[Amazon Bedrock] Amazon Titan Multimodal Embeddings G1モデル を使用して、生産ラインにおける外観検査を試してみました
1 はじめに
製造ビジネステクノロジー部の平内(SIN)です。
Amazon Bedrockで利用可能なAmazon Titan Multimodal Embeddings G1モデル は、 テキスト、イメージ、または、その組み合わせによるマルチモーダル埋め込みモデルです。
今回は、これを利用して、外観検査を試してみました。
以前、Embedding(埋め込み)モデルで、画像を数値ベクトルに変換し、画像の差異を判別(分類モデルとして利用)できることを確認できました。
今回は、部品や製品の品質を維持・保証する目的で行う、外観検査を試してみました。
最初に、作成したデモが動作している様子をご確認下さい。
ベルトコンベア上を流れる製品(アヒル)は、カメラで監視されており、ペイントが漏れていたり、汚れが検出されたアヒルは、ライン上から排除されます。
2 構成
ベルトコンベアの上のiPhoneは、生産ラインのアヒルを撮影するためのカメラとして利用されています。iPhoneの下には、IR赤外線障害物回避センサーモジュールが配置されており、アヒルの通過を検出しています。後段のサーボモータは、異常なアヒルを検出したときに、ラインから排除するためのものです。
Jetson AGX Orinの画面です。iPhoneに写っている「カメラの画像」とその一部(緑枠内)を「Fast SAMでセグメンテーションした画像」そして、検査の雑音となる背景を排除してアヒルが中央になるように補正された「補正後の検査画像」が写っています。
最終的にベクトル化され検査されるのは、「補正後の検査画像」です。
3 埋め込みモデルによる外観検査
製造ライン等における、外観検査を自動化する場合、機械学習(画像認識)による物体検出モデルなどが使用されることがありますが、このようなモデルを作成するためには、異常状態の画像を数多く準備する必要があります。そして、検出できるのは、準備できた異常な状態のみとなります。
機械学習の知識・プログラミング不要 外観検査の機械学習モデルを作ろう
しかし、今回試した方法だと、用意するのは、「正常な画像1枚」のみです。
次の図は、比較のための「基準イメージ」と、特に問題のない「正常系(基準イメージと同じ画像ではありません)」と、ちょっと汚れなどをつけた「異常系」の画像をベクトル化してコサイン類似性で差異を検出してみたものです。
異常な状態のものは、ベクトルに一定以上の距離が出ているのが分かります。今回の外観検査は、この距離を利用しています。
4 画像補正
実は、「赤外線センサー」で検出したタイミングで撮影した画像は、ターゲットを正確に中心を捉えられていません。このまま、基準画像との比較を行ってしまうと、正常系の差分が大きくなってしまうので、この画像の補正を行っています。
まずは、アヒルだけを抽出するため、SAM(Segment Anything Model)を使用しています。Segment Anything | Meta AIは、非常に精度高くセグメンテーションできるのですが、検出(推論)に2秒程度かかってしまうため、ベルトコンベアーで次々流れる物体を処理するには、ちょっと間に合いませんでした。
そこで、今回は、Fast SAMを使用しています。
こちらだと200msec程度で処理できるため、FPSを少し下げれば対応できている感じです。
参考:FastSAMで高速道路を走行する車両をセグメンテーションをしてみました(上下線や追い越し車線も判定してみました)
続いて、検出したアヒルをマスクして背景を黒に塗りつぶし、アヒルの矩形を計算して画像の中央に移動しています。
ここまで補正すると、基準画像との差分が比較的小さくなって、異常状態の検出が可能になりました。
今回作成したコードです。
5 コサイン類似性
Amazon Titan Multimodal Embeddings G1モデルは、boto3から使用しています。
画像を対象にする場合、base64でテキスト化して、パラメータに渡します。
response = self.bedrock.invoke_model(
body=json.dumps(
{
"inputImage": base64.b64encode(body).decode("utf8"),
"embeddingConfig": {"outputEmbeddingLength": self.dimensions},
}
),
modelId="amazon.titan-embed-image-v1",
accept="application/json",
contentType="application/json",
)
コサイン類似性の算出は、sklearnのcosine_similarity() で行っています。
基準となる画像のベクトルを保存しておいて、検出画像のベクトルと比較し、0.9以上か以下かで判定しています。
class Embedding:
def compare(self, target_img_path) -> List[float]:
target_embedding = self.__create_embedding(target_img_path)
cosine = cosine_similarity([self.base_enbedding], [target_embedding])
return cosine[0][0]
cosine = embedding.compare(save_file_name)
if cosine < 0.9:
servo.close_gate()
Embeddingクラスのコードです。
参考
6 課題
(1) カメラの焦点
次の左右の画像を比べていただくと、左の方がシャープに写っている事が分かると思います。
実は、左は、ベルトコンベアーが停止している状態で撮影したもので、右は、動作中のものです。対象物が移動してしまうと、オートフォーカスでのピント合わせが間に合わないよです。このため、当初イメージしていた、僅かな異常の検出が難しくなっています。
カメラは、最初Webカメラを使用していたのですが、解像度が低くて精度が上がらなかったため、iPhoneに変更したのですが、最終的にピントの問題は、解決できませんでした。
こちらは、デモでの限界となりました。精度を上げるには、固定でピント調整できるカメラの準備が必要なことが分かりました。
(2) 回転補正
計画段階の「画像補正」では、ターゲットを中央に移動した後に、回転を補正しようと考えていました。しかし、特徴点検出がうまく行かず断念してしまいました。
これも、先のピントの問題がクリアできれば、同時に解決できるかも知れません。
7 その他
埋め込みモデルによる外観検査とは、直接関係ありませんが、今回使用したものについて、簡単に紹介させて下さい。
(1) DroidCam
画像の解像度や、ピント調整に限界を感じて、WebカメラからiPhoneに移行する際に使用したのが。https://droidcam.app/
です。
このアプリは、iPhoneにインストールするだけで利用可能で、OpenCVからは、以下のようにhttpでアクセスできます。
解像度も 1920 x 1080まで対応しており、カメラの機能をそのまま利用できます。
droid_cam = "http://192.168.1.41:4747/video/force/1920x1080"
cap = cv2.VideoCapture(droid_cam)
if cap.isOpened() is False:
raise IOError
(2) IR赤外線障害物回避センサーモジュール
IR赤外線障害物回避センサモジュールは、可変抵抗で感知する距離を設定できます。電源と信号線だけで接続し、GPIO(INPUT)で、検知の有無(0若しくは、1)が取得できます。
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD) # 物理ピン番号で指定
GPIO.setup(self.SENSOR_PIN, GPIO.IN)
sensor = GPIO.input(self.SENSOR_PIN)
関連コードです。
(3) サーボモータ
SG90 サーボモータも電源と信号線の3線で利用可能ですが、こちらは、PWMでの制御になります。
なお、Jetson AGX Orinでは、デフォルトでPWMが有効になっていないため、 ツールを使用して有効化する必要があります。
% sudo /opt/nvidia/jetson-io/jetson-io.py
Select desired functions (for pins): |
| |
| [ ] can0 (29,31) |
| [ ] can1 (33,37) |
| [ ] dmic3 (16,32) |
| [ ] dmic5 (16,32) |
| [ ] extperiph4_clk (7) |
| [ ] i2s2 (12,35,38,40) |
| [ ] pwm1 (15) |
| [*] pwm5 (18) <<= ここにチェックを入れる |
| [ ] pwm8 (13) |
| [ ] spi1 (19,21,23,24,26) |
| [*] uarta-cts/rts (11,36) |
| |
| Back
参考:
関連コードです。
8 最後に
今回は、埋め込みモデルによる外観検査を試してみました。
埋め込みモデルのベクトル化には、約1,000 msecを要するため、ラインの速度に対応可能かどうかが、一つの条件にはなりますが、充分な選択肢になるような気がしています。
画像や、照明等も、精度に大きく影響しますが、こちらは、通常の物体検出モデルを使用する場合も同じだと思います。
デモ用の製造ラインを作成するために購入したブロックは、すでに孫のおもちゃになってます。\(^o^)/
9 参考リンク
AWS の機械学習サービスを使った外観検査プロジェクトの進め⽅
機械学習の知識・プログラミング不要 外観検査の機械学習モデルを作ろう
cosine_similarity