"語(yǔ)義分割"最原始的版本-->>
Fully Convolutional Networks for Semantic Segmentation-->>FCNs.理解FCN是理解當(dāng)前最先進(jìn)的
deepLab-V3+的基礎(chǔ)
# python3.6
# tensorflow1.8
# GTX1060
這里引用博客大神的解釋:
先看CNN結(jié)構(gòu)圖:
這里不難理解,很簡(jiǎn)單了.

再進(jìn)一步看FCN結(jié)構(gòu):
這里我簡(jiǎn)單說(shuō)一下.其它基礎(chǔ)自己
多了一個(gè)全連接層,也就是在VGG的第五層加上三層全連接,其中前五層的Weight和Bias直接用VGG的參數(shù)當(dāng)做初始值(遷移學(xué)習(xí)),后面三層參數(shù)高斯初始化設(shè)置.
然后使用三層"反卷積"接在第八層之后,這里的參數(shù)都是使用高斯初始化的.最后得到和輸入圖一樣大小的圖(
end to end)如何訓(xùn)練?這里比較麻煩,我看見(jiàn)網(wǎng)上很多人在問(wèn)這個(gè)問(wèn)題,我剛開(kāi)始也一直糾結(jié).
舉個(gè)例子:假設(shè)訓(xùn)練目標(biāo)種類為
151,輸入一張圖[28X28],而輸出就是[28X28X151],這里對(duì)應(yīng)CNN中的輸出[1X151]一樣的,不過(guò)FCN是基于像素的end to end.其中每一張圖代表一個(gè)種類,圖上的像素越大代表屬于這個(gè)類的種類越大.最后經(jīng)過(guò)softmax,這個(gè)函數(shù)簡(jiǎn)單理解就是歸一化.反卷積?這也是一個(gè)難點(diǎn),我特意寫(xiě)了一篇文章去說(shuō)明,請(qǐng)看我的 深入理解反卷積



最后說(shuō)明以下代碼問(wèn)題:
- 關(guān)于版本的問(wèn)題就不說(shuō)啦,網(wǎng)上百度都是.
- Pickle 讀取不了文件No Model:如果你安裝了pillow,那就是由于文件
MITSceneParsing.pickle生成的有問(wèn)題,這里我將好的文件放在網(wǎng)上,你點(diǎn)擊文件下載- 關(guān)于卡死讀取數(shù)據(jù):把讀取的數(shù)據(jù)弄小一點(diǎn),肯定會(huì)影響訓(xùn)練model,看下面的代碼~~
- 關(guān)于如何測(cè)試圖片:網(wǎng)上很多人不會(huì)測(cè)試圖片,這里我沒(méi)測(cè)試(因?yàn)楣P記本訓(xùn)練不了,訓(xùn)練小數(shù)據(jù)結(jié)果太差了).關(guān)于如何讀取,請(qǐng)看下面代碼.
train_records, valid_records = scene_parsing.read_dataset(FLAGS.data_dir)
print(len(train_records)) # 長(zhǎng)度
print(len(valid_records))
train_records = train_records[0:100]
#valid_records = valid_records[0:1000]
elif FLAGS.mode == "visualize":
# 可視化,這里是讀入的數(shù)據(jù),直接在這里把valid_images/valid_annotations改成你的訓(xùn)練圖片和標(biāo)簽圖,你可以在線看一下格式,讀取進(jìn)來(lái)做個(gè)修改就行了.
valid_images, valid_annotations = validation_dataset_reader.get_random_batch(FLAGS.batch_size)
# pred_annotation預(yù)測(cè)結(jié)果圖
pred = sess.run(pred_annotation, feed_dict={image: valid_images, annotation: valid_annotations,
keep_probability: 1.0})
valid_annotations = np.squeeze(valid_annotations, axis=3)
pred = np.squeeze(pred, axis=3)
for itr in range(FLAGS.batch_size):
utils.save_image(valid_images[itr].astype(np.uint8), FLAGS.logs_dir, name="inp_" + str(5+itr))
utils.save_image(valid_annotations[itr].astype(np.uint8), FLAGS.logs_dir, name="gt_" + str(5+itr))
utils.save_image(pred[itr].astype(np.uint8), FLAGS.logs_dir, name="pred_" + str(5+itr))
print("Saved image: %d" % itr)
參考資料: