使用的代码
faster-rcnn.pytorch
重要参考
CNN目标检测(一):Faster RCNN详解
基於Resnet的Faster R-CNN網絡模型
重要参数
coco: 使用的数据集
coco数据集achor数量为3*4=12个
(P, Q):没有resize之前的原始图像大小.
(M, N): 输入到网络的图像, 是resize之后的图像大小.
重要数据
im_data:图像数据, size = ([batch, 3, M, N]), 由原始图像(P, Q)统一resize到(M, N).
im_info:图像信息,size = ([batch, 3]),保存的是 resize后的图像的H, W, 也就是上面图中的M, N以及resize的scale,scale = P/M = Q/N.
gt_boxes:gt box信息,size = ([batch, 50, 5]), 每张图片最多50个box, 每个box信息包含box的4个坐标和box的类别.
num_boxes:size= ([batch]), 记录每张图片有多少个box,因为在gt_boxes中每张图片都存储了50个box, 但实际上box数只有num_boxes[i]个,gt_boxes中box不够50的box信息全部填0.
整体结构
- 整体网络结构
2.整体代码结构
这里最重要的就是_fasterRCNN的forward过程:i: RCNN_base, 卷积网络提取的图片特征, 输出为base_feat, shape=(batch, 512, M/16, N/16)ii: RCNN_rpn, rpn网络, 计算rios、前景背景2分类loss和粗边框回归loss, 其中rois的shape=(batch, post_top_n, 5), 是排序后并经过nms后的post_top_n个anchor(经过网络预测的delta修正原始anchor之后的anchor),这些anchor都是映射回MxN的图像的, 并且经过剪切, 不会超出图像的大小, 每个anchor由1个占位和x1, y1, x2, y2这4个坐标组成。iii: RCNN_proposal_target, 本过程只有训练阶段有, 目的是得到128个与anchor有最大IOU的gt_box的label, 以及gt_box与anchor之间的偏移, 用作求类别loss和精边框回归loss. iv: RCNN_roi_align, 使用roi_align方法将128个anchor每个都切成7x7的块, 输出为pooled_feat, shape=(batch*128, 512, 7, 7).v: _head_to_tail, 全连接层: (batch*128, 512*7*7) --> (batch*128, 4096).vi: RCNN_cls_score, 全连接层用做分类, 预测score, (batch*128, 4096) --> (batch*128, n_class), 并使用交叉熵求得预测的分类与第iii步得到的gt_box的label的loss.vii: RCNN_bbox_pred, 全连接层, 预测bbox偏移: (batch*128, 4096) --> (batch*128, 4), 并使用smooth_l1求得预测bbox偏移与第iii步得到的gt_box与anchor之间的偏移的loss.
3.训练阶段的反向传播
根据2.ii、2.vi和2.vii求得的4个loss相加然后进行反向传播。
4.测试阶段的后处理i: bbox_transform_inv, 根据2.vii得到的RCNN_bbox_pred 修正2.ii得到的rios.ii: clip_boxes, 将 pred_boxes剪切在图像范围内, 超出边界的都剪切回图像内, pred_boxes个数没有变。iii: 使用nms得到最终的rios和label.
代码细节
- rpn网络
i: rpn整体结构
ii: rpn前置网络
iii: RPN_proposal
代码注释 proposal_layer.py / class _ProposalLayer
def
iv: RPN_anchor_target
代码注释 anchor_target_layer.py / class _AnchorTargetLayer
def
v: rpn loss
2. RCNN_proposal_target网络
3. RCNN_roi_align, roi align原理和流程这里先不介绍
4. 后置处理