下面是已经阅读的代码:
- Unet实现多期相肝脏肿瘤分割
Unet实现多期相肝脏肿瘤检测
数据加载
np.transpose()
使用PIL
的Image.open()
打开图片,得到的格式是HWC
,不能直接使用,需要转换为CHW
格式。其中C:channel
通道,如:RGB通道;W
图片的宽度;H
图片的高度。1
2img = Image.open(img_path)
img_sample = np.transpose(np.asarray(img,np.float32)/255.0,[2,0,1]) # HWC ==> CHWnp.asarray()
将Image
得到的数据转为numpy
的数组形式
数据预处理
图片归一化
上面使用/255.0
进行归一化,归一化不会改变图像本身的信息存储,对于后续的神经网络或者卷积神经网络处理有很大的好处。尤其对于医学图像处理,可以抵抗几何变换的攻击,通过归一化减小医学图片由于光线不均匀造成的干扰。图像裁剪
图像作为numpy
的数组后,可以直接对数组进行裁剪来获得裁剪后的图像数据。1
img = img[2:10,2:10]
图像旋转
1
2np.rot90(m, k=1, axes=(0, 1)) #k>0顺时针,k<0逆时针,axes是由坐标轴定义的平面,旋转轴垂直于该平面,坐标轴必须不同,
# 对 `CHW`的数据进行旋转,一般令`axes=(1,2)`镜像操作
1
2# 对于 `CHW`数据
img = img[:,::-1]
数据维度问题
神经网络中的数据一般有4个维度:BCHW
。其中B
是batch
,前面已经说过,使用Image.open()
打开需要转换,但是有时还要用到另外两个函数np.squeeze()
和np.unsqueeze()
- numpy.unsqueeze(a,axis)
- a表示输入的数组;
- axis用于指定需要添加的维度,如:0,1,2…
- 返回值:数组
- 不会修改原数组;
- numpy.squeeze(a,axis = None)
- a表示输入的数组;
- axis用于指定需要删除的维度,但是指定的维度必须为单维度,否则将会报错;
- axis的取值可为None 或 int 或 tuple of ints, 可选。若axis为空,则删除所有单维度的条目;
- 返回值:数组
- 不会修改原数组;
应用场景如下:我只想训练一张图片img(3x512x512)。我读到的数据是3维的,首先使用numpy.unsqueeze(img,0)
添加到4维 ==> img(1x3x512x512) ==> 放到net中训练 ==> 得到out(1x3x512x512)的结果 ==> numpy.squeeze(img,0)
降到3维 ==> out(1x3x512x512) ==> 当成图片展示