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
結果です.
傷無し
(左:元画像,中:ラベル,右:結果)
傷無し
(左:元画像,中:ラベル,右:結果)
学習としては成功していると思うのですが,汎用性に不安を感じました.
今回,傷無し部分のラベル値を0.0001としましたが,この値を傷有りと傷無しの画像数比や傷の大きさに応じて変える必要がありそうだからです.
また,0.0に近い値を採用すると,傷有りだけで学習するのと同値になります.
傷有り画像が潤沢にある場合には,傷有りだけでネットワークを作る方が良いのかも知れません.
ラベルを使わない方法も色々*2*3提案されている様なので,調べてみようと思います.
今回書いたソースはここ*4です.