##概要
画像からHOG特徴量の抽出しようとして、Pythonのパッケージの一つである「hog」をpip使ってインストールしてHOG特徴量を抽出するプログラムを作成した。
以下ソースコード例
.py
import cv2
import numpy as np
from skimage.feature import hog
hog_image1 = cv2.imread("./data/image1.jpg")
fd, hist1 = hog(hog_image1, orientations=8, pixels_per_cell=(128, 128),cells_per_block=(2, 2), visualize=True, multichannel=True)
print(str(hist1))
実行すると以下のような警告文が出た。
/Users/User/.pyenv/versions/3.6.0/lib/python3.6/site-packages/skimage/feature/_hog.py:150: skimage_deprecation: Default value of `block_norm`==`L1` is deprecated and will be changed to `L2-Hys` in v0.15. To supress this message specify explicitly the normalization method.
エラー文を読まずとりあえずパッケージをアップデートしたが、ダメだった。
pip install -U hog
対処法
エラー文を読むと
デフォルト値の`block_norm`==`L1`はバージョン0.15で廃止され、今では`L2-Hys`に変更されている。
実行するには正規化方法を明確に指定して。
と記述されているようだ。
正規化法の指定の仕方を調べるためにScikit-imageのモジュール説明を読むと、HoGモジュールを用いる場合では以下のような引数を与えることができる。
skimage.feature.hog(image, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(3, 3), block_norm=None, visualize=False, visualise=None, transform_sqrt=False, feature_vector=True, multichannel=None)
ということで、skimageのHoGモジュールを呼び出す際のパラメータにhog(..., block_norm='L2-Hys')
のようにblock_normをL2-Hysを指定してあげれば良さそうだ。
以下のようにソースを修正して再度実行したら警告は出なくなった。
.py
import cv2
import numpy as np
from skimage.feature import hog
hog_image1 = cv2.imread("./data/mouth_img13.jpg")
fd, hist1 = hog(hog_image1, orientations=8, pixels_per_cell=(128, 128),cells_per_block=(2, 2), visualize=True, multichannel=True, block_norm='L2-Hys')
print(str(hist1))