用PaddleX中的Faster RCNN快速实现目标检测训练
比赛的链接:aistudio.baidu.com/aistudio/co…
PaddleX 1.3 版本文档:paddlex.readthedocs.io/zh_CN/relea…
直接使用paddle进行测试
验证飞桨安装
python -c "import paddle;paddle.utils.run_check()"
获得下图,则安装成功
准备工作
用pip install安装paddlex
pip install paddlex==1.3.7 -i https://mirror.baidu.com/pypi/simple
用pip install安装pycocotools
pip install pycocotools -i https://mirror.baidu.com/pypi/simple
验证PaddleX安装
python -c "import paddlex as pdx;print(pdx.__version__)"
获得下图,则安装成功
飞桨 - PaddleX
是一套更加简明易懂的API,并配套一键下载安装的图形化开发客户端。用PaddleX实现图像分类训练非常快速,代码量也小。
数据的处理
! wget https://bj.bcebos.com/paddlex/datasets/insect_det.tar.gz
! tar xzf insect_det.tar.gz
解压完成,我们进入insert_det中查看下数据
labels.txt (主要是类别标签的名称)
制造train_list.txt和val_list.txt
- train_list.txt (训练图片的路径和标签)
- val_list.txt (验证图片的路径和标签)
数据展示
我们以其中一个数据为例进行展示
- 图片数据
- xml标签数据
<annotation>
<folder>石霄宇</folder>
<filename>654.jpeg</filename>
<path>/home/sxy/已拍摄图片/石霄宇/石霄宇/石霄宇/654.jpeg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>1232</width>
<height>1232</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>Leconte</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>534</xmin>
<ymin>406</ymin>
<xmax>716</xmax>
<ymax>554</ymax>
</bndbox>
</object>
<object>
<name>Boerner</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>742</xmin>
<ymin>471</ymin>
<xmax>825</xmax>
<ymax>586</ymax>
</bndbox>
</object>
<object>
<name>Linnaeus</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>448</xmin>
<ymin>646</ymin>
<xmax>534</xmax>
<ymax>713</ymax>
</bndbox>
</object>
<object>
<name>armandi</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>615</xmin>
<ymin>761</ymin>
<xmax>698</xmax>
<ymax>830</ymax>
</bndbox>
</object>
<object>
<name>coleoptera</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>798</xmin>
<ymin>694</ymin>
<xmax>848</xmax>
<ymax>762</ymax>
</bndbox>
</object>
</annotation>
PaddleX完成目标检测
- 程序运行的主路径是
data_sets
,在此目录下新建一个output的目录 下面是程序的代码
# 设置使用0号GPU卡(如无GPU,执行此代码后仍然会使用CPU训练模型)
import matplotlib
matplotlib.use('Agg')
import paddlex as pdx
import os
os.environ['CUDA_VISIBLE_DEVICE'] = '0'
from paddlex.det import transforms
from paddlex.det import transforms
train_transforms = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.Normalize(),
transforms.ResizeByShort(short_size=800, max_size=1333),
transforms.Padding(coarsest_stride=32)
])
eval_transforms = transforms.Compose([
transforms.Normalize(),
transforms.ResizeByShort(short_size=800, max_size=1333),
transforms.Padding(coarsest_stride=32),
])
train_dataset = pdx.datasets.VOCDetection(
data_dir='insect_det',
file_list='insect_det/train_list.txt',
label_list='insect_det/labels.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.VOCDetection(
data_dir='insect_det',
file_list='insect_det/val_list.txt',
label_list='insect_det/labels.txt',
transforms=eval_transforms)
num_classes = len(train_dataset.labels) + 1
model = pdx.det.FasterRCNN(num_classes=num_classes)
model.train(
num_epochs=100,
train_dataset=train_dataset,
train_batch_size=2,
eval_dataset=eval_dataset,
learning_rate=0.025,
lr_decay_epochs=[50,75,90],
save_interval_epochs=1,
save_dir='output/faster_rcnn_r50_fpn',
use_vdl=True)
观察训练过程
我们能看到的信息是这是1个epoch训练完,Epoch 1 finished, loss=1.038, lr=0.004875,在训练集的损失已经很小了,bbox_map = 19.9823,我们发现使用Fast-RCNN在第一轮得到的结果比yolo更加的准确。
第三个epoch
我们能看到的信息是这是3个epoch中,训练完,[EVAL] Finished, Epoch=3, bbox_map=67.17
,在验证集上我们的bbox_map已经可以达到67了,已经是很高的分数了,模型被存入了最好的模型中了
第十五个epoch
我们能看到的信息是这是15个epoch中,训练完,[EVAL] Finished, Epoch=15, bbox_map=86.4486
,模型被存入了最好的模型中了
第十五个epoch
我们能看到的信息是这是100个epoch中,训练完,[EVAL] Finished, Epoch=100, bbox_map=80.25
,最佳模型是在第15轮的时候存储的那个模型,最后的bbox_map的值就是86.4486
验证代码
# 模型加载
import paddlex as pdx
model = pdx.load_model('output/faster_rcnn_r50_fpn/best_model')
image_name = 'insect_det/JPEGImages/0216.jpg'
result = model.predict(image_name)
pdx.det.visualize(image_name, result, threshold=0.5, save_dir='./output/faster_rcnn_r50_fpn')
比较好的测试结果
但是对于位置较近的识别效果较差
总结:Paddle的yolo和Fast-RCNN相比,Fast-RCNN的准确率更高一些,我们在前5轮次的训练中,bbox_map的值就能达到70%以上,20轮次的训练中可以高达86%,而yolo训练到100轮次以上的时候,才能达到75%左右,并且最终我们的效果81%多一点,不如Fast-RCNN的效果好。