昆虫目标检测---PaddleX之Faster RCNN目标检测

690 阅读3分钟

用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()"

获得下图,则安装成功 image.png

准备工作

用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__)"

获得下图,则安装成功

image.png

飞桨 - PaddleX 是一套更加简明易懂的API,并配套一键下载安装的图形化开发客户端。用PaddleX实现图像分类训练非常快速,代码量也小。

数据的处理

! wget https://bj.bcebos.com/paddlex/datasets/insect_det.tar.gz
! tar xzf insect_det.tar.gz

image.png

解压完成,我们进入insert_det中查看下数据

image.png

labels.txt (主要是类别标签的名称)

image.png

制造train_list.txt和val_list.txt
  • train_list.txt (训练图片的路径和标签)

image.png

  • val_list.txt (验证图片的路径和标签)

image.png

数据展示

我们以其中一个数据为例进行展示

  • 图片数据

image.png

  • 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)

观察训练过程

image.png

我们能看到的信息是这是1个epoch训练完,Epoch 1 finished, loss=1.038, lr=0.004875,在训练集的损失已经很小了,bbox_map = 19.9823,我们发现使用Fast-RCNN在第一轮得到的结果比yolo更加的准确。

第三个epoch

image.png

我们能看到的信息是这是3个epoch中,训练完,[EVAL] Finished, Epoch=3, bbox_map=67.17,在验证集上我们的bbox_map已经可以达到67了,已经是很高的分数了,模型被存入了最好的模型中了

第十五个epoch

image.png

我们能看到的信息是这是15个epoch中,训练完,[EVAL] Finished, Epoch=15, bbox_map=86.4486,模型被存入了最好的模型中了

第十五个epoch

image.png

我们能看到的信息是这是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')

比较好的测试结果

image.png

image.png

但是对于位置较近的识别效果较差

image.png

总结:Paddle的yolo和Fast-RCNN相比,Fast-RCNN的准确率更高一些,我们在前5轮次的训练中,bbox_map的值就能达到70%以上,20轮次的训练中可以高达86%,而yolo训练到100轮次以上的时候,才能达到75%左右,并且最终我们的效果81%多一点,不如Fast-RCNN的效果好。