3行で説明する全体的な進捗
- 物体検出モデルの導入が完了
動物たちの行動を常時観測するための技術的なハードルの1つをクリアした。 - アプリを1つにまとめた
カメラアプリと見守りアプリ、別々にインストールする必要性を感じなかった。 - 以前の2アプリの機能をもつアプリを申請した
後述のプログラミング言語の変更があったので、ちょっと手間取った。
今回わかったことは、アプリのユースケースとして事前に考えたことと実際は大きく違うということ。
動物見守りアプリ(CoVision)簡易版リリースでアプリをリリースして使ってみたところ、日常生活で使うためには不具合が多かったです。
例えば、カメラ側のスマートフォンは常に電源をつけっぱなしにするので、充電しながらカメラをつけっぱなしでも電池が足りなくなることがないように・・・と思ったらプログラミング言語がFlutterだと10時間くらいで落ちる。Kotlinで最低限の機能で実装したら余裕を持ってOKでした。
その他には、カメラの配信モード(外出先から家の中&動物たちを見れるモード)が常時ONのため、使っていて気持ち悪いらしい。認証やURLの一致をクリアする必要はあるものの、常時放映中は確かに・・・誰かに見られる心配があるか。そのため、後述のFirebaseでのリアルタイムスマートフォン画面の変更技術を作り、外出先から家の中にあるカメラの配信のON/OFFをできるようにしました。
最後に、現物があることの違いが大きかった。家族や知人に見せた時に、自分(れい)が何をしたいのかイメージを共有でき、アドバイスやそもそも論の議論ができた。スタートアップでの起業?の方法論として、ユーザーインタビューから始めることが推奨されるようである。ただ、競合となる製品がいまだに有名になっておらず、利用イメージがわかりづらい(&自分の説明が分かりづらい)ので、○○みたいなものを作りたいとプレゼンで見せてインタビューしようとしても、その課題は持っているし、経済的・精神的な痛みも理解できる。で、できるモノはどんな感じなの?となる。手触り感で使用可否を決めるユーザーとして当然の反応だ。
そのように、思ってたことと実際は大きく違うことがわかりました。スマートフォンアプリはウォーターフォール型で作ったらミスしそうだなあ…という経験に。
続いて、技術的な発展がありましたので共有しておきます。
3行で説明する技術的な進捗
- プログラミング言語をFlutterからKotlinに変更した
Flutterの画像処理に致命的な不具合があり、画像認識技術が使えなかったため変更した。当面Androidのみ対応に。 - 画像認識技術の組み込みに成功した
今回は物体検出モデル(Mobilenet V1、YOLO V5、Efficientdet-lite4)の導入ができた。毎秒行動データを取る訳ではないので、FPSは1あれば十分だが今は3FPS以上ある。 - リアルタイムスマートフォン画面の更新技術を作成
外出先のアプリから、家の中にあるアプリ(カメラ)の画面を変更できるようにし、カメラ画面の配信ON/OFFを操作できるようにした。
まさか・・・Flutterでリアルタイム画像認識が無理だとは。バージョンを下げて維持すれば対応できなくもないですが諦めました。
諦めた背景として、Flutterは2021年のメジャーバージョンアップでNull Safetyをはじめとした変更が入り、カメラ画像処理関係の多数のパッケージが使えなくなったまま更新されていません。そのため、1つ1つのパッケージを現状対応にするためにはめっちゃ工数がかかるという・・・少数で対応するには大きすぎる問題です。
Flutter関連でGoogle検索しても、なぜか2021年前半までの記事が多く、2021年後半以降の記事が少ないことに違和感を覚えていました。メジャーバージョンアップのことを知って、なるほど、だからかと合点してしまいました。とはいえ、あまりひねりのないアプリを作るならFlutterは便利だと思います。パーツを組み合わせればすぐ完成するので、レゴブロックみたいな感じで開発できます。
物体検出モデルの導入はTensorflow公式サイトのKotlinサンプルをちょっとだけいじったら導入できました。物体検出モデルの今後の課題は2点あり、(1)できるだけ少ないデータでの学習がうまく行くか(ユーザーは手間暇を掛けたくないし、大量のデータを入力したいわけではない)と、(2)学習モデルの導入がある程度高速にできるか(独自モデルの学習に1日掛かると、だいたいのユーザーは離脱してしまうのではないか)ですね。
モデル学習を含めたアプリのワークフローの、理想と現実のズレをいかにうまくまとめるか・・・ですね。
現状
CoVision公式HPはある程度できてはいるものの、出来合い感が強い。
上記の画面のように、アプリでは物体検出モデルのテスト導入中です。現在は3~5FPSで表示できています。
ただ、CoVisionでかなり重要な機能である特定の動物たち(例:犬のAちゃん、鶏のBちゃん)の行動をトラッキングできるモデルを作る機能がないので、現在開発中です。これさえ開発できれば、MVP(最低限のプロダクトの機能)で開発する内容は行動データの可視化だけになります。とはいえ、パソコンで学習させたモデルをスマートフォンに移して動かすので、複数のプログラミング言語の知識やモデル・データ形式の変換の対応が必要です。そこがなかなか難しい。
具体的に言うと、PC上だけの対応であればPythonの深層学習パッケージTensorflowまたはPytorchを使えれば問題ありません。ただ、スマートフォンも入ってくるとFlutter(Dart)やKotlin(≒Java)、C/C++などの複数のプログラミング言語に対応せざるを得ません。かつ、モバイルアプリ×深層学習モデルの開発はそこまでユースケースが豊富ではないため、PytorchからTensorflowへのデータ変換のためのONNX形式への対応や、TensorFlowからTfliteへの変換(公式サイトの通りに変換するとうまく動かない)のような問題もあります。
現在ハマっている問題は、同一であるはずのモデルの構造が違うことです。Tensorflow Hubで公開されている学習済みモデル(現在利用中だが、独自の学習はできない:TfLite形式)と、Tensorflow公式で公開されている学習モデル(独自の学習ができる:チェックポイント形式等含む)をTfLite形式に変換したモデルのモデル構造が違うという謎現象があります。学習に目途が付いたのに構造が違うと導入できんよ。。orz
とはいえ、開発が無理ではないことはわかったので、あとは粛々と進めるのみです。
以上、もう少しでできそうです。
モバイルアプリ開発は、新たな言語の習得を含めて3か月くらいかかるんですね・・・やっぱり。