Pythonで画像から特徴量をつくりたい(HOG)

色ではなく、HOGで画像の特徴量をつくってみます。

hogを可視化してみる

画像用意

from skimage.data import chelsea
import matplotlib.pyplot as plt

img = chelsea()
plt.imshow(img)

hoghog画像の取得。
引数として方向、セルあたりのピクセル数、ブロックあたりのセル数、マルチチャンネルか(今回はRGBなのでTrue)を渡します。

from skimage.feature import hog
from skimage import data, exposure

#hogとhog画像の取得
fd, hog_image = hog(
    img, orientations=8, 
    pixels_per_cell=(16, 16),
    cells_per_block=(10, 10), 
    visualize=True, 
    multichannel=True,
    feature_vector=True
  )

#可視化
plt.imshow(hog_image,cmap=plt.cm.gray)

f:id:esu-ko:20200815113927p:plain

見えてる。

分類なんかで使う時は別に画像はいらないので、visualize=False にするとfdだけ帰ってきます。

#特徴量ほしい
fd

1dじゃない状態で欲しい場合

feature_vector=Trueだと1dにされた状態ですが、ブロック/セル/オリエントごとに欲しい場合はFalseにして渡します。

fd = hog(
    img, orientations=8, 
    pixels_per_cell=(16, 16),
    cells_per_block=(10, 10), 
    visualize=False, 
    multichannel=True,
    #こいつ
    feature_vector=False

fd.shape
#(9, 19, 10, 10, 8)

このとき配列は最初から、ブロック列、ブロック行、セル列、行セル、方向を表しています。
上だとブロックは919,1ブロックは10セル10セルで計算される方向数は8方向を表しています。 このあたりパラメータとして渡した、下記と連動しています。

#方向数
orientations=8, 
#セルあたりのピクセル数
pixels_per_cell=(16, 16),
ブロックあたりのセル数
cells_per_block=(10, 10)