怎么实现物体检测:不管是传统方法还是深度学习方法都可以看作是搜索加分类;搜索可以用滑窗来实现,不过缺点是滑窗只能固定大小,可以使用图像金字塔来实现多尺度滑窗。
传统方法:人工设计特征+浅层分类器;代表为:ROBUST REAL TIME FACE DETECTION; DPMs
深度学习:使用原始图像数据+图像标注,训练神经网络;
1. RCNN: 图片-》生成候选区域-》resize-》使用CNN进行特征提取-》检测分类+检测框回归; CNN部分使用的是ImageNet 预训练模型,之后进行finetune。 缺点是每一张图片的候选区域数量很大,所以RCNN速度很慢。
2. FastRCNN是对RCNN的改进方法;具体改进是将原始图片直接送进CNN网络,之后在输出的feature map上进行候选区域的选择;同时引入了一层ROI pooling,用来将候选区域转换为固定大小的feature map。转化出来的feature map转换为全连接层,之后继续进行特征分类以及BB回归。这种方法共享了特征图计算,节省了大量计算量。
3. Faster RCNN是进一步改进,具体改进是引入了RPN来进行候选区域的提出。
input data->conv->rpn->roi pooling->fc->classification and bounding box regression.
a. 原始图片减去三通道均值,图片保持长宽比进行resize,但是注意宽度和高度的最大值分别为600以及1000.输入包含三个部分。第一个是输入的图像data,具体为[1,3,800,600],表示为一张图片,三通道,图像高和宽分别为对应大小的图像;第二个是一个size 为[1,3]具体为[800,600,1.6]的向量,前两者为图像大小,1.6表示按照宽度来算的放大倍数;第三个为一个size[2,5]的ground truth bounding box信息,其中每一行的最后一列为对应物体的类别信息。总而言之,训练的输入数据为图像数据本身,图像自身的信息以及ground truth;
按照网络流程来说,图像进行完前面所说的预处理会送入基层卷积网络,卷积网络的输出会送入下面所讲的rpn网络;
b. RPN:首先有一层CNN,cnn的输出输入到一个rpn_cls_score层和一个reshape层,上一层结果以及输入的[2,5]标定框,以及[1,3]图像信息向量,以及[1,3,800,600]图像,继续输入到一个rpn_data层.rpn_data层的输出为rpn_labels,rpn_bbox_targets等。这块相对复杂,还是看论文和代码吧。
c. rpn_loss_cls: softmax 以及 loss
4.FRCN,全CNN进行检测。
5.YOLO ,利用整张图作为输入,直接在输出层输出bb位置以及类别,是一种grid based 方法。
6.SSD, 类似于强化版的RPN;可以进行多尺度检测,
7.FPN, 利用各尺度特征图进行检测。
8.Mask Rcnn, 相比较于Faster RCNN的改进是将roi pooling改为roi allign,并加了一个分支网络,这个分支网络用来实现像素分割。
9.Focal Loss,它认为one-stage 检测器不如two-stage检测器的原因是正负样本不均衡,负样本占总loss比重大,对loss function进行了修改。