Faster R-CNN是作者Ross Girshick继Fast R-CNN后的又一力作。同样使用VGG16作 为网络的backbone,推理速度在GPU上达到5fps(包括候选区域的生成),准确率 也有进一步的提升。在2015年的ILSVRC以及COCO竞赛中获得多个项目的第一名。
Fast R-CNN算法流程可分为3个步骤
- 将图像输入网络得到相应的特征图
- 使用RPN结构生成候选框,将RPN生成的候选框投影到 特征图上获得相应的特征矩阵
- 将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图, 接着将特征图展平通过一系列全连接层得到预测结果
- Faster RCNN的结构组成RPN+Fast RCNN
- 1 数据集,image input
- 2 卷积层CNN等基础网络,提取特征得到feature map
- 3-1 RPN层,再在经过卷积层提取到的feature map上用一个3x3的slide window,去遍历整个feature map,在遍历过程中每个window中心按rate,scale(1:2,1:1,2:1)生成9个anchors,然后再利用全连接对每个anchors做二分类(是前景还是背景)和初步bbox regression,最后输出比较精确的300个ROIs。
- 3-2 把经过卷积层feature map用ROI pooling固定全连接层的输入维度。
- 4 然后把经过RPN输出的rois映射到ROIpooling的feature map上进行bbox回归和分类。
Faster R-CNN
1.环境配置:
- Python3.6或者3.7
- Pytorch1.6(注意:必须是1.6.0或以上,因为使用官方提供的混合精度训练1.6.0后才支持)
- pycocotools(Linux: pip install pycocotools;
Windows:pip install pycocotools-windows(不需要额外安装vs)) - Ubuntu或Centos(不建议Windows)
- 最好使用GPU训练
2.预训练权重下载地址(下载后放入backbone文件夹中):
- ResNet50+FPN backbone: https://download.pytorch.org/models/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth
3.数据集,本例程使用的是PASCAL VOC2012数据集(下载后放入项目当前文件夹中)
- Pascal VOC2012 train/val数据集下载地址:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
数据标签:总共20个种类
“aeroplane”: 1,
“bicycle”: 2,
“bird”: 3,
“boat”: 4,
“bottle”: 5,
“bus”: 6,
“car”: 7,
“cat”: 8,
“chair”: 9,
“cow”: 10,
“diningtable”: 11,
“dog”: 12,
“horse”: 13,
“motorbike”: 14,
“person”: 15,
“pottedplant”: 16,
“sheep”: 17,
“sofa”: 18,
“train”: 19,
“tvmonitor”: 20
}
4.训练方法
- 确保提前准备好数据集
- 确保提前下载好对应预训练模型权重
- 若要训练resnet50+fpn+fasterrcnn,直接使用train_resnet50_fpn.py训练脚本
- 若要使用多GPU训练,使用 “python -m torch.distributed.launch --nproc_per_node=8 --use_env train_multi_GPU.py” 指令,nproc_per_node参数为使用GPU数
5.实验结果记录
5.1train_resnet50_fpn.py训练脚本代码
import torch
import transforms
from network_files.faster_rcnn_framework import FasterRCNN, FastRCNNPredictor
from backbone.resnet50_fpn_model import resnet50_fpn_backbone
from my_dataset import VOC2012DataSet
from train_utils import train_eval_utils as utils
import os
# import torchvision.models.detecion.faster_rcnn
def create_model(num_classes):
backbone = resnet50_fpn_backbone()
model = FasterRCNN(backbone=backbone, num_classes=91)
# 载入预训练模型权重
# https://download.pytorch.org/models/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth
weights_dict = torch.load("./backbone/fasterrcnn_resnet50_fpn_coco.pth")
missing_keys, unexpected_keys = model.load_state_dict(weights_dict, strict=False)
if len(missing_keys) != 0 or len(unexpected_keys) != 0:
print("missing_keys: ", missing_keys)