異常検知検討メモ(個人利用)

学習プロセスと学習異常検出の毎日の計画を記録します。

ドメインの背景知識

異常検出のタスクの決定: MVTec AD データセット。画像レベルまたはピクセルレベルの検出タスク。データセットの背景は比較的単純ですが、検出される欠陥は一般に比較的小さな欠陥です。

この段階で一般的に使用される 3 つの検出方法:
1. 再構成に基づく異常検出: オートエンコーダーと敵対的生成ネットワーク (GANS)
オートエンコーダーGAN はサンプルの生成能力に焦点を当てているのに対し、GAN はサンプルの再構築能力に焦点を当てています。
2. 合成ベースの方法
3. 埋め込みベースの方法。このタイプの方法では、ImageNet の事前トレーニングされた機能を使用します。たとえば、SimpleNet。 ImageNet の特徴をターゲット ドメインにマッピングし、その特徴マップにガウス ノイズを追加して欠陥をシミュレートし、2 つの特徴マップを識別器で一緒に使用して判断し、損失を生成します。
4. ゼロ/少数ショット検出
ゼロ/少数ショット検出の最大の利点は、パスのみを通過することです。 1 つのモデルですべての欠陥の検出を完了できます。カテゴリごとに分類子を用意する必要はありません。ただし、すべてのモデルが上記の定義に従っているわけではないことに注意してください。 PatchCoreと同様に数ショット実装ですが、n(ウェイ)×k(ショット)枚の画像が使用されることになり、実際にはカテゴリごとに1つの分類器が設定されます。プロジェクトの要件を考慮して、すべての欠陥を検出できるモデルを選択することをお勧めします。

特定のアルゴリズム (ゼロショット/少数ショット)

RegAD: RegAD はコールド スタートです (通常のサンプルのみを使用します)。MVTecAD データ セットに基づいて、2 つのトレーニング設定があります。 1 つ目は、leave-one-setting です。これは、最初にターゲット カテゴリ外の正規画像でトレーニングし、次にターゲットのサポート データ セットに基づいて正規分布推定を実行し、最後にターゲットのテスト セットで推論を実行します。別の設定では、各カテゴリのサポート データをトレーニングします。これは、単一カテゴリの分類器もトレーニングします。 githubのソースコードで提供されている学習メソッドはsetting(i)のもので、我々もこのメソッドに注目しています。このプロジェクトのwelded_seatがMVTecADと同じスケールであれば可能です。ただし、このアルゴリズムは各カテゴリに対する単一クラスの分類器ではありません。ただし、正規分布推定プロセスも必要で、MVTecAD では 4 秒かかります。
質問があります: これをエンジニアリングにどのように適用するか?数枚の画像を入力し、4秒で欠陥モデルを生成し、推論を実行します。これは本質的に単一クラスの検出器ではないでしょうか?別の質問がありましたが、このプロジェクトでは、すべてのサポート データ セットは同じです。こんなこともあり得る!次に、現在提供されている垂直溶接データ セットでトレーニングし、水平溶接の正常なサンプルをサポートとして使用し、異常なサンプルを推測として使用します。このように、サポート データ セットが異なります。

WinCLIP: これは、教師なし形式の CLIP に基づくマルチモーダル モデルです。 N 個の画像とテキストのペアを入力します。そのうち N*N-N は負のサンプルであり、N 個のテキストと画像のペアだけが正のサンプルです。私の推測では、CLIP の事前トレーニング済みモデルを使用し、それを MVTec AD データセット上で微調整しており、テキスト命令は 4 つに分割されています。ただし、これはオープンソースではありませんが、以下のコンテストで1位になった論文をWinCLIPをベースに改変したものであり、ソースコードが公開されています。

アルゴリズムの導入 (プロジェクト)

1. データセット。まず、前回先生から教えていただいた垂直ガス溶接画像をトリミングします(ただし、実際の使用では水平溶接を検出するために使用する必要があります)。溶接部分を抽出し、小さなグリッドを切り出します。異常のない小さな格子が陽性サンプル、欠陥のあるものは陰性サンプルです。現在、「良好」と「バブル」の 2 つのカテゴリがあります。ただし、グッドにはアンダーカット画像が存在する可能性があり、バブル内の画像は甲が言うバブルとは限りませんので、この部分は教師とさらに最終的に詰める必要があります。
2. 現在、欠陥は 1 つだけなので、最初に単一クラス分類子メソッドを使用してテストできます。 openvino の下の anomalib フレームワークが選択されています。現在グラフィックカードを待っています。
3. 検証の前のステップが成功した場合は、RegAD を再試行できます。これには、別のアンダーカット欠陥データ セットにラベルを付けてから、leave-one-setting でトレーニングする必要がある場合があります。
4. 4 月の GAN の論文はまだ読んでいません。この競技会のゼロショットチャンピオンです。数ショットトラックのもう 1 つのチャンピオンはオープンソースではないようですが、他のランキングやアルゴリズムにも注目することができます。

毎日の計画

6.29

  • 4月のGANの論文を読んだ後
  • グラフィックス カードに空き領域がある場合は、anomalib を使用して自家製の welded_seat データ セットを実行します。
  • 4月のGANまたはRegADの環境を構築する

概要:
4 月の GAN 論文はまだ終わっていませんが、CLIP (対照言語) について学ぶために Li Mu に行きました。 -イメージ事前トレーニング)それを補います。 anomalib の Padim と patchcore を使用して自作のデータ セットを実行しました。どちらも画像レベルの検出精度は 90% 以上ですが、テスト結果は patchcore の方が優れています。ただし、フィーチャ ヒート マップの欠陥位置は特に問題ありません精度が高く、ピクセル処理レベル検出を行うのは容易ではないと推定されます。 github の issue を通じて、彼の max_epoch が 1 であることがわかりました (CNN は特徴抽出でのみ出現するため、それ以上のエポックがある場合は最初と同じになります)。この文は理解できません、明日読みます。

6.30

  • anomalib のこれらのパラメーター、特に train と val データセットの分割について理解する
  • anomalib での推論結果
  • 4月のGANの論文を読んだ後
  • 4月のGANまたはRegADの環境を構築する

概要:
4 月の GAN の論文を読み終わりました。これは、CLIP (Win-CLIP) に基づいて改良されたモデルです。ゼロショットミッションが利用可能です。画像エンコーダーとテキスト エンコーダーは両方とも CLIP を使用し、ゼロショット推論を実行できるように、いくつかの画像とテキストのペアを提供して特徴変換用の線形レイヤーをトレーニングします。少数ショットを使用する場合は、サポート イメージの特徴をメモリ バンクに保存します。各段階のメモリ バンクの特徴は、事前類似性のためにゼロショットの特徴マップと比較され、異常マップが取得され、最終的に異常が取得されます。スコア。
データセットの分割ですが、現在自作データセットではvalとしてnormalの20%、bubbleの50%を使用しており、valとtestの内容は同じです。 。
最後に、推論があります。 anomalib はトレーニングの最終段階で推論を行います。プロジェクト内のモデル検出データ セットを呼び出すときは、test.py を渡す必要があります。明日は、それがテストに使用されるか推論に使用されるかを確認します。テストに使用される場合、指定されたデータのカテゴリは確実である必要があり、推論は検出されるデータの未知のカテゴリであるためです。

7.2

  • anomalib の推論デプロイメントを行う
  • 4月のGAN環境を構築する
  • 4 月の GAN を実行する

概要:
anomalib の理由は、py ファイル tools/inference/lightning_inference.py を使用することです。推論時間は 400 ミリ秒 (3060)、サーバー上の推論時間は 350 ミリ秒です。 openvino の推論ファイルはありますが、モデルの変換が必要ですが、現時点では推論時間の要件がないため、当面は考慮する必要はありません。
April GAN 環境のセットアップは難しくなく、現在サーバー上にセットアップされています。しかし、サーバーに問題があり、conda ベースのコマンドは、仮想環境のアクティブ化を除き、pip なしでエラーを報告し、原因がわかりません。このプロジェクトの環境は、新しい 3.8 仮想環境を作成し、requirement.txt にパッケージをインストールします。 (はい、もう手遅れです。仮想環境は作成できますが、パッケージ化の際に色々問題が発生するので、conda環境を作成できるか、使用時に発生するpipの問題を解決できるかは、明日もう一度試してみる必要があります) conda) < /span>
April GAN では、明日コードを詳しく見ていきます。まず、MVTecAD データ セットに何をしますか? 同じディレクトリの welded_seat データ セットで使用できますか?構造?

7.4

  • April GANのconda環境を作成し、パッケージをインストールする
  • 4月のGANのデータ読み取りコードを見てみる
  • welded_seatの分割タグを作成し、jsonからpngに変換します。
  • 少数ショットの推論を直接実行し、ゼロショットの各段階の機能を借用して、メモリ バンク内のサポート機能と比較してみます。
  • 4月のGANネットワークを実行する

概要:
4 月の GAN 環境はセットアップされましたが、conda 環境はまだ動作していません。仮想環境を使用しています。ソース経由で Python が付属します April_GAN/ bin/activate 環境を開始します。ただし、horvod パッケージのインストールに失敗するという隠れた危険があります。これは分散トレーニングに使用されます。その後のトレーニングに影響があるかどうかはわかりません。以前は、これに従いました horvodチュートリアルに従ってください。後で本当に必要になった場合は、チュートリアルを変更し、新しい仮想環境を直接作成し、horvod を除くすべてのパッケージをインストールし、最後に horvod を個別にインストールします。
png 形式の分割タグが完成しました。ただし、ディレクトリ構造は April GAN で必要な mvtec 形式とは異なります。 train ディレクトリと test ディレクトリは各欠陥の下に設定する必要があります。トレインには 200 個以上の正常なサンプルが含まれる必要があり、テストにはそれぞれ 20 個の正常なサンプルと 20 個の欠陥のあるサンプルが含まれます。通常のサンプルがまだ不足しています。
データ セットが変更され、サーバーに配置されました。

7.6

  • ブロックの切断の概念を変更し、重複する切断を実行し、推論セットを構築します
  • レポートpptを作成する
  • 4月 GAN他カードトレーニング

概要:
1 クラス上の異常検出アルゴリズムを検討する必要はありません。ゼロに基づくアルゴリズムだけを検討してください。 /数ショット。
今回は、ブロックは stride=100 に従ってカットされます (溶接の平均幅と高さは 320*3200)。推論セットとテスト セットはどのように設計するか?重複しない画像をテストに置き、データ処理された画像を推論に置きますか?それとも、元の画像と強化された画像をテストに入れ、未確認の画像とその強化された画像を推論に入れるべきでしょうか?私は後者であるべきだと思います。午後にレポートを終えてからpptを抽出します。

7.7
レポートが完成したので、April-GAN のデータセットに対して mvtecAD と VISA に基づいてゼロショットとフューショットを実行し、ヒートマップ。当事者 A がデータ セットを返送した場合、数種類の溶接欠陥に基づいて、他の種類の欠陥の数ショットを実行できます。

April-GAN に基づいて、welded_seat でゼロショットといくつかのショットを実行すると、結果は次のようになります。

ゼロショット
ビザ データ セットに基づくトレーニング マッピング
ここに画像の説明を挿入します
mvtec データ セットに基づくトレーニング マッピング
ここに画像の説明を挿入します
数-shot

5shot
ここに画像の説明を挿入します
10shot
ここに画像の説明を挿入します
20shot を使用した、ビザ データ セットに基づくトレーニング マッピング< in welded_seat /span> 教師はいくつかの新しいデータを与え、いくつかのバブルと正常なサンプルを抽出しました。 これらの指標は何を意味しますか? 何らかの誤った判断が存在するか、他の欠陥がバブルとして検出されます。現在、mvtec または VISA を使用して特徴マッピングを行っていますが、このプロジェクトの通常のサンプルまたはアンダーカットを使用して特徴マッピングを行い、バブルで推論を行うと、効果はさらに良くなりますか? 現在、ショットが高いほど効果が高いようです。5 ショットの場合、1 枚の推論時間は約 1.4 秒、10 ショットの場合、2 秒かかります。ゼロショットの場合は 0.5 秒かかります。ここで、問題は次のとおりであることがわかります。 20shot を使用した、mvtec データ セットに基づくトレーニング マッピング 10shot 5shot
ここに画像の説明を挿入します


ここに画像の説明を挿入します

ここに画像の説明を挿入します

ここに画像の説明を挿入します



7.14&7.15
これはまだプロジェクトであり、完了することはできませんが、話し合うことは可能です。だから頑張ってください!

  • 論文とコードの train 部分を見て、welded_seat データ セットを使用して train を実行する方法を考えてください。
  • 視覚化を改善し、欠陥マップを元の画像にマッピングします。
  • 新しい写真もいくつかあり、バブルと通常のサンプルが再抽出されています
  • 各指標の意味を理解する

mvtec データ セットを実行しました。このモデルは実際には 2 分類モデルであり、具体的な欠陥が何であるかを判断できません。
もう一度論文を読みました。実際、鍵はゼロショットのトレーニング部分にあります。モデルの精度を向上させたい場合、最も直接的な方法は次のとおりだと思います。溶接シームのアンダーカット データ セットを使用してゼロ ショットを実行し、ショット部分の特徴マッピングを行ってから、バブルに対して数ショット推論を実行します。これは落とし穴ですが、まず、セグメンテーション結果に対する異常マップを視覚化します。
各指標の特徴について説明します。分類では、AUROC、F1-max、AP がすべて非常に高いです。 PRO (交差および結合比) の分割が増えると、このタスクの F1-max と AP は非常に低くなりますが、AUROC、F1-max、および PRO は非常に高くなります。これらの指標のレベルがセグメンテーションの結果に具体的にどのような影響を与えるのかはまだわかりません。

7.17

  • 半透明の視覚化を有効にする
  • アンダーカット データ セットを作成し、ラベルを付けて形式を変換します (json-png)
  • meta.json を生成する
  • 特徴マップをトレーニングしてからゼロショット推論を再実行する

妥協案で、視覚化に使用する黄色の円は出て、半透明の円は出ませんでした。
アンダーカット データ セットが作成され、welded_1 という名前が付けられました。明日の列車の走行に使用してください。

7.18

  • アンダーカット データ セットを使用して特徴マッピングをトレーニングし、ゼロショット推論を実行します
  • mvtec データセットの重みに基づいて 5 ショット推論を実行し、マスクを生成して視覚化します。
  • 半透明の視覚化を実現する方法を試してみましょう

トレーニングの最初のステップが完了しましたが、トレーニング効果が非常に悪いです。その理由を考えてみると、トレーニングに含まれる欠陥サンプルの種類が単一すぎるため、トレーニングで学習した特徴が不十分であるためだと思います。アンダーカット専用モデルです。欠陥マップから、特定された欠陥領域がすべてアンダーカットの位置にあることもわかります。したがって、データセットを大きくしない限り、自作のデータセットを使用して特徴マップをトレーニングすることはできません。さらに、独自に作成したアンダーカット データ セットを welded_seat テストに入力して、数ショット推論を行うこともできます。モデルは単一カテゴリであり、スマート検出は欠陥カテゴリを返さないことに注意してください。
2 番目のステップでは、バブルに加えてアンダーカット クラスも追加され、検出効果が非常に低いことがわかりました。
3 番目の半透明ビジュアライゼーションは、赤いマスクを追加し、cv2.addWeight 関数を通じて img とマスクの透明度を設定して実装され、この 2 つの組み合わせを実現しました。
明日、バブル推論の結果を教師に送り、アンダーカットの結果が非常に悪いと伝えます (両方の方法を試しました)

7.20

  • まず、April GAN のセグメンテーション ヘッドと損失関数を見てみましょう。
  • 分割ヘッドを検出ヘッドに交換することはできますか?
  • または、他の数発のターゲット検出アルゴリズムがこのデータセットを実行できるかどうかを確認してください

セグメンテーション アルゴリズムを放棄する理由の 1 つは、最終的な欠陥領域が細かすぎてバウンディング ボックスを介して描画できないこと、もう 1 つはセグメンテーション アルゴリズムの速度が遅すぎることです。そうそう、セグメンテーションは不要になりましたが、視覚化の観点から、教師は透明マスクなしで輪郭を不明瞭にすることを推奨しています。

7.23

  • 分割ヘッドを検出ヘッドに交換することはできますか?

今朝読んだ後、2つの疑問が残りました。

テキスト プロンプトを追加すると精度が向上するのはなぜですか?
これについては、WinCLIP の論文を参照してください。この部分の仕事は比較的固定されています。バッチの画像カテゴリを入力し、245 文を生成し、最終的にトークナイザーを通じて (768,2) のテキスト特徴を取得します。
これは、モデルの特徴が比較学習手法である CLIP に由来しているためです。画像特徴を x 、テキスト特徴を y として取り、エージェント タスクを対角線の x-y ペアとして正のサンプルとして定義し、残りはトレーニング用の負のサンプルとします。ここでのテキスト情報の導入は、実際には、何が不良品で、何が許容範囲内の誤差を含む陽性サンプルであるかをテキストで定義する、より正確な記述方法を使用しています。

モデルによって最終的に出力された image_feature は何に使用されますか?
4 月の GAN のプロセス図を見てください。これは画像レベルの欠陥検出に使用されていると思います。これが行われているかどうかは、test.py で確認できます。

7.31

  • セマンティック セグメンテーションとターゲット検出のために変更する必要がある領域を決定します。
  • yolo の検出ヘッドがどのように設計されているかを見てみましょう
  • セマンティック セグメンテーションとターゲット検出の両方をサポートするネットワークをいくつか見てみましょう (mask-RCNN? いいえ、yolov5 がサポートしています)。

train.py ファイルから判断すると、欠陥マップに基づくセマンティック セグメンテーションは実際には複雑ではありません。4 (8, 1369, 2) の特徴マップは 4 (8, 2, imgsize, imgsize) の特徴マップに変換されます。 、特徴チャネル2に対してソフトマックスを実行して各画素に対応する外れ値を取得し、欠陥マップを取得する。ターゲット検出をしたい場合、カテゴリー情報に加えて座標も返す必要があるのですが、この地物形状を座標に変換することはできるのでしょうか?次に、データの読み出しに関しては、マスクを読み込むことができず、検出フレームを読み込む必要があります。最後に、損失関数が変更されます。
yolo は 3 つのスケールの特徴マップですが、CLIP で抽出された 4 つのステージは同じスケールであり、実験では最後のステージの特徴のみが検出に使用できます。
問題は、yolov5 の検出ヘッドで、出力特徴マップが最後の畳み込み層を通過してから (bs,nl,x,y,no*na) に分解される必要があることです。 。ここで、畳み込み層の前後の特徴マップの形状を知る必要があり、それをコンパイルして確認する必要があります。最小特徴マップの出力は x(bs,255,20,20) です。 April-GAN は (bs,1369,2) ですが、理論的には (bs,2+xywh+conf,w,h) になるはずです。 Yolo はマルチスケール問題を指向しており、April は 4 つのステージの特徴マップ出力をマルチスケール特徴マップに変換できます。 (実際のところ、yolo のバックボーンを CLIP に変えたほうが良いでしょうか???)

8.1

  • yolov5 の train.py を実行して、機能マップのサイズの変化を確認します。
  • バブルをポットホールなどの単語に置き換えて、検出結果に改善があるかどうかを確認します。
  • これをコンパイルして、テキストのエンコード特性の最初の次元がどのような情報を表しているかを確認します。
  • CLIP に基づくターゲット検出論文の概要

1. yolov5 の検出ヘッドが x(bs,255,20,20) を x(bs,3,20,20,85) に変更することは明らかです。キーとなるのは高次元特徴量を次元削減した255で表されるアンカー×(xywh+conf+80カテゴリ)ですが、CLIPではこれを255まで上げる必要があります。これは不合理です。
2. CLIP は比較学習のために言語プロンプトの単語を借用するため、機能の説明が正確であるかどうかもモデルの検出に一定の影響を与えます。検証後、影響は重大ではなく、元の気泡であろうと溶接ピットであろうと、溶接上のポットホールを正確に記述するには CLIP で十分であることがわかります。精度は増減しますが、欠陥マップの変化はそれほど大きくありません。
3. text_feature の形状は (768,2) です。 1 次元では、テキスト エンコーダによって生成された正常な特徴ベクトルと異常な特徴ベクトルは順番に並んでいます (768)。
4. ViLD の記事を読みました。RPN を使用して提案書を生成し、conv を使用して画像エンコーディングを生成し、テキストは CLIP のテキスト エンコーダーを通じてエンコードされます。この 2 つは比較学習によって学習されます。その中で、Backbone+RPN+RoIAlign を導くために CLIP を教師として使用して提案を生成します。ほら、実はこうしてみるとCLIPをベースに位置情報付きの提案書も生成できるんですが、どうやって作っているんですか?

8.2

  • April-GAN の数ショット出力を観察する
  • 少数ショットのターゲット検出アルゴリズムを収集

1. 少数ショットでの April-GAN の出力は、ゼロショットと少数ショットの合計になります。ここでは、少数ショットの出力だけを確認したいと思います。現在の出力では、通常のサンプルでの誤検出が多すぎるのは、ゼロショットの結果が貧弱であるためでしょうか?少数ショットの結果が良好であれば、追加された 2 つの欠陥マップの重みを調整したり、少数ショットのみを出力したりすることができます。
少数のショットを見るだけでは、欠陥のない部分の外れ値を生成するのは実際には簡単です。モデルはまだ正常な画像がどのようなものであるかを認識しておらず、理解が不足しています。 「気泡」や「はんだ穴」などの欠陥を除去します。 CLIP のモデル推論速度はまだ遅いので、まずは試してみましょう。最後に、これを有効にする場合は、マッピング レイヤーをトレーニングするためにより大きな weld_seat データ セットを使用するのが最善です。

8.9

  • anomalib でバブル データ セットを実行して、精度と推論速度を確認します。
  • 効率的な_adを実行しているanomalibを試してください

1. 実行して、セグメンテーションの精度はまだ高くないことを確認しますが、誤検出は April-GAN よりもはるかに小さいです。別のデータ セットを作成して効果を確認できます。
2. 現在、自家製データセットでスタックしています。しかし、問題があります。mvtec をトレーニングしたいときに、大量のデータ セットをダウンロードしました。明日これらのデータ セットのダウンロードを完了し、mvtec コードを実行して、自家製の welded_seat が実行できるかどうかを確認してみてはどうでしょうか

8.13

  • 効率的な広告を実行する
  • efficient_ad の論文を見てください
  • 今回収集したデータのデータセットを作成します
  • 新しいデータセットで April GAN を使用して再試行してください

1、跑mvtec时精度很高,自制的welded_seam精度很低。有可能是数据集的组成形式不一样,改成mvtec一样的再试试。要是精度还低,就补充一些正常图像进去。efficient_ad的效果很差,不予采用了就。patchcore的效果还挺不错的,目前F1-score是0.44,AUROC是0.99。F1低的原因我觉得是召回率比较低,这个和阈值也有一定关系,在热度图里可以看到,尽管有些缺陷没有检测出来,但是还是有一定热度的,所以我想把8月数据集里的bubble提出来,做个test看看结果。
2、没用,不看了,去看patchcore
3、制作了一个normal数据集,一共是436张正常的block,补充到welded_seam数据集中了。
4、可试可不试了,因为太慢了。

8.14

  • 用anomalib做pathcore的predict,改变阈值看看效果
  • 把上次采集数据中的bubble,飞溅,焊瘤提取出来,用作predict
  • 看patchcore论文

1、predict跑通了,现在是在热度图上放分割结果。单独跑一下1689的block10和11,因为这个问题是关乎焊瘤的检测效果。因为方案设计的关系,所以截取的焊瘤大多分布在两个block中,在block10中尚且有焊瘤的特征,但在block11中可能就难以观测到了。阈值根据官方手册的说明进行修改。
当前阈值下,bubble的效果还好,其他两种效果就比较差了,是因为没有给这两种数据做test?明天看看论文吧,需要的话就补充上。
2、不做咬边数据集,因为现在采集的图片放大以后,很多看起来都像是有咬边的。如果要加入咬边数据,需要对normal数据进行大规模清洗,可能满足要求的也不会很多,所以就先试试其他四种缺陷的检测效果。
spatter和beading提取好了,bubble中只把“微信图片”的block分好了,其他IMG开头的block没分。
跑predict可以在分好的bubble等四个文件夹中跑,也可以直接在各个图片的文件夹下跑。
3、明天一定要看了,因为这个模型的效果还不错。

8.16

  • 修改阈值跑跑这几个数据集的predict
  • 一定看patchcore的论文。为什么训练一个epoch就够了,还有什么可以优化的参数吗?

1、我认为这个阈值应该是anomaly map里大于这个最近邻距离就判定为异常。但是现在我不知道这个值应该是多少,正常来说应该是0-255之间?0.1,1,100,200都试过没有效果。这个最后再试吧,先调整其他的参数
2、论文看完了看懂了。训练阶段还需要调整的参数是coreset生成时,最近邻的数量以及采样的比例。两个调整方向就是增大num_neighbors和coreset_sampling_ratio。必然会导致推理速度变慢,不过可以试着看看效果如果。最后再看看有没有办法有效地改阈值。后面如果要调试别的缺陷数据集,由于数据很少嘛,memory bank里的东西少,所以这两个值可以适当加大,牺牲训练和推理速度换一点精度。

8.17

  • 增大num_neighbors和coreset_sampling_ratio,看看patchcore的训练结果
  • 这个anomalib能不能调试整个训练过程啊,如果在lighting_net里加点应该可以
  • 最后可以试试怎么改阈值

1、coreset_sampling_ratio修改为0.2和0.3均无法训练,neighbor改了对于模型也没有很大的变化,所以这两个因子有影响但不多,可以在最终确定了patchcore后再进行调参。现在转而去看看改阈值(改验证集)。
2、确实是的
3、在github的issue里找到的:Anomalib目前有一个自适应阈值机制,旨在解决阈值问题。自适应阈值机制为一系列阈值计算验证集上的F1分数。最终的阈值是导致F1得分最高的阈值。这种方法的一个主要缺点是验证集需要包含异常样本,这在现实世界的异常检测问题中可能并不总是可用的。所以这个阈值应该是在val时确定的,修改val集也会修改这个阈值,目前的阈值感觉偏高了,应该把val集变简单(或者和predict相近)会使得阈值降低一点。
现在把8月采集的一部分bubble换成val了,借此来改变阈值,同时扩充了train,明天跑一下看看有没有好一些。

8.18

  • 跑一下拓充后的welded_seam_2数据集
  • 试试reverse distillation网络(有2022和2023CVPR两版)
  • 试试dream网络(分割的F1比较高)

1、在autodl的anomalib服务器上跑了下新数据集,果然在val换成比较简单的数据以后,阈值明显提升了,用这个模型和阈值再在原来welded_seam_1上的val上跑,效果也不错。目前在welded_seam_2的val上F1-score是0.69。后续试试另外两个,如果效果一般,就继续研究该模型的可视化(在原图上标注缺陷区域)和openvino部署。
2、anomalib上的是2022版本的,跑起来效果不好。还有个2023CVPR的reverse distillation++,官方强调得是与patchcore相近的精度和更少的推理速度。现在offical代码也出来了,如果patchcore推理速度不满意可以再试试这个。
3、也不高。除了patchcore都不太好,为啥呢?

8.19

  • 修改可视化
  • openvino推理加速

1、调试的时候找到welded_seam_2对应的pixel_threshold了:51.8008。位置在
src/anomalib/models/components/base/anomaly_module.py的94行
可视化现在已经修改为原图+mask。位置在
src/anomalib/post_processing/visualizer.py的203行
注意:只修改了segmentation的visualization,classification暂时没有修改
2、不用openvino推理加速,2080Ti的infer速度1秒3张。如果要使用openvino的话,查了下官方的github issue,其实说是解决了这个bug。可能需要把整个工程重新替换成最新版的。

April GAN总结

ここに画像の説明を挿入します入力: 518×518 画像
ネットワーク構造:
1. 画像は CLIP エンコーダによって生成されます各段階で特徴マップ (1369,1024) を作成し、線形レイヤーを通過して特徴をテキスト特徴 (1369,768) と結合できる形状にマッピングします。
2. テキストに基づいています。 on template + category + status 形式で文が形成され、エンコード後に (768,2) のテキスト特徴が生成されます。これは、正常な文とテキスト エンコーダを介した異常な文によって生成された 2 つの (768) 特徴ベクトル スタックによって形成されます。
3. 画像特徴行列とテキスト特徴行列を乗算して、(1369,2) の特徴を取得します。セマンティック セグメンテーション タスクの場合、(2,w,h) の欠陥マップは次のようになります。直接出力する
概要:
ターゲット検出タスクでは、(1369,2) の特徴を (anchor×(xywh+conf+) に変換する必要があります。 2 カテゴリ) を 1×1 畳み込み )、w,h) で計算し、ビューは (アンカー、xywh+conf+2 カテゴリ、w、h) になります。この畳み込みのステップは不合理です。検出器ヘッドを直接接続するのは適さないと思います。基本的に、CLIP は画像全体から特徴を抽出し、画像領域の特徴がないため、単一段階のターゲット検出タスクには適していません。
欠陥名 (bubble->welding_pits) を変更してみましたが、効果は明ら​​かではありませんでした。セグメンテーションの問題を検出の問題に変えるのは現実的ではありません。まず、形状が制限されています。テキスト特徴によるものであり、アップグレードすることはできません。ディメンションまたは CLIP は、画像の個々の領域ではなく、画像全体の特徴を抽出します。第 2 に、CLIP に基づくターゲット検出はほとんど 2 段階であるため、直接数ショット アルゴリズム、最後に、検出速度が非常に遅く、実際のエンジニアリング ニーズを満たしていません。これを有効にしたい場合は、マッピング レイヤーをトレーニングするためにより大きな weld_seat データ セットを使用することをお勧めします。

パッチコアの概要

ここに画像の説明を挿入しますトレーニング フェーズ: Xtrain で生成された欠陥のないフィーチャを送信し、メモリ バンクに保存します。
テスト フェーズ: Xtest がフィーチャを生成した後、メモリ バンク内のフィーチャを使用して最近傍検索を実行します。 、最も近い値を返します。 隣接距離行列は、再形成後に欠陥マップと欠陥スコアに変換できます。
ネットワークには 3 つの革新的な点があります
1. ローカル認識パッチ特徴
ImageNet に基づいてトレーニング イメージをバックボーンに入力し、中間レベルの特徴を取得してメモリ バンクに保存します。中間レベルの特徴の受容野を改善し、解像度を維持し、特徴を深くしないようにするために、各点を中心、p を半径として、パッチの特徴を集約して、その点の元の特徴を置き換えます。 。
2. コアセット削減パッチ機能メモリ バンク
メモリ バンク全体を使用することはできません。この記事の方法は、コアセットを使用することです。コア サブセット。このサブセットはバンク全体の情報を完全に表すことができます。抽出方法は minmax 施設位置であり、目標は、抽出された mc を元の m にできるだけ近づけることです。これはモデル全体のいわゆるトレーニング プロセスであり、コアセットと元のセットを可能な限り近づけます。
3. PatchCore による異常検出
トレーニング イメージは、まずトレーニング前バックボーンを通過して中間特徴を取得し、メモリ バンクに保存します。特徴が大きすぎるため、コアセット コレクションを通じて次元削減が実行されます。テスト イメージはネットワークを通じて中間特徴を取得し、メモリ バンク内で最も近い特徴を見つけ、最も近い特徴までの距離を返し、最後に (batch_size, h*) に再形成されます。 , w*) をチャネルごとに加算することで取得でき、異常スコアについては、補間を (batch_size, h, w) に拡張することで異常マップを取得できます。
概要:
詳細については、緑のクジラのメモに戻ってください。ここにはソース コードの解釈もあります。
このモデルの推論速度は実際に使用できます。ここには 2 つのオプションがあり、1 つは train に欠陥のないブロックに入り、val に 5 つの欠陥カテゴリを入れる方法です。これは実際にはモデルを生成するだけです。利点は推論速度が速いことですが、欠点は5つの欠陥に対して統一した欠​​陥閾値を生成する必要があり、精度が低下することです。もう 1 つは、バブルを例にとると、train のブロックにはブロックがなく他の欠陥がある画像、val のブロックにはバブルなどの欠陥のみが存在する画像を 5 つ生成する方法です。利点は、各欠陥がモデルとしきい値に対応していることですが、欠点は処理が遅いことです。

おすすめ

転載: blog.csdn.net/smallbig12/article/details/131451511