超初心者の機械学習入門

目的

 自分の撮影した写真をもとにして、スマホで画像を判別するアプリを作る

---------------------

概要

・スマホを使った画像分類の方法を教えてくれるサイトがいくつかあるが、その多くは既存の画像データセットを用いたものである。ここでは、自分の撮影した写真を教師データとして、画像の判別アプリを作る。

・この方法を使えば、独自の視点から画像を判別するアプリを作ることができる。例えば、家族の一人にスマホを向ければ誰であるか答えるアプリや、子どもの絵とピカソの絵を区別するアプリなどを作ることができる。

・ここで行うのは、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 のファイルを作ることができた。
 基本は、GoogleColaboratory(以下、Colab)に上記のひな型を読み込んで動かせばよい(Colabについて知らない人は別途調べほしいが、ネット上にGoogleが公開している開発環境で、機械学習を高速で行えるGPUを使うことができるというもの)。方法は詳細は次のとおり。

・例えば犬と猫を区別するアプリを作るのならば、「dog_or_cat」というフォルダを自分のPCに作り、その下に「test」と「train」という2つのフォルダを作る。さらに、testとtrainのそれぞれの下に「dog」と「cat」というフォルダを作り、その中に犬の画像、猫の画像のファイルを入れておく。trainにはトレーニング用の画像、testにはテスト用の画像を入れるが、その重複がないようにする。(私の場合、トレーニング用には100枚、テスト用には30枚の画像を使った。通常はもっと多くの画像を使うと思うが、この程度でもかなりの判定の精度を出すことができた)
 こうして作ったフォルダをGoogleDriveにアップロードしておく。

・東京化学同人のウェブサイトの『深層学習入門』のページ(下記)から、リンク先のURL一覧表(PDFファイル)を開く。
この中から、まえがき2にあるgithubのサイト
に行って、ファイルをダウンロードして解凍・保存しておく。できれば本も買って第10章までをだいたいで良いので理解しておくとよいと思う。

・Colabのサイト
にアクセスし、で「ファイル」メニューから「新しいノートブックを作成」をクリック。「アップロード」を選ぶとPCのファイルから選択できるようになるので、『深層学習入門』のダウンロードしたファイルの中から「Transfer Learning in Keras」を選んで開く。すると、Colabの上でコードの編集ができるようになる。ファイルに適当な名前を付けて、自分のPCまたはGoogleDrive上などに保存する。

・コードのいちばん最初に次のコードを付け加える。
from google.colab import drive
drive.mount('/content/drive')
 このコードが書かれた四角い枠(セル)の左上隅にカーソルを持っていくと▶マークが出てくるので、これをクリックして実行し、出てくる確認ウインドウで「はい」やら「続ける」をクリックする。これによって、GoogleDriveの中のファイルを扱うことができるようになる。

・途中に出てくる
'./hot-dog-not-hot-dog/train' './hot-dog-not-hot-dog/test'
 を、自分がアップした画像フォルダのパスに変更する。すなわち、画面左カラムのフォルダのマークをクリックするとそこにColabで扱えるファイルが表示される(すでに表示されているかもしれない)。GoogleDrive上に自分がアップしたフォルダ(例えば dog_or_cat/train)も表示されるので、それを右クリックしてパスを取得し、これによって上記を置き換える。

・途中に出てくる2か所の
classes=['hot_dog','not_hot_dog'],
 の中の hot_dog not_hot_dog を自分が分類したいものの名前(例えばdog と cat)に置き換える。

・私の場合、用意した画像の数が少なかったため、bach_size を10に、steps_per_epoch を10に、validation_stepを3に変更した。batch_size × steps_per_epoch はトレーニング用サンプル数以下でなければならないし、batch_size × validation_steps はテスト用サンプル数以下でなければならないようである。

・ここまでを行って全て実行する(上のメニューバーから「ランタイム」「すべてのセルを実行」)と、次のような表示が出てくるはず。
ここで、lossはトレーニング用サンプルに関する誤差の指標、accuracyはトレーニング用サンプルの中で正しく判定されたものの割合です。val loss, val accuracy は、テスト用サンプルについて誤差の指標および正しく判定されたものの割合である。

・ここで作ったモデルをTensorFlow Liteの形式で出力するため、次のコードをいちばん最後に付け加える。
model.save('/content/saved_model/myModel')

%pip install tflite-support

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model('/content/saved_model/myModel')
tflite_model = converter.convert()

with open("myTfliteModel.tflite", "wb") as f:
  f.write(tflite_model)

 これで、Colabのsaved_modelというフォルダにmyModelという名前でモデルが保存されている。さらにmyTfileModel.tfliteという名前のTenosrFlow 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の最新バージョンだと使えないようだ。

 


 

 



コメント

このブログの人気の投稿

目覚まし時計アプリを公開します

画面回転で苦労した話(原因はわかった)