卷积神经网络 + 机器视觉: L11_Detection and Segmentation 目标识别与分割 (斯坦福CS231n)

完整的视频课堂链接如下:

完整的视频课堂投影片连接:

前一課堂筆記連結:

 

Semantic Segmentation(语意分割)

先前几个单元中专注讨论的是如何通过一系列神经网络的模型去归纳出一张输入图片里面物体,但是并没有明确定义该东西在一张图片里面的位置是在哪里,接下来的这个单元主要探讨的就是如何准确的定义出辨识物体在画面所在的位置,并予以准确的标记。

普遍的方式中,在目标物体周围画上一个方形框框并写上标签名字,已经是一个很好的效果,但是在语义分割的环节里我们更注重其能够更深入去对每一个 pixel 分类的能力,目的是为了非常清晰的描绘出一个图片里面的物体其轮廓线的描绘方式,甚至对同种类的两个物体在画面中连起来的部分也可以顺利辨别。 下面介绍从无脑到聪明方法演变过程:

 

1. Sliding Window(bad idea)

为了能够尽可能精确到每个 pixel 的分类,这边使用了 “小窗口” 扫描的方式把每个小画面(如同 mini-batch 一般)放入 CNN architecture 里面计算每个 mini-batch 中心 pixel 的种类。形象化的解释如下图:
但是这种方式一旦套用到解析度极高的图像数据上时,缺陷就即刻败露:太多的计算资源被占用,在时间和硬件配套上都是个浪费的做法。因此直接被淘汰。

 

2. Fully Convolution

与其使用 mini-batch 一点点的放入 CNN 里面,不如直接一整张原始图片直接一次性作为一个 input data 放入 CNN 当中,并用 zero padding 和 3*3 kernal 等等,去做出每一层都保持原始数据大小的神经网络,并在最后面放一个全连接层去对应到每个 pixel 的种类,但是缺点是它占用了大量的缓存,对于节约资源的门槛来说,他还是不太合格的方式。

因此下面针对这个问题予以改进:先 down sampling 数据,处理完数据后再 up sampling 成为原本的尺寸。如下图:

但是这个方法还是有个问题:数据制作成本太高了,针对不同的每个像素都要标注属性的这件事情需要花费的大量时间和人力成本也是一个不容忽视的问题。

假设要把一个 2*2 的画素变成 4*4 的大小,下面有几种 up sampling 的方式 (it is also called pooling and unpooling):

2-1. Nearest Neighbor

直接把扩充出来的对应像素格全部填充成原来的 2*2 对应的数值,等于是把像素格等比例放大成我们期望的大小,说得直白他其实是一个很拙劣的方式。

2-2. Bed of nails

一样是直接使用原本 2*2 对应的数值,但是只对应其中一个分割的 corner 的 “角” ,剩下的位置都用 0 来替代,着两个 cases 如下图:
它就像钉床一样,一片平整的 0 平面突出几个数值,故此而得名。

2-3. Max unpooling

这个方法相对前两个来说就智能了一点,它会记得当时 max pooling 取值的时候,极值的位置,并在后面反向操作 unpooling 的时候能够还原其位置,而把其他的部分都用 0 填上,使其能够有更好的原始数据还原度。
这个方式可以更好的保留原始数据的细节,在 semantic segmentation 实际应用上更符合其对物体边界精度的要求。

 

3. Transpose Convolution

上面三种 unpooling 的方法都只是一些写死了的函数,并没有办法真正 “智能” 的去学习该怎么 unsampling ,而第三个方法就是一个 learnable layers 设计,去比较好的拟合反压缩的过程。

以前介绍的 CNN 操作方式用一个 kernal 对一张图片上面的像素点扫描,把该 kernal 和扫描到的区域做 dot product 得到一个数值,逐一填到新的矩阵中形成新的输入层,而 Transpose Convolution 则是相反,卷积核 kernal 成了一个 “公因数” 的角色,而原本小的 matrix 里面的元素成了倍数的决定值。在同样有 zero padding 步骤的情况下,把倍数乘以 kernal 得出来的新 kernal 数值填入即将被放大的新 matrix 中,而当同一个 kernal 在不同时间点数值重叠在同一个位置的时候,就把重叠的部分数值相加,详情如附图:

但是随着方法的使用,问题也逐渐浮现出来,但凡遇到扫描重叠的数值就相加的这个动作本身,也导致了扭曲的特征被凸显,像是一个完整的图像被小矩阵拼凑出来后还残留着拼接的痕迹,为此对应的解决之道则是使用 4*4 或者 2*2 的 kernal 去扩增矩阵长宽,采用严实重叠或者是完全不重叠的方式去进行。

 

Classification + Localization

面临物体识别的时候有两件事情需要分开关注:一个是物体的种类;另一个是该种类的物体坐落在图片的位置。因此在一个物体识别的完整模型中,会有两个 CNN architectures 同时运行,第一个 CNN 会经由全连接层(fully connected)对应到物体种类,而第二个 CNN 则是经由另一个不一样的全连接层关联到该物体的坐标位置。

这也意味着会有两个 Loss values 在同一个 model 里面等着我们使用如 Gradient Descent 这类的数学工具去最优化结果。大部分的时候同时让两个 CNN 一起训练出来的结果会是符合我们预期的状态,但是有些时候会出现识别的物体和对应的位置匹配不上的问题,需要另外调整参数,甚至会尝试把两个 CNN 神经网络分开训练,先让其中一个网络收敛了之后,再来处理另一个网络的参数设置问题。

说到参数 Hyperparameters 的调整,就必须提及这里两个 Loss values 的 case,它又称作 multi-task loss。以前只有一个 CNN 的时候比较容易,Gradient Descent 运算过程就只会有一个框架的参数参与,现在两个框架并行时,就需要额外的一个 Hyperparameter 调节器去控制分别的 Loss values 以至于能够让其走到最小值完成训练。

而用来分类的神经网络和用来定位的神经网络两者的损失函数使用也不尽相同,原因是分类的网络会把数字经过全连接层收敛到一个特定的数字种类中,而数字种类本身必须经过 one hot 转换后,才能使用如 softmax loss,或 cross entropy loss 等函数归类之。反观定位的网络不同,它要收敛的方向是一组坐标,它是一串数字,我们期望数字的预测值越靠近标签给的值越好,而不是像分类问题中的归类,一定要就是属于什么类型,因此损失函数一般使用 L1 loss 或是 L2 loss 来定义。

除了定位识别物体这个应用之外,另一个有趣的应用就是 Pose Estimation,如下图:

上面使用了一共 14 个节点去模拟一个人的动作,同时这 14 个点在画面上的位置就是用上面描述的类似手法去做深度学习的预测,并给出一个总的 Loss value 作为最优的目标方向。

然而,手动设置神经网络的个数来控制一共有多少个物体被识别理论上是可以运作的,不过如果物体增加了,或是物体的个数不限时这种方法又显得相形见拙了,因此下面有几个方法用来尝试解决这个问题,而这几种方法中又可以被分成主要的两大类:

  1. Region based
  2. Regression based

 

1-1. Sliding window

最原始的定位方式之一莫过于此,把图片切割成随机的小块,并逐一扫描至于填满所有图片角落,每次扫描的时候都要该区域套入 CNN 框架中计算出出现该辨识目标的可能性。这个方法完美的包含了上面提及的缺点:效率低下,计算资源大量占用。是一个在现今可以直接 pass 的方法。道理放在 Region Proposal 方法上同样适用,也是一个不智能且比较早期的方式,这里就略过了。

1-2. R-CNN v.s. fast R-CNN

Region of Interest 的决定方式是在描述两者差异之前需要先了解的概念,训练好一个物体识别的神经网络之后,接下来会随机分割一张图片的可能 1000 个区域的画面信息放到神经网络中,让它们去判别哪些区域的画面内容是我们要找的种类,进而给这些区域一个较高的相关值,而这些值即为该 region 的 interest。

R-CNN 根据 Regions of Interest (ROI) 来选出区域画面并做前处理把每张画面压缩成同样格式大小,然后才能放入 CNN 中去跑结果看最后定位落点与类别归属。但是每一个 CNN 的套用也意味着多一个单位的计算资源占用,那么多的 CNN 框架肯定造成运行速度的低落和没效率的计算资源分布,因此与其分别检测不同区域的画面信息,不如直接把一整张图片作为单一个 input 信息直接处理,如下图:

先让一张完整图片经过一个卷积层,并开始分化出图片的特征信息,再经过 ROI 决定哪些区域要被选择进一步处理,处理前需要使用如 pooling 等手法把图像变得一样大(与之前的方法类似),最后通过全连接层渐渐的剥离出我们预期的坐标信息。

不过 fast R-CNN 虽然方法提升了原来方法的速度超过 10 倍的量,却也受制于 CNN 分化信息后的 ROI 筛选上而无法突破,因此下一个方法 faster R-CNN 专门解决此问题,达到效率的进一步提升。

1-3. faster R-CNN

其改进的方式是在原本额 fast R-CNN 方法的全连接层中间多加了一个 Region Proposal Network,既然随便尝试 ROI 的时间耗费太大,那么就创建一个神经网络专门来预测哪些 ROI 是最接近我们预期的坐标,一旦预测出一个结果后,接下来的动作都跟 fast R-CNN 一样了。

不过添加一个新的神经网络到整个计算框架内的举动也增添了新的问题,那就是我们要一次训练四个损失函数,分别是两个分类损失函数,和两个坐标损失函数,调整参数的时候在难度上增添了一个新的维度,建议还是使用一次训练一个网络的方法来逐一完成所有神经网络的训练。

经过一系列的算法优化后,运算效率再次提升大约 10 倍的时间,如下图:

2-1. YOLO / SSD

和 ROI 不同之处在于一张图像被输入后,首先对其格子状切割成 nxn 个相等的区域,以区域为最小单位开始检查区域内的图像内容为何,如下图所示:

在这些被切割的格子中,使用单一个神经网络算出其图像的物体类别和位置信息,具体细节需要另外研读论文方可全面理解。两种方法对比下,使用 Region 判断的方法慢一些但是较准确,而 Regression 的方法快一些但是较不准,各有利弊优劣。

 

Instance Segmentation

经过一系列上述的介绍,终归做的事情有两件: 1. 对图像中的物体分类 ; 2. 对分类的物体定位。因此我们使用神经网络开始各种损失函数的优化和调参,而上述两件事的终极目标就是我们能够把电脑呈现出来的额每个像素点都标注类别,总的来看就会是一个非常清晰的结果,下面方法即为当前最新的能够做到像素点分类的算法。

Mask R-CNN

此方法是 faster R-CNN 的再进化版本,把 faster R-CNN 中的算法再分出一支新的神经网络出来,用以预测每个像素点的类别归属,预测结果如下图:

甚至这个框架可以被用来使用在 pose estimation 领域上,可以算是一个综合上述所有方法的解决方案,速度方面也足以达到实时的检测需求,0.2 秒完成一次检测,至于深入的内容同样需要研读论文才能一窥全貌,课堂只给了粗浅的介绍。

 

当前的方法一致性的以非常庞大的训练数据为前提才能够达到惊艳的效果,例如Mask R-CNN 使用了二十万张 COCO 数据集搭配了强力的运算硬件,最终产生出一个非常好的识别机制。而这些标签数据的过程耗时耗力,如何在减少数据量的情况下达到相同好的效果将是未来发展的方向之一!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值