meideru blog

meideruが書いているブログです。主に電子工作・プログラミング・ガジェット類などを中心に記事を書いています。

HOG + SVMで物体検出をやってみた

   

HOG + SVMで物体検出をやってみました。

人工知能(AI)

結論から言うと、初めてにしては、まぁまぁな検出精度だなと思いました笑。

とりあえず今日は、ここまでのまとめを書きたいと思います。

物体検出とは

※ 物体検出はオブジェクト検出とも呼ばれていて、多くの人はそちらの呼び名を使用しているかもしれません。

 

物体検出とは、画像内に写っているものから特定の物体を検出することです。

以下の画像を見れば、一発で理解できると思います。

@物体検出
物体検出

これが物体検出です。

物体検出の手法

多くの手法が存在しますが、どれでも根本的にやることは同じです。

画像内から領域を抽出して画像認識させ、一致する箇所を枠で囲うだけです。

候補領域の抽出方法としては、Selective Searchやスライディングウィンドウなどがあります。

アルゴリズムの詳細については、この場で解説しませんので、興味のある方は調べてみてください。

HOGとSVMとは

HOG(Histograms of Oriented Gradients)とは、特徴ベクトルの一種です。輝度の勾配をヒストグラム化したものです。

SVM(Support Vector Machine)とは、分類アルゴリズムの一種です。分類アルゴリズムの中では、最も強力なものの一つと言われています。

 

こちらも、アルゴリズムの詳細については、この場で解説しませ。興味のある方は調べてみてください。

HOGとSVMで画像検出をやってみた

何を検出するのか

横向きの自動車を検出します。

@学習データ
自動車(学習データ)
なぜ、それをやろうと思ったのかと言うと、学習データがあったからです。

初めての物体検出としては良い題材だと思います。

学習データは、以下のURLから無料でダウンロードできます。

(URL:https://cogcomp.cs.illinois.edu/Data/Car/

学習方法

学習データに入っている正例データ(positive data)と負例データ(negative data)を学習させます。

すべての学習データからHOG特徴量を計算して、SVMで学習させます。

このとき、HOGはscikit-image、SVMはscikit-learnというライブラリを用います。

 

以下が学習部分のコードです。

リファクタリングしていないので汚いです。ご了承ください。。。

 

ポイントはSVMの学習にグリッドサーチを使用している点です。

これを用いると、色々なハイパラメータを組み合わせて最適なモデルを作成することができます。

学習データに対して、クロスバリデーションで平均精度99.8%まで到達できました。

検出方法(予測方法)

学習したモデルを活かして、物体を検出させる方法について書きます。

候補領域の抽出には、スライディングウィンドウを採用しました。

 

以下がコードです。こちらもリファクタリングしていないので汚いですorz

 

説明を忘れていましたが、最後にNon-Maximum Suppression(以下NMSと略す)で領域をまとめています。

このアルゴリズムは過去に記事を書きましたので、そちらをご覧ください。

物体検出におけるNon-Maximum Suppressionのアルゴリズム
最近は機械学習にのめり込んでいます。特にディープラーニングを用いた画像認識の勉強しています。これまでに手書き文字(MNIST)の認識や、一般物体認識(CIFAR-10)に挑戦しました。(CIFAR-10の記事は準備中です。。。) そして、今挑戦しているのは物体検出...

結果

まずは成功例から示します。

@成功例(NMS前)
自動車を検出@成功例(NMS後)
自動車を検出上手く検出できていますね!

NMSをかけると完璧です。

 

次に、失敗例を示します。

@失敗例 その1(NMS前)
自動車を検出

@失敗例 その2(NMS後)
自動車を検出

@失敗例 その2(NMS前)
自動車を検出@失敗例 その2(NMS後)
自動車を検出

余計な場所が検出されていますね。上手く検出できていません。

これは何故なのでしょうか?

考察します。

上手く検出できないことに対する考察

理由

上手く検出できない理由は、考えてみると、とても簡単なことでした。

分類器は、99.8%の精度だと言いました。これはすごい精度ですが、言い返せば1000枚に2枚は認識に失敗するということです。

今回、スライディングウィンドウで抽出している候補領域の数はおよそ1200個でした。

ということは、必然的に失敗する箇所が出てくるのです。

改善策

調べて見た結果、画像検出ではAdaBoostという手法が存在するようです。

AdaBoostは、1つ1つの精度はあまり良くない識別器を複数つなげることで、全体として精度の良い識別器を構成する手法です。

例えば、HOG+SVMの他にも識別器を作って、それを繋げるということになります。

こちらにわかりやすい説明が書いてありました。

感想

SVMの学習が思ったよりも速くてビックリしましたΣ(・□・;)

これまでは中心に勉強してきたディープラーニングは学習にとてもとても時間がかかります。

次回は、AdaBoostを試します!

 - 機械学習