初心者でもできる画像異常検知プロンプトの自動生成
こんにちは。松尾研究所AIエンジニアインターン生の有田です。
現在、生成AI関係のプロジェクトに参加させていただいております。
プロジェクトの中で、プロンプトエンジニアリングを活用した画像の異常検知を検討する機会がありました。プロンプトエンジニアリングに精通した方であれば、プロンプトを構成して画像の異常検知の精度を上げることができますが、初心者の方にはなかなか難しいです。
そのため、異常かどうかを判別したい画像と一緒に入力する「異常検知を精度良くできるプロンプト」を生成AIに自動で作ってもらえれば、誰でも簡単に高精度で画像の異常検知ができるのではないかという話がチーム内でもりあがりました。
Segment any anomary(SAA)などのゼロショット(事前の特別な訓練なし)のプロンプトで異常検知する手法なども出てきていますが、
- 推論に時間がかかるので、もっと判定までの時間を短くしたい
- より詳細な情報をテキストベースで得たい
- コードを書かなくても、異常検知をしたい
などのモチベーションがあり、今回検討することとなりました。
今回はまだまだ実験段階ですが、「異常検知を精度良くできるプロンプト」を自動で作る方法を紹介したいと思います。
1. 全体のイメージ
まだあまりイメージがつかないと思うので、まずは何を作りたいか具体例で見ていきましょう。今回は異常検知によく用いられるデータセットであるMVTec ADのヘーゼルナッツの画像を使っていきたいと思います。
異常かどうかを判別したい画像と何らかの「異常検知を精度良くできるプロンプト」を入力することで、その画像の異常検知をすることが目標です。
つまり、入力はこの画像と、何らかの「異常検知を精度良くできるプロンプト」です。
その入力を受けて、出力フォーマットはこんな感じになると良いですね。
#出力フォーマット
画像の種類: ヘーゼルナッツ
主要な特徴:
異常の種類:
異常の程度:
信頼度:
追加コメント:
「異常検知を精度良くできるプロンプト」を自分で作っていくのは大変なので、それを自動で作成してくれる仕組みを作っていきたいというわけです。
2.「異常検知を精度良くできるプロンプト」を作るための「プロンプト」
さて、画像と一緒に入力し、「異常検知を精度良くできるプロンプト」とはどのようなものでしょうか。
- 正常と異常の基準が明確
- 分析手順がstep by stepに示されている
- 具体例があり、その具体例から判定の基準を学べる
などが考えられると思います。
この辺りのプロンプトを自分で作成するのはなかなか手前ですし、基準も適当になってしまいそうですよね。
なので、この辺りを生成AIが勝手に作ってくれると便利です。
これを生成AIにやってもらうためにも、「プロンプト」を使います。
つまり、「異常検知を精度良くできるプロンプト」を作るための「プロンプト」というわけです。その「プロンプト」は、画像を数枚与えただけで、基準を自動で決めてくれて、「異常検知を精度良くできるプロンプト」を自動で作ってくれます。このように、他のプロンプトを作成するためのプロンプトを「メタプロンプト」と呼びます。
まだイメージできていないかもしれませんが、次の章で実際に使っていくのでぜひ確認してみてください。
3.「異常検知を精度良くできるプロンプト」を作成するための準備
では、早速ですが「異常検知を精度良くできるプロンプト」を自動で作成していきましょう。そのために前章で話した、「異常検知を精度良くできるプロンプト」を作るための「メタプロンプト」が必要です。
そのメタプロンプトと画像を数枚入力すると、異常の定義などを自動で決めて「異常検知を精度良くできるプロンプト」を作成してくれます。
下記が、「異常検知を精度良くできるプロンプト」を作るためのメタプロンプトです。画像の種類を問わずに使えるように作りました。
#プロンプト
あなたは、様々な種類の画像に対する異常検知プロンプトを生成する専門家です。
ユーザーから提供される複数の画像サンプルを分析し、それらに基づいて効果的な異常検知プロンプトを作成します。
以下の手順に従ってプロンプトを生成してください。
1. 画像の分析: - 提供された画像サンプルを注意深く観察してください。 - 各画像の特徴を以下の点に注目して記録してください:
a) 画像の種類(例:機械部品、自然風景、医療画像など)
b) 画像内の主要な要素や構造
c) 色彩、テクスチャ、形状などの視覚的特徴
d) 特筆すべき特徴や異常と思われる箇所
2. 共通パターンの特定: - 提供された画像群に共通する特徴やパターンを見つけ出してください。 - 「正常」と思われる画像の特徴を列挙してください。 - 「異常」と思われる画像の特徴を列挙してください。
3. 異常の定義: - 分析した画像群に基づいて、何を「異常」とみなすかを定義してください。 - 異常の種類や程度を分類してください(例:軽度の異常、重度の異常など)。
4. 測定基準の設定: - 異常を判定するための定量的または定性的な基準を設定してください。 - 可能であれば、数値化できる指標を提案してください。
5. 分析手順の作成: - 新しい画像を分析する際のステップバイステップの手順を作成してください。 - 各ステップで注目すべきポイントを明確に示してください。
6. 出力フォーマットの指定: 以下のような形式で出力するよう指示してください:
・画像の種類:
・主要な特徴:
・異常の有無:
・異常の種類(該当する場合):
・異常の程度(該当する場合):
・信頼度(0-100%):
・追加コメント:
7. 注意事項の追加: - 画像の一対一の対応ではなく、特徴の捉え方と異常の判断方法を学習し、新しい画像にも対応できるようにすることを強調してください。 - 判断が難しい場合の対処方法(例:人間の専門家への相談)を提案してください。
8. 例示: 分析した画像サンプルから2-3個の例を選び、それぞれについて詳細な分析と出力例を示してください。
9. 柔軟性の確保: - 生成されるプロンプトが様々な種類の画像に対応できるよう、柔軟性を持たせることを強調してください。 - 新しいタイプの異常や予期せぬパターンに対処する方法を含めてください。
#ユーザーから受け取る画像:資料欄にn枚(どれが異常でどれが正常かもあなたが決めるのです)
長いので詳細の解説は省略しますが、このメタプロンプトと画像を数枚入力するだけで「異常検知を精度良くできるプロンプト」が完成します。
次の章で「異常検知を精度良くできるプロンプト」がしっかりと作成できるかを確認してみましょう。
4.「異常検知を精度良くできるプロンプト」を作成してみる
では前の章のメタプロンプトを使って「異常検知を精度良くできるプロンプト」を作成していきましょう。先ほどのメタプロンプトといっしょに下記の四枚の写真を学習用として渡してあげます。
結果として出てきた「異常検知の精度が良くなるプロンプト」はこの通りになりました。具体例として1枚目の画像と4枚目の画像が挙げられているので、実際に異常検知をするときも2枚の画像を入力します。
ヘーゼルナッツ異常検知プロンプト:
1. 画像の分析:
a) 画像の種類: ヘーゼルナッツ(単一の実)
b) 主要な要素: 殻、核(中身)、外皮(薄い茶色の部分)
c) 視覚的特徴: 楕円形、茶色の色調、滑らかな表面、縞模様のような筋
2. 共通パターンの特定: 正常な特徴: * 均一な茶色 * 滑らかで傷のない表面 * 楕円形の形状 * 縞模様のような自然な筋 異常と思われる特徴: * 色の不均一性(黒ずみ、変色) * 表面の損傷(穴、ひび、凹み) * 形状の歪み * 外皮の剥離 * 虫食いの跡
3. 異常の定義: * 軽度の異常: 小さな変色、微細な傷 * 中度の異常: 明確な変色、小さな穴、部分的な外皮の剥離 * 重度の異常: 大きな穴、広範囲の変色、顕著な形状の歪み、明らかな虫食いの跡
4. 測定基準: * 色の均一性(0-100%) * 表面の完全性(0-100%) * 形状の正確さ(0-100%) * 外皮の被覆率(0-100%)
5. 分析手順:1. 全体的な形状を確認2. 表面の色を観察し、不自然な変色がないか確認3. 表面の傷や穴の有無を確認4. 外皮の状態を確認5. 虫食いの跡がないか確認 6. 各測定基準に基づいてスコアを付ける
6. 出力フォーマット:
・画像の種類: ヘーゼルナッツ
・主要な特徴: [観察された特徴を記述]
・異常の有無: あり/なし
・異常の種類(該当する場合): [軽度/中度/重度] の [具体的な異常]
・異常の程度(該当する場合): [1-10の尺度]
・信頼度(0-100%): [分析の確信度]
・追加コメント: [特記事項や推奨事項]
7. 注意事項: * この分析は一般的なヘーゼルナッツの特徴に基づいています。品種による違いがある可能性があります。 * 判断が困難な場合は、食品安全の専門家に相談することを推奨します。
8. 例示: 例1(画像1): ・画像の種類: ヘーゼルナッツ ・主要な特徴: 楕円形、均一な茶色、滑らかな表面 ・異常の有無: なし ・信頼度: 95% ・追加コメント: 典型的な健康なヘーゼルナッツの特徴を示しています。 例2(画像4): ・画像の種類: ヘーゼルナッツ ・主要な特徴: 楕円形、茶色、表面に穴あり ・異常の有無: あり ・異常の種類: 重度の虫食い跡 ・異常の程度: 8/10 ・信頼度: 90% ・追加コメント: 虫害の可能性が高く、食用には適しません。廃棄を推奨します。
9. 柔軟性の確保: * 新しいタイプの異常(例:カビ、変形)に遭遇した場合は、「未分類の異常」として記録し、詳細な説明を追加してください。 * 季節や生育条件による色の微妙な変化にも注意を払ってください。
5.実験してみる
では前の章で作成したヘーゼルナッツ異常検知プロンプトとともに異常かどうかを判別したい画像を一枚入力してみましょう。
画像はこの画像を入れてみます。
出力結果は下記の通りになりました。
画像の分析結果は以下の通りです:
・画像の種類: ヘーゼルナッツ
・主要な特徴: 楕円形、茶色の殻、部分的に露出した内部(核)、表面に細長い傷あり
・異常の有無: あり
・異常の種類: 中度の表面損傷
・異常の程度: 5/10
・信頼度: 85%
・追加コメント: ヘーゼルナッツの殻に細長い傷が見られます。これは機械的な損傷か、収穫・輸送時の取り扱いによる可能性があります。傷は深刻ではありませんが、内部への微生物侵入のリスクが若干高まる可能性があります。食用前に慎重に確認することをお勧めします。また、殻の一部が剥がれて内部が露出していますが、これは通常の状態の範囲内かもしれません。全体的な品質は許容範囲内と思われますが、長期保存には適さない可能性があります。
いい感じで異常検知できていますね。
6.最後に
異常検知プロンプトを数枚の画像を用意するだけで準備することに成功しました。
テキストのみのタスクでは、タスクに対する初期のプロンプトに対して類似の挑戦的なタスクをLLMに生成させて、それを解かせることで初期のプロンプトの弱点を探る手法(Intent-based Prompt Calibration: Enhancing prompt optimization with synthetic boundary cases)や、プロンプトを編集・生成する役割のLLMと生成されたプロンプトの質を評価する役割のLLMの二つのLLMを準備してプロンプトを徐々に改善していく手法(Evoke: Evoking Critical Thinking Abilities in LLMs via Reviewer-Author Prompt Editing)など、自動プロンプト生成の技術はたくさん出て来ています。
ゼロショットで異常検知する時も人が明示的に指示をしていませんが、今回は工夫として最初に複数枚与えて基準を設定させ、step by stepで考えさせるフェーズを追加してみました。
まだまだ改善点として、
- メタプロンプトを入力する時に与えた画像に特化しすぎたプロンプトが生成されてしまう可能性がある(過学習ぽい)
- 未知の異常には対応しずらい
なども挙げられると思うので、今後も検討していきたいです。
今回は、あまり試されていない画像を含めたマルチモーダルな自動プロンプト生成を簡単にですが試してみました。
ヘーゼルナッツの異常検知プロンプトを作成してみましたが、もっといろんな画像にも使えると思うのでぜひ使ってみてください。まだまだプロンプトもいろんなカスタマイズの余地はあると思います。
画像も含めたマルチモーダルな自動プロンプト生成の研究もこれから注目です。
最後までお読みいただきありがとうございました。
Discussion