LLMで進化する画像の異常分類:AIによる自動解析と自然言語説明
画像内の予期しないパターンに、意味のあるカテゴリや説明を付けること(= 画像の異常分類)は、品質管理の自動化や医療診断の高度化に役立ちます。本ブログでは、画像データ向けの異常分類モデルである EfficientAD と、大規模言語モデル(LLM)を活用し、MATLAB で異常分類を行う方法を紹介します。
ここでご紹介するワークフローは、画像データに対する異常分類を自動化するだけでなく、LLM の助けを借りて、分類結果について自然言語での説明も生成します。また、LLM を活用した異常分類を行うために必要なコードは GitHubリポジトリにありますが、ここでも一部ご紹介します。
重要なコンセプト
異常分類とは?
異常分類とは、画像データにおける通常とは異なるパターンに対して、意味のあるラベルやカテゴリを割り当てる作業です。一般的な画像分類が「画像に何が写っているか」を識別するのに対し、異常分類は「どのような異常か」に特化しており、不規則なパターンを検出し、それがどの種類の異常に該当するかを判断します。たとえば製造業での異常分類としては製品表面の傷、へこみ、塗装不良などを区別することが求められるかもしれません。また医用画像の場合は、病変が良性か悪性かの分類が考えられます。
異常分類の難しさとしては、異常が往々にして稀かつ多様であり、文脈にも依存するという点が挙げられます。これにより異常分類は通常の分類タスクよりも複雑になります。効果的な異常分類モデルは、単に異常を検出するだけでなく、その性質・深刻さを解釈し、場合によっては適切な対応を提案する必要があります。そのためには、モデルに高い精度だけでなく、説明可能性や適応性も求められます。特に、新しい異常やこれまでに見たことのない異常が登場し得る環境では、これらの能力が不可欠です。
EfficientAD:リアルタイム異常分類のためのモデル
EfficientAD はリアルタイムな産業用途を想定して設計された、高性能な外観異常分類モデルです。このモデルは「スチューデント・ティーチャーアーキテクチャ」を採用しており、軽量なスチューデントネットワークが、事前学習された大規模なティーチャーネットワークの特徴表現を模倣するように学習されます。学習には「正常」または「期待される状態」を表す画像が使用されます。推論時には、スチューデントとティーチャーの出力の差異をもとに、異常パターンを分類します。このアーキテクチャは高速かつ高精度であり、1 枚の画像を 2 ミリ秒未満で処理でき、最新の GPU 上では毎秒 600 枚以上の画像処理が可能です。
EfficientAD の大きな特長は、「構造的異常」と「論理的異常」の両方に対応できる点です。
-
構造的異常:表面の傷やずれなど、局所的な特徴のズレによって検出されます。
-
論理的異常:意味的な構造の矛盾、例えば予期しない物体の配置などが該当します。
このような高度な分類を可能にするために、EfficientAD はオートエンコーダーモジュールを組み込み、画像全体の意味的な構造を捉えることができるようにしています。これにより、単純な見た目の違いを超えた分類が可能になります。その結果、EfficientAD は計算資源が限られた環境でも安定したパフォーマンスを発揮できる、迅速で柔軟なモデルとなっており、現実のアプリケーションに非常に適したものとなっています。
R2024b 以降、EfficientAD は MATLAB で efficientADAnomalyDetector オブジェクトとして利用可能になりました。この EfficientAD は、Automated Visual Inspection Library for Computer Vision Toolbox に含まれており、異常分類、異常検出、物体検出ネットワークの学習・評価・デプロイのための関数群を提供しています。
LLM による異常分類の高度化
EfficientAD が視覚的な異常を分類する一方で、大規模言語モデル(LLM) はその結果に文脈を与え、専門領域に応じた説明を提供し、結果の説明性を高めることができます。このような文脈において、LLM は以下のような役割を果たします:
- 異常マップを人間が理解しやすい形で解釈・表現する
- 過去の異常記録に基づき、潜在的な原因を推測する
- 自動異常レポート作成や対応策の提案を支援する
MATLAB では、API 経由またはローカルにモデルをインストールすることで人気のある LLM にアクセスできます。そしてお好みのモデルを使ってテキスト解析や生成を行うことができます。
LLM と MATLAB を連携させるためのコードは、Large Language Models (LLMs) with MATLAB リポジトリ で公開されています。
LLM にアクセスする方法は主に以下の3つです:
-
OpenAI® Chat Completions API(ChatGPT のベースとなる API)と接続
-
Ollama™ を利用したローカル LLM の活用
-
Azure® OpenAI Services を通じたクラウドベースの利用
それぞれの設定方法や使用例については、以下のブログ記事で詳しく紹介されています:
File Exchange Repository: Large Language Models (LLMs) with MATLAB
異常分類のコードをためしてみよう
私の同僚である福本拓司 (Takuji Fukumoto) が、異常分類を実行するためのコードをまとめた GitHub リポジトリ: Zero-shot anomaly classification with EfficientAD and LLM からアクセスできます。
すぐに試してみたい場合は、そのままリポジトリを確認してください。このあとリポジトリに含まれる主要なステップを順を追って解説していきます。
データセットの読み込み
まずは、異常分類を行う画像データを用意し、それを ImageDatastore に格納します。ImageDatastore
を使うことで、大量の画像を効率よく扱いながら処理できます。
dataDir = "CAEdemo"; downloadData(dataDir) Imgsize = [720 1280]; % Image size BlockSize = [256 256]; % Input size of Network numPatch =8; imds = imageDatastore(fullfile(dataDir,dataDir,"trainingimage"),IncludeSubfolders=true); imdsTrain = subset(imds,1:38); imdsTraint = transform(imdsTrain,@(x1) transformFcn(x1,BlockSize,numPatch));
学習用データセットからサンプル画像を表示する
まずは学習用データセットに含まれる画像の一部を表示してみましょう。これらは「布地(fabric)」の画像で、一見すると異常の有無を判断するのは非常に困難です。
numTrainImages = numel(imdsTrain.Files); idx = randperm(numTrainImages,16); I = imtile(imdsTrain,Frames=idx,GridSize=[4 4],BorderSize=10); figure imshow(I)
異常分類器のファインチューニング
次に、efficientADAnomalyDetector
オブジェクトを使用して、EfficientAD 異常分類器を作成します。ここでは、UseGlobalAnomalyMap
引数を false
に設定して、オートエンコーダーを無効にし、スチューデント・ティーチャーモデルのみを使用します。
untrainedDetector = efficientADAnomalyDetector(Network="pdn-medium",UseGlobalAnomalyMap=false);
訓練オプションの指定と異常検出器の訓練
EfficientAD 異常検出器を訓練するためには、訓練オプションを指定し、その後にモデルを学習させます。以下のコードで訓練オプションを設定し、異常検出器を訓練します。
maximumEpochs=100; options = trainingOptions("adam", ... InitialLearnRate=1e-4, ... L2Regularization=1e-5, ... LearnRateSchedule="piecewise", ... LearnRateDropPeriod=floor(0.95*maximumEpochs), ... LearnRateDropFactor=0.1, ... MaxEpochs=maximumEpochs, ... VerboseFrequency=2, ... MiniBatchSize=1, ... Shuffle="every-epoch", ... ResetInputNormalization=true,... Plots="training-progress"); detector = trainEfficientADAnomalyDetector(imdsTraint,untrainedDetector,options,MapNormalizationDataRatio=0.2);
これで、異常分類器は目的のタスクに使用する準備が整いました。
LLM による分類の強化
ここから GPT モデルを活用して異常分類の結果を強化します。LLM により、異常分類の説明を自然言語で生成したり、異常の原因や推奨対応策を提案したりできます。MATLAB から OpenAI の GPT モデルを使用するには API key が必要ですが、詳細は ChatGPT API を確認ください。
まず OpenAI Chat オブジェクトを初期化します。
chat = openAIChat("You are an AI assistant.",ApiKey=my_key);
EfficientAD 異常検出器によって生成された異常マップと、LLM によって生成された自然言語の説明を組み合わせて、画像を表示しながら異常分類結果を解説します。以下の流れでこれを実行できます。
-
異常マップの生成:EfficientAD を使って異常マップを生成します。異常マップは、画像の各ピクセルの異常度合いを示すもので、どの部分が通常のパターンと異なるかを視覚的に示します。
-
LLM を使用した自然言語による解説:生成された異常マップに基づいて、LLM が異常の原因や分類結果について説明を生成します。
alltext = []; imdsllm = imageDatastore("cropped_image",IncludeSubfolders=true); for k =1:numel(imdsllm.Files) % Create context and query prompts messages = messageHistory; context = "You are inspecting the blue polka dot fabric as shown in this image file. This file is a normal data." + ... "It has a tested image on its left and a mask image showing where there is abnormal part on its right" + ... "If the test image is normal, the right side is completely black and no white area."; messages = addUserMessageWithImages(messages,context,string(imdsllm.Files{6})); image_path = imdsllm.Files{k}; Query = "This image is the one that was determined to be abnormal." + ... "It has a tested image on its left and a mask image showing where there is abnormal part on its right" + ... "Referencing white area of the mask image describe What anomalies the image on your left contains with in 10 words" + ... "It is possible that a foreign substance is mixed in, something different in color exist or there is some kind of stain on the fabric."+ ... "If the corresponding mask on your right is black and not white, There are no stains and foreign substances. Answer 'This is normal'"; messages = addUserMessageWithImages(messages,Query,string(image_path)); % Generate a response [txt,response] = generate(chat,messages,MaxNumTokens=4096,TimeOut=500); % Plot anomaly classification results enhanced by LLM figure(f), subplot(6,1,k), imshow(imoutall{k}); title(txt,'FontSize',10);shg end
主なポイント
- EfficientAD モデル は、軽量なアーキテクチャと強力な意味的理解を組み合わせることで、迅速で高精度かつ高速な異常分類を実現します。これにより、リアルタイムの産業アプリケーションに最適です。
- LLM(大規模言語モデル) は、異常分類結果を自然言語で説明に変換し、過去のデータに基づいて潜在的な原因を提案します。また、異常レポートの自動生成を支援し、分類結果をより解釈可能で実行可能なものにします。
- MATLAB は、AI 技術やデータ前処理技術を統合できる環境を提供し、エンドツーエンドの異常分類ワークフローを構築できます。この統合的なアプローチにより、開発、デプロイ、説明性の向上が簡素化されます。
- Category:
- Artificial Intelligence,
- 機能と使い方
Comments
To leave a comment, please click here to sign in to your MathWorks Account or create a new one.