目次
1. 教師なし学習の欠陥検出のための Anomalib の概要
序文
この記事は、自作のデータ セットでの Padim アルゴリズムのトレーニング プロセスに焦点を当てています。ブロガーのスキルは限られており、ニューラル ネットワーク モデルに対する態度も異なります。したがって、この記事には、ネットワーク構造の解釈やニューラル ネットワーク モデルの詳細は含まれていません。これらを読みたい学生は、別の情報を見つけてくださいは〜
1. 教師なし学習の欠陥検出のための Anomalib の概要
このグループに最近与えられた新しい課題は、金属材料の表面にあるさまざまな欠陥を検出することです。以前は監視付き yolov5 ネットワークを使用していましたが、ラベル付きデータセットは非常に苦痛でした。さらに、工業用欠陥データには、サンプルの不均衡というさらに重要な特徴があります。収集された産業データのほとんどは完璧であるため、肯定的なサンプルのデータはモデルのトレーニングに役割を果たさず、否定的なサンプルのデータが少なすぎるため、効果的なモデルをトレーニングすることが困難になります。教師あり学習方法には別の問題があります: 負のサンプルの出現は非常に偶然であり、データセットには特定のタイプの負のサンプルが存在しない可能性があります。この方法でトレーニングされたモデルはひっくり返る可能性が高いため、できることは別のものを見つけてください。
データをチェックすると、教師なしアルゴリズムが工業用欠陥検出シナリオにより適していることがわかります。教師なしアルゴリズムでは、トレーニングに正のサンプルのみが使用されます。多数の正のサンプルを学習した後、ネットワークは、負のサンプルに遭遇したときに、負のサンプルと正のサンプルが「異なって見える」ことを認識し、同じサイズの確率マップを出力します。元画像 ある場所が異常領域である確率を示す分布図。
教師なし学習法は良いのですが、配布会としてコードをどこに持って行けばよいでしょうか? 個人的に一番良いのはAnomalibで、Pythonで実装されており、情報が充実していて分かりやすく、現在も更新されています。リンクは次のとおりです: GitHub - openvinotoolkit/anomalib: 実験管理、ハイパーパラメーターの最適化、エッジ推論などの最先端のアルゴリズムと機能で構成される異常検出ライブラリhttps://github.com/openvinotoolkit /anomalib
英語名を見ればわかります が、これは異常検出(Abnormal)ライブラリ(ライブラリ)で、padim アルゴリズムや fastflow アルゴリズムなどの教師なし学習手法です。
この宝の山を見つけたので、次のステップはそのコード構造と使用法を調査することです。
2. Anomalib コード構造
Pycharm を使用してローカルでプログラミングする場合、新しいプロジェクトを作成した後の Anomalib のコード構造は次のようになります。
プロジェクトのコード構造を理解し、その後のトレーニングと展開を容易にしたい場合は、それを少し分析する必要があります。その中で、より重要な部分は次のとおりです。
1. Anomalib フォルダー:実際、このフォルダーはチームがリリースしたライブラリのソース コードであり、pip install を通じてインストールすることもできます。
1.1このフォルダーの下のmodelsサブフォルダーには、10 種類を超える欠陥検出アルゴリズムが含まれており、読者はこれらを自由に呼び出すことができます。
1.2 pre_processingサブフォルダーとpost_processingサブフォルダーはそれぞれ前処理と後処理の関数であり、post_processingの下のビジュアライザーは最終的に推論結果を表示するために使用されます。
1.3デプロイフォルダー内の推論器はさまざまな推論器であり、pytorch を使用したい読者はtorch_inferencerに注目し、onnx 推論を使用したい読者はopenvino_inferencerを使用する必要があります。
2. データセット フォルダー:名前が示すように、このフォルダーには、産業用データセット MVTec や独自に作成したデータセットなど、トレーニング対象のデータセットを保存する必要があります。
3. 結果フォルダー:このフォルダーにはトレーニングと推論の結果が保存され、トレーニングまたは推論タスクが完了した後にのみ表示されます。
4. Tools フォルダー:このフォルダー内の推論サブフォルダーには、 anomalib.deploy内の異なる推論器 (Reasoner)をそれぞれ呼び出す一連の推論コードが保存されます。このフォルダーの下にあるtrain.py がトレーニング モデルのエントリです。
概要: 後でモデルのトレーニングに tools/train.pyを使用し、モデルの推論予測に tools/inference の推論コードを使用する 必要があります。上記の予備知識があれば、いよいよモデルのトレーニングを開始できます。
3. タスクの説明とモデルトレーニングの推論
pycharm のアルゴリズムの効果だけを確認したい場合は、公式の例に従って、train.py を使用してトレーニングし、次に lightning_inference.py を使用して推論すると、新しい結果フォルダーで推論結果を確認できます。非常に便利なのでここでは説明しません。
ただし、私を含め、後で他のプラットフォームにデプロイする必要がある読者の場合は、独自のデータセットをトレーニングしてonnx モデル を取得する必要があるため、config.yaml ファイルを変更する必要があります。方法は次のとおりです。
まず、公式計画に従って、 Readme でカスタム データセットをトレーニングする方法を参照してください。
ここでは、padim アルゴリズムを使用するため、上記の部分に従って anomalib/models/padim/config.yaml のデータセット部分を変更し、ターミナルで次のトレーニング コマンドを実行します。
python tools/train.py --model padim --config anomalib/models/padim/config.yaml
ただし、「正規化」とその他の属性が見つかりませんというエラーが報告されます。現時点では心配する必要はありません。実際、これらの属性は以前の config.yaml にあります。公式はここにそれを書いていません。怠慢である可能性があります。 . config を置きます .yaml の datasets 部分をここに置きます. 読者は自分で作成したデータセットのパスに従って書き換えることができます. 追加と注意が必要な場所についてコメントしました:
dataset:
name: tube # 数据集的名字,如MVTec等,这个不重要
format: folder
path: ./datasets/img_192 # 自制数据集路径
normal_dir: normal # 自制数据集正样本子文件夹
abnormal_dir: abnormal # 自制数据集负样本子文件夹
mask_dir: null # 二值掩膜路径,自制数据集一般没有,填null
normal_test_dir: null # name of the folder containing normal test images.
task: classification # classification or segmentation
extensions: null
normalization: imagenet # 此处添加imagenet
split_ratio: 0.2 # ratio of the normal images that will be used to create a test split
image_size: 256
train_batch_size: 32
test_batch_size: 32
num_workers: 8
transform_config:
train: null
val: null
test_split_mode: from_dir # 此处添加
test_split_ratio: 0.2
val_split_mode: same_as_test
val_split_ratio: 0.5
create_validation_set: true
tiling:
apply: false
tile_size: null
stride: null
remove_border_count: 0
use_random_tiling: False
random_tile_count: 16
特別な注意を払う必要があります: 自作のデータ セットを使用するため、多くの場合、グラウンド トゥルース バイナリ マスク (マスク) が存在しないため、ここではタスク フィールドを セグメンテーション ではなく分類に設定する必要があります。次に、メトリクス部分のピクセル部分を削除します。削除しないと、エラーが報告されます。その理由は、二値化マスクが提供されておらず、ピクセルベースのテスト精度を計算できず、画像部分のみが保存されるためです。次のように変更します。
metrics:
image:
- F1Score
- AUROC
# pixel:
# - F1Score
# - AUROC
threshold:
method: adaptive #options: [adaptive, manual]
manual_image: null
manual_pixel: null
onnx モデルも必要です。ここでは、onnx フィールドを config.yaml の最適化セクションに追加する必要があります。
optimization:
export_mode: onnx # options: torch, onnx, openvino
この時点で、トレーニング コマンドを再度実行してトレーニングを開始できます。
python tools/train.py --model padim --config anomalib/models/padim/config.yaml
Padim アルゴリズムの論文は勉強していませんが、トレーニング プロセスには 1 ラウンドしか必要ないようです。トレーニングが完了すると、結果フォルダーに次の構造が表示されます。
tube はブロガー自身のデータセットの名前です。下の画像フォルダーには、確率ヒートマップの形式で与えられる陽性サンプルと陰性サンプルのテスト結果が含まれています。重みフォルダーには、pytorch-lightning モデルと必要な onnx モデルが含まれています。 、およびトレーニング データ セット情報を含むmetadata.json (デプロイメントにとって非常に重要です。詳細については次の記事で説明します)。
上記の手順を完了した後、onnx モデルを取得しましたが、デプロイする前に、変換されたモデルに精度の損失があるかどうかを確認し、ターミナルで次のコマンドを入力する必要があります。
python tools/inference/openvino_inference.py --weights results/padim/tube/run/weights/onnx/model.onnx --metadata results/padim/tube/run/weights/onnx/meta_data.json --input datasets/img_192/abnormal/cam0_17_04_54.jpg --output results/padim/tube/run/images --config src/anomalib/models/padim/config.yaml
次の推論結果が得られます。
効果は良好です。工業用欠陥検出に関しては、ついに yolov5 に別れを告げることができます~
4. まとめと展望
Padim アルゴリズムを使用して自作の産業用データセットで良好な検出結果を取得し、トレーニングを通じて onnx モデルを取得しました; このプロセスで注意を払う最も重要なことは、構成ファイル config.yaml の変更です。公式 Web サイトのチュートリアル、このブログに従って、エラーを防ぐために独自のデータ セットのパスを構成および変更します。
onnx モデルを取得した後、巨大で複雑な Anomalib プロジェクトと環境を取り除き、独自のソフトウェア アルゴリズムの展開を完了したいと考えていますが、画像データを onnx モデルに送信する前にどのような前処理手順が必要ですか? モデルの入力と出力は何ですか? 出力データにはどのような後処理が必要ですか? Anomalib で非常に簡潔かつ明確なヒート マップを描画するにはどうすればよいですか? これらは私たちが解決しなければならない問題です。
次回のブログでは、引き続き Anomalib のコード構造とプロセスを分析し、onnxruntime エンジンを使用して C++ での onnx のデプロイを完了し、アルゴリズムの実装を実現します。