一、更改參數(shù),訓(xùn)練Unet神經(jīng)網(wǎng)絡(luò)
1、更改的兩個(gè)方向:
(1)batch_size改大
(2)訓(xùn)練集改多,比如可以改成800.
(3)epoch可以稍微改小,從30改成20。
2、復(fù)習(xí)訓(xùn)練和跑訓(xùn)練集的方法
參考自己的文章“在Linux服務(wù)器上跑Python Unet程序”,其實(shí)自己記錄得不多,這里重新寫一遍跑的方法吧。
(1)服務(wù)器選擇:用greenpill跑;
(2)在自己電腦上改好代碼(參數(shù)和需要用到的數(shù)據(jù)集);
(i)改train數(shù)據(jù)集:
在Unet_project文件夾下的Data文件夾下的兩個(gè)文件夾:“Data”和“GT_One_Class”分別代表原始圖片和對(duì)應(yīng)的ground truth。先把這里改掉。
注意,需要用到“renamer”軟件來(lái)確保原始圖片和groundtruth的對(duì)應(yīng)名稱是一樣的。
這次我把前13個(gè)原始圖像生成的擴(kuò)增圖像作為訓(xùn)練集,一共有871張圖片。
注意:數(shù)據(jù)集從最后一個(gè)字為1的文件夾里復(fù)制粘貼,這里的名字是改過(guò)的。
其次檢查名稱是否對(duì)應(yīng):
第一個(gè)groudtruth圖的名稱是:“DS01_01.tif_0b2db155-af35-4c31-9586-f29fecb7e695”
第一個(gè)original圖的名稱是:“DS01_01.tif_0b2db155-af35-4c31-9586-f29fecb7e695”
是對(duì)應(yīng)的,可能因?yàn)橹案倪^(guò)名字了?,F(xiàn)在就不用改了。
(ii)改參數(shù):
主要是改batch_size和epochs這兩個(gè)量。
在“main.py”里,batch_size是從batch_size = args.batchsize這句話中得到的。其實(shí)就是從函數(shù)“get_args”中得到的。
所以改參數(shù),實(shí)際上就改函數(shù)“get_args”里的變量就可以了。
我把batch_size改成了5,epoches還是30。
(3)放到服務(wù)器上運(yùn)行
(i)把文件通過(guò)Winscp傳到greenpill上。
(ii)運(yùn)行python文件的方法:
直接先把目錄轉(zhuǎn)移到你需要運(yùn)行的python文件的目錄下,然后輸入如下指令:python main.py?就可以了。其中“main.py”是我需要運(yùn)行的文件。
轉(zhuǎn)移目錄的方法:比如:cd? /home/duola/file
(iii)用windows打開ubuntu軟件,輸入 ssh? 用戶名@主機(jī)地址,進(jìn)而鍵入密碼。
(iv)返回上一級(jí)的方法:cd -就可以了
3、復(fù)習(xí)測(cè)試集的test方法
(1)這個(gè)文件“result_visualization"位于visualization文件夾里,是進(jìn)行測(cè)試用的。
(2)測(cè)試前需要把由train的代碼生成的結(jié)果“weights0.pth”放入visualization文件夾內(nèi)。這個(gè)“weights0.pth”文件本身的路徑在Unet_project的Checkpoints下。
(3)測(cè)試前需要把visualization文件夾下的“img_test”文件夾下的“Data”和“GT_One_Class”文件夾分別存上測(cè)試圖的data和groundtruth
我放上剩余的由original_14和original_15擴(kuò)增得到了圖,一共有129張。
(4)然后把文件夾cd到test的python文件result_visualization.py所在的文件夾中,然后跑這個(gè)python程序。
4、運(yùn)行時(shí)出現(xiàn)的問(wèn)題
(1)服務(wù)器 oom了
可能是:train的圖片數(shù)量太多了?(不是這個(gè)原因)batch_size太大了?(是這個(gè)原因)
改main.py的參數(shù),還是把batch改成2吧,然后直接丟到greenpill里把這個(gè)文件換掉。
從命令行里運(yùn)行的batch_size可以看出新的文件覆蓋掉了原來(lái)的文件。然后正常開始跑了。說(shuō)明batch_size設(shè)置成5不行,設(shè)置成2才可以。
(2)跑一個(gè)epoch的時(shí)間:10分鐘
5、寫一個(gè)能夠一口氣跑出所有test圖并且保存的代碼
(1)遠(yuǎn)程調(diào)試教程:(非常重要?。?/p>
http://www.itdecent.cn/p/9b362cdee2ab
(2)需要改result_visualization.py的代碼:
新建一個(gè)python文件叫做:result_visualization_1.py
(3)研究see_results這個(gè)函數(shù):
see_results這個(gè)函數(shù)是從dir_img里導(dǎo)入原圖,dir_cmp里導(dǎo)入groundtruth,用這個(gè)函數(shù)“get_dataloader_show”來(lái)導(dǎo)入。
(4)研究get_data_loader_show這個(gè)函數(shù)
(i)在這個(gè)“get_dataloader_show”函數(shù)里,這一句其實(shí)我沒(méi)有太看懂:ids = [f[:-4] for f in os.listdir(dir_img)]
是只讀第一個(gè)名字嗎?
這個(gè)函數(shù)的返回值是一個(gè)dataloader
我新建了一個(gè)test進(jìn)行測(cè)試。文件名為“test_1.py”,保存在visualization這個(gè)文件夾內(nèi)。
其實(shí)不用寫test的,只需要這一句:
ids = [f[:-4] for f in os.listdir("./img_test/"+args.dataset+"/")],即把dir_img具體化就可以了。
結(jié)果發(fā)現(xiàn)ids讀取了全部圖片的名字(不包括文件后綴。)
我進(jìn)而輸入了type(ids)查看文件類型。發(fā)現(xiàn)是一個(gè)list。
(ii)loader = get_dataloader_show(dir_img, dir_cmp)這里的loader是什么呢?是只包含一個(gè)圖還是包含了很多個(gè)圖呢?
loader 是一個(gè)class類型的數(shù)據(jù)。
在class中有一個(gè)函數(shù)叫g(shù)etitem,作用是ask for an image。是可以根據(jù)輸入的index獲取一張圖。
(5) 研究result_visualization_1.py 里for (data, gt) in loader:這段循環(huán),到底是對(duì)一個(gè)圖循環(huán)還是對(duì)loader里的所有圖循環(huán)?
我在test_1.py中跑了,驚訝地發(fā)現(xiàn)結(jié)果是把所有的結(jié)果放在同一張圖上。類似這種效果:

這個(gè)感覺(jué)非常好哎!那我下一次可以試著用10個(gè)圖生成這個(gè)結(jié)果圖吧。
(6)實(shí)際嘗試:
一次處理10張照片又oom了。
6、結(jié)果總結(jié)
(1)original_image_14我處理了第一幅圖和前10幅圖;
(2)original_image_15我處理了第一幅圖和前10幅圖;
二、評(píng)價(jià)結(jié)果
https://github.com/lucianolorenti/ImageSegmentationEvaluation.jl
https://github.com/martinkersner/py_img_seg_eval? 這個(gè)代碼特別好
我需要找pixel-based matrix
那么我還是自己寫吧,基于https://github.com/martinkersner/py_img_seg_eval這個(gè)代碼自己去寫。
1、np.unique函數(shù):該函數(shù)是去除數(shù)組中的重復(fù)數(shù)字,并進(jìn)行排序之后輸出。返回值通常是一個(gè)列表。
參考網(wǎng)址:https://blog.csdn.net/u012193416/article/details/79672729
2、for in enumerate這個(gè)循環(huán):
例如:

3、explanation:
n_cl?: number of classes included in ground truth segmentation
n_ij?: number of pixels of class?i?predicted to belong to class?j
t_i?: total number of pixels of class?i?in ground truth segmentation
4、還是自己寫程序會(huì)更快一點(diǎn)吧
參考文章:https://blog.csdn.net/hjxu2016/article/details/79104607
讀入圖片的代碼:
from PIL import Image
import numpy as np
I = Image.open('./cc_1.png')
I.show()? ?
I.save('./save.png')
I_array = np.array(I)
print I_array.shape
這理我發(fā)現(xiàn)了一個(gè)問(wèn)題:保存的圖片的格式是png格式的??隙ú恍?,我需要改成“.tiff”格式
爭(zhēng)取在1點(diǎn)前出完圖:結(jié)果:在1:30完成了出圖和對(duì)應(yīng)圖的PPT的書寫。
爭(zhēng)取在2點(diǎn)前寫完evaluation的代碼:結(jié)果:可能在3點(diǎn)左右才能寫完?3:18寫完
主要參考文獻(xiàn)是學(xué)長(zhǎng)發(fā)給我的那篇論文。
在代碼里我需要計(jì)算出以下幾個(gè)量:
n_tp:groundtruth為正,預(yù)測(cè)也為正
n_tn:groundtruth為負(fù),預(yù)測(cè)也為負(fù)
n_fp:groundtruth為負(fù),但是預(yù)測(cè)為正
n_fn:groundtruth為正,但是預(yù)測(cè)為負(fù)
正為前景(即255),負(fù)為背景(即0)
出現(xiàn)了問(wèn)題:n_tp,n_tn,n_fp,n_fn的總和和圖片的像素之和對(duì)應(yīng)不上。
解決辦法:我放到matlab里看一看吧。
出現(xiàn)問(wèn)題的原因是:
prediction里有介于0~255之間的值,我的處理方法是:大于255/2的都視為255,小于255/2的視為0。
爭(zhēng)取在4點(diǎn)前做完P(guān)PT:在3:41的時(shí)候我寫完了定量分析部分的PPT。爭(zhēng)取在4:00前寫完
其實(shí)主要是定量分析部分。
至于那邊要求的數(shù)據(jù)擴(kuò)增部分,參考:“(1-2)Python3.6進(jìn)行圖片及對(duì)應(yīng)groundtruth的data augmentation”這篇文章進(jìn)行增加。
增加完了。可以睡了。