アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

anoGANで画像の高精度の異常検知(anoGAN, metric learning, VAE) 【機械学習】

今回は画像から異常を検知するタスクをやった。データセットはドイツの異常検知コンペのデータセットDAGM 2007」。

人が人為的に微細な傷をつけたかなりガチの異常検知用データセット
f:id:trafalbad:20190904213001j:plain

精度出すのにやった過程とかを備忘録も兼ねてまとめてく。


目次
1.やったことない内容をまず何からはじめたか
2.一通り動かしてフィードバックを得る
3.ひたすらインプットして、集中して考えまくる
4.飛び道具は使わず、オールマイティな手法の汎用性を上げる工夫をした
5.まとめ



1.やったことない内容をまず何からはじめたか


とにかく下準備8割は自分の経験則なので、準備は念入りにした。

・主な一般的な・人気なトレンド手法を論文、kaggle、qiitaとかいろんなサイトで探す

アルゴリズムでスターの多いgithubコードをリサーチ

・大まかな工程を決める

オライリーとの機械学習の画像系の本読んだ

等、下準備をかなりやった。



主に調べたサイト

そのあとはとにかく失敗を恐れず、コードを書いて動くものを作ってみた。

たいてい論文みたいな精度が出ることはないので、動かす。そして問題点を洗い出し、フィードバックをもらって対策を考えた。





2.一通り動かしてフィードバックを得る

チーム内で問題点をざっと共有。主にslackに投げるとアドバイスや意見とかもらえることもあるし、自分でやったこと見直すこともできるのし、対策を考えるのにも役立つ。

問題点を書き出して、人目につくところに投稿してフィードバックを得る or まとめるというのは重要な作業。

anoGANの問題点は例えばこんだけあった。


・普通のGANでは生成画像の精度が悪い

・3次元(カラー)とグレースケールの使い分けが悪い可能性あり

・画像サイズが小さくない?(小さすぎて異常がわからない)

・異常画像と生成画像の差分の取り方、重み付けに使うopencvのメソッドのパラメータの値に問題あるかも

閾値の設定してないのやばいと思う

など



それからフィードバックもらい、anoGANの改善案の一部

問題点:生成精度が悪い

解決策:マスキングする、もっと精度のいいGAN使う、画像サイズを上げる


3.ひたすらインプットして、集中して考えまくる

次は他の同業者の事例からアイデアを盗む、関連事例で成功してる手法、kaggleとかで上手くいってる手法、論文で参考になる部分、問題点を解決する手法、必要な書籍の購入、等とにかく調べてインプットしまくる。

大量のインプットしたら、調べた知識を整理して、とにかく集中して考える。


だいたい1週間以上ぶっ続けで考えて、トライアンドエラーを繰り返すと、上手く行くこと行かないこと、対策法とかがわかってくる。

この大量にインプット→集中して考えまくるという工程はこの記事でも共通してる。


techlife.cookpad.com


いろいろ考えて試したのち、styleGANを使ったanoGANの手法が上手く行くことがわかった。

これで異常検知用データセットを使ったところ、95%以上の精度を出して、無事プロジェクト終了。




主に考えた・使える手法


手法1.anoGAN+LOFやマハラノビス距離を使ったanomaly scoreの算出

図で見るとわかるように、かなり綺麗に分かれてる。ので、ここからLOFやマハラノビス距離でanomaly scoreを算出。

f:id:trafalbad:20190904151355p:plain



手法2.anoGAN+類似画像検索の手法

下の混合行列を見ればわかるように99%、誤差一枚という驚異的な精度。
f:id:trafalbad:20190904151627p:plain





不採用の手法



1.VAEのloss値を使った手法

→VAEの異常検知のサイトみたいに画像をカットせずに、256ピクセルのままloss値を利用する手法でも十分いけたけど、anoGANには及ばないし、使い勝手悪いのでやめた。


2.metric learning
qiitaとか論文では普通に話題だったけど、Resnet50をベースモデルに一から学習させてもそんな精度出なかった。
多分、lossでいろんな手法があるから、もっと深追いすれば上手く行く方法もあるだろう。けど、anoGANの方が精度いいので別にいいやってなった。



3.類似画像生成して差分から検知
下のようにクエリの異常画像とGANで生成した画像を1次元にして引算した後、画像に戻して、閾値超えたら検知する方法。
一枚しか一度にさばけないし、大量の画像の異常検知はできないのでやめた。


1次元にして差分を出し、画像に戻した

f:id:trafalbad:20190904151527j:plain


opencvのcv2.addWeightedメソッドを用いた差分の画像

f:id:trafalbad:20190904151545p:plain


画像を1次元にするアイデアを閃いた手法
f:id:trafalbad:20190904151800j:plain


4.飛び道具は使わず、オールマイティな手法の汎用性を上げる工夫をした

anoGANを超えたmodelが論文で結構出てるが、やってることはmnistとかcifar-10レベルのデータの精度検証であって、そのまま実用レベルとか、同じ精度で使えることはまずない。

大事なのは一般的な手法(例えばanoGANとか)で、どんな状況でも適用できるようにする工夫が出来ることが重要。


料理漫画とかで、仰々しいマシーン(分子ガストロミーの機械とか)ですごい料理作れるより、フライパンとか油のような一般的・汎用的な道具と知恵と工夫でそれに勝てる料理を作れる主人公が強いのがいい例。

あと、アイデアはかなり大事なので、

大量にinputする

・アイデアを盗む

アイシュタインみたいに一つのことについて考え続けると、思いもよらないideaが生まれる(普通の人はそこまで考えないから)

とにかくアイデアを手当たり次第紙に書き出し(失敗とか気にしない)、その中からよさそうなの試して、絞ったりする



とアイデアに凝って、インプットをしまくるとアウトプットも増えていいものができた。
良質なアウトプットには大量のインプット・良質なインプットが大事」というのが今回の教訓。






5.まとめ

ガチの異常検知、特に画像の異常検知は初めてで、一番難しいタスクだった気がする。

opencvの画像補正もやったので、かなりいい経験と勉強になった。あと画像系のこういうニーズは本当に多いなと思うし、今後も増えそう。


参考にしたサイト


画像を1d変換する時に参考にした記事

いろんなデータセット

【精度対決】リアルな画像で異常検知