一、更改参数,训练Unet神经网络
1、更改的两个方向:
(1)batch_size改大
(2)训练集改多,比如可以改成800.
(3)epoch可以稍微改小,从30改成20。
2、复习训练和跑训练集的方法
参考自己的文章“在Linux服务器上跑Python Unet程序”,其实自己记录得不多,这里重新写一遍跑的方法吧。
(1)服务器选择:用greenpill跑;
(2)在自己电脑上改好代码(参数和需要用到的数据集);
(i)改train数据集:
在Unet_project文件夹下的Data文件夹下的两个文件夹:“Data”和“GT_One_Class”分别代表原始图片和对应的ground truth。先把这里改掉。
注意,需要用到“renamer”软件来确保原始图片和groundtruth的对应名称是一样的。
这次我把前13个原始图像生成的扩增图像作为训练集,一共有871张图片。
注意:数据集从最后一个字为1的文件夹里复制粘贴,这里的名字是改过的。
其次检查名称是否对应:
第一个groudtruth图的名称是:“DS01_01.tif_0b2db155-af35-4c31-9586-f29fecb7e695”
第一个original图的名称是:“DS01_01.tif_0b2db155-af35-4c31-9586-f29fecb7e695”
是对应的,可能因为之前改过名字了。现在就不用改了。
(ii)改参数:
主要是改batch_size和epochs这两个量。
在“main.py”里,batch_size是从batch_size = args.batchsize这句话中得到的。其实就是从函数“get_args”中得到的。
所以改参数,实际上就改函数“get_args”里的变量就可以了。
我把batch_size改成了5,epoches还是30。
(3)放到服务器上运行
(i)把文件通过Winscp传到greenpill上。
(ii)运行python文件的方法:
直接先把目录转移到你需要运行的python文件的目录下,然后输入如下指令:python main.py 就可以了。其中“main.py”是我需要运行的文件。
转移目录的方法:比如:cd /home/duola/file
(iii)用windows打开ubuntu软件,输入 ssh 用户名@主机地址,进而键入密码。
(iv)返回上一级的方法:cd -就可以了
3、复习测试集的test方法
(1)这个文件“result_visualization"位于visualization文件夹里,是进行测试用的。
(2)测试前需要把由train的代码生成的结果“weights0.pth”放入visualization文件夹内。这个“weights0.pth”文件本身的路径在Unet_project的Checkpoints下。
(3)测试前需要把visualization文件夹下的“img_test”文件夹下的“Data”和“GT_One_Class”文件夹分别存上测试图的data和groundtruth
我放上剩余的由original_14和original_15扩增得到了图,一共有129张。
(4)然后把文件夹cd到test的python文件result_visualization.py所在的文件夹中,然后跑这个python程序。
4、运行时出现的问题
(1)服务器 oom了
可能是:train的图片数量太多了?(不是这个原因)batch_size太大了?(是这个原因)
改main.py的参数,还是把batch改成2吧,然后直接丢到greenpill里把这个文件换掉。
从命令行里运行的batch_size可以看出新的文件覆盖掉了原来的文件。然后正常开始跑了。说明batch_size设置成5不行,设置成2才可以。
(2)跑一个epoch的时间:10分钟
5、写一个能够一口气跑出所有test图并且保存的代码
(1)远程调试教程:(非常重要!)
https://www.jianshu.com/p/9b362cdee2ab
(2)需要改result_visualization.py的代码:
新建一个python文件叫做:result_visualization_1.py
(3)研究see_results这个函数:
see_results这个函数是从dir_img里导入原图,dir_cmp里导入groundtruth,用这个函数“get_dataloader_show”来导入。
(4)研究get_data_loader_show这个函数
(i)在这个“get_dataloader_show”函数里,这一句其实我没有太看懂:ids = [f[:-4] for f in os.listdir(dir_img)]
是只读第一个名字吗?
这个函数的返回值是一个dataloader
我新建了一个test进行测试。文件名为“test_1.py”,保存在visualization这个文件夹内。
其实不用写test的,只需要这一句:
ids = [f[:-4] for f in os.listdir("./img_test/"+args.dataset+"/")],即把dir_img具体化就可以了。
结果发现ids读取了全部图片的名字(不包括文件后缀。)
我进而输入了type(ids)查看文件类型。发现是一个list。
(ii)loader = get_dataloader_show(dir_img, dir_cmp)这里的loader是什么呢?是只包含一个图还是包含了很多个图呢?
loader 是一个class类型的数据。
在class中有一个函数叫getitem,作用是ask for an image。是可以根据输入的index获取一张图。
(5) 研究result_visualization_1.py 里for (data, gt) in loader:这段循环,到底是对一个图循环还是对loader里的所有图循环?
我在test_1.py中跑了,惊讶地发现结果是把所有的结果放在同一张图上。类似这种效果:
这个感觉非常好哎!那我下一次可以试着用10个图生成这个结果图吧。
(6)实际尝试:
一次处理10张照片又oom了。
6、结果总结
(1)original_image_14我处理了第一幅图和前10幅图;
(2)original_image_15我处理了第一幅图和前10幅图;
二、评价结果
https://github.com/lucianolorenti/ImageSegmentationEvaluation.jl
https://github.com/martinkersner/py_img_seg_eval 这个代码特别好
我需要找pixel-based matrix
那么我还是自己写吧,基于https://github.com/martinkersner/py_img_seg_eval这个代码自己去写。
1、np.unique函数:该函数是去除数组中的重复数字,并进行排序之后输出。返回值通常是一个列表。
参考网址:https://blog.csdn.net/u012193416/article/details/79672729
2、for in enumerate这个循环:
例如:
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、还是自己写程序会更快一点吧
参考文章: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
这理我发现了一个问题:保存的图片的格式是png格式的。肯定不行,我需要改成“.tiff”格式
争取在1点前出完图:结果:在1:30完成了出图和对应图的PPT的书写。
争取在2点前写完evaluation的代码:结果:可能在3点左右才能写完?3:18写完
主要参考文献是学长发给我的那篇论文。
在代码里我需要计算出以下几个量:
n_tp:groundtruth为正,预测也为正
n_tn:groundtruth为负,预测也为负
n_fp:groundtruth为负,但是预测为正
n_fn:groundtruth为正,但是预测为负
正为前景(即255),负为背景(即0)
出现了问题:n_tp,n_tn,n_fp,n_fn的总和和图片的像素之和对应不上。
解决办法:我放到matlab里看一看吧。
出现问题的原因是:
prediction里有介于0~255之间的值,我的处理方法是:大于255/2的都视为255,小于255/2的视为0。
争取在4点前做完PPT:在3:41的时候我写完了定量分析部分的PPT。争取在4:00前写完
其实主要是定量分析部分。
至于那边要求的数据扩增部分,参考:“(1-2)Python3.6进行图片及对应groundtruth的data augmentation”这篇文章进行增加。
增加完了。可以睡了。
网友评论