背景と概要
ロボットが自立移動するとして、知らない物体を発見した時その知らない物体を自分で学習して認識できるようにしたい。また、認識できているラベルをさらに細かく認識できるようにもしたい(犬を犬ではなく個体名で認識など)。しかし再学習をすると学習に時間がかかりすぎてしまうため、転移学習を使用して学習時間を短縮する。その前準備として、とりあえず自分たちで集めた画像を用いて、まず転移学習を試してみようと思った。
今回は、手元にあったペットボトルをターゲットという新しいラベルを付けて、転移学習させてみた。単眼カメラを搭載しているロボット(Cozmo)を使用して、画像を取得して学習させたが普通のWEBカメラ等でも大丈夫。
開発環境
- google colablatory
- python3
- chainer 5.0.0
- Cupy-cuda 5.0.0
- ChainerCV 0.11.0
使用したデータセット
- PascalVOCの学習済みモデル
- Cozmoに搭載してるカメラから画像を取得し、手動でアノテーションデータを作成した自作のデータセット
アノテーションデータの作成方法
slowsingleさんのlabeling_for_object_detectionを使用してアノテーションデータを作成した。
使い方はこちらの記事に書いてます。
物体認識用データセット作成支援ツール(Faster R-CNNとかSSDとか)
originalDatasetクラス
作成したデータセットはそのままでは使えないので、CheinerCV内で使われている形と同じになるようにoriginalDatasetクラスを作成した。(内容はgithubへ)
使用したネットワーク
今回は,ChainerCVのSSDを使用した。一応Yoloも並行して動かしてみたがCheinerCVのYoloは20クラスしか判別できず、目的に使用できなかったため断念。
リポジトリ
今回のやったことをまとめたリポジトリ
SSD_FineTuning
結果
ターゲットラベルのペットボトルは、はっきり写っている画像では検出スコアがほぼ100%、斜めにしたり見切れていてもきちんと認識できた。誤認識してしまった時や、ノイズが酷い画像の検出スコアは70%前後。色が似ているガムの画像を背景色の影響もあってか誤認識してしまっていた。
成功例
誤認識
感想
時間がなく多クラス分類はできなかったが、ターゲットのペットボトルと他のペットボトルの区別ができていた。また、角度がついていたり見切れている画像は、元のPascalVOCの学習済みモデルを使い判別ができなかったが、転移学習を行った結果、角度があったり、見切れているターゲットのペットボトルの画像でも認識できていたので転移学習は成功したと言ってもいいのではないかなと思う。転移学習させていくことで新しく認識できるものを増やすことができると思う。色が似ているものを誤認識していたので、形ではなく色の組み合わせで学習していると考えられる。
今後の展望
- 今回はCheinerCVのSSDを使用したが、別のフレームワーク、別のネットワークを試してみたい。
- 背景を何とかして引き算して学習させたい
- 多クラス分類できるように転移学習をさせたい
- 手動でアノテーションデータを作成したが、今回のように認識できているラベルを細分化しようとする場合、SSDで認識できたバウンディングボックスのデータを使うことで効率よくアノテーションデータを作成できそう。