StableDiffusionで生成した画像で画像認識AIを作ってみた
基盤モデルの記事の後日談
私は普段、農作物の外観を選別する画像認識AIや物体検出AIをディープラーニングで作成しています。
対象の農作物の画像や動画を収集してディープラーニングすれば簡単にAIを作れるので、便利な時代です。
ところで、農作物の収穫や選別の基準は、対象の農作物ごとに異なります。
そのため、収穫ロボットや選別機に搭載するAIを開発する場合、まずは農作物ごとに分類項目を明確に決めて、それぞれのデータを収集します。
分類項目が増えれば、その分集めるデータの種類も増えて手間が増えます。
データ収集はメジャーな農作物であればAIの利用者も増えてはかどりますが、そうでない場合はデータがなかなか集まりません。
また、同じ農作物でも巨峰やシャインマスカットのように基本的な色や形が違うものは、それぞれ別にAI開発をしなければなりません。
さらに、地域ごとに出荷規格が変わればアノテーションもその都度やり直さなければならないなど、農業分野でのAI開発はまだまだ発展途上です。
そんな中、前回の記事で、基盤モデルを農業の収穫ロボットや選別機へ応用したらどうなるか予想してみました。
その中で、文章から画像を生成するStableDiffusionを基盤モデルに見立てて、良品や不良品(形状不良, 割れ, 変色)の計4種類の農作物の画像を生成しました。
基盤モデルとは違いますが、StableDiffusionも大規模データセットで開発されて様々な表現が可能なAIです。
その結果、次のようにそれぞれの特徴を加味した画像を生成できました。
これができるなら、将来登場する基盤モデルは映像から農作物を見つけて、その外観の特徴を言語などで表現(変換)して収穫や選別の判定ができる、とも考えられます。
基盤モデルが農作物の基本情報を知らなければ、各農作物の良品画像だけを収集してファインチューニングすれば、いろんな農作物へ対応できるAIができあがるのではないでしょうか。
StableDiffusionで生成した画像を学習データにしてみたら?
StableDiffusionで良品や不良品の特徴を捉えた農作物の画像を生成しつつ、ふと
「StableDiffusionで生成した画像でAIを作れば、どんな農作物の選別にも使える汎用的な選別AIを作れるのでは?」と考えました。
GAN(敵対的生成ネットワーク)で生成した画像で教師あり学習することと同じですね。
StableDiffusionは、良品・不良品それぞれの特徴をとらえた農作物をまずまずの精度で描写できます(たまに特徴が含まれない画像を生成することもありますが)。
そのため、高品質な学習データを大量生成できるはずです。
そうして生成した画像を使ってディープラーニングすれば、農作物ごとにデータ収集する必要がなく、また基盤モデルを使わなくてもどんな農作物にも対応可能な選別用AIを作れるかも。
…ということで今回は、StableDiffusionで「良品」「不良品(形状不良)」「不良品(割れ)」「不良品(変色)」の4種類の画像を大量に生成して、農作物の選別用画像認識AI(ResNet152)を作成してみました。
そして、テストとしてエダマメを選別させたときの結果をご紹介します。
画像生成とディープラーニングの手順
今回取り組んだことの流れは次のとおりです。
まず、こちらのサイトのコードを利用させていただき、以下の4項目の画像を生成しました。
- good(良品)
- bad_shape(形状不良)
- bad_crack(割れ)
- bad_color(変色)
StableDiffusionのプロンプトへの入力内容は、それぞれ次の通りです。
- good appearance vegetable or fruit, not defective
- defective shape appearance vegetable or fruit, not good product, distorted in shape
- defective crack appearance vegetable or fruit, not good product, crack, broken piece
- defective color appearance vegetable or fruit, not good product, disease, insect infestation, withered
生成した画像数はそれぞれ約10,000枚です。
真っ黒なNG画像が時々生成されたので、それらは画像生成後に削除しておきました。
生成した画像の一例はこちら。
good(良品)の生成画像の一例
bad_shape(形状不良)の生成画像の一例
bad_crack(割れ)の生成画像の一例
bad_color(変色)の生成画像の一例
たまに「?」な画像も生成されましたが、ひとまずそのまま残しておきます。
次に、ディープラーニングで画像認識AI(ResNet152)を作成しました。
実装にはこちらのサイトのコードを利用させていただきました。
テスト画像を分類させた結果&Score-CAMで可視化した結果
作成した画像認識AIでエダマメの選別をさせた結果がこちらです。
同時に、Score-CAMで分類根拠も可視化してみました。
図の上段はテスト画像で、下段はScore-CAMで分類根拠を可視化した結果です。
また図中の「correct:」は正解のラベルで、「prediction:」は画像認識AIの選別(分類)結果です。
good(良品)のエダマメの選別結果
bad_shape(形状不良)のエダマメの選別結果
bad_crack(割れ)のエダマメの選別結果
bad_color(変色)のエダマメの選別結果
…うーんこの
形状不良(bad_shape)と割れ(bad_crack)への誤分類が多発しています。
割れのエダマメはbad_crackへ正しく分類できているように見えますが、Score-CAMの結果を見ると分類根拠になる部分がほぼ無く、当てずっぽうに近い分類を行ったのでしょう。
精度が低い理由として、次のことが考えられます。
- 約40000枚生成した画像中にそれぞれの分類項目の特徴が含まれていない画像も含んでいた
- 生成画像にエダマメに近い野菜はほぼ含まれていなかった
- 画像認識AI(CNN)が各分類項目の特徴を学習できていない
- 生成した画像を吟味していたわけではないので似たような画像がそれぞれ含まれていた
- 生成画像にイラスト調のものや人が写っているものが含まれていた(ノイズ)
生成画像のうち、イラスト調や人が写っていたものがこちら。
一概に画像認識AI(CNN)が悪いとは言えませんが、StableDiffusionで生成した画像だけで作った画像認識AIに良品や不良品の特徴を学習させるのは困難そうです…
画像を精査したり、StableDiffusionのプロンプトに入力するキーワードを変えれば、多少精度は改善されるかも知れません。
それでも、CNNベースの画像認識AIや物体検出AIにいわゆる「汎用性」を持たせるのはまだ難しいかな、といった印象です。
おわりに
従来のCNNベースの画像認識AIや物体検出AIは、画素情報に畳み込み処理などを経て分類項目ごとに特徴量を抽出します。
ですが、いわゆる人間が考える「形の良い」「色の悪い」といった概念を理解しているわけではありません。
そのため、農作物の選別を柔軟にこなすために、基盤モデルのような「概念」を表現できるAIの登場に期待がかかります。
もちろん、農作物や分類項目を限定すれば、ディープラーニングで開発したCNNベースの画像認識AIや物体検出AIでも十分な精度を発揮できます。
農業分野でも農作物の選別に画像認識AIや物体検出AIを応用した事例は多数あり、できるところからAI化を進めていくべきです。
ただし、当面の間はAIはメジャーな農作物への利用にとどまると予想されます。
農作物はいろんな品目や分類基準があるため、汎用的に使えるAIを開発・運用することは並大抵のことではありません。
今後基盤モデルが登場したら、これらの課題はだいぶ改善されるはずです、
基盤モデルがこれらの課題を解決できるか、期待が膨らみます。
自由に使える基盤モデルが登場したら、私も研究で応用したいですねー。
Discussion
生成モデルによるデータ拡張の論点は、「学習データの持つ情報を越えるような情報を、同じデータで学習した生成モデルから得られるか?」ということだと思います。そもそも一般論として分類よりも生成の方が難しいタスクなので、基本的には生成モデルを作れる学習データがあるなら、それを使えば分類モデルを学習できるはず…