在做图像分类任务时,我们先使用卷积神经网络提取图像特征,然后再用这些特征预测分类概率。注意这里是对整张图像提取特征,所以无法区分图像中的不同目标,也就没法分别标示出每个物体所在的位置。
为了解决这个问题,我们可以将目标检测任务进行拆分。以某种方式在图像上生成一系列可能包含物体的区域(候选区域),然后对每个候选区域,把它单独当成一幅图像来看待,使用图像分类模型对它进行分类,看它属于哪个类别,从而实现目标检测任务。
2015年,ShaoqingRen等人提出了FasterR-CNN模型,提出了RPN的方法来产生物体的候选区域,这一方法不再需要使用传统的图像处理算法来产生候选区域,进一步提升了处理速度。

faster-rcnn模型结构
本文将通过一个具体的案例来演示一下如何使用FasterRCNN来实现目标检测任务。
一、数据集介绍:这里采集了五种水果的数据:蕃茄、核桃、桔子、龙眼、青枣。共300张图像,图像大小:640*480。并做好了标注和数据集的划分。标注和划分操作可以参看:24.人工智能:计算机视觉任务——数据格式和标注。


这里使用飞桨的PaddleX来进行数据训练,飞桨的PaddleX安装和介绍可以参看:40.人工智能——深度学习飞桨-PaddleX安装:Windows10系统
训练代码:
importpaddlexaspdxfrompaddleximporttransformsasT定义训练和验证所用的数据集train_dataset=(data_dir="fruit",file_list="fruit/train_",label_list="fruit/",transforms=train_transforms,shuffle=True)eval_dataset=(data_dir="fruit",file_list="fruit/val_",label_list="fruit/",transforms=eval_transforms,shuffle=False)paddlex-export_inference--model_dirbest_model--save_dirinference

输出部署模型
推理预测实现代码:
importosimportcv2importrandom随机选择一个测试文件,并显示test="test_"withopen((basedir,test),"r")asf:lines=().splitlines()fimg=(lines).split("")[0]fimg=(basedir,fimg)print(fimg)predictor=("output/faster_rcnn_fpn_fruit/inference_model",use_gpu=True)img=(fimg)result=(img)#print(result)vis_img=(img,result,threshold=0.5,save_dir=None)("result",vis_img)(0)()随机取三条测试数据,预测结果可视化如下:

预测结果1

预测结果2

预测结果3
从预测结果的准确率来看,效果还是不错的,基本上能达到预期目标检测的效果。
补充说明:
修改调整了一下训练参数,一是迭代次数增加到50,二是数据增强也增加尺寸。最后mAP高达到94%以上了。
[INFO][EVAL]Finished,Epoch=50,bbox_map=92.396987.[INFO]Currentevaluatedbestmodeloneval_datasetisepoch_40,bbox_map=94.28783236128207[INFO]Modelsavedinoutput/faster_rcnn_fruit_vd_ssld/epoch_50.