医療職からデータサイエンティストへ医療職からデータサイエンティストへ統計学、機械学習に関する記事をまとめています。Python機械学習を用いた画像データの異常検知は、様々な分野で用いられ始めています。工場現場であれば、流れてくる製品から自動的に不良品をはじくといったことにもできますし、医療現場であれば、画像診断にも応用できるでしょう。異常検知の課題は、そもそも発生が少ない異常を学習させることが難しいところにあります。今回は、そんな画像異常検知をシンプルな手書き文字画像でやってみます。Encoder)です。データの準備CNNによる異常検知CAEによる異常検知まとめ参考データの準備まずはデータを読み込んでおきましょう。今回はkerasを使ってモデルを作成しますが、kerasにデフォルトで入っている画像分類の代名詞であるMINSTを使います。5421})MINISTは、28×28ピクセルの手書き文字がtrainには60,000枚、テストには10,000枚入っています。各画像には0~9までの数字が一つ書かれていて、それぞれ6,000枚ずつぐらい入っています。試しに1枚表示させてみましょう。plt.imshow(X_train[0])plt.show()次に、CNNとCAEの学習用にデータを加工していきます。画像は1と書いてある画像を正常、それ以外を異常と仮定し、学習、テストデータともに異常画像を10枚にします。CNNでは教師ラベルが必要なため、1のときは1、それ以外の数字は0とラベルをつけておきます。10})これで準備が整いました。CNNによる異常検知それでは早速CNNを使って画像の異常検知してみます。画像分類に応用した手法です。www.medi-08-data-06.work本来、犬やネコといった画像分類タスクに優れており、画像の特徴を勝手に学習することで、画像を分類することができます。CNNの詳細には触れませんが、今回のモデルイメージとしては、こんな感じです。次に、trainデータを評価用と学習用に分割し、教師ラベルを加工します。2)最後にkerasを使って、モデルを作成します。今回は、中間層が3層のCNNを作成します。勾配アルゴリズムにはAdam、誤差評価にはcategorical_crossentropyを用いました。)print(model.summary())学習させます。y_valid_cnn))少し時間がかかりますが、学習が終わったあとは、trainとvalidationの学習曲線を確認してみます。fontsize=10)plt.grid()plt.xlabel('epoch')plt.ylabel('loss')plt.show()過学習することなくうまく学習できているように見えます。テストデータで予測して、混同行列で結果を確認してみましょう。1135テストデータの中で、1の画像、つまり正常データは正しく分類できているようです。一方で1以外の異常画像は10枚のうち5枚を、誤って正常と分類しています。このようにCNNなどの教師あり学習は、データが少ないラベルの分類が苦手です。次にCAEを使ってみます。Encoderの一種で、入力と出力を全く同じ形式に復元するように学習させます。正常データのみを学習させ、うまく復元できない物があれば、異常とみなす仕組みです。CAEの良いところは、学習に正常データのみを用いるため、そもそも異常データを準備する必要がないところにあります。今回のCAEのモデルイメージはこんな感じです。それでは早速モデルを作っていきましょう。はじめに学習と評価データを1の画像のみで準備します。5393})そして、先ほど同様にモデルを作成します。勾配アルゴリズムはAdam、誤差評価は、入力と出力のピクセルで評価するため、binary_crossentropyを使います。)print(model.summary())学習させて、学習曲線を確認してみます。fontsize=10)plt.grid()plt.xlabel('epoch')plt.ylabel('loss')plt.show()こちらもうまく学習できているように見えます。テストデータで評価してみましょう。異常の判断方法は様々ありますが、今回は学習データにおける各画像の入力と出力の誤差平方和を利用し、その平均値より誤差が大きい(つまり、復元がうまくできていない)画像を異常とみなします。792誤差の平均値を異常の域値としたため、正常データも半分弱は異常と分類さていますが、異常データは全て正しく分類できています。異常の域値を変えることで、用途にあわせた異常検知を行えます。このようにCAEは"俺か俺以外か"で判断できるため、学習時に異常データがない場合でも異常検知をすることができます。復元前と後で画像を比較してみましょう。1の復元はうまくできているようですが、1以外の復元は、横棒や円などは途切れていたりして、不完全な復元になっているように見えます。まとめ今回は、白黒だったため分かりにくいですが、CAEは色も復元できるため、変色など異常検知に用いることもできます。入力に対して、ノイズを除いた出力の復元を学習させるとノイズ除去などにも使えます。Encoderは奥が深いので、気になる方は是非とも調べてみてください。(調べます、、)※本記事は筆者が個人的に学んだこと感じたことをまとめた記事になります。所属する組織の意見・見解とは無関係です。学んだこと、日々の所感をまとめていきます。※本ブログは筆者が個人的に学んだこと感じたことをまとめたブログになります。所属する組織の意見・見解とは無関係です。medi_data0826引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。