オッサンはDesktopが好き

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

傷有りと傷無しを混ぜてDeep Learningしてみる

DAGMデータセットの傷有り・傷無しを混ぜてDeep Learningしてみます.

画像の割当は下記です.

傷有り 傷無し
学習画像 Class1_def 1-100 Class1 1-900
テスト画像 Class1_def 101-150 Class1 901-1000

前回*1と同様にラベルを伴ったAutoEncoderを使うのですが,ラベル画像の作り方を少し変えます.
傷無し画像のラベルを全て0にしてしまうと,学習で使用されなくなってしまうからです.
今回は,傷有りを1.0,傷無しを0.0001とラベル付けしました.
(ソース内ではweightと呼んでいます)

configurate_data_02.py

NO_DEFECT = 0.0001
DEFECT = 1.0

(省略)

weight = np.zeros([OUTPUT_SIZE + 1])
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):
            weight[j*IMG_SIZE + i + 1] = DEFECT
        else:
            weight[j*IMG_SIZE + i + 1] = NO_DEFECT

結果です.

傷無し f:id:changlikesdesktop:20190513084605p:plain:w500 f:id:changlikesdesktop:20190513084625p:plain:w500
(左:元画像,中:ラベル,右:結果)

傷無し f:id:changlikesdesktop:20190513084641p:plain:w500 f:id:changlikesdesktop:20190513084653p:plain:w500
(左:元画像,中:ラベル,右:結果)

学習としては成功していると思うのですが,汎用性に不安を感じました.
今回,傷無し部分のラベル値を0.0001としましたが,この値を傷有りと傷無しの画像数比や傷の大きさに応じて変える必要がありそうだからです.
また,0.0に近い値を採用すると,傷有りだけで学習するのと同値になります.
傷有り画像が潤沢にある場合には,傷有りだけでネットワークを作る方が良いのかも知れません.

ラベルを使わない方法も色々*2*3提案されている様なので,調べてみようと思います.

今回書いたソースはここ*4です.