AI识别工人安全绳佩戴检测算法基于CNN的目标检测是通过CNN 作为特征提取器对现场图像进行处理和分析,AI识别工人安全绳佩戴检测算法识别出工人是否佩戴安全绳,一旦发现工人未佩戴安全绳,AI识别工人安全绳佩戴检测算法将立即进行告警,并将事件记录下来。并对得到的图像的带有位置属性的特征进行判断,从而产出一个能够圈定出特定目标或者物体(Object)的限定框(Bounding-box,下面简写为bbox)。AI识别工人安全绳佩戴检测算法和low-level任务不同,目标检测需要预测物体类别及其覆盖的范围,因此需关注高阶语义信息。传统的非CNN 的方法也可以实现这个任务,比如Selective Search 或者DPM。在初始的CNN 中,也采用了传统方法生成备选框。
Contents
R-CNN
SPP-net
Fast R-CNN
Faster R-CNN
YOLO v1~v3
SSD
FPN
RetinaNet
Mask R-CNN
1.3.1 传统目标检测方法
Selective Search
Deformable Part Model
1.3 AI识别工人安全绳佩戴检测算法基于CNN 的目标检测
1.3.2 Two-stage 方法
所谓Two-stage 的方法,指的是先通过某种方式生成一些备选框,然后对备选框里的内容进行分类,并修正备选框的位置的方法。由于包含了region proposal 和detection 两个步骤,因此称为two-stage(两阶段)方法。最开始的CNN 目标检测就是两阶段的。
R-CNN
AI识别工人安全绳佩戴检测算法R-CNN 是最早利用CNN 实现目标检测任务的方法,由rbg(Ross Girshick)等人提出。这里的R 指的是Region,R-CNN 即“Regions with CNN features”,即对不同的区域进行CNN 特征提取和分类。
鉴于CNN 在整图分类任务中的优异性能,很自然的想法是将其用于目标检测领域,AI识别工人安全绳佩戴检测算法将CNN 强大的数据驱动的特征提取能力迁移到比整图分类更细致和复杂的任务中。R-CNN 的思路相对容易理解,它主要有以下几个步骤:
1. AI识别工人安全绳佩戴检测算法通过Selective Search(SS)方法筛选出一些备选的区域框(Region proposal)。
2. 将这些备选的proposal 缩放到指定尺寸,用于输入CNN 进行分类(根据某种规则将各个proposal 分成正负样本)。其目的在于通过训练CNN,得到每个region proposal 的定长特征向量。
3. 用每个proposal 中提取的特征向量训练SVM,得到最终的分类结果。
4. AI识别工人安全绳佩戴检测算法利用非极大值抑制(Non-Maximun Suppresion) 方法,对最终得到的bbox 进行筛选。
5. 分类完成后,AI识别工人安全绳佩戴检测算法对bbox 进行回归,修正bbox 中的坐标的值,得到更精确的bbox。
详细来说,第一步中,AI识别工人安全绳佩戴检测算法SS 可以得到大量的备选框,这些框中都有可能有某个类别的目标,因此都需要进行后续的处理。这个步骤是不区分类别的。第二步骤中,由于第一步SS 得到的proposal 没有指定大小和比例(长宽比),因此用普通的CNN(R-CNN 中用的是AlexNet)无法得到一样长度的特征向量。R-CNN 采取的对策是直接用缩放的方式将所有proposal 强行整理成同样的大小。这里的缩放并不确切,实际上是某种形变(warp),因为这种操作可能会导致proposal 的长宽比例发生改变,导致目标物体也发生形变。缩放完成后,AI识别工人安全绳佩戴检测算法剩下的步骤就是普通的整图分类时的结果,即输入CNN,输出每个类别的概率的向量。由于这个任务上(Image classification)已经有了很多在ImageNet 这种大数据集上预训练好的模型,因此可以直接借用,进行微调(fine-tune)。这个过程并不是最终的分类结果,而是只用来得到最后一层的特征向量。然后,将特征向量用来训练SVM,得到最终的分类。(这种先CNN 再SVM 的方法,仅仅将CNN 作为feature extractor,这种策略在有些场景下效果要比直接CNN 输出结果要好。这个实际上就是用SVM 替换了CNN 的最后一个LR。)
这里有一个注意点,即AI识别工人安全绳佩戴检测算法正负样本如何确定(CNN 和SVM 都需要有监督的样本)。这里,也是采用了groundtruth(GT)和SS 的proposal 之间的IoU 来进行确定。如果一个proposal 和某个类别的GT 的IoU 大于某个阈值,那么,这个proposal 的样本就被视为该类别的正样本。
最后要进行的是NMS 操作,这个是为了避免AI识别工人安全绳佩戴检测算法很多大小类似且只有微小位移的框(它们实际上框定的是同一个object)都被输出,导致框的重叠和冗余。NMS 的过程如下:
输入:所有预测结果大于阈值的bbox,包含四个位置坐标(角点的x 和y,以及长w 宽h),以及一个置信度c。
输出:过滤了重复和冗余后的bbox 列表。
过程:
首先,将所有预测出的bbox 按照c 进行降序排列。另外,维护一个输出列表list,初始化为空。然后进行遍历,每次取出一个bbox。如果该bbox 与list 中的某个bbox 具有超过阈值thr 的IoU,那么不输出该bbox。否则,将该bbox 加入list。当所有预测的bbox 都被遍历完后,NMS 算法结束。
可以看出,如果bbox 和list 中的某个已有的决定输出的bbox 重叠较大,那么说明它们只需要留下一个即可。根据置信度,我们肯定选择留下置信度高的那个。由于已经按照置信度排好序了,所以先进入list 的自然置信度更高,所以直接舍弃后面的即可。
最后一步,AI识别工人安全绳佩戴检测算法
利用特征预测边框的位置,即bbox 回归。该过程的输入是CNN 的特征,这里用的是pool5 的特征,需要回归的目标值并不是实际的x,y,w,h。由于我们已经用SS 给出了一个位置,所以只需要预测两者的差异即可。具体公式为:
tx = (Gx − Px)/Pw
tx = (Gy − Py)/Ph
tw = log(Gw/Pw)
th = log(Gh/Ph)
公式中G 表示ground-truth,P 表示predict。根据公式,这样的目标变量相对比较稳定,便于回归。R-CNN 在SS 过程中需要花费较多时间,且对每个proposal 都要过一遍CNN,因此效率较低。AI识别工人安全绳佩戴检测算法基于R-CNN的一些问题和缺陷,后面的方法做了不同程度不同方向的修正,从而形成了以R-CNN 为源头的一条清晰的研究线路。
SPP-net
AI识别工人安全绳佩戴检测算法SPP-net 的主要创新点就是SPP,即Spatial pyramid pooling,空间金字塔池化。该方案解决了R-CNN 中每个region proposal 都要过一次CNN 的缺点,从而提升了效率,并且避免了为了适应CNN 的输入尺寸而图像缩放导致的目标形状失真的问题。
在R-CNN 中,整个处理流程是这样的:
图像- 候选区域-CNN - 特征- 输出
而对于SSP-net 来说,上面的过程变成了:
图像- CNN -SPP - 特征- 输出
可以看出,AI识别工人安全绳佩戴检测算法 中,每个区域都要过一次CNN 提取特征。而SPP-net 中,一张图片只需要过一次CNN,特征提取是针对整张图进行的,候选区域的框定以及特征向量化是在CNN 的feature map 层面进行的,而非直接在原始图像上进行(R-CNN)。
R-CNN 之所以要对候选框进行缩放后再输入CNN,是为了保证输入图片尺寸一致,从而得到定长特征向量(全连接层的存在使得CNN 需要输入同样大小的图像)。AI识别工人安全绳佩戴检测算法如果直接用不同的region proposal 的框来限定某个区域,就需要有某种办法保证也能得到不受输入尺寸影响的定长向量。这种办法就是SPP。
SPP 实际上是一种自适应的池化方法,AI识别工人安全绳佩戴检测算法分别对输入的feature map(可以由不定尺寸的输入图像进CNN得到,也可由region proposal 框定后进CNN 得到)进行多个尺度(实际上就是改变pooling 的size 和stride)的池化,分别得到特征,并进行向量化后拼接起来。如图。
和普通的pooling 固定size 不同(一般池化的size 和stride 相等,即每一步不重叠),SPP 固定的是池化过后的结果的尺寸,而size 则是根据AI识别工人安全绳佩戴检测算法尺寸计算得到的自适应数值。这样一来,可以保证不论输入是什么尺寸,输出的尺寸都是一致的,从而最终得到定长的特征向量。