一、图像分类
图像分类主要是基于图像的内容对图像进行标记,通常会有一组固定的标签,通过模型预测出最适合图像的标签。
比赛:ImageNet挑战赛(约有1400万张图像,超过20000个图像标签)
模型:AlexNet、GoogLeNet、VGGNet、ResNet
二、图像说明
计算机视觉+自然语言处理,例如,为图像生成一个最适合图像的标题
图像说明是基本图像检测+说明。图像检测通过我们前面看到的相同的Faster R-CNN方法完成。字幕使用RNN(循环神经网络)完成。为了更加较精确,使用作为RNN的高级版本的LSTM(长短期记忆网络)。这些RNN非常类似于我们的常规深度神经网络,除了这些,RNN取决于网络的先前状态。你可以想象它更像一个神经网络,神经元随着时间的推移与空间建立。
![](https://i-blog.csdnimg.cn/blog_migrate/0b3bdf2f45589ee4d0d95be553f057b9.jpeg)
三、目标识别/检测
![](https://i-blog.csdnimg.cn/blog_migrate/8cab0d40864fa2e9549a91ee5184438d.jpeg)
四、图像/实例分割
图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。简单而言就是给定一张图片,预测图像中每一个像素所属的类别或者物体。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像素赋予相同的编号。其中图像语义分割是 AI 领域中一个重要的分支,是机器视觉技术中关于图像理解的重要一环。近年的自动驾驶技术中,也需要用到这种技术。车载摄像头探查到图像,后台计算机可以自动将图像分割归类,以避让行人和车辆等障碍。图像语义分割的意思就是机器自动分割并识别出图像中的内容比如给出一个人骑摩托车的照片,机器判断后应当能够生成右侧图,红色标注为人,绿色是车(黑色表示背景)。
1)普通分割:将不同分属不同物体的像素区域分开。 如前景与后景分割开,狗的区域与猫的区域与背景分割开。普通的图像分割,通常意味着传统语义分割,这个时期的图像分割(大概2010年前),由于计算机计算能力有限,早期只能处理一些灰度图,后来才能处理RGB图,这个时期的分割主要是通过提取图片的低级特征,然后进行分割,涌现了一些方法:Ostu、FCM、分水岭、N-Cut等。这个阶段一般是非监督学习,分割出来的结果并没有语义的标注,换句话说,分割出来的东西并不知道是什么。
2)语义分割:在普通分割的基础上,分类出每一块区域的语义(即这块区域是什么物体)。如把画面中的所有物体都指出它们各自的类别。2010年之后,随着计算能力的提高,人们开始考虑获得图像的语义分割,这里的语义目前是低级语义,主要指分割出来的物体的类别,这个阶段(大概是2010年到2015年)人们考虑使用机器学习的方法进行图像语义分割。随着FCN的出现,深度学习正式进入图像语义分割领域,这里的语义仍主要指分割出来的物体的类别,从分割结果可以清楚的知道分割出来的是什么物体,比如猫、狗等等。
3)实例分割(Instance segmentation):在语义分割的基础上,给每个物体编号。如这个是该画面中的狗A,那个是画面中的狗B。其可以对同一类别的不同物体进行不同的划分,可以清楚地知道分割出来的左边和右边的两个人不是同一个人。
传统图像分割的定义:所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内表现出一致性或相似性,而在不同区域间表现出明显的不同。简单的说就是在一副图像中,把目标从背景中分离出来。
普通的图像分割往往是根据图像的颜色纹理进行划分区域,而语义分割是基于一个语义单元,例如将人,车等目标从图像中分割出来,如果目标存在多种颜色,在普通分割中往往是分割成多个区域。而上面提到的Instance segmentation还要跟进一步,比如一排车连在一起,语义分割的结果是整个一排车在一个分割区域里,而Instances segmentation还要将车与车分割开来。
图像分割有两个子问题,一个是只预测类别层面的分割,对每个像素标出一个位置。第二个是区分不同物体的个体。
模型:Mask R-CNN(实际上就是前面所讲的R-CNN技术上的几个卷积层。微软、Facebook和Mighty AI联合发布了这个称为COCO的数据集。它与ImageNet很相似,但它主要用于分割和检测。)
应用场景:比如自动驾驶,3D 地图重建,美化图片,人脸建模等等
常用数据集:Pascal VOC;CityScapes;MSCOCO
Pascal VOC是一个比较早的数据集,提供 20 个类别,包括,人,车等。有 6929 张标注图片,提供了类别层面的标注和个体层面的标注,也就是说既可以做语义分割,只区分是不是车;也可以做个体分割,区分有几辆车,把不同的车标记出来。
主要面向道路驾驶场景,它有 30 个精细的类别。其中有 5000 张图片进行了精细标注,精确到像素级别。还有 20000 张图片有粗糙的标注。它也可以提供语义层面分割和个体层面分割。
这是目前为止有语义分割的最大数据集,提供的类别有 80 类,有超过 33 万张图片,其中 20 万张有标注,整个数据集中个体的数目超过 150 万个,最新的一些论文都会在 MSCOCO 数据集上做实验,因为它的难度最大,挑战性最高。
五、边缘检测
图像边缘是图像最基本的特征之一,往往携带着一幅图像的大部分信息。而边缘存在于图像的不规则结构和不平稳现象中,也即存在于信号的突变点处,这些点给出了图像轮廓的位置,这些轮廓常常是我们在图像边缘检测时所需要的非常重要的一些特征条件,这就需要我们对一幅图像检测并提取出它的边缘。
图像的边缘
在数字图像中,边缘是指图像局部变化最显著的部分,边缘主要存在于目标与目标,目标与背景、区域与区域之间,是图像局部特性的不连续性,如灰度的突变、纹理结构的图标、颜色的图标等。尽管图像的边缘点产生的原因各不相同,但他们都是图形上灰度不连续或灰度几句辩护的点,图像边缘分为阶跃状、斜坡状和屋顶状。图像强度的不连续性可分为:阶跃不连续,即图像强度在不连续处的两边的像素灰度值有显著的差异;线条不连续,即图像强度从一个值变化到另一个值,保持一较小行程后又回到原来的值。
从成因上看,一般图像边缘主要由四个方面的因素形成:1)图像灰度在表面法向变化的不连续造成的边缘;2)图像对像素在空间上不一致形成的边缘;3)在光滑的表面上由于颜色的不一致形成的边缘;4)物体的光影造成的边缘。
边缘检测算子检查每个像素的邻域并对灰度变换率进行量化,也包括方向的确定。大多数使用基于方向倒数掩模求卷积的方法。
基本步骤
1)滤波:边缘检测主要基于导数计算,会受到噪音的影响,可以通过设计滤波器来降低噪音,但滤波器在降低噪音的同时也会导致边缘精度的损失;
2)增强:增强算法将邻域中灰度有显著变化的点突出显示。一般通过计算梯度幅值来完成;
3)检测:在有些图像中梯度幅值较大的并不是边缘点。最简单的边缘检测是梯度幅值阈值判定;
4)定位:精确确定边缘的位置。
边缘检测算法
1)Roberts算子:利用局部差分来寻找边缘的算子,其梯度算子所采用的是对角方向相邻两像素值之差;
2)Sobel算子:Sobel算子是一个主要用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导,用于计算图像灰度函数的近似梯度。其在边缘检测时扩大了其模板,在边缘检测的同时尽量削弱了噪音,其模板大小为3*3,其将方向差分运算与局部加权平均相结合来提取边缘。Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,对边缘定位不是很准确,图像的边缘不止一个像素。;
3)PreWitt算子:类似于Sobel算子,也是将方向差分运算与局部加权平均相结合来提取边缘,也是取水平和垂直两个卷积核来分别对图像中各个像素点做卷积运算,所不同的是,Sobel算子是先做加权平均然后再微分,PreWitt算子是先平均后求微分;
4)Kirsch算子:Kirsch算子是一种3*3的非线性方向算子,其基本思想是希望改进取平均值的过程,从而尽量使边缘两侧的像素各自与自己同类的像素取平均值,然后再求平均值之差,
来减小由于平均值所造成的边缘细节丢失;
5)LOG算子:先在一定范围内做平滑滤波,然后再利用差分算子来检测在相应尺度上的边缘;
6)Canny算子:该算子是目前理论上相对最完善的一种边缘检测算法,运用比较广泛,是在Sobel算子的基础上改进的。其提出的评价边缘检测性能的三个准则为:好的信噪比准则、好的定位性能准则、单边缘响应准则。其步骤是:先进行滤波降噪;计算梯度幅值和方向(进行Sobel算子计算);非极大值抑制;滞后阈值。
7)Laplacian算子:Laplacian算子边缘检测是通过二阶倒数,二阶倒数比一阶倒数的好处是在与受到周围的干扰小,其不具有方向性,操作容易,且对于很多方向的图像处理好。Laplacian算子对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。
六、轮廓提取&轮廓跟踪
轮廓的提取,边缘检测就可以做到,不过得到的轮廓比较粗糙。
图像轮廓提取先对图像二值化,再通过findContours()函数提取轮廓,最后通过drawContours()函数将轮廓绘制出来。
经典轮廓提取技术大都基于微分运算,首先通过平滑来滤波图像中的噪声,然后进行一阶微分或二阶微分运算,求得梯度最大值或二阶导数的过零点,最后选取适当的阈值来提取边界。
传统轮廓提取算法:就是掏空内部点 - 如果原图中有一点为黑,且它的8个相邻点都是黑色时(此时该点是内部点),则将该点删除。注意:虽然处理的是二值图,但实际是256级灰度图,不过只用0和255两种颜色。
通常在进行边缘检测之后,需要通过边缘跟踪来将离散的边缘串接起来,常用边缘跟踪法,边缘跟踪又分为八邻域和四邻域两种。实现步骤:灰度化并进行Canny边缘检测;按照预先设定的跟踪方向(顺时针)进行边缘跟踪;每次跟踪的终止条件为:8邻域都不存在轮廓。