Androidで画像認識 ~ ナキウサギをOpenCVで認識してみた

2019年8月15日


「改造したAR-J-GPSでナキウサギ画像を認識させてみた」

最近は画像認識の話題を良く目にします。画像認識の技術は、車の自動運転や防犯カメラ、ロボット、無人レジなど、さまざまな用途で利用されています。これから画像認識の利用は加速度的に進み、社会の激変が予想されます。

そこで、自分もいずれは画像認識のアプリケーションを作ってみたいということで、テストしてみました。画像認識を行うデバイスですが、Androidとラズベリーパイを候補として挙げました。そして、既に自作のAndroidアプリケーション「AR-J-GPS」があるので、Ar-J-GPSのAR画面で画像認識を行うことにします。

それでは、画像認識を行う時は、どのようなライブラリを使えば良いのでしょうか。

※ソースは精査されたものでないため、現時点では方法や手順について紹介します。

1.TensorFlow Lite

「TensorFlow Lite」は、googleから提供されているモバイル向け機械学習ライブラリです。googleが作るものですから、Android Studioでの開発には最適のライブラリでしょう。

「Lite」と名前が付くとおり、フルセットの「TensorFlow」からモバイル向けとして用意されたライブラリです。その使い方ですが、以下のサイトさんの記事が参考になります。

Cafe and Cookies.:TensorFlow Liteのデモを動かす(外部リンク)

私もやってみたのですが、途中で私の開発環境では重すぎて厳しいことが分かりました。今は非力なノートブックのみで開発しているので、リソースが不足してしまいます。残念ですが、私は違う方法を使うことにします。みなさんは「TensorFlow Lite」を試してみてください。

後日TensorFlow Liteで画像認識をやっています。当記事の最後にリンクを用意しています。

2.OpenCV 4

「OpenCV」は、画像や動画を処理するのに必要な機能をまとめたライブラリです。そのライブラリの中に、画像認識や機械学習の機能が含まれています。OpenCVは若干軽い構成なので、こちらを実装することにしました。

まずは顔認証をしてみます。パッケージには、顔認証をするためのxmlがいくつか用意されています。

haarcascade_frontalface_alt.xml

を今回使ってみました。これらのxmlは「分類器」と呼ばれています。顔認識のやり方ですが、以下の記事が良いでしょう。

Qiita:Android + OpenCV 4 で、顔認識をする(外部リンク)

私もAR-J-GPSに組み込んでやってみましたが、認識率はお世辞にも高いとは言えません。結構ミスするし、なんとAndroid Studioの画面でも顔認証する有様です。サンプルが悪いのか、この程度の認識しかできないのかは謎です。

「AR-J-GPS」プレビュー画面に、検出した顔を四角で囲うようにしました。そしてgoogle検索画面でフリー画像を表示させて認識してみました。まあまあ認識していますが、もう少し認識率が高くなって欲しいところです。

さて、ナキウサギの分類器はありません。そのため、自作してみます。

3.分類器の作り方の概要

画像認識というとAIが賢く判断して何であるかを導き出すイメージですが、実際は大量の画像を登録して、近い画像があれば、それであると判定するのに過ぎないようです。そして判断に使う画像には、判断する対象部分を四角で囲んであげる必要があります。これを大量に用意することによって、画像に判断するものがあるかを判定します。

このように、AIというよりは大量のデータベースの中から近いものを探すといった方が正しいです。対象を作成者が枠指定しているので、AIとはちょっと違う気がします。

さて、分類器の作り方と使い方は以下の記事が良いでしょう。

shkh’s blog:OpenCV 2.4.2で分類器を作る(外部リンク)

分類器の作成の際、いろいろトラブルが発生しました。注意する点を以下に示します。

TrainingAssistantのセットアップについて

Githubの設定で以下のチェックアウトが必要とありますが、私の環境では設定すると「views.py」で枠の作成ができませんでした。同じ現象の人もいるようなので、まずは設定しないで動作させてみてください。

% cd static/Jcrop
% git checkout master

ももん2さんによる写真ACからの写真

TrainingAssistantで、ナキウサギの顔を四角で囲います。範囲を設定した後に他の場所をクリックして枠が赤色になると指定が有効になります。

opencv_createsamples.exeがない

分類器を作成する時に「opencv_createsamples.exe」が必要ですが、Open CVのWindows最新版ではソースしかありません。そしてビルドもうまくいかないようです。そのため、古いOpen CVをダウンロードする必要があります。私は「Open CV 2.4.11」を使用しました。

4.画像認識の結果

最初のテストでは、正解42枚、不正解53枚の画像を用意しました。しかし、本格的な判定を行うには、数千枚が必要なようです。認識させてみると、めちゃくちゃな判定で使い物になりません。

そこで2回目のテストで使った画像は、クオリティの高いものにしました。2回目は、正解54枚、不正解48枚を用意しました。その結果の1枚が、冒頭のキャプチャ画像です。1回目よりは認識が良くなりましたが、お世辞にも認識率が高いとは言えません。

ナキウサギふぁんくらぶ(外部リンク)」さんのホームページの画像を認識させたものが以下の画像です。

ナキウサギも判定していますが、関係のない文字まで判定していますね。これはまだ良い方で、ナキウサギには反応しないで関係のないものばかり選択することもあります。

画像認識で用意しなければならない画像は、5千枚前後に及ぶようです。また、不正解の画像も、むやみにあれば良いわけではないようですし、まだまだ改良が必要なようです。これでは、ねずみとの区別なんて、ずっと先のこととなりそうです。

5.処理速度の考察

画像認識の処理速度ですが、今のところ1秒弱掛かってしまって動きのあるものには付いていけません。方法として、画像サイズを小さくしたり、グレースケールにしたりしてテストしていますが、劇的な効果に結びついていません。グレースケールは、以下のコードで実現できます。

Imgproc.cvtColor(matImg, matImg, Imgproc.COLOR_RGB2GRAY);

これからもテストを続けます。

6.まとめ

「ナキウサギの出現を待つのは大変なので、画像認識で見つけてくれると嬉しいのですが。ちなみに中央にナキウサギがいます」

OpenCVによる画像認識ですが、まだまだ実用性が高くない印象でした。今回の自分の作成した分類器の精度が低いことは仕方ありませんが、標準で付いてくる分類器も精度が高いとは言えません。精度を高めるためには、大量の画像と、有効な不正解画像の用意が必要なようです。

ナキウサギ分類器は著作権のある画像を使用しているので提供できません。ご了承ください。

まだテストが不十分で結論が出せる状態ではないので、今後もテストを続けて行きたいと思います。
⇒分類器をいろいろ作成してみましたが、やればやるほど成績が良くなくて困っている状態です。何かコツを掴めれば良いのですが。

TensorFlow Lite モデルを使ったナキウサギの検出をやってみました!。成績も良いので、ぜひ見てください。