背景
EfficientNetで異常検知を試した際に、HLACというものを知ったのでほんの少しだけ試してみました。
結果としては、全然ダメでしたが、ほぼアダコテックさんのブログのコードをただ使っただけで、何の工夫もしていないので、改善の余地は多々あると思います。
HLACとは
アダコテックさんの記事がとてもわかり易いと思います。
https://note.com/ryotakawamura9/n/nb91e8e226dfa
こちらは実際の使い方。今回のコードはほぼこれをそのまま使わせて頂いています。
https://zenn.dev/kotaro_inoue/articles/f0cbbca962313b
HLAC特徴量抽出の流れ
- 使用データ
-
MVTECの中から木・ネジ・ボトルで検証
- ダウンロード時はgood,scratch,hole等にフォルダ分かれているが、good,badフォルダのみに修正
-
MVTECの中から木・ネジ・ボトルで検証
- 前処理
- グレースケール
- HLAC特徴量抽出
- 画像から指定したパッチ毎(20x20等)に特徴量を抽出
- PCA
- HLAC特徴量を主成分分析で一次元に変換し、良品と不良品を比較
- PCA以外でもマハラノビス距離を求めたり、色々方法はありそう
コード
コードはこちら
結果
木(パッチサイズ20x20)
木(パッチサイズ8x8)
パッチサイズが小さすぎるのかと思って8x8を試したが全然良くならず。
ちゃんと一個ずつ分析しながらやらないとダメですね・・・
ネジ
ボトル
所感
- ぱっと使った感じだとEfficientNetの方が精度高いが、実際にビジネスでやる場合はどちらの手法もこの何千倍も探求して、様々な工夫をして使われていると思うので、単純にどちらが良いという話ではない。
- HLACはシンプルな特徴抽出なので、論理立てて深堀が出来ればかなり使えるのではないか。(自分では出来ないが、アダコテックさんは製造業での難しそうな検査をやられているので腕があれば出来るはず・・・)
- 本来はこんなシンプルな使い方でなく、対象物や傷の種類等で色々な使われ方をするのだろうか。