目标定位
输出表示
Pc = 1 表示 有东西存在,具体是什么东西,要看c1 c2 c3;
损失函数
对于Pc = 1,这个列向量8个元素,每个元素都要与训练集里面的真实值去比较,最终得出比较结果。
对于Pc = 0,这个列向量8个元素,只用第一个元素就可以了。
特征点检测
神经网络可以像标识目标的中心点位置那样,通过输出图片上的特征点,来实现对目标特征的识别。
在标签中,这些特征点以多个二维坐标的形式表示。
比如:识别四个眼角 l1x l1y l2x l2y l3x l3y l4x l4y;识别64个面部特征点,判断表情;
比如:识别胳膊等躯干,最终绘制成一个火柴人,捕捉动作。
目标检测·滑动窗口
基于滑动窗口的目标检测(Sliding Windows Detection)
- 训练集上搜集相应的各种目标图片和非目标图片,样本图片要求尺寸较小,相应目标居于图片中心位置并基本占据整张图片。
- 使用训练集构建 CNN 模型,使得模型有较高的识别率。
- 选择大小适宜的窗口与合适的固定步幅,对测试图片进行从左到右、从上倒下的滑动遍历。每个窗口区域使用已经训练好的 CNN 模型进行识别判断。
- 可以选择更大的窗口,然后重复第三步的操作。
优点:原理简单,且不需要人为选定目标区域
缺点:需要人为直观设定滑动窗口的大小和步幅。
滑动窗口过小或过大,步幅过大均会降低目标检测的正确率;另外,每次滑动都要进行一次 CNN 网络计算,如果滑动窗口和步幅较小,计算成本往往很大。
实现
# 我把图片划分成3*3 我并没有判断9次,而是通过卷积神经网络,一次运算,直接看结果。
# mark
找出目标的边界bounding box(YOLO算法)
YOLO(You Only Look Once)算法可以用于得到更精确的边框
我原本用的是划分的3*3,这个太笼统了,我需要它真实的边框。
我输入100*100*3的图片,输出结果的维度是 3*3*8。
在实践中,可能使用更为精细的 19×19 网格,则两个目标的中点在同一个网格的概率更小。
评价指标(交互比 IoU)
非极大值抑制
很多个格子可能都汇报:自己是中心。
非极大值抑制(Non-max Suppression)会通过清理检测结果,找到每个目标中点所位于的网格,确保算法对每个目标只检测一次。
进行非极大值抑制的步骤如下:
- 将包含目标中心坐标的可信度 Pc小于阈值(例如 0.6)的网格丢弃;
- 选取拥有最大 Pc 的网格;
- 分别计算该网格和其他所有网格的 IoU,将 IoU 超过预设阈值的网格丢弃;
- 重复第 2~3 步,直到不存在未处理的网格。
上述步骤适用于单类别目标检测。
进行多个类别目标检测时,对于每个类别(行人、车辆、红绿灯),应该单独做一次非极大值抑制。
Anchor Boxes
到目前为止,我们讨论的情况都是一个网格只检测一个对象。
我们希望:一个网格的标签中将包含多个 Anchor Box,相当于存在多个用以标识不同目标的边框。
如上图,输出的标签结果大小从 3×3×8 变为 3×3×16
在单目标检测中,图像中的目标被分配给了包含该目标中点的那个网格;引入 Anchor Box 进行多目标检测时,图像中的目标则被分配到了包含该目标中点的那个网格以及具有最高 IoU 值的该网格的 Anchor Box
Anchor Box 的形状一般通过人工选取。高级一点的方法是用 k-means 将两类对象形状聚类,选择最具代表性的 Anchor Box。
代码
文件太大了,没做