如何利用PaddleDetection做一个完整的项目

转载CSDN博客:

系列文章:如何利用PaddleDetection做一个完整的项目(一)_yzl819819的博客-CSDN博客_paddledetection如何利用PaddleDetection做一个完整的项目(一)0PaddleDetection简介PaddleDetection 是PaddlePaddle推出的物体检测统一框架。支持现有的RCNN、SSD、YOLO等系列模型、支持 ResNet、ResNet-VD、ResNeXt、ResNeXt-VD、SENet、MobileNet、DarkNet等主干网络。针对不同的业务场景(性能、目标大小...https://blog.csdn.net/yzl819819/article/details/104336990

他写的非常详细,非常好。不过有些步骤和官网不一致。因为我是按照官网按照paddlepaddle和paddleDetection的。步骤和他的有差异。本博客主要参考他的博客。

现在开始;

PaddleDection简介

PaddleDetection 是PaddlePaddle推出的物体检测统一框架。支持现有的RCNN、SSD、YOLO等系列模型、支持 ResNet、ResNet-VD、ResNeXt、ResNeXt-VD、SENet、MobileNet、DarkNet等主干网络。针对不同的业务场景(性能、目标大小、准确率等)可以调用框架下的不同参数(或者是参数文件),实现任务。相比于tensorflow的Object_Detection,优势之一就是将YOLO这一目标检测的快速算法融合到了框架下。
文章将以一个例子为说明,来谈如何利用paddleDetection完成一个项目,本文介绍(1-6章节)
项目用到的工具 硬件:Win10(RTX2060)笔记本、某品牌服务器(4*T4)工业相机(Hikvision)软件:pycharm、VS2019
1、环境部署
2、数据集准备
3、训练
4、训练过程可视化
5、模型导出
6、python进行单张/多张图片的预测
7、python+qt(给客户的演示demo)

8、C++进行单张预测(含编译简介)
9、C++预测代码封装成DLL、配合C#完成一个整体项目
10、扩展:关于PaddlePaddle代码数据读取的方式。

1.环境部署

1.1 安装paddle

利用anaconda创建一个名字叫做anaconda的paddle环境(备注:下文中命令提示窗口出现的(paddle)是指该项目环境的名称叫做paddle)具体安装方式见此链接

paddlepaddle安装参考链接

paddlepaddle安装文档_Vertira的博客-CSDN博客该文档来源paddlepaddle的官网 :日期2021/12/6进入虚拟环境,conda activate paddle_envhttps://blog.csdn.net/Vertira/article/details/121746401paddlepaddle 官网有详细的安装教程。建议以官网为准。

paddleDection安装参考链接:

PaddleDetection安装总结_Vertira的博客-CSDN博客安装PaddleDetection,必须先安装paddlepaddle,然后安装PaddleDetection。paddlepaddle安装的文档:paddlepaddle安装文档_Vertira的博客-CSDN博客该文档来源paddlepaddle的官网 :日期2021/12/6进入虚拟环境,conda activate paddle_envhttps://blog.csdn.net/Vertira/article/details/121746401注意,安装完paddledection后..https://blog.csdn.net/Vertira/article/details/121746536

 这里假设您已经配置好环境,安装好paddledetection

重点来了。

2.数据集准备

2.1 数据标注

目前项目使用的数据集格式是VOC数据格式,使用labelimg作为标注工具,标注工具的下载安装见链接
特别说明:项目中使用的数据集是PaddleDetection提供的演示示例数据集,下文将通过使用该数据集来说明。
首先,下载该数据集,下载后如下图所示:下载链接提取码vw3b

标注如下:使用软件labelme ,labelimg等都可以

保存即可。标注完后。我们会得到一大堆的xml文件

打开其中一个xml文件,你可以看到内部的结构。

 具体信息如下:

2.2创建VOC数据格式

其中Annotations存放标注生成的xml文件,JPEGImage存放图片,ImageSets存放对训练集和数据集的划分。ImageSet下有Main文件,Mian下需要建立一个label_list.txt。label_list.txt是指标注的目标的名称。其内容如下:

 

 备注:train.txt、val.txt是根据下文中代码(该代码会命名为:get_list.py,放置在了数据集链接的文件里面)生成,分别是对训练集和验证集的划分:
接上文所述,是生成生成train.txt、val.txt的代码,该代码会将300张水果图片分成240张训练集和60张验证集。

```python
import os
import random

train_precent=0.7
xml="C:/Users/zhili/Desktop/fruit-detection/Annotations"
save="C:/Users/zhili/Desktop/fruit-detection/ImageSets/Main"
total_xml=os.listdir(xml)

num=len(total_xml)
tr=int(num*train_precent)
train=range(0,tr)

ftrain=open("C:/Users/zhili/Desktop/fruit-detection/ImageSets/Main/train.txt","w")
ftest=open("C:/Users/zhili/Desktop/fruit-detection/ImageSets/Main/test.txt","w")

for i in range(num):
    name=total_xml[i][:-4]+"\n"
    if i in train:
        ftrain.write(name)
    else:
        ftest.write(name)

ftrain.close()
ftest.close()

如下图是生成的train文件
 
备注:在Main文件夹中生成的train.txt文件和val.txt文件仅仅是对数据集的划分,还需要进一步的利用如下代码(create_list.py,该代码是paddle提供的)生成含有路径信息以及图像和xml文件一一对应的文件。

```python
import os
import os.path as osp
import re
import random

devkit_dir = './'
years = ['2007', '2012']


def get_dir(devkit_dir,  type):
    return osp.join(devkit_dir, type)


def walk_dir(devkit_dir):
    filelist_dir = get_dir(devkit_dir, 'ImageSets/Main')
    annotation_dir = get_dir(devkit_dir, 'Annotations')
    img_dir = get_dir(devkit_dir, 'JPEGImages')
    trainval_list = []
    test_list = []
    added = set()

    for _, _, files in os.walk(filelist_dir):
        for fname in files:
            img_ann_list = []
            if re.match('train\.txt', fname):
                img_ann_list = trainval_list
            elif re.match('val\.txt', fname):
                img_ann_list = test_list
            else:
                continue
            fpath = osp.join(filelist_dir, fname)
            for line in open(fpath):
                name_prefix = line.strip().split()[0]
                if name_prefix in added:
                    continue
                added.add(name_prefix)
                ann_path = osp.join(annotation_dir, name_prefix + '.xml')
                img_path = osp.join(img_dir, name_prefix + '.jpg')
                assert os.path.isfile(ann_path), 'file %s not found.' % ann_path
                assert os.path.isfile(img_path), 'file %s not found.' % img_path
                img_ann_list.append((img_path, ann_path))

    return trainval_list, test_list


def prepare_filelist(devkit_dir, output_dir):
    trainval_list = []
    test_list = []
    trainval, test = walk_dir(devkit_dir)
    trainval_list.extend(trainval)
    test_list.extend(test)
    random.shuffle(trainval_list)
    with open(osp.join(output_dir, 'train.txt'), 'w') as ftrainval:
        for item in trainval_list:
            ftrainval.write(item[0] + ' ' + item[1] + '\n')

    with open(osp.join(output_dir, 'val.txt'), 'w') as ftest:
        for item in test_list:
            ftest.write(item[0] + ' ' + item[1] + '\n')


if __name__ == '__main__':
    prepare_filelist(devkit_dir, '.')

这个时候的新生成的train.txt的内容如下:

{**************************************

更正第二部分程序

路径需要改成绝对路径才可以。

效果如下:

}

谨记:{ 环境部署、训练、导出的py文件里面都需要加一下路径 }

最终生成如下所示的数据集格式如下,其中label_list.txt和Mian中的label_list.txt一致。train.txt文件和val.txt是新生成的图像-xml的名称路径对应文件。
该完成后的数据集作者放置在了项目文件夹下:dataset/fruit下,并命名为该文件夹为fruit-detection,如下图所示。
数据集生成后就可以根据如下的命令进行训练。3.

 3.训练

在训练之前,首先了解模型的配置文件,如文章开头所述:PaddleDetection 是PaddlePaddle推出的物体检测统一框架。支持现有的RCNN、SSD、YOLO等系列模型、支持 ResNet、ResNet-VD、ResNeXt、ResNeXt-VD、SENet、MobileNet、DarkNet等主干网络。而实现我们如何快速的完成不同模型的训练体验,就是需要依靠配置文件的切换。
如下所示就是该项目配置文件(config文件)的路径
 

如图下图就是我们选取的深度学习的配置文件,我们选取yolov3_mobilenet_v1_fruit.yml做为本项目的训练配置文件。该配置文件是使用yoloV3的框架,同时主干网络为mobilenet
这些参数可以根据我们自己的数据情况进行设计。
如设置:最大迭代步数:max_iters
预训练模型的来源:pretrain_weights
数据路径dataset_dir
Batch_size的大小 batch_size

 需要着重关注点如下:需要根据自己的不同数据集进行训练。

 

在将config文件配置好了以后,就可以进行训练
set PYTHONPATH=$PYTHONPATH:. (这个命令可以不用。coda创建的虚拟环境,不需要这个命令)
set CUDA_VISIBLE_DEVICES=0(默认只有一个GPU)(这个命令是设置GPU的数量编号,从0开始,)

python -u tools/train.py -c configs/yolov3_mobilenet_v1_fruit.yml --use_tb=True --tb_log_dir=tb_fruit_dir/scalar --eval
运行如下命令,即可开始训练

 出现如下图所示现象,可以表示为训练正常,可等待训练结束

关于训练命令的阐述:
-c configs/yolov3_mobilenet_v1_fruit.yml 用来指定配置文件
–use_tb 是否使用tb-paddle记录数据,进而在TensorBoard中显示,默认值是False
–tb_log_dir 指定 tb-paddle 记录数据的存储路径
–eval 是否边训练边测试
 

备注:
 关于–eval参数的使用
在训练中交替执行评估, 评估在每个snapshot_iter时开始。每次评估后还会评出最佳mAP模型保存到best_model文件夹下,建议训练时候使用该参数,可以使得完成训练后快速找到最好的模型。
 关于预训练模型的来源:
在本案例中,预训练模型是通过一个链接方式在训练开始时候加载进行下载的,其实paddle提供了丰富的预训练模型库,具体链接为:https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/MODEL_ZOO_cn.md
 

  训练过程出现的一个错误:
作者使用的电脑是笔记本,显卡型号是RTX2060 显存为6G。在训练过程中出现如下错误。

通过命令提示符中发现,竟然出现了(7184, 7184, 3)这样大的图片,而本身数据像素多数为1000*1000左右。出现这个原因是配置文件有一个参数ratio设置的太大。Paddle Detection中设置了数据增强功能:在RandomExpand这种数据增强里,首先新建一张(原图大小 * ratio)大小的空白图片,然后在这张空白图片上随机找个位置,把原图贴上去,之后再把这张新图片缩放成原图大小。原配置文件中ratio默认为4.作者将ratio设置成2以后,就可以正常训练了,当然如果显存足够大的话,也可以按照默认值来。

 4.训练过程可视化
训练期间可以通过tensorboard实时观察loss和精度值,启动命令如下:
tensorboard --logdir tb_fruit_dir/scalar

paddle 有专门的可视化工具VisualDL

参考链接如下:

Paddle+Conda+VisualDL可视化的使用方法详细介绍(有图例)。_Vertira的博客-CSDN博客创作不易,如果我文章的介绍 对您有用,请各位看官 点赞,收藏,关注。谢谢。首先把ubuntu创建虚环境,paddlepaddle安装好,我用来做分割,所以我安装paddleseg。安装成功后。开始训练:输入命令:python ./PaddleSeg/dygraph/train.py --config ./PaddleSeg/dygraph/configs/unet/unet.yml --do_eval --use_vdl --save_interval 5 --log_iters 1 --save_https://blog.csdn.net/Vertira/article/details/121494492

 

5.模型导出

当我们训练完成后,在项目文件的output中可以看到我们生成的模型文件,在代码中我们设置模型每迭代200步保存一次,训练总共有20000步,因此会生成100个训练文件,由于我们使用 --eval参数进行边训练边测试,因此我们可以获得训练过程中最好的模型文件,我们将做好的模型进行导出
 

 执行如下命令:
python tools/export_model.py -c configs/yolov3_mobilenet_v1_fruit.yml --output_dir=./inference_model -o weights=output/ yolov3_mobilenet_v1_fruit/best_model
最终导出如下所示
 

6.模型预测

PaddleDetection给出的模型预测代码是infer.py。该文件在项目文件夹tools里面。改代码提供了两种预测方式第一种是单张图片预测,第二种是以一个文件夹中的图片进行预测。通过设置不同的预测方式达到自己的目的。如下,使用–infer_img=demo/xxx.jpg为单张图片进行预测,使用–infer_dir=demo为用一个文件夹进行预测。其中demo是放置测试图片的地方。
6.1使用单张图片进行预测

测试的结果保存在infer_output这个文件夹中
python -u tools/infer.py -c configs/yolov3_mobilenet_v1_fruit.yml -o weights=inference_model\yolov3_mobilenet_v1_fruit --infer_img=demo/orange_71.jpg --output_dir=infer_output
 

6.2使用一个文件夹中图片进行预测

测试的结果保存在infer_output这个文件夹中
python -u tools/infer.py -c configs/yolov3_mobilenet_v1_fruit.yml -o weights=inference_model\yolov3_mobilenet_v1_fruit --infer_img=demo/test --output_dir=infer_output/testout

 

文章结尾说明:
1、该文章多数内容来源于PaddleDetection的文档,链接
https://github.com/PaddlePaddle/PaddleDetection


 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值