scikit-learnとOpenCVで電子部品の画像分類

11月の1日〜3日に学祭がありました。サークルとしても何か出そうということになり、「とりあえず手続きだけはして夏休みに何か作るってことで〜」ということになったのですが、各々がICPCの練習やCTFに熱中しすぎたあまり、肝心の展示物が@akihiro01051先輩のすごいやつ以外に無いという状況になってしまいました。さすがに1人(それも先輩)に任せるのは問題なので、急いで何か作ることになったのですが、学祭の展示ということで一般受けするものである必要があります。ゲームなどは素材(集め|作り)に時間が無限に取られてしまうので、CV (Computer Vision) かAR (Augmented Reality) に関連するものが良さそうということになり、電子部品の物体認識を実装してみました。

制作物は以下のようなものです。

正解率 (Accuracy) は5-fold cross-validationで80%前後でした。たった6クラスの分類で、背景は白色で固定、スケールもほぼ一緒という条件なので、最新の研究の成果とは程遠いですね。

用いたソフトウェアや手法など

コンピュータビジョンの入門ということでBag of Visual Words*1という手法を使ってみました。Bag of FeatureやBag of Keypointsという名前も使われているので、検索するときはちょっと厄介です。あと、bagだったりbagsだったりします。この手法の良いところは、提案されてから10年経っているため、日本語で書かれた論文やブログ記事がたくさん見つかることです!!!私は公開されている日本語の論文*2を読んで愚直に実装しました。

いろいろ調べた結果、特徴量としてはSIFT*3やSURF*4がよく使われているようなのですが、Ubuntuの公式リポジトリに含まれているOpenCVに、特許の都合でSIFTが含まれていなかったため、代わりにORB*5を使ってみました。性能が全然ダメだったら、諦めてソースからビルドするか非公式リポジトリのものを使おうと考えていたのですが、学祭の展示物としては十分に許容できる性能だったため、そのまま使っています。副次的な作用としてSIFTに比べて高速に動作するため、WEBカメラを使ってリアルタイムに動作させることができるという利点もありました。

WEBカメラとの接続やORB特徴の抽出の時点でOpenCVを利用してしまっているので、機械学習の部分もOpenCVに任せても良かったのですが、今回は「夏休みに別の用途で使って慣れていた」という理由でscikit-learnを使いました。scikit-learnの良い所は、機械学習に詳しくなくても使えるカンペが用意されていることです。今回は特徴量のクラスタリングMini Batch K-Means、分類にはSVM(kernel='rbf')を使いました。 クラスタリングには最初は普通のK-Meansを使ったのですが、時間がかかりすぎたのでカンペに従った結果、Mini Batch K-Meansに誘導されました。分類にはRandomForestSVM(kernel='linear')も試してみたのですが、複数の論文で指摘されているようにSVM(kernel='rbf')が最も性能が良かったです。

性能を改善するためには?

今回は画像の輝度しか利用しておらず、色を利用していなかったため、形状が似ているLEDと電解コンデンサの認識が困難でした。色を特徴量として利用する研究は調べれば(日本語の論文でさえ)たくさん見つかるのですが、簡単に性能が上がるわけでは無さそう?な感じがしたので保留にしました。(特徴量をクラスタリングする時点で色特徴を入れるのか、最後に分類器に突っ込むときに入れるのか、など考えていると闇が生える)

あとは、以下のブログに書かれているキーワードを調べているところです(ここでモチベーション切れ)

コード

プロトタイピングです。許してください。

github.com

おまけ

ロボット研究会が制作した「電解コンデンサの着ぐるみ」に来てもらい、分類させたところ、「電解コンデンサ」であると識別できました!やったぜ!!

f:id:kujira16:20141115211213p:plain

f:id:kujira16:20141115211225p:plain

おまけ2

画像のアカデミックな分野に手を出してみましたが、確かにコンピュータが物体の概念を獲得していくのを見るのは楽しいです。熱中する人がいるのも分かります。ただ、私としては研究としてやっていきたいかと聞かれると微妙な感じです(私は学部3年生です)。性能が出なかったとき「なぜうまくいかないか」というのを調べていく過程がつらそうな気がします。。。