PaddlePaddle图像分割七日打卡营——学习心得
- 一、图像分割
- 二、FCN网络
- 图像分类和图像分割的区别
- FCN网络结构
本文参考图像均来自课程课件
一、图像分割
首先介绍一些基本概念:
图像分割:把目标物体和背景区分开来
图像语义分割:不光要区分开来还要知道该图像是什么,因此要给每个pixel(像素)分类
图像实例分割:比如一张图片上有两只猫,要对他们进行id编号,要知道哪个是第一只猫,哪个是第二只猫,即给每个框里的object分mask
图像全景分割:包含背景的分割,即背景pixe(像素)l分类+mask
图像分割有着十分重要的应用,比如我们最熟悉的人像分割,广泛地应用于各种美颜软件和视频会议软件中,可以将任务单独区分于环境,从而加上用户想要的虚拟背景。另外,在自动驾驶领域,图像分割也可用于行人和车辆的分割,车道线的检测。在医学图像处理的领域,图像分割也可应用于病灶的分割,和CT、MRI的分割。最后,在工业质检方面也有广泛的应用。
图像分割和目标检测的区别在于,图像分割更加精细,目标检测只需要给目标物体标出锚框并显示类别即可,但是图像分割更加要求将原物体的轮廓显示出来。
语义分割算法的基本流程为:
1、输入一张三通道的RGB图像;
2、使用深度学习算法训练深度学习模型;
3、输出分类的结果(为与输入大小一致的单通道图)
训练过程为:
1、输入:image+label
2、前向:out = model(image)
3、计算损失:loss = loss_fuc(out,label)
4、反向:loss.backward()
5、更新权重:optimizer.minimize(loss)
语义分割的性能指标主要使用mIoU(平均交并比)和mAcc(平均精度)
交并比就是预测结果和ground-truth的交集除以它们的并集,而mIoU则表示将分割每一类的IoU取平均值
Acc就是表示预测结果和ground-truth对应位置分类的准确率,因为图像分割本质上就是对每个像素点的分类。
mean体现在batch或者每一类上,例如一共有七个类别,计算出每个类别的IoU后,再取一个平均值就可以得到mIoU,作为评价预测结果和ground-truth的匹配度,从而判断效果如何,计算loss值。
之所以要用IoU就是因为对acc来说,如果只有车没有分割出来,其他部分都效果不错,那么acc还是会比较好,但因为车是比较重要的物体,此时的iou则不会很好,更能反映分割的好坏。
Batch_size:是一次训练所取的样本数
shuffle:就是打乱,洗牌的意思
二、FCN网络
FCN就是全卷积神经网络(Fully Convolutional Networks),全卷积神经网络的意思就是说没有FC层,即没有全连接层,图像分割的网络还是和目标检测挺类似的,只要将全连接层替换为卷积层即可,即替换FC,换成Conv。
图像分类和图像分割的区别
对于图像分类来说,例如输入的是224×224×3的尺寸的图像,输出则是1×1×1000,其中1000表示输出的类别数,简要的说,分类就是,输入一张图像,然后得到特定的类别,而图像分割则不同,输出的图像尺寸应当和输出的图像尺寸是相同的,即输入一张图像,输出的也是一张图像。如下图所示:
语义分割相当于像素级分类,输入的是RGB图像,输出的是每个像素的分类,输入的size=输出的size,且输入的每个像素点大小为(0-255,0-255,0-255),输出的每个像素点范围则是(0~num_class-1)。
如何处理全连接FC层呢?考虑将FC层替换为1×1的卷积,这样不会改变feature_map的大小,只会改变输出的通道数,即类别数,但是此时feature_map还是没有达到原图的大小,所以此时就要采用上采样的方法,增加feature_map的大小。
上采样一共有三种方法:
1.Up-sampling
2.Transpose Conv
3.Un-pooling
在相邻两像素点之间插值
已知插入值的坐标(如果要扩大一倍,那就插一个),如何得知该点的值?该点离哪一端近,值就更偏向于哪一端,也就是说要大一些,如公式V(x)所示。
在代码中但凡看到interpolate或upsampling时都要考虑到此时是在做上采样插值,即此时的feature map是要变大的
深度学习中一般遇到的数据维度都是四维的,比如[1,3,8,8],8×8的图片,输入通道数为3,1表示batch_size,即每一批训练的样本个数。
pooling就是减小feature map,在对应区域内取最大
类似于反卷积,卷积减小feature_map尺寸,但是反卷积增大feature_map尺寸
一般kernal多少,padding就多少
通过这样的一次转换,就可以简化计算,只要计算一次4×16矩阵和16×1矩阵的乘法就可以得到4×1的输出值了,不需要像之前那样计算很多次
很多框架都有会考虑将滑动窗口的方法变成矩阵的乘法来计算,比如某些GEMM,Im2col
FCN网络结构
FCN的网络结构主要由两部分组成,编码器和解码器,简单来说整个网络就是由卷积,下采样和上采样构成的,
FCN网络是以VGG网络作为核心基础的。它又采用了多层融合的机制,集成了多层的feature_map,从而可以得到更丰富的语义信息,因为不同的层次采用的是不同的采样率。
FCN暂时更新到这里,后续还会跟新更多不同的网络和实现…