第一篇技术博客——PaddleDetection训练自己的数据集并部署到边缘计算设备全过程

写在前面

这是我的第一篇技术博客,也是我希望能在研究生生涯开始之前让自己保持良好的项目记录习惯和总结习惯的开始。首先明确一下博客的目的肯定是希望让更多人在接触深度学习时少走一些弯路,所以这同时也是一篇踩坑总结。

了解你的硬件设备

在模型训练开始首先一定要了解你的硬件设备,本次项目的目的是将所训练的模型部署到eageboardFz3B板卡上,所以在此之前一定要先了解你的硬件设备所能承载的模型的版本及依赖。线总结如下:

eageboard依赖的版本号
paddlepaddle <=1.8.5
PaddleDetection realse 0.5
PaddleSlim =2.9.0

软件平台

百度飞浆实训平台AIstudio。项目地址

模型训练

由于项目要求所以我们要训练自己的数据集,而不能选择公开的数据集,当然如果你的项目是可以在网上找到替代数据集的当然也可以选择公开数据集,那就生省去了数据标注等内容。

1. 准备数据集

数据集标注,这里主要讲述VOC数据集的标注,鉴于我最终选择使用voc格式的数据集所以省去了labelme转换为coco格式的内容,如果有需要可以查询[帮助文档](如何训练自定义数据集 — PaddleDetection 0.1 文档)

工具使用

使用精灵标注助手完成标注任务,

微信图片_20220307154850.png 项目名称随便起,图片文件夹路径是源图片路径,num_class用英文逗号隔开,最好类名也写成英文。 标注完成后记得CTr+S保存否则不会覆盖。导出数据集之后就是voc格式需要的xml文件了。其中应该包换类别关键字object

2. 使用aistudio平台训练

2.1创建项目

AI studio提供脚本和jupyter notebook;两种方式进行编辑,我们这里使用notebook编辑代码,[使用方法见](AI Studio-帮助文档 (baidu.com)) 这里以ssd_mobilenet模型为例,由于需要部署到终端上所以有必要提前了解你终端的算力情况,这在实践中尤为重要,因为这一点前期工作没有做好调研导致所训练的yolov3模型因为模型太大而板卡不能提供所需要的算力而达不到预期效果。最终只能采用轻量型模型来完成检测任务。常用模型在edgeboard上的表现如下表。

微信图片_20220308085919.png 以上图片出自为某博主,但是因为整理的时候与笔者写总结的时间间隔太长没有找到原博主,如果有侵权联系我删除(笔芯) 了解到这些我们就可以开始编程了,参考PaddleDetection帮助文档,现在首先我们解压工程文件,这里我选择下载安装包的方式,[大家也可以在直接从gitee中下载但是为了防止版本问题](PaddleDetection: PaddleDetection的目的是为工业界和学术界提供丰富、易用的目标检测模型 - Gitee.com),这里选择release_0.5直接下载。然后用以下命令解压到根目录下。 ! unzip PaddleDetection-release-0.5.zip

解压数据集

! unzip data/data130283/trytwo3.zip -d work/

划分数据集

import random
import os
#生成train.txt和val.txt
random.seed(2020)
xml_dir  = '/home/aistudio/work/trytwo/ANNOTATIONS'#标签文件地址
img_dir = '/home/aistudio/work/trytwo/IMAGES'#图像文件地址
path_list = list()
for img in os.listdir(img_dir):
    img_path = os.path.join(img_dir,img)
    xml_path = os.path.join(xml_dir,img.replace('png', 'xml'))
    path_list.append((img_path, xml_path))
random.shuffle(path_list)
ratio = 0.9
train_f = open('/home/aistudio/work/train.txt','w') #生成训练文件
val_f = open('/home/aistudio/work/val.txt' ,'w')#生成验证文件

for i ,content in enumerate(path_list):
    img, xml = content
    text = img + ' ' + xml + '\n'
    if i < len(path_list) * ratio:
        train_f.write(text)
    else:
        val_f.write(text)
train_f.close()
val_f.close()

#生成标签文档
label = ['Slope','Numone','Freeezone','NumTwo','STOP','CASD','GasStation','GrossWalk','Cone']#设置你想检测的类别
with open('/home/aistudio/work/label_list.txt', 'w') as f:
    for text in label:
        f.write(text+'\n')
复制代码

参数配置

在路径PaddleDetection-release-0.5/configs/ssd/ssd_mobilenet_v1_voc.yml下设置你数据集的路径配置参数,下面是你可能需要修改的参数设置记得根据你的类别多少修改类别。 num_classes

TrainReader:
  inputs_def:
    image_shape: [3, 300, 300]
    fields: ['image', 'gt_bbox', 'gt_class']
  dataset:
    !VOCDataSet
    anno_path: train.txt             #需要修改
    dataset_dir: /home/aistudio/work #需要修改
    use_default_label: false         #默认为True ,修改为false,下同
  sample_transforms:
  
  EvalReader:
  inputs_def:
    image_shape: [3, 300, 300]
    fields: ['image', 'gt_bbox', 'gt_class', 'im_shape', 'im_id', 'is_difficult']
  dataset:
    !VOCDataSet
    anno_path: val.txt                        #修改
    dataset_dir: /home/aistudio/work          #修改
    use_default_label: false           
  sample_transforms:
  
  TestReader:
  inputs_def:
    image_shape: [3,300,300]
    fields: ['image', 'im_id', 'im_shape']
  dataset:
    !ImageFolder
    anno_path: /home/aistudio/work/label_list.txt    #修改
    use_default_label: false
  sample_transforms:
 
复制代码

开始训练

!python PaddleDetection-release-0.5/tools/train.py -cPaddleDetection-release-0.5/configs/ssd/ssd_mobilenet_v1_voc.yml --eval 看到这样的信息视为成功开始训练

image.png

训练结束后还会自动生成一个output文件夹目录,然后我们可以先预测一张图片看一下效果这里需要根据你自己的需要修改

模型预测

python PaddleDetection-release-0.5/tools/infer.py \
-c PaddleDetection-release-0.5/configs/ssd/ssd_mobilenet_v1_voc.yml \
-o weights=output/ssd_mobilenet_v1_voc/best_model.pdparams \
--infer_img=work/trytwo/IMAGES/1010.png
复制代码

导出模型

 python PaddleDetection-release-0.5/tools/export_model.py -c PaddleDetection-release-0.5/configs/ssd/ssd_mobilenet_v1_voc.yml --output_dir=./inference_model -o weights=output/ssd_mobilenet_v1_voc/best_model.pdparams TestReader.inputs_def.image_shape=[3,300,300]
复制代码

模型部署需要paddleDemo,按照json文件样例配置即可,至此你就完成了所有在aistudio平台上能够操作的步骤。

视频预测

python PaddleDetection-release-0.5/deploy/python/infer.py --model_dir=inference_model/ssd_mobilenet_v1_voc --video_file=testes.mp4 --thresh=0.8
复制代码

结果

image.png

模型部署及调优

在部署到终端设备上可以看到模型的表现并不总是如你预期所料,所以这就需要更近一步的调优工作, 部分参数调优参考

image.png

猜你喜欢

转载自juejin.im/post/7073792861154017310