机器视觉领域的核心问题之一就是目标检测(objectdetection),它的任务是找出图像当中所有感兴趣的目标(物体),确定其位置和大小。作为经典的目标检测框架FasterR-CNN,虽然是2015年的论文,但是它至今仍然是许多目标检测算法的基础,这在飞速发展的深度学习领域十分难得。而在FasterR-CNN的基础上改进的MaskR-CNN在2018年被提出,并斩获了ICCV2017年的最佳论文。Mask R-CNN可以应用到人体姿势识别,并且在实例分割、目标检测、人体关键点检测三个任务都取得了很好的效果。因此,百度深度学习框架PaddlePaddle开源了用于目标检测的RCNN模型,从而可以快速构建强大的应用,满足各种场景的应用,包括但不仅限于安防监控、医学图像识别、交通车辆检测、信号灯识别、食品检测等等。
项目地址:
https://github.com/PaddlePaddle/models/blob/v1.3/fluid/PaddleCV/rcnn/README_cn.md
目标检测的任务就是确定图像当中是否有感兴趣的目标存在,接着对感兴趣的目标进行精准定位。当下非常火热的无人驾驶汽车,就非常依赖目标检测和识别,这需要非常高的检测精度和定位精度。目前,用于目标检测的方法通常属于基于机器学习的方法或基于深度学习的方法。对于机器学习方法,首先使用SIFT、HOG等方法定义特征,然后使用支持向量机(SVM)、Adaboost等技术进行分类。 对于深度学习方法,深度学习技术能够在没有专门定义特征的情况下进行端到端目标检测,并且通常基于卷积神经网络(CNN)。但是传统的目标检测方法有如下几个问题:光线变化较快时,算法效果不好;缓慢运动和背景颜色一致时不能提取出特征像素点;时间复杂度高;抗噪性能差。因此,基于深度学习的目标检测方法得到了广泛应用,该框架包含有Faster R-CNN,Yolo,MaskR-CNN等,图1和图2分别显示的是基于PaddlePaddle深度学习框架训练的Faster R-CNN和Mask R-CNN模型对图片中的物体进行目标检测。
从图1中可以看出,目标检测主要是检测一张图片中有哪些目标,并且使用方框表示出来,方框中包含的信息有目标所属类别。图2与图1的最大区别在于,图2除了把每一个物体的方框标注出来,并且把每个方框中像素所属的类别也标记了出来。
图1 基于paddlepaddle训练的Faster R-CNN模型预测结果
图2基于paddlepaddle训练的Mask R-CNN模型预测结果
Mask R-CNN是承继于Faster R-CNN,Mask R-CNN只是在Faster R-CNN上面增加了一个Mask Prediction Branch(Mask预测分支),并且在ROI Pooling的基础之上提出了ROI Align。所以要想理解Mask R-CNN,就要先熟悉Faster R-CNN。同样的,Faster R-CNN是承继于Fast R-CNN,而Fast R-CNN又承继于R-CNN,因此,为了能让大家更好的理解基于CNN的目标检测方法,我们从R-CNN开始切入,一直介绍到Mask R-CNN。
区域卷积神经网络(Regions with CNN features)使用深度模型来解决目标检测。
R-CNN的主要性能瓶颈在于需要对每个提议区域(region proposal)独立的抽取特征,这会造成区域会有大量重叠,独立的特征抽取导致了大量的重复计算。因此,Fast R-CNN 对 R-CNN 的一个主要改进在于首先对整个图像进行特征抽取,然后再选取提议区域,从而减少重复计算。
FasterR-CNN 对Fast R-CNN 做了进一步改进,它将 Fast R-CNN 中的选择性搜索替换成区域提议网络(region proposal network)。RPN 以锚框(anchors)为起始点,通过一个小神经网络来选择区域提议。
FasterR-CNN 在物体检测中已达到非常好的性能,Mask R-CNN在此基础上更进一步:得到像素级别的检测结果。 对每一个目标物体,不仅给出其边界框,并且对边界框内的各个像素是否属于该物体进行标记。Mask R-CNN同样为两阶段框架,第一阶段扫描图像生成候选框;第二阶段根据候选框得到分类结果,边界框,同时在原有Faster R-CNN模型基础上添加分割分支,得到掩码结果,实现了掩码和类别预测关系的解藕。
图3 Mask R-CNN网络结构泛化图
图4展示了Mask R-CNN在像素级别的目标检测结果:
图4 Mask R-CNN:像素级别的目标检测
环境准备:
需要PaddlePaddle Fluid的v.1.3.0或以上的版本。如果你的运行环境中的PaddlePaddle低于此版本,请根据安装文档中的说明来更新PaddlePaddle。
数据准备:
在MS-COCO数据集上进行训练,可以通过脚本来直接下载数据集:
cd dataset/coco./download.sh
数据目录结构如下:
data/coco/
├── annotations
│ ├── instances_train2014.json
│ ├── instances_train2017.json
│ ├── instances_val2014.json
│ ├── instances_val2017.json
| ...
├── train2017
│ ├── 000000000009.jpg
│ ├── 000000580008.jpg
| ...
├── val2017
│ ├── 000000000139.jpg
│ ├── 000000000285.jpg
| ...
模型训练:
下载预训练模型: 本示例提供Resnet-50预训练模型,该模性转换自Caffe,并对批标准化层(Batch Normalization Layer)进行参数融合。采用如下命令下载预训练模型。
sh ./pretrained/download.sh
通过初始化pretrained_model 加载预训练模型。同时在参数微调时也采用该设置加载已训练模型。请在训练前确认预训练模型下载与加载正确,否则训练过程中损失可能会出现NAN。
安装cocoapi:
训练前需要首先下载cocoapi:
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
# if cython is not installed
pip install Cython
# Install into global site-packages
make install
# Alternatively, if you do not have permissions or prefer
# not to install the COCO API into global site-packages
python2 setup.py install --user
数据准备完毕后,可以通过如下的方式启动训练:
#Faster RCNN
python train.py \
--model_save_dir=output/ \
--pretrained_model=${path_to_pretrain_model} \
--data_dir=${path_to_data} \
--MASK_ON=False
#Mask RCNN
python train.py \
--model_save_dir=output/\
--pretrained_model=${path_to_pretrain_model} \
--data_dir=${path_to_data} \
--MASK_ON=True
python train.py –help
数据读取器说明:
数据读取器定义在reader.py中。所有图像将短边等比例缩放至scales,若长边大于max_size,则再次将长边等比例缩放至max_size。在训练阶段,对图像采用水平翻转。支持将同一个batch内的图像padding为相同尺寸。
模型设置:
训练策略:
模型评估:
模型评估是指对训练完毕的模型评估各类性能指标。本示例采用COCO官方评估。eval_coco_map.py是评估模块的主要执行程序,调用示例如下:
#Faster RCNN
python eval_coco_map.py \
--dataset=coco2017 \
--pretrained_model=${path_to_trained_model} \
--MASK_ON=False
#Mask RCNN
python eval_coco_map.py \
--dataset=coco2017 \
--pretrained_model=${path_to_trained_model} \
--MASK_ON=True
模型精度:
下表为模型评估结果:
#Faster RCNN:
模型 | RoI处理方式 | 批量大小 | 迭代次数 | mAP |
---|---|---|---|---|
End2End Faster R-CNN 1x | RoIPool | 8 | 180000 | 0.318 |
End2End Faster-RCNN RoIAlign 1x | RoIAlign | 8 | 180000 | 0.348 |
End2End Faster R-CNN RoIAlign 2x | RoIAlign | 8 | 360000 | 0.367 |
#Mask RCNN:
模型 | 批量大小 | 迭代次数 | box mAP | mask mAP |
---|---|---|---|---|
End2End Mask R-CNN | 8 | 180000 | 0.359 | 0.314 |
模型推断:
模型推断可以获取图像中的物体及其对应的类别,infer.py是主要执行程序,调用示例如下:
python infer.py \
--pretrained_model=${path_to_trained_model} \
--image_path=dataset/coco/val2017/000000000139.jpg \
--draw_threshold=0.6
注意,请正确设置模型路径${path_to_trained_model}和预测图片路径。默认使用GPU设备,也可通过设置--use_gpu=False使用CPU设备。可通过设置draw_threshold调节得分阈值控制检测框的个数。
传送门:
PaddlePaddle Github:
https://github.com/PaddlePaddle
R-CNN in PaddlePaddleGithub:
https://github.com/PaddlePaddle/models/tree/develop/fluid/PaddleCV/rcnn
Reference:
Girshick, Ross, etal. "Rich feature hierarchies for accurate object detection and semanticsegmentation." Proceedings of the IEEE conference on computer visionand pattern recognition. 2014.
https://arxiv.org/abs/1311.2524
Girshick, Ross."Fast r-cnn." Proceedings of the IEEE international conferenceon computer vision. 2015.
https://arxiv.org/abs/1504.08083
Ren, Shaoqing, et al."Faster r-cnn: Towards real-time object detection with region proposalnetworks." Advances in neural information processing systems. 2015.
https://arxiv.org/abs/1506.01497
He, Kaiming, et al."Mask r-cnn." Proceedings of the IEEE international conferenceon computer vision. 2017.
https://arxiv.org/abs/1703.06870
本文分享自 PaddlePaddle 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!