写在前面
2016年,谷歌 DeepMind 开发出的人工智能系统AlphaGo 五局四胜战胜一代围棋宗师李世石,震惊世界。
2016年,微软人工智能团队报告出他们的语音识别系统实现了和专业速录员相当甚至更低的词错率(WER),达到了 5.9%。
2016年,谷歌、亚马逊、Facebook、IBM 及微软在九月宣布成立 AI 联盟,并取了个很长的名字:Partnership on Artificial Intelligence to Benefit People and Society。意为“为大众和社会谋福祉的 AI 合作组织”。
2016年,在美国佛罗里达州,一辆处于”自动驾驶“模式的特斯拉 Model S 以 74 英里的时速(119 km/h),撞上了一辆大货车,40 岁的驾驶员 Joshua Brown 不幸死亡。
2016年,AI的浪潮席卷了全球,这一年发生了很多的事情,可以称得上“人工智能革命”。
而在同一年,在读master最后一年的我,开始了毕业论文之旅。。。
以下是正事
想倒叙讲这个故事,说一下我在毕业论文答辩时,向教授、导师、博士们、同学们如何介绍我的毕业论文的。。。
大家好,我的论文题目是“Instance-level Image Segmentation by Fusing Deep CNN Models Using Conditional Random Field”。一口气说完题目,可能会喘不上气。这个题目翻译成中文大概是“使用条件随机场融合深度卷积神经网络实现实例级图像分割”。说出来也是一样让人喘不上气。
1.背景
但我们把这个题目拆开来看,先看主体“实例级图像分割”。在2016年,在计算机视觉领域有两个方向的课题很火。一个叫“物体检测”,一个叫“语义分割”。火到什么程度呢?当时,很多CV的数据集和比赛都是来针对这两个任务来的,比如ILSVRC、COCO、Pascal VOC等等。准确度和速度因为算力和模型的突破达到了比较高的水平。相比这两个任务,实例级图像分割的起步较晚,水平也不及前者,还属于较小众的领域。那物体检测、语义分割和实例级图像分割三者是怎样的关系和区别呢?
任务区别我们来看一下上图,图(a)是一张原图,图(b)是物体检测(Object Detection)的结果。此任务可以把图片中位于前景的物体(在此指人和车辆)用一个包围框(Bounding Box)标注出来,并指明框中的物体类别。图(c)是语义分割(Semantic Segmentation)的结果。此任务呢,就是像素级的任务。任务的结果就是图片中的每个像素都有一个类别标签,不仅前景物体被标注,背景元素(在此指天空、地面、树木、标志等)也会被标注。再来看一下图(d)实例级图像分割(Instance Segmentation)。乍看好像和语义分割差不多,都是像素级的分割。可相比语义分割的结果,很容易找到区别,那就是位于前景的物体不再是用一个颜色进行标注。例如,不同的行人用不同的颜色进行标注。所以,实例级图像分割解决的任务是,图像中的每个像素都会有一个物体类别标签,我们知道每个物体类别中包含几个物体,以及我们能清楚知道每个物体的轮廓,而不是包围框的位置。所以,实例级图像分割的任务更复杂,但能获得更丰富的场景信息。
表面上看,实例级图像分割好像是物体检测和语义分割的结合。那是不是可以把两者结合起来,来实现实例级图像分割。答案是肯定的。否则我的论文也写不出来。(捂脸)
再来说一下数据库吧。我选择的是Cityscape。Cityscapes数据集是由奔驰主推,提供无人驾驶环境下的图像分割数据集。用于评估视觉算法在城区场景语义理解方面的性能。图片都是德国几个大城市的街景实拍,所以场景还是较为复杂多变的。为了实验方便和训练速度,我设定了图片尺寸为512*1024。其中,有2975张图片作为训练集,500张图片用来预测和评估算法。
2.方法、过程
算法框架上图就是大概的算法框架。我的初始意图就是能搭建一个端到端(end to end)的框架。并且能够用一种方法把物体检测和语义分割结合融合起来。具体使用什么方法,下面我们再聊一聊。先来聊一下已知的内容,即我选择如何实现语义分割和物体检测的。
FCN ResNet在上面有提到,当年语义分割和物体检测水平已经比较高了,这得益于前辈们优秀且强大的CNN网络结构们。在众多网络结构中,我选择了两个很典型的网络:FCN(Fully Convolutional Network)和ResNet。这两个网络结构的规模形成了鲜明的对比。一般意义上说网络越深(deep),也就是层数越多,最终语义分割的准确度就越高,效果越好。但是不同的语义分割网络会影响到最终实例级图像分割的效果吗?如果有影响的话,影响有多大呢?所以,带着这样的疑问,我选择了在网络结构上差异很大的两个网络模型。关于这两个网络的论文和分析在这里就不再细说了,感兴趣的童鞋可以自己搜索多了解一下。
语义分割结果以上就是用FCN和ResNet训练同一个训练集后,预测的结果。可以很明显的发现,ResNet的检测效果要好于FCN,这也是符合我们预期的。但也会发现一些问题,物体的边缘十分平滑,很像是抽象版画,这显然是和现实世界相差甚远。如果有某种办法可以使物体的边缘更加清晰,那很就是很大的进步了。
Faster-RCNN再来看一下物体检测使用的CNN。当年有三个网络模型比较火:Faster-RCNN系列、YOLO和SSD。最终,我选择了Faster-RCNN,一是因为Faster-RCNN在经过RCNN、Fast-RCNN网络迭代优化后,检测效果和性能都很好;二是Faster-RCNN相比其他两个网络,对于小物体的检测效果要优秀一些。之所以我会在乎小物体的检测,是和我的数据库有关。因为我发现Cityscape数据库中很多图片的前景物体比较小或者处于边缘位置。Faster-RCNN毋庸置疑是个伟大而经典的网络,至少对于当时来说。原始尺寸的图片进入到网络中先经过尺寸变换后(P*Q>M*N),会进入一个CNN网络,然后得到feature maps。CNN这部分可以选择不同的网路结构。在这里,我也选择了两个网络,VGG-16和ZF。这两个网络的层数是不一样的,所以会得到不同的feature map。像语义分割网络一样,我们也可以评估物体检测网络对实例级图像分割结果的影响程度。
物体检测结果以上是物体检测网络的结果。红色框代表人,绿色框代表车辆。可以看到,Faster-RCNN的效果还是不错的,如果把检测的阈值调的合适,图片中的物体基本都可以正确判别其类别和位置。不过图片中仍然有一些包围框判别失误,将非前景物体的部分判别为前景物体。这个问题在Faster-RCNN ZF model的模型上更加突出。
综合以上,如果说探索研究课题是一个实验的话,现在已经有四组对照实验了。按照两个语义分割网络和两个物体检测网络两两组合,可以得到四组实验数据,见下图。之后的讨论就按照下图表格中蓝色部分的简称代替。对于四个CNN的训练,我选择了当时很火也普遍应用在图像上的深度学习框架Caffe。使用GPU训练,速度还是可以的。
实验组合那么问题来了,要用什么方法把语义分割和物体检测结合起来呢?当年还处于刚入门级水平,学艺不精,想这个问题想了很久,翻烂了当时的各种论文。后来看到了一篇刚发表不久的牛津大学Anurag Arnab的论文“Bottom-up Instance Segmentation using Deep Higher-Order CRFs”给了我灵感和希望。论文的思路也是先训练语义分割和物体检测的网络,然后这里提到可以建立条件随机场CRF来达到融合效果。
于是,我又花了一番功夫来研究CRF。简单的来说,CRF是一种概率图模型,把条件分布概率用一种图模型的形式展示出来,便于寻找变量之间的关系。(更细节的技术问题这里就不讲了,讲起来得好几节课了。。。)于是,建立一个可靠可行的概率图模型是首要任务。又经过一番折腾,我建了下面这个图模型,直接上图,不多说了。
CRF图模型图中每一个小球代表一个变量,小球的连线(边)代表了变量之间的关系。理想情况下,每个小球代表了一个像素,但是考虑到计算能力,我这里的每个小球代表了一个超像素。这个影响不大。变量代表了第个超像素的实例序列标签(instance lable),通俗的讲就是这块超像素属于第几个实例。这个变量的信息来自于物体检测的结果。因为物体检测会检测出图像中物体的位置(包围框)以及该物体的类别。变量代表了第个超像素的物体类别标签,这个变量的信息来自于语义分割的结果。我们期待每个变量和其超像素对应的之间有某种依赖关系(蓝色线条表示)。而由语义分割的特点知道,相邻两个像素之间存在着依赖关系,所以相邻两个之间也存在着依赖关系。对于单个变量可以定义一元势函数(unary potential),对于两个变量可以定义二元势函数(pairwise potential)。经过了一番优化(折腾),我设计了下图所示的势函数。
一元势函数 二元势函数建立势函数只是CRF工作的一部分。像其他机器学习算法一样,我们需要估计上述过程的势函数中定义的参数,如、。于是,还要定义损失函数loss function以及参数学习的策略MAP。如下图所示。当然,建立这么庞大的模型和训练系统单纯靠手码代码完成,实在是emmmm...幸好前辈们给我们留下了宝贵的财富,一个可用于CRF的建模工具distributed Structured Prediction(dSP_5.2)帮助我实现了。这个工具是需要matlab编程,也不会太难理解和使用。
CRF参数学习和断定CRF模型的训练就要耗时很多,我分patch训练,也要3~5天。可以感觉到使用caffe训练CNN(一般会使用GPU)是多么幸福的一件事情。训练完模型后,再加一点代码就能预测实例级图像分割。
3.结果和评价
对于一个模型效果的优劣,我们也会用一约定俗成的些评价策略,也就是Evaluation Metric。对于语义分割网络,将使用以下四个公式计算,而物体检测网络和CRF模型,只使用前两个:recall召回率和precision准确率。
评价策略在最终实验结果评价阶段,我主要是关注了这么几件事情:
a. CRF模型的预测结果是否对语义分割网络模型的预测结果有改善?
答案是部分改善。可以看下面的同一张照片的预测结果。可以看到,相比在使用CRF融合网络前,检测到的物体的边缘不再平滑,而是更加清晰。不过也暴露了一个问题,就是物体的边缘不够贴合,有些错误的预测。而通过计算上面的metric,也发现大部分类别的recall值有所上升,但其他三个metric的值并没有有很大提升。
CRF融合后语义分割结果b. CRF模型的预测结果是否对物体检测网络模型的预测结果有改善?
答案也是部分改善。相比在使用CRF融合网络前,许多在之前被错误预测为前景物体的包围框减少了,也就是false positive个数的减少,但代价也就是包围框减少了,在一些复杂场景中,会有一些不易检测的物体被“遗忘”。而通过metric也证明了这点,recall小了,precision大了。
CRF融合后物体检测结果c.语义分割或者物体检测网络模型的选择是否会影响融合效果?
答案是会的。通过控制变量分析可得,不论是针对融合后语义分割还是物体检测的结果来说,物体检测模型的选择对结果的影响较为显著,而不同的语义分割模型对结果的影响不明显。也就是说,最终融合的效果依赖于物体检测网络的性能。
d.能否实现实例级图像分割的目标?
答案是可以的。如下图所示,最终可以得到实例级图像分割的标签。当然,这里的颜色标注有点问题,色阶没有处理好。实际上,每个物体都有自己instance lable。可以从标签知道每个像素的类别。如果是属于前景物体的话,也可以知道它是属于此类物体中的第几个物体。
实例级图像分割结果写在最后
整个论文的思路和大概过程就是这些啦!尽管实验结果没有完全达到预期。但是做研究做实验就是这样,道路都是曲折的。之后提升改进和优化的道路远比探索的道路还要长。从现在的实验结果来看,物体检测的网络对结果影响较大,所以之后应该寻找其他性能更好的网络。以及现在的CRF设计的势函数也是有优化空间的。
不管怎么说,经过半年多的工作,也算是从一个对CNN毫无了解的状态磨练到初级入门了。不管是从理论还是实践经验上来说,自身能力都得到了很大的提高。困难总是有的,但是求知的乐趣也是其他事情很难代替的。
网友评论