Edited at

【備忘録】pythonのパッケージ 「hog」でWarningが出る


概要

画像からHOG特徴量の抽出しようとして、Pythonのパッケージの一つである「hog」をpip使ってインストールしてHOG特徴量を抽出するプログラムを作成した。

以下ソースコード例

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を指定してあげれば良さそうだ。

以下のようにソースを修正して再度実行したら警告は出なくなった。

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))