深度学习图像处理目标检测图像分割计算机视觉 06--图像分类
摘要
本周的主要工作是学习深度学习图像分类,跑出一个UNET模型,了解甲状腺癌的研究现状和研究的技术难点。
一、图像分类
图片分类就是给图片一个标签
但是这个标签并不是随便给的,有一个数据集
卷积神经网络进化的过程有几个代表性的网络:
1.1 AlexNet(8层)
AlexNet标志着DNN深度学习革命的开始。
AlexNet是分为两个通道进行训练的,但是,这两个通道并不是完全不相交的,卷积层之间会交互信息,全连接层之间会互相交叉信息。
在每一层上并不是只有卷积一种操作,有涉及到卷积,池化,激活函数等。
在AlexNet中,有一个模型后来被证实并没有什么用,就是LRN局部响应归一化。
NiN在AlexNet的基础上提出来的。
1x1卷积的作用是实现跨通道的交互和信息整合。进行卷积核通道数的降维和升维。c是卷积前的通道数,k是卷积后的通道数。k<c,为了计算方面,实现了降维。
1.2 VGG(19层)
VGG网络是网络改造的首选基础网络。
它把一个大的卷积核分解成为连续的多个小的卷积核,这样做的优势是参数量小,在
卷积层数增加时,参数量的增加并不会太多。但是这样做的劣势使操作时的速度比较慢。
1.3 GoogLeNet
在GoogLeNet提出之前,模型完全靠猜或者试,GoogLeNet提出一个想法,能否把所有的情况都列举出来,比如堆叠多少卷积核,卷积核是大还是小,要不要加入最大池化层或者卷积直接代替池化,让模型自己训练,决定哪个好,采用什么样的顺序才能对性能提升,把所有的性能都训练出来,让事实说话。
在GoogLeNet有一个重要的模块:Inception,进化了4个阶段。
V2
V3
V4
Inception总结
1.4 ResNet、ResNext
二、U-Net模型
2.1 U-Net
U-Net诞生的一个主要前提是,很多时候深度学习的结构需要大量的sample和计算资源,但是U-Net基于FCN(Fully Convultional Neural Network:全卷积神经网络)进行改进,并且利用数据增强(data augmentation)可以对一些比较少样本的数据进行训练,特别是医学方面相关的数据(医学数据比一般我们所看到的图片及其他文本数据的获取成本更大,不论是时间还是资源的消耗),所以U-Net的出现对于深度学习用于较少样本的医学影像是很有帮助的。生物医学与人工智能的结合正在如火如荼地发展着,利用机器学习手段处理医学影像,可以大大提高医学诊断的效率和精确度。医学影像处理有时涉及到细胞分割,即将图像中的细胞识别出来并把细胞与背景分割开来。为了帮助对这一结果具有更直观的了解,可以参考如下原图和分割图像的效果图:
从这两张图可以看出,原图中细胞所在的地方在分割图像中被分割标注了出来,这也就是细胞分割。分割图像中每个细胞的分割被用不同的颜色标注,看起来像是实例分割(多分类),但事实上,细胞与细胞之间分成不同的类别还是太困难了,毕竟神经网络在学习的过程中基本上不能认出来不同颜色标注出来的细胞有什么本质上的区别。所以这里的不同的颜色其实是后续的处理结果,最开始的分割其实是语义分割(二分类)的结果,如下图所示:
所以要如何实现这样的语义分割呢?这时在细胞分割领域独领风骚的Unet就闪亮登场啦。Unet是一种比较年轻的神经网络,顾名思义,其结构为U形,在卷积层一层一层提取特征的同时将首尾对称的两层联系起来,结构图如下:
Unet在ISBI 2015 显微图像分割竞赛中拔得头筹,分割效果远优于其他网络,现在已经成为医疗影像处理中最主流的分割网络。与传统的全卷积神经网络相比,Unet进行了改进,通过层与层之间更强的联系,加上上采样和下卷积,实现特征的充分提取,所以可以使用更少的训练样本得到准确的分割。
从图中可以看出,除输出层外,Unet每一层以三层卷积构成,层间采用池化或上采样的方法实现特征的提取和整合,最后一层将之前所有提取出来的特征做一个二分类,实现细胞的语义分割。
2.2 实现
# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os
import numpy as np
import pandas as pd
import scipy.io
from skimage.transform import resize
import matplotlib.pyplot as plt
from tqdm import tqdm
import gc
gc.collect()
# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory
import os
print(os.listdir("../input"))
# https://www.kaggle.com/pierrenicolaspiquin/oct-segmentation/data
# Settings
input_path = os.path.join('..', 'input', '2015_boe_chiu', '2015_BOE_Chiu')
subject_path = [os.path.join(input_path, 'Subject_0{}.mat'.format(i)) for i in range(1, 10)] + [os.path.join(input_path, 'Subject_10.mat')]
data_indexes = [10, 15, 20, 25, 28, 30, 32, 35, 40, 45, 50]
width = 284
height = 284
width_out = 196
height_out = 196
mat = scipy.io.loadmat(subject_path[0])
img_tensor = mat['images']
manual_fluid_tensor_1 = mat['manualFluid1']
img_array = np.transpose(img_tensor, (2, 0, 1))
manual_fluid_array = np.transpose(manual_fluid_tensor_1, (2, 0, 1))
plt.imshow(img_array[25])
plt.imshow(manual_fluid_array[25])
def thresh(x):