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です.
次は,傷無し画像と傷あり画像が混ざった画像からの学習を試します.