下面是已经阅读的代码:

  • Unet实现多期相肝脏肿瘤分割

Unet实现多期相肝脏肿瘤检测

数据加载

  1. np.transpose()
    使用PILImage.open()打开图片,得到的格式是HWC,不能直接使用,需要转换为CHW格式。其中C:channel通道,如:RGB通道;W图片的宽度;H图片的高度。

    1
    2
    img = Image.open(img_path)
    img_sample = np.transpose(np.asarray(img,np.float32)/255.0,[2,0,1]) # HWC ==> CHW
  2. np.asarray()
    Image得到的数据转为numpy的数组形式

数据预处理

  1. 图片归一化
    上面使用/255.0进行归一化,归一化不会改变图像本身的信息存储,对于后续的神经网络或者卷积神经网络处理有很大的好处。尤其对于医学图像处理,可以抵抗几何变换的攻击,通过归一化减小医学图片由于光线不均匀造成的干扰。

  2. 图像裁剪
    图像作为numpy的数组后,可以直接对数组进行裁剪来获得裁剪后的图像数据。

    1
    img = img[2:10,2:10]
  3. 图像旋转

    1
    2
    np.rot90(m, k=1, axes=(0, 1))   #k>0顺时针,k<0逆时针,axes是由坐标轴定义的平面,旋转轴垂直于该平面,坐标轴必须不同,
    # 对 `CHW`的数据进行旋转,一般令`axes=(1,2)`
  4. 镜像操作

    1
    2
    # 对于 `CHW`数据
    img = img[:,::-1]

数据维度问题

神经网络中的数据一般有4个维度:BCHW。其中Bbatch,前面已经说过,使用Image.open()打开需要转换,但是有时还要用到另外两个函数np.squeeze()np.unsqueeze()

  1. numpy.unsqueeze(a,axis)
  • a表示输入的数组;
  • axis用于指定需要添加的维度,如:0,1,2…
  • 返回值:数组
  • 不会修改原数组;
  1. 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) ==> 当成图片展示