首页 > 应用开发 > Python > U-net基础入门(包括纠错过程)
原文在此:U-net:运行你的第一个U-net进行图像分割
代码: Github代码
接下来我将就我自己运行原博主代码的调试过程进行一些记录。
1.libtiff
有关libtiff库的导入,我认为大家还是使用下载好文件后,进入你的运行环境中,用
pip instll 下载好的文件路径
安装最为稳妥
注意:博主blog中的文件结构与他代码中使用的文件结构是有一定出入的,个人认为是在后续更改代码的时候忘记更改博客中的说明了,所以截至今天2020-04-02,请大家先以我的说明为准,如果再产生新的错误,大家根据报错来进行新的更改。
2.U-Net 文件夹结构
–Unet-master
–deform
–train
–label
0.tif
1.tif
……
29.tif
train
0.tif
1.tif
……
29.tif
–my_test
data. py
unet. py
–npydata
–results
–test
0.tif
1.tif
……
29.tif
test
0.tif
1.tif
……
29.tif
注:–黑体表示的是文件夹;斜体表示的是文件。
接下来就要根据这个文件结构来进行代码的调试运行。
(PS:之后的报错还需要对这个结构进行更改)
3.data.py
报错1:
FileNotFoundError: [Errno 2] No such file or directory: '../npydata/imgs_train.npy' wei shen me
解决方法:
确认你的data.py文件是否在’my_test’文件夹中。
windows中’…/'表示返回上层文件,所以,data.py应该是和’npydata’文件夹的子文件同一级别。
报错2:
FileNotFoundError: [Errno 2] No such file or directory: '../test/test\\0.tif'
解决方法:
完全按照上述的文件夹结构布局,这个问题自然解决。
原博主的测试图片文件保存在’test’文件夹当中,在Github中,‘test’&'train’文件夹同在’images’文件夹下。
我猜测博主是复制’images/test’文件夹后又将’images/test’文件夹复制了一遍。(正因为这一点,在之后的一个报错中我明白了为什么会产生错误。博主这么做是有意的。)
成功运行’data.py’文件后得到以下结果:
------------------------------
Creating training images...
------------------------------
[]
0
loading done
Saving to .npy files done.
------------------------------
Creating test images...
------------------------------
30
loading done
Saving to imgs_test.npy files done.
------------------------------
load train images...
------------------------------
(0, 512, 512, 1) (0, 512, 512, 1)
其他:
注意此次结果中的‘0’的显示
……………………………………
[]
0
loading done
……………………………………
(0, 512, 512, 1) (0, 512, 512, 1)
在运行’data.py’文件中我还遇到了一些Warning,这个也是预告着之后会出问题。如下:
../Unet-master/my_test/data.py:207: RuntimeWarning: Mean of empty slice.
mean = imgs_train.mean(axis = 0)
..\lib\site-packages\numpy\core\_methods.py:78: RuntimeWarning: invalid value encountered in true_divide
ret, rcount, out=ret, casting='unsafe', subok=False)
同时,在’npydata’文件夹下生成三个’.npy’文件
–npydata
imgs_mask_train.npy
imgs_test.npy
imgs_train.npy
4.unet.py
报错1.1:
TypeError: 'module' object is not callable
解决方法:
更改问题代码。
因为tensorflow不同的版本,语法的使用会有所不同。
#更改前
merge6 = merge([crop4,up6], mode = 'concat', concat_axis = 3)
#更改后
merge6 = Concatenate([drop4,up6],axis=3)
同理更改merge7,8,9:
#更改后
merge7 = Concatenate(axis=3)([conv3, up7])
...
merge8 = Concatenate(axis=3)([conv2, up8])
...
merge9 = Concatenate(axis=3)([conv1, up9])
...
报错1.2:
NameError: name 'Concatenate' is not defined
解决方法:
‘from keras.layers import Concatenate ’
把Concatenate模块(module)载入后才能调用。
报错2:
UnboundLocalError: local variable 'batch_index' referenced before assignment
解决方法1:
这次先说报错原因,在’data.py’的报错1中的其他提到了注意‘0’的显示,这说明程序其实并没能够载入数据到.npy文件当中去,代码产生了错误。而这个错误的原因是原作者对代码编写时对路径的定义产生了问题。
class dataProcess(object):
def __init__(self, out_rows, out_cols,
data_path = "../deform/train",
label_path = "../deform/label",
test_path = "../test",
npy_path = "../npydata",
img_type = "tif"
):
data_path & label_path的路径定义和之后的代码产生了冲突,为了解决这一冲突,不得已把文件结构变得更加复杂化。 郑州做人流哪家医院好 http://mobile.sptdnk.com/
还记的以开始所说的要对结构进行更改吗?
U-Net 文件夹结构
–Unet-master
–deform
–label
0.tif
1.tif
……
29.tif
train(注意这个train文件夹只是命名为train,里面的tif文件是label文件)
0.tif
1.tif
……
29.tif
–train
0.tif
1.tif
……
29.tif
train
0.tif
1.tif
……
29.tif
–my_test
data. py
unet. py
–npydata
–results
–test
0.tif
1.tif
……
29.tif
+test
0.tif
1.tif
……
29.tif
#修改文件结构前
imgs = glob.glob(self.data_path+"/*."+self.img_type)
>>无任何结果显示
#修改文件结构后
imgs = glob.glob(self.data_path+"/*."+self.img_type)
>>'../deform/train\\0.tif','../deform/train\\1.tif',...
#修改文件结构前
midname = imgname[imgname.rindex("/")+1:]
>>无任何结果显示
#修改文件结构后
midname = imgname[imgname.rindex("/")+1:]
>>'train\0.tif','train\1.tif',...
img = load_img(self.data_path + "/" + midname,grayscale = True)
label = load_img(self.label_path + "/" + midname,grayscale = True)
#(注意这个midname其实是'train\*.tif',所以之后的文件结构更改时,'deform-label-train'文件夹只是命名为train,里面的tif文件是label的文件)
解决方法2:
这个bug还有一个简单的解决方式,因为会出现这个问题,说明你用的应该是windows系统,而正因为此,系统的分隔符判定不同。
#修改前
midname = imgname[imgname.rindex("/")+1:]
#修改后
midname = imgname[imgname.rindex("\\")+1:]
使用这个方法,你的文件结构就可以简化。
#存放图片的文件结构
| --deform
| |
| |--label
| | | 0.tif
| | | 1.tif
| | | ……
| | | 29.tif
| | |
| |--train
| | | 0.tif
| | | 1.tif
| | | ……
| | | 29.tif
| | |
|--test
| | 0.tif
| | 1.tif
| | ……
| | 29.tif
| |
当你把所有以上的代码报错都解决了,重新运行data.py,生成3个.npy文件,保存在’npydata’文件夹中,然后运行unet.py,代码就可以跑通了,但是结果如何还无法保证。
5.因为会有
报错*
FileNotFoundError: [Errno 2] No such file or directory: '../results/imgs_mask_test.npy'
解决方法:
#定位
print('predict test data')
imgs_mask_test = model.predict(imgs_test, batch_size=1, verbose=1)
#添加代码
path = '../results'
if not os.path.exists(path):
os.mkdir(path)
#定位
np.save('../results/imgs_mask_test.npy', imgs_mask_test)
原理
可以参考我的另一篇blog。
同理,你之前遇到的任何可能的文件夹错误都可以使用这一个方法来解决。
结束语
今天先记录一下U-net学习的第一步,之后的过程有需要继续更新。
最后让大家看那么久的文字过意不去,最后贴上文件结构图:
运行程序前的结构:
deform下包含两个文件夹,label和train。
my_test文件夹下面是两个主要的.py文件。
label和train文件夹下是训练用的图片,为了减少计算,我只放了两张图在里面,同理test文件夹也一样。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69945560/viewspace-2684151/ ,如需转载,请注明出处,否则将追究法律责任。