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)
結果はこんな感じです.
(左:元画像,中:ラベル画像,右:結果)
やっとここまで来た,,,って感じです.
結構時間かかりました(汗)
反省点としては,原理的な理解にこだわって身重になってしまったことですね.
研究あがりの人間としてはある程度正しい態度だと思うんですが,結果的には,多くの情報を集めてトライアルを繰り返すプログラマー的なアプローチの方が圧倒的に正しかったです.
近年のDeep Learningブームはライブラリの充実(=専門的な知識がなくてもプログラムが組める)に支えられているわけで,「使えるものは使う」柔軟な姿勢を取ることが重要だと感じました.
今回書いたソースはここ*4です.
次は,傷無し画像と傷あり画像が混ざった画像からの学習を試します.