前一半寫(xiě)于2019年1月3日凌晨
后一半寫(xiě)于2019年1月3日下午至晚上
一无埃、找Unet代碼
https://github.com/PARMAGroup/UNet-Instance-Cell-Segmentation
我找到的是這個(gè)浓体,instance cell segmentation恰好對(duì)應(yīng)細(xì)胞分割辱揭。
而且用到的軟件是Pytorch裆泳,恰好是學(xué)長(zhǎng)推薦的軟件鳄橘。
感覺(jué)看起來(lái)非常好的樣子叽掘。
二蚣抗、閱讀該代碼的幫助文件
We tested UNet over several configurations including the loss function, evaluation function and the datasets.
1勉躺、準(zhǔn)備工作
Python3.7? ? ?Pythorch? ? ?數(shù)據(jù)集
2癌瘾、運(yùn)行training and validation
運(yùn)行訓(xùn)練集:運(yùn)行main.py文件。
Options for configuration配置選項(xiàng)
3饵溅、運(yùn)行結(jié)果可視化
在文件夾“visualization”中運(yùn)行結(jié)果可視化妨退。
show visualization
These report will create an image of the performance (Loss, Accuracy), an image of the outputs of the model and an image of the gt to compare.
Options for configuration配置選項(xiàng)
4、Compare two Trained Models
暫時(shí)我們用不到
三蜕企、安裝Pytorch然后看一下Pytorch的基本操作
1咬荷、安裝Pytorch
我們現(xiàn)在Windows下安裝Pytorch吧。Pytorch也有Linux版本轻掩。
(1)嘗試安裝的第一個(gè)方法:
參考網(wǎng)站:https://zhuanlan.zhihu.com/p/32910624
針對(duì)小筆記本電腦幸乒,只需要這一條命令:
conda install -c peterjc123 pytorch
我還是打開(kāi)Anaconda Prompt,在這個(gè)上面輸入這條命令的唇牧。然后就開(kāi)始安裝了罕扎。
解析安裝環(huán)境好像需要1分鐘。中間需要點(diǎn)一次yes丐重。然后就一直等就行了腔召。整個(gè)過(guò)程我這邊花了20分鐘左右。
注意:安裝的時(shí)候務(wù)必要關(guān)掉所有其他的Python程序扮惦,否則可能報(bào)錯(cuò)臀蛛!
在安裝Pytorch的同時(shí)快速入門(mén)
檢測(cè)是否安裝成功:
cmd到命令窗口,輸入python,然后import torch包崖蜜,查看是否導(dǎo)出成功浊仆。
結(jié)果:安裝不成功
(2)卸載pytorch
pip uninstall torch
需要點(diǎn)一次確認(rèn)。
參考網(wǎng)站:https://ptorch.com/news/37.html
注意:務(wù)必重啟命令行豫领,不能先輸入python后再輸入這個(gè)命令抡柿。
(3)安裝pytorch的第二個(gè)方法:
參考網(wǎng)址:https://blog.csdn.net/sc2079/article/details/82353894
去官網(wǎng):
選擇適合你開(kāi)發(fā)環(huán)境要求的選項(xiàng)。筆者從上到下依次選的是window氏堤、pip沙绝、3.6搏明、None。
查看安裝命令
pip3 install https://download.pytorch.org/whl/cpu/torch-1.0.0-cp36-cp36m-win_amd64.whl
pip3 install torchvision
希望這次能安裝成功
運(yùn)行第一個(gè)命令大概需要等5分鐘
再?gòu)?fù)制粘貼第二個(gè)命令闪檬。
輸入python,然后import torch包星著,查看是否導(dǎo)出成功。
安裝成功粗悯!
2虚循、Pytorch快速入門(mén)
參考網(wǎng)址:https://zhuanlan.zhihu.com/p/26854386
(1)pytorch處理對(duì)象及操作
Tensor:
張量,其實(shí)就是多維矩陣
torch.Tensor(5,4) #返回5*4大小的矩陣
a = torch.rand(5,4)
a.size()
Variable:
一個(gè)Variable里面包含著三個(gè)屬性样傍,data横缔,grad和creator,其中creator表示得到這個(gè)Variabel的操作衫哥,比如乘法或者加法等等茎刚,grad表示方向傳播的梯度,data表示取出這個(gè)Variabel里面的數(shù)據(jù)撤逢。
神經(jīng)網(wǎng)絡(luò)
模型的建立主要依賴(lài)于torch.nn膛锭,torch.nn包含這個(gè)所有神經(jīng)網(wǎng)絡(luò)的層的結(jié)構(gòu)
可以看這個(gè)網(wǎng)站,注釋是中文的蚊荣,是非常好的Pytorch入門(mén)初狰。
https://github.com/L1aoXingyu/pytorch-beginner
比如第四節(jié)構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)。
四互例、嘗試閱讀代碼并弄清楚Options for configuration到底是什么
https://github.com/PARMAGroup/UNet-Instance-Cell-Segmentation
還是這個(gè)代碼
1奢入、閱讀main.py
(1)之前看代碼手冊(cè)的時(shí)候,一直看不懂Options for configuration說(shuō)的是啥媳叨,但是在代碼里找到了對(duì)應(yīng)的答案腥光。
OptionParser:Python里的這個(gè)模塊用于處理命令行參數(shù)。
比如在命令行里輸入某個(gè)命令肩杈,便會(huì)打印出對(duì)應(yīng)參數(shù)柴我。
(2)main.py一共有一下幾個(gè)組成部分:
定義第一個(gè)函數(shù):Configure every aspect of the run.?Runs the training and validation.
def setup_and_run_train(n_channels, n_classes, dir_img, dir_gt, dir_results, load,? val_perc, batch_size, epochs, lr, run, optimizer, loss, evaluation):
定義第二個(gè)函數(shù):Definition of the optional and needed parameters.
def get_args():
這個(gè)函數(shù)里設(shè)置了各個(gè)參數(shù)的默認(rèn)值。
開(kāi)始運(yùn)行:(用到了剛剛定義的兩個(gè)函數(shù))
if __name__ == "__main__":
? ? args = get_args()
? ? for r in range(args.runs):
? ? ? ? setup_and_run_train(
? ? ? ? ? ? ? ? n_channels = args.n_channels,
? ? ? ? ? ? ? ? n_classes = args.n_classes,
? ? ? ? ? ? ? ? dir_img = '../data/'+args.dataset+'/',
? ? ? ? ? ? ? ? dir_gt = '../data/'+args.gt+'/',
? ? ? ? ? ? ? ? dir_results = '../checkpoints/'+args.savedir+'/',
? ? ? ? ? ? ? ? load = args.load,
? ? ? ? ? ? ? ? val_perc = args.val_perc,
? ? ? ? ? ? ? ? batch_size = args.batchsize,
? ? ? ? ? ? ? ? epochs = args.epochs,
? ? ? ? ? ? ? ? lr = args.lr,
? ? ? ? ? ? ? ? run=str(r),
? ? ? ? ? ? ? ? optimizer = args.optimizer,
? ? ? ? ? ? ? ? loss = args.loss,
? ? ? ? ? ? ? ? evaluation = args.evaluation)
注意:
dir_img和dir_gt和dir_results這三個(gè)文件夾的命名方法:
兩個(gè)點(diǎn)“..”表示當(dāng)前所處的文件夾上一級(jí)文件夾的絕對(duì)路徑
初步理解為:
有一個(gè)最大的文件夾扩然,比如叫:Unet_project
里面分為3個(gè)小文件夾,分別為:data,checkpoints,codes
然后在data文件夾里聋伦,又分為:Data夫偶,GT_One_Class兩個(gè)小文件夾
在checkpoints文件夾里,還有一個(gè)checkpoints文件夾觉增。用來(lái)保存結(jié)果
其中有一項(xiàng)叫做Validation Percentage兵拢,暫時(shí)還沒(méi)有弄懂是什么意思。
然后這里的loss和evaluation是選擇loss和evaluation函數(shù)逾礁。
?setup_and_run_train這個(gè)函數(shù)會(huì)返回每個(gè)epoch的這些值:
'epoch', 'train loss', 'train acc', 'val loss', 'val acc'并存在excel里说铃。
epoch的含義是:摘自知乎:
對(duì)于初學(xué)者來(lái)講访惜,有幾個(gè)概念容易混淆:
(1)iteration:表示1次迭代(也叫training step),每次迭代更新1次網(wǎng)絡(luò)結(jié)構(gòu)的參數(shù)腻扇;
(2)batch-size:1次迭代所使用的樣本量债热;
(3)epoch:1個(gè)epoch表示過(guò)了1遍訓(xùn)練集中的所有樣本。
值得注意的是幼苛,在深度學(xué)習(xí)領(lǐng)域中窒篱,常用帶mini-batch的隨機(jī)梯度下降算法(Stochastic Gradient Descent, SGD)訓(xùn)練深層結(jié)構(gòu),它有一個(gè)好處就是并不需要遍歷全部的樣本舶沿,當(dāng)數(shù)據(jù)量非常大時(shí)十分有效墙杯。此時(shí),可根據(jù)實(shí)際問(wèn)題來(lái)定義epoch括荡,例如定義10000次迭代為1個(gè)epoch高镐,若每次迭代的batch-size設(shè)為256,那么1個(gè)epoch相當(dāng)于過(guò)了2560000個(gè)訓(xùn)練樣本畸冲。
2嫉髓、閱讀dataset.py文件
需要在main里用到的函數(shù)是 get_dataloaders,所以需要仔細(xì)閱讀這個(gè)函數(shù)召夹。
(1)在main函數(shù)中:
在main里的調(diào)用用到的是這一行:
train_loader, val_loader = get_dataloaders(dir_img, dir_gt, val_perc, batch_size)
(2)在dataset.py文件中:
get_dataloaders這個(gè)函數(shù)的作用是:
Returns the dataset separated in batches. Used inside every epoch for retrieving the images.
(3)這一句的含義:ids = [f[:-4] for f in os.listdir(dir_img)]
# [:-4]=.后綴
os.listdir() 方法用于返回指定的文件夾包含的文件或文件夾的名字的列表岩喷。
(4)在Class里,有一段transform代碼,試圖弄清楚它的意思:
# Transforms
? ? ? ? self.data_transforms = {
? ? ? ? ? ? 'imgs': transforms.Compose([
#? ? ? ? ? ? ? ? transforms.RandomResizedCrop(256),
#? ? ? ? ? ? ? ? transforms.RandomHorizontalFlip(),
? ? ? ? ? ? ? ? transforms.ToTensor(),
? ? ? ? ? ? ? ? transforms.Normalize([0.0054],[0.0037])
? ? ? ? ? ? ]),
? ? ? ? ? ? 'masks': transforms.Compose([
? ? ? ? ? ? ? ? transforms.ToTensor()
? ? ? ? ? ? ]),
? ? ? ? }
這段代碼的作用是:
在Pytorch中轉(zhuǎn)化成張量形式并且進(jìn)行歸一化监憎。
參考網(wǎng)址:https://zhuanlan.zhihu.com/p/27382990
注意:第15行的extension應(yīng)該改成“tiff”以適應(yīng)我自己的圖片的需要纱意。
3、閱讀model.py文件
構(gòu)建Unet網(wǎng)絡(luò)
4鲸阔、閱讀train_val文件
定義loss function
5偷霉、閱讀miscc.py文件
把數(shù)據(jù)存到csv格式的文件中。
6褐筛、一些還有疑問(wèn)的地方
(1)代碼里是怎么區(qū)分train和validation set的呢类少?
五、弄清楚一個(gè)問(wèn)題:訓(xùn)練好之后怎么測(cè)試呢渔扎?
幫助文件里有這么一句話(huà):
Show Visualization
If you want to see how a trained model performs out, you should use the?result_visualization.py?file. These report will create an image of the performance (Loss, Accuracy), an image of the outputs of the model and an image of the gt to compare.
對(duì)硫狞!這個(gè)文件“result_visualization.py?” 位于visualization文件夾里,是進(jìn)行測(cè)試用的晃痴。
if __name__ == '__main__':
? ? args = get_args()
? ? df = mean_results(args.folder)
? ? plot_one(df, args.title, args.folder)
? ? see_results(n_channels = args.n_channels,
? ? ? ? n_classes = args.n_classes,
? ? ? ? load_weights = args.load,
? ? ? ? dir_img = "./img_test/"+args.dataset+"/",
? ? ? ? dir_cmp = "./img_test/"+args.gt+"/",
? ? ? ? savedir = args.folder,
? ? ? ? title = args.title)
這一段是最后跑的代碼残吩。這里非常關(guān)鍵的內(nèi)容是load_weights,我需要仔細(xì)研究這個(gè)函數(shù)倘核。
但是可以先訓(xùn)練起來(lái)泣侮,訓(xùn)練的過(guò)程中研究測(cè)試的代碼。
六紧唱、開(kāi)始調(diào)試和運(yùn)行訓(xùn)練集代碼
第一步:
先取200幅圖像進(jìn)行調(diào)試活尊,合適的話(huà)再去取1000幅
第二步:
開(kāi)始嘗試運(yùn)行隶校。
一開(kāi)始主要是一些文件尋找的錯(cuò)誤。