超初心者の機械学習入門
目的
概要
・スマホを使った画像分類の方法を教えてくれるサイトがいくつかあるが、その多くは既存の画像データセットを用いたものである。ここでは、自分の撮影した写真を教師データとして、画像の判別アプリを作る。
・この方法を使えば、独自の視点から画像を判別するアプリを作ることができる。例えば、家族の一人にスマホを向ければ誰であるか答えるアプリや、子どもの絵とピカソの絵を区別するアプリなどを作ることができる。
・ここで行うのは、TensorFlow Liteの形式で機械学習モデルを作り、これを組み込んだスマホ(ここではAndroid)のアプリを作ることである。
・TensorFlow Liteの形式でモデルを作るための比較的簡易なやりかたとして、TensorFlow Model Maker というライブラリを使う方法があったが、2024年3月現在、これは(普通のやり方では)使えない。TensorFlow のモデルをつくるには、少なくとも初心者は別の方法を使ったほうがいい。私は書籍に従ってKerasで作成した。Model Maker の代わりにMediaPipe Model Makerを使うと良いと言われているが、私はまだこのやり方でうまくいっていない。
・上記モデルを組み込んだアプリを作る方法を非常に親切に教えてくれるサイトがある。その通りに入力しても動かないが、わずかの手直しで画像を分類するアプリを作ることができた。
なお、この記事は約2か月前に機械学習の勉強を始めた超初心者によるものです。不備な点や誤りがあると思いますが、どうかご指摘いただければありがたいです。
----------------------
画像分類のモデルを作る
スマホで扱える機械学習モデルの形式として「TensorFlow Lite」がある。これを使えば、例えば花にスマホをかざすとその花の種類を5種類の中から答えてくれるといったアプリを作ることができる。
この方法を教えてくれるサイトがいくつかあるが、その多くは既存の画像のセットを使ってモデルを作るものである。しかし私は、自分の撮影した写真を教師データとして画像を分類するアプリを作りたかったので、その方法を模索した。(事情があって、車をななめ後ろから見た時、ドアミラーが開いているか閉じているかを区別したかった)
そのための手順は、まず.tfliteを拡張子とするTensorFlow Liteモデルのファイルを作り、さらに判別するためのスマホ用のアプリを作って、それにこのモデルを組み込むということになる。
Google Teachable Machine
このモデルを作る方法にはいくつかある。最も簡単なのは、Google Teachable Machineを使うもので、コーディングは必要ない。次のサイトにアクセスし、「使ってみる」「画像プロジェクト」を選択したうえで、自分で用意した写真をアップロードするだけである。例えば家族の顔を区別するならば、家族の顔写真をそれぞれ10枚程度アップロードしておけば、まあまあの精度で家族の写真を区別するようなモデルができるだろう。これに新たに家族の誰かの写真を読み込ませると、それが誰であるかの確率を提示してくれる。
https://teachablemachine.withgoogle.com
Google Teachable Machineは簡単に使える代わりに多くの画像を使う場合には非常に手間がかかる。画像ファイルのアップロードはドラッグアンドドロップだし、精度を確認するにはテストのための画像を1枚1枚ためす必要がある。各種設定の自由度も少ない。さらに、PC上ではうまく判別できたのに、スマホにすると判定が偏るという問題も起きたことがあり、これは今も原因不明である。
TensorFlow Lite Model Maker
そこで、もっと別の方法がないかと調べ、初心者にとって比較的取り組みやすそうと思えたのがTensorFlow Lite Model Makerを使う方法であった。しかもたいへんわかりやすいと言われている次のようなチュートリアルがあったので、私もこれで、スマホでモデルづくりにチャレンジしてようとした。結局はそのために相当な時間を無駄にしてしまったのだが。
https://codelabs.developers.google.com/codelabs/recognize-flowers-with-tensorflow-on-android/#0
https://www.youtube.com/watch?v=s_XOVkjXQbU&list=PL4Hi1-vxFC9t86VRBFlvyeK8cN6F0h6pm&index=1&t=680s
ところが、この通りにやってもModel Makerをインストールすることができない。最初はGoogle Colab上で、そのあとはVSCode上で行ってみたが、結構時間をかけて(多分10分くらい)あれこれダウンロードした後で次のエラーが出る。
ERROR: Cannot install tflite-model-maker==0.1.2,・・・
なぜそうなるのか、何かやり方がないかといろいろ探してみた結果、
https://github.com/tensorflow/tensorflow/issues/60431
https://github.com/tensorflow/tensorflow/issues/60493
これらによると、昨年5月頃から多くの人がこの問題にぶつかっており、TensorFlowの「開発チーム」が取り組んでいるとのことだが、昨年(2023年)10月にpkgoogle(おそらく開発側のアカウント?)から「問題の解決には時間がかかります」とのコメントがあった。その後進展のコメントはなく、2024年3月現在も使用できない(注1)。(ここにたどり着くまでに相当時間がかかってしまった)
問題の原因はおそらく、Pythonが3.9から3.10にアップグレードされたときに互換性がなかったということで、Pythonをダウングレードすれば解決できる可能性があるようなことが書かれているサイトもある。
私の環境では、VSCodeでカーネルがPython3.12だったものをPython3.9にダウングレードしてやってみると、 !pip install -q tflite-model-maker はうまくいったが、そのあとで import tflite_model_maker などとしてもインポートできない。
さらに、ColabではPythonのダウングレードのしかたがよくわからず、結局あきらめた。
できないのならできないとチュートリアルなどに書いてくれていたらよかったのに・・・。
Keras
さて、今のところうまくいったやり方は、まず、モデル作成についてはKrohn著『深層学習入門』という書籍
に沿って、Kerasを使ってモデルを作るというものである(注2)。この本からはいくつかのモデルのひな型がダウンロードすることもできるので、そこからTransfer Learning in Keras というひな型を使い、自分の撮影した画像を読み込んで(この部分も、自分の画像をGoogle DriveにあげておけばColabから読み込めることを最初は知らなくて苦労したのだが)、何とかTensorFlow Lite のファイルを作ることができた。
スマホでモデルを使うためのアプリを作る
TensorFlow Liteのモデルをスマホで使う方法については、次のサイトに従った。これは非常にわかりやすく書かれており、大変役に立った、というかほぼ書かれているとおりにコーディングした(どうもありがとうございました)。
https://www.arp-corp.co.jp/blog/contents/2022/07/002.html
ただ、それでも超初心者の私にとっては、次の2点、戸惑うことがあった。
(1)モジュールのgradleのdependencyにカメラのために次のような記述を追加するとあるが、
def camerax_version='1.0.0-alpha06'
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
これは自分の環境ではそのままでは機能せず、次のように書き直す必要があった。
implementation ("androidx.camera:camera-core:1.0.0-alpha06") implementation ("androidx.camera:camera-camera2:1.0.0-alpha06")
(2)ResultActivityの冒頭が次のようになっているが、
package
jp.co.arpcorp.flowerclassification
import
android.graphics.Bitmap
import
jp.co.arpcorp.flowerclassification.ml.Model
ここで、import jp.co.arpcorp.flowerclassification.ml.Model は、自分のプロジェクトの環境からインポートするということなので、このままでは動かない。そこで、
「 jp.co.arpcorp.flowerclassification」の部分を自分のプロジェクトの名前に置き換える必要がある。
さらに、ここで使われているCameraXという、スマホのカメラを操作するためのライブラリは少し古いバージョンであるが、これを新しいものにバージョンアップするとエラーが出て使えなくなるので、そのままにしておく必要がある。
ともかく、これで何とか、「自分のスマホを物に向けて、それを判別する」という目標を達成することができた。
さらに改善したい点としては、このアプリでは画像があてはまる確率が最も高いカテゴリーが何であるかを表示するだけで、確率の数値までは表示できない。また、このアプリではCameraXが古いのでこれを新しいものにするとともに、カメラのズーム機能が使えないがこれを使えるようにしたい。これらの点についてはまた後日報告させていただきたい。
---------------------------------
注1)
このスレッドの中で、グーグルの開発チームの人らしき人からのコメントで、TensorFlow ModelMakerの代わりに次の MediaPipe Model Maker なるものを使ってくださいとの趣旨のことが書かれていた。
https://developers.google.com/mediapipe/solutions/model_maker
これにも親切なチュートリアルがついており、これはそのままでColabで動くようだ(まだスマホで使えるかは試していない)。ただ、私は自分の撮影した写真などを読み込ませるやり方がよくわからなかった。そこで、その件を調べると次のチュートリアルがあった。
https://axross-recipe.com/recipes/1283
これは登録が必要だが、わかりやすく書かれている・・・ところが、この通りにやっても途中で動かなくなった箇所があり、今のところ解決できていない。
注2)
この本はとても良い本と思うのだが、他の部分で多く出てくるtfLearnというライブラリはModelMakerと同じくPythonの最新バージョンだと使えないようだ。
コメント
コメントを投稿