茨城エンジニアのPython開発日記

茨城のITベンチャー企業ではたらく2年目エンジニア。Pythonで色々なものを作成中。

AIをARに応用するぞ会 → (第15回) ~リリース準備2~


ブログから記事を見つけたい場合はこちら

ブログ地図 - 茨城エンジニアのPython開発日記



こんにちは。
開発メンバーのKです。

最近、新しいスマートフォンを買いました。Pixel 6 Proです。
今までiPhone7を使っていたので、カメラ性能がすごいなと思っているところです。
画面サイズが大きいのはありがたいですが、iPhone7に慣れていたためか、Pixel 6 Proはやはり重く感じます。




以下、目次です。

0. 前回まで

↓前回のブログ
tottorisnow33.hatenablog.com

前回、実機デバッグをしたうえで、以下の点を修正したいと書きました。
① 実機デバッグしたところ処理速度が遅すぎる
② otherになる確率が低すぎる

今回は以下のことをやりました。

  • 識別処理にかかった時間を表示できるようにする。
  • 学習に使うotherデータを増やして、otherになる確率もあげる。
  • データのシャッフル機構を修正

1. 識別処理にかかった時間を表示

前々回作ったソースの、推論を実施する部分を、以下のように変更して処理時間をmsecオーダーで計測します。
(↓前々回のブログ)
tottorisnow33.hatenablog.com

やっていることは単純で、推論前にSystem.currentTimeMillis()を呼び出して時刻を取得し、推論後にも時刻を取得して推論前の時刻との差を取るだけです。
それから、この後の処理でputText()をして画面に処理時間を表示します。

/**推論実施**/
long inferenceStartTime = System.currentTimeMillis();
interpreter.run(testImg, output);
inferenceTime = System.currentTimeMillis() - inferenceStartTime;

2. 学習に使うotherデータを増加

前回は以下のようなデータの枚数で学習させていました。

【前回】

パグとブルドッグStanford Dogs Dataset (Stanford Dogs dataset for Fine-Grained Visual Categorization)を使用しています。これはImageNetから使われているデータみたいです。
(ちなみにブルドッグはいろいろ種類がある中で、Bull mastiff を使っています)
otherはPASCAL VOC 2012 (The PASCAL Visual Object Classes Challenge 2012 (VOC2012))から適当に使っています。
これで学習させた結果は、前回のブログに書いた通りで、パグ・ブルドッグ以外を写して推論させてもotherの確率が低いというものでした。

原因として、otherの枚数が少なすぎることが考えられます。
otherには、人間や他の動物や乗り物などが入っています。パグやブルドッグに比べると、特徴が多様すぎます。
つまり、パグやブルドッグは毛の色や体の形状などから推定できるかもしれませんが、otherは色や形が様々です。
どんなときにotherとすればよいか、識別器はわからないのだと思います。


そこで今回はotherのデータ数を増やして、500枚にしました。

【今回】

これにより、より多くのotherの特徴を教えられます。
また、otherの枚数が増えたことにより、学習の難しいotherを重点的に教えられます。

3. データのシャッフル機構を修正

前回作ったパグ・ブルドッグの識別器は最初にデータ全体をシャッフルして、学習時にシャッフルしたデータをバッチごとに入力していました。
ただ、これではエポックごとにデータがシャッフルされないので、1バッチの中に含まれる画像の組み合わせが変わりません。

そこで、今回はtf.dataのshuffle()を利用して、エポックごとにシャッフルされるので、1バッチの中に含まれる画像の組み合わせがどんどん変わっていきます。
(本来はエポックごとにシャッフルされるのが当たり前ですが、、、これで本来あるべき姿になりました。)

www.tensorflow.org

4. 実機で推論

実機にソフトを入れて、動画キャプチャをしました。
使用したスマートフォンは Pixel 6 Pro です。

3秒に一回、識別処理を行っています。
Speedには識別処理にかかった時間を表示しています。(Section2で書いたことです)

実行結果は以下の通りです。

動画を見ていただくと分かると思いますが、識別結果が更新される直前に、一瞬カクカクしています。
識別してから表示の更新をしているのと、識別処理自体に約300[msec]もかかっていることが原因でしょう。

まあ、とりあえずリリースしてしまって、それから高速化に着手しようと思います。
識別性能もまだまだなので、accuray上げていきたいです。

5. 次回やること

次回は、ついにアプリをリリースしようと思います!