今年の4月頃から人工知能、ディープラーニング(Deep Learning、深層学習)に興味を持ち始めました。そして、樹皮の写真から木の名前を当てる人工知能を作ってみました。
こちらの記事で詳しく書いています。
次のステップとして物体検出にチャレンジしたいと以前から思っていたものの、難しそうでなんとなく挑戦できないでいました。しかし、大学の授業が終わって夏休みになり、時間ができたので今こそ物体検出に取り組むタイミングだと思って勉強してみました。
シカを検出する人工知能を作るぞ!
さて、何を題材にして物体検出をしてみるかですが、「シカとイノシシを検出する」というテーマにしました。
近年、シカによる樹木の食害被害はかなり問題になっているので、シカを自動で検出できればシカの調査が効率的になるかなと思いました。(イノシシはそのついでです。)
地道な画像データの収集
「シカが写った写真110枚」と「イノシシが写った写真110枚」をGoogle画像検索の結果から地道に集めました。110という数字には特に深い意味はありません。(じゃあ100にしろよ!って感じですね。)
地道なアノテーション作業
さて、無事に集めた写真ですが、このまま学習させるわけではありません。今回の目標である「物体検出」では、写真のどこにシカ(もしくはイノシシ)がいるのかまで特定したいのです。
つまり、まずは手動で合計220枚の写真1枚ずつ、シカ(もしくはイノシシ)が写っているところに印をつけていく必要があるのです。
この印をつける作業をアノテーションと言います。これには便利なソフトがいくつかあって、効率よく地道な作業を行うことができます。ちなみに印をつけた結果はXML形式のファイルにしないといけないのですが、勝手にソフトがしてくれるのでありがたいです。
マイクロソフトの「VoTT」というものや、「labelImg」というものがあります。個人的には「labelImg」の方が使いやすいと感じたのでこちらで作業をしました。ファイルの保存がわかりやすかったのです。(←後々大変なことになりましたが…)
参考:
ディープラーニングで動画に自動でモザイクをかける「ディープモザイク」作ってみました - karaage. [からあげ]
学習
上でも紹介させていただいた「からあげさんの記事」を参考にして(まるパクリして)物体検出してみることにしました。
しかし、「よし、学習させるぞ!」と思っても同じエラーばかりが出ました。
pyenvはインストールしていなかったのですが、他のバージョンは以下のものにしっかり合わせました。
tensorflow==1.0.0 keras==1.2.2 opencv-python==3.3.0
やはり、pyenvとやらもインストールしないといけないのか、、、と思いつつ嫌な予感が…。
エラーの文章を見ると、なんか「ファイルの形式(?)が違うんじゃ!そんなファイルはないんじゃ!」って感じだったんです。もしかして、これはバージョンの問題ではない。アノテーションツールの問題なのか…。
予感は的中。まあ結局、「labelImg」じゃなくて「VoTT」を使っておけば良かったんですよね。鋭い直感をほめましょう。
というわけで再びアノテーション作業。220枚。最初は楽しかったのにだんだんと腕が疲れてきます…。
記事に書かれている通りに、コードの修正やディレクトリの確認を行って、さあ実行。
ん?精度が低すぎるぞ。学習を回すことはできたのですが、精度が3割にも届いていません。
もちろんepochが10ってこともあるとは思うのですが、教師データの質にも問題がありそうです。実は今回は、シカ(イノシシ)の顔を検出していて、大人でも子どもでも横顔でも正面でも角があっても無くても全部「シカ」(イノシシ)だとして教師データを作成したのです。どうやらこれが良くないのかもしれません。
まとめと今後の課題
・教師データの質を高めるために、「シカ」の基準をできるだけ明確にする。そしてそもそもデータの量も多くする。
・コードに何が書いてあるかまで深く理解したい。(今回はとりあえず実行してみた感じなので…。)
以上です。
最後に、小学生の頃に奈良公園に行った時の写真で物体検出してみたサンプルです。なかなかいい写真が撮れてる!(笑)
おいおい、もうちょっと頑張ってくれ!右に写ってるのもシカですよ!!!
と、まあ、こんな感じの精度なわけです(笑)
ちなみに、つい最近こんな論文が出ていることを知って感激しています。すごい。