Pydroid 3 - IDE for Python 3 (Android) のOpenCVとTensorFlowオプションを試した

[Pydroid 3 - IDE for Python 3](https://play.google.com/store/apps/details?id=ru.iiec.pydroid3) はAndroidで動くPythonですが、PC上のPythonと互換性が高くtkinterなどのGUIプログラムも同じソースを使うことができます。スマホだけでまあまあ使えるアプリが書けるのでお勧めです。さらにOpenCVやTensorFlowまで動くそうです。残念ながらこれらのライブラリは有料オプションとなっていますが、３日間のお試しができるので申し込んでみました。

※サンプルスクリプトはすべてPixel3で実行確認しています。機種によってはカメラが動かなかったりします。
#有料オプション申し込み
有料オプションは次の２つの種類があります。
・買い切り￥1160 
・月々￥110 最初の３日は無料
3日間お試しをやってみることにしました。申し込みは製品から行えます。
左上アイコンをクリックしてサイドメニューを開くと一番上に有料オプション申し込みメニューがあります。申し込みメニューに入ると上記２つのオプション選択メニューになります。
![Screenshot_20200913-074331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/b041fe95-0f10-faec-9bfa-c75faf28c14b.png)　![Screenshot_20200913-074319.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/59d3bb23-43b9-a708-587c-3272bf602057.png)
下の「3 DAY FREE TRIAL」をクリックします。
![Screenshot_20200913-074343.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/e45decdb-579f-f174-a40f-dbfdf9e687b6.png)
定期購入を押すと、個人認証ダイアログがでるので指紋で認証します。これで申し込み完了です。
#ライブラリインストール
申し込み完了すると、ライブラリメニューでグレーアウトしていたものがインストール可能になっています。
![Screenshot_20200913-075009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/7634bdc8-c599-fc4e-16e8-63c3b31d198d.png)
全部インストールしました。
tensorflow-2.2.0, opencv-python-4.3.0, torch-1.5.0 がインストールされました。

#サンプルプログラム
サイドメニューの Samples からサンプルプログラムをダウンロードできます。ここもグレーアウトしていたものが選択可能になっています。
![Screenshot_20200913-210722.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/d45b1493-26d8-7a10-477b-8b186e76acaf.png)
##Tensorflow
###MNIST
よくあるやつです。サンプルデータをダウンロードして学習させるやつです。もの凄く遅いので、epoch=5に設定されています。5回まわすだけでも大変なんですが。モデルはKerasの普通のソースが使えそうです。
![Screenshot_20200913-173630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/784daa2a-6cb9-d87a-c805-fdfa04e2db13.png)
###Image Classification
![Screenshot_20200913-173816.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/562cf1dc-c775-d812-abea-6110231e5886.png) ![Screenshot_20200913-173924.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/7d9e0aaa-ebd8-2aa6-0f4f-8043b18fe8d3.png)
###Text classification
衣類画像の識別のようです。最後にmatplotlibで画像とグラフが表示されます。
![Screenshot_20200913-173816.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/b478d0f5-969d-2e6c-fa89-bf687a7c8fd2.png)　![Screenshot_20200913-173924.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/6ed88594-5573-e918-62d0-9195fa12483f.png)
このサンプルソースをWindowsに持っていって走らせてみたら、そのまま１行も変えずに動かすことができました。
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/17ca7fef-6c70-be48-fe18-4821fc86fcf0.png)
###Regression
車のスペックから燃費を推測して、本当の値と比べてるのかな？
![Screenshot_20200913-174249.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/816fed41-0acb-b657-dba2-629c12c6cd80.png)
これも同じソースがWindowsでも動きます。
##OpenCV
古い機種ではOpenCVがダウンロードができないものがありました。別の機種ではカメラが動作しない、カメラが使える機種でも動作が安定しない、などカメラ機能は問題があります。
###Hello camera
カメラが安定しません。一度だけ動きましたが、キャプチャを撮るのを忘れてました。
Zenfone3 Maxで試したところ次のようなメッセージがでて動作しませんでした。
Camera NDK APIをサポートしている機種でないとダメみたいです。
![Screenshot_20200914-140205.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/00ac3374-33a6-3262-5b77-6bd400316c0a.jpeg)

Windowsで実行すると次のようなエラーがでまくります。

```
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (374) `anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -1072875772
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (386) `anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error status: -1072875772
[ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (906) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -1072875772
[ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (906) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147483638
[ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (906) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147483638
```

###Laplacian
これもカメラが安定しません。何度かやってると動きました。リアルタイムに輪郭抽出します。
![Screenshot_20200913-184729.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/9a3ad03a-b974-8724-8672-7199d9a1b36e.png)

###Face detector
これはキャプチャのやり方が他と違うのか安定してます。リアルタイムに顔を検出します。
![Screenshot_20200913-185402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/b50da71d-e319-2d49-675e-9287534f51b9.png)
サンプルは自撮り用に前面カメラ(1)を使ってますが、カメラ番号を(0)にするとPCでも動作します。PyQt5をインストールする必要があります。
![Screenshot_20200913-094118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/7317802f-150d-3810-bbaa-068a95eda8cd.png)
###ASCII camera
これまたまたカメラが安定しません。右の人形を撮ると左のようにASCII文字で表示します。
![Screenshot_20200913-184036.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/07b7570f-460f-9340-fc23-b1f2ddff6622.png) ![IMG_20200913_184053s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/c1c57e54-3f22-73dc-7acb-ac2142337831.jpeg)

###Camera options
カメラの設定をするもののようですが、よく分かりません。
![Screenshot_20200913-233723.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/dde99785-b554-7fe1-1b5c-ed429eec803a.png)

##PyTorch
###Tensors
なんか動いているようです。
![Screenshot_20200913-234202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/68b04a98-ff35-570f-e02d-2e1e174fe364.png)
###MNIST
動いているようですが、ものすごく時間がかかります。Epoch=5 ですが、30分くらいかかりました。
![Screenshot_20200913-234722.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/3b6f74d7-9f5f-e6eb-d26b-68998b03a530.png)

###Pretrained model
画像をダウンロードして何が写ってるか判定します。ダウンロード済の画像でも判定に数十秒かかりました。
![Screenshot_20200913-081552.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/afb60a8a-a851-24dc-b913-34826387b3c2.png) ![Screenshot_20200913-081711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/277c41af-2660-4556-566c-737d08643400.png)

###Quantized model
このカメラは安定しているようです。カメラに写ったものをリアルタイムに識別します。ステンレスのタンブラーがカクテルシェーカーと判定されましたが似てるかも。
![Screenshot_20200913-192101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/ba1a6ce4-b0e4-11c6-efd2-e006449e3bf9.png)

#まとめ
互換性は高く、たいていのサンプルはPCでもそのまま動きます。OpenCVのサンプルでカメラが不安定なものがあるのが気になりますが、安定した動きをするサンプルもあるので回避する方法はありそうです。Pydroid3でカメラを使うには、別アプリで撮影し、すぐに切り替えて処理する手もありますか、リアルタイムにカメラ画像を使うには、この有料オブションを使うしかないでしょう。ただし、サポートしていない機種の場合はどうにもなりません。

モデルの学習もできますが、スマホは遅いので実用にはならないと思います。大量にデータを取ってバッチ的にイッキに学習させるというのは、気の向いたときに写真をとったりネットを見たり電話がかかってきたり、何かと割り込みが多いスマホには向いてません。ホームではなく出先でデータや写真を撮ってすぐに学習させていくというやり方がいいのかもしれません。

スマホでブログラムが組めるというのは楽しそうです。以前自分でもそういう環境( [アプリを作るためのAndroidアプリ、「PineVentor」](https://ascii.jp/elem/000/001/081/1081214/ ) )を作ったことがあります。ただしスマホだけで開発するのはなかなかキツいものがありました。Pydroid3はPCでも同じスクリプトが使えるので、いったりきたりしながら作るといいことがあるかもしれません。ただし今のところ気軽にいろんなところでスクリプトを渡り歩いていく仕組みはないので、いろいろ工夫する必要はありそうです。

出先にノートPCを持っていくほどではないが、ちょっとした空き時間にプログラムしてパズルをといたりゲームでズルしたりしたい人向けでしょうか。現場でデータを取ってすぐに時系列のグラフにすることができると、より深いデータ収集ができるかもしれません。無料のPydroid3でもかなり遊べるので、リアルタイムにカメラを使う必要がなければ、有料オプションはぜひとも必要ではありませんが、無料で３日お試しする価値はあると思います。
機種によってはカメラが動かなかったり、古い機種だとOpenCVまるごと動かなかったりするので、購入するにしても゛お試しはやった方がいいです。