FCN從原理到代碼的理解

"語(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)單了.

CNN結(jié)構(gòu)圖

再進(jìn)一步看FCN結(jié)構(gòu):

這里我簡(jiǎn)單說(shuō)一下.其它基礎(chǔ)自己Google.

  1. 多了一個(gè)全連接層,也就是在VGG的第五層加上三層全連接,其中前五層的Weight和Bias直接用VGG的參數(shù)當(dāng)做初始值(遷移學(xué)習(xí)),后面三層參數(shù)高斯初始化設(shè)置.

  2. 然后使用三層"反卷積"接在第八層之后,這里的參數(shù)都是使用高斯初始化的.最后得到和輸入圖一樣大小的圖(end to end)

  3. 如何訓(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)單理解就是歸一化.

  4. 反卷積?這也是一個(gè)難點(diǎn),我特意寫(xiě)了一篇文章去說(shuō)明,請(qǐng)看我的 深入理解反卷積

FCN結(jié)構(gòu)圖
FCN總圖
進(jìn)一步理解圖

最后說(shuō)明以下代碼問(wèn)題:

  1. 關(guān)于版本的問(wèn)題就不說(shuō)啦,網(wǎng)上百度都是.
  2. Pickle 讀取不了文件No Model:如果你安裝了pillow,那就是由于文件MITSceneParsing.pickle生成的有問(wèn)題,這里我將好的文件放在網(wǎng)上,你點(diǎn)擊文件下載
  3. 關(guān)于卡死讀取數(shù)據(jù):把讀取的數(shù)據(jù)弄小一點(diǎn),肯定會(huì)影響訓(xùn)練model,看下面的代碼~~
  4. 關(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)

代碼訓(xùn)練+測(cè)試下載

參考資料:

引用圖

其它資料沒(méi)來(lái)急記錄,請(qǐng)諒解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容