オッサンはDesktopが好き

自作PCや機械学習、自転車のことを脈絡無く書きます

Deep Learning: AutoEncoderで傷検出してみる

DAGM画像をAutoEncoderにかけてみます.
内容的には,これ*1とこれ*2をドッキングしただけです.

mnistの場合*3と異なるのは,傷がある場所を1,傷が無い場所を0とするラベル画像を使っている事です.

# label #
trnLABEL = []
tstLABEL = []    
# defection data
x = np.linspace(1.0, 511, IMG_SIZE)
y = np.linspace(1.0, 511, IMG_SIZE)
label1 = open('./data/Class1_def/labels.txt', 'r')
for k in range(TRAIN_DATA_SIZE + TEST_DATA_SIZE):
     line = label1.readline()
     val = line.split('\t')
     num = int(val[0]) - 1
     mjr = float(val[1])
     mnr = float(val[2])
     rot = float(val[3])
     cnx = float(val[4])
     cny = float(val[5]) 

     # inverse rotate pixels
     label = np.zeros([OUTPUT_SIZE + 1])
     weight = np.zeros([OUTPUT_SIZE + 1])
     label[0] = num # index
     weight[0] = num # index
     for i in range(IMG_SIZE):
          for j in range(IMG_SIZE):
               dist = math.sqrt((x[i] - cnx)**2 + (y[j] - cny)**2)
               xTmp = (x[i] - cnx) * math.cos(-rot) - (y[j] - cny) * math.sin(-rot)
               yTmp = (x[i] - cnx) * math.sin(-rot) + (y[j] - cny) * math.cos(-rot)
               ang = math.atan(yTmp/xTmp)
               distToEllipse = math.sqrt((mjr * math.cos(ang))**2 + (mnr * math.sin(ang))**2)
               if(dist < distToEllipse):
                   label[j*IMG_SIZE + i + 1] = 1 # defection
               else:
                   label[j*IMG_SIZE + i + 1] = 0
        
     if(k < TRAIN_DATA_SIZE):
          trnLABEL.append(label)
     else:
          tstLABEL.append(label)

結果はこんな感じです.

f:id:changlikesdesktop:20190503164242p:plain:w500

f:id:changlikesdesktop:20190503164311p:plain:w500

f:id:changlikesdesktop:20190503164342p:plain:w500

(左:元画像,中:ラベル画像,右:結果)

やっとここまで来た,,,って感じです.

結構時間かかりました(汗)
反省点としては,原理的な理解にこだわって身重になってしまったことですね.
研究あがりの人間としてはある程度正しい態度だと思うんですが,結果的には,多くの情報を集めてトライアルを繰り返すプログラマー的なアプローチの方が圧倒的に正しかったです.
近年のDeep Learningブームはライブラリの充実(=専門的な知識がなくてもプログラムが組める)に支えられているわけで,「使えるものは使う」柔軟な姿勢を取ることが重要だと感じました.

今回書いたソースはここ*4です.
次は,傷無し画像と傷あり画像が混ざった画像からの学習を試します.