首页 > 其他分享 >paddleDection安装使用

paddleDection安装使用

时间:2023-10-27 16:01:42浏览次数:29  
标签:paddleDection 640 -- Average py python 使用 安装 IoU

1,安装环境

首先要安装paddlepaddle:安装方式的链接,各种显卡驱动,cuda和cudnn不多说比较基础

我本身是在虚拟环境里安装的,所以虚拟环境安装也不影响它调用显卡资源

查看paddle是否安装成功:

>>> import paddle
>>> paddle.utils.run_check()

安装paddleDection:

git clone https://github.com/PaddlePaddle/PaddleDetection.git    #或者直接登录gitbub下载zip包

# 安装其他依赖
cd PaddleDetection
pip install -r requirements.txt

# 编译安装paddledet
python setup.py install

#因为我是windows环境,所以又加了这样一句
pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

#安装以后确认安装结果
python ppdet/modeling/tests/test_architectures.py
#正常返回:
.......
----------------------------------------------------------------------
Ran 7 tests in 12.816s
OK

更多详细链接可以参考官方教程

安装一个可视化工具:

python -m pip install visualdl -i https://mirror.baidu.com/pypi/simple

 苍天好轮回,我又来了。说来惭愧,我这种装环境的老油条竟然有一天被自己给坑了,众所周知,cudnn需要根据cuda的版本进行选择,而nvidia官网上选项众多,以11.6为例(为啥是11.6呢,我3050用11.7也不是不可以,主要是paddle支持11.6支持的比较好),能够安装的cudnn版本有,8.7.0,8.4等,我挑了个8.7,这一挑问题来了,paddleDetection的train能跑,infer跑不了了,说是CUDNN_STATUS_NOT_SUPPORTED,而paddlepaddle这种大框架呢,对环境契合程度要求比较高,人家也明明白白说过了:

 

/#笑哭,所以你看,这又发现一大坑。所以本人目前用的技术链条如下:

paddlepaddle 
python -m pip install paddlepaddle-gpu==2.4.2.post116 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html
paddleDetection-develop版本
cudnn:8.4.0
cuda:11.6
python3.8.9

 

 

2,实操

自己标图并且转换格式,然后训练

python D:\env\paddledetection\labelme2voc.py D:\env\data\JPEGJson D:\env\data\new\aim --labels=D:\env\data\new\labels.txt

注意,labels.txt里面的内容这样的:

__ignore__
_background_
dust
tube

首先声明,官方给的kaggle数据集和标牌识别我是能跑通的,跑的方法是先把数据下载下来,数据包括图片,voc格式的标注,以及label_list.txt和train.txt,valid.txt的数据切分,然后直接跑

训练

python -u tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml  --use_vdl=true  --vdl_log_dir=vdl_dir/scalar  --eval
#参数解析:python命令加上-u(unbuffered)参数后会强制其标准输出也同标准错误一样不通过缓存直接打印到屏幕。
-c 参数表示指定使用哪个配置文件,注意哈,yolov3_mobilenet_v1_roadsign.yml这个配置文件内部还include了好几个其他的配置文件。
#-o 参数表示指定配置文件中的全局变量(覆盖配置文件中的设置),这里设置使用gpu
# --eval 参数表示边训练边评估,最后会自动保存一个名为model_final.pdparams的模型
#use_vdl指的是是不是用vdl可视化

训练可视化

visualdl --logdir vdl_dir/scalar/
##后面的地址指向训练的时候写出log的文件
##打开localhost:8040自己看

 

训练完成以后评估模型

python tools/eval.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml -o use_gpu=true

#评估 默认使用训练过程中保存的model_final.pdparams,一开始我还纳闷为啥没有指定评估哪个模型呢,打开yolov3_mobilenet_v1_roadsign.yml就发现了有个字段叫做weights直接指定了模型文件夹,需要注意的是,默认使用训练过程中保存的model_final.pdparams

模型导出

python tools/export_model.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml --output_dir=./inference_model -o weights=D:\env\paddledetection\PaddleDetection\output\yolov3_mobilenet_v1_roadsign/model_final.pdparams
#也可以单独指定某个模型

模型简单推理(注意这里用的是简单模型推理,未经转化的那种)

python tools/infer.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml   --infer_img=D:\env\paddledetection\data_img\JPEGImages\0-22.jpg --output_dir=D:\env\paddledetection\PaddleDetection\output  --draw_threshold=0.5  -o weights=output/yolov3_mobilenet_v1_roadsign/model_final  --use_vdl=True

 paddleInfence推理

python deploy/python/infer.py --model_dir=D:\env\paddledetection\PaddleDetection\inference_model\yolov3_mobilenet_v1_roadsign --image_file=D:\env\paddledetection\data_img\JPEGImages\6-9.jpg --device=GPU

结果会print出来,所以画框子啥的需要自己去处理

实操这里还有个遗留问题:推理模型如何自定义的问题,主要是这几个yaml格式的文件有些地方不知道怎么改

 3,pp-yoloe小目标

环境要求:paddle>2.3.2  python>3.8

首先要有数据,因为我是labelme标注的,而官方也给了lebelme转voc和coco的例子:

python tools/x2coco.py   --dataset_type labelme   --json_input_dir D:\env\data\JPEGJson2 --image_input_dir D:\env\data\JPEGImages2  --output_dir D:\env\data\annotation_coco  --train_proportion 0.7  --val_proportion 0.2  --test_proportion 0.1

转完成coco以后是这样的:

 

 但是实际上本教程整出来的coco是这样的

 

 visdrone_sliced那一版数据是这样的

 

coco数据格式验证是可以通过的哈

# 查看COCO标注文件
import json
coco_anno = json.load(open('D:\\env\\data\\annotation_coco\\annotations\\instance_train.json'))

# coco_anno.keys
print('\nkeys:', coco_anno.keys())

# 查看类别信息
print('\n物体类别:', coco_anno['categories'])

# 查看一共多少张图
print('\n图像数量:', len(coco_anno['images']))

# 查看一共多少个目标物体
print('\n标注物体数量:', len(coco_anno['annotations']))

# 查看一条目标物体标注信息
print('\n查看一条目标物体标注信息:', coco_anno['annotations'][0])

好吧那接下来需要验证数据,主要是验证我们的数据集是不是适合用yoloe模型,以及我们的标注框占图片的大小等

python tools/box_distribution.py --json_path D:\env\data\annotation_coco\annotations\instance_train.json --out_img ttt2.jpg

问题是我自己的环境跑不出来reg_range,目前此问题已经解决,是git上下载的包版本不对,应当下载的是develop版本,不要用release版本

 

然后进入切图

pip install sahi
pip install torch #这个巨慢无比,怀疑是pytorch

切图

python tools/slice_image.py --image_dir D:\env\data\annotation_coco\train --json_path D:\env\data\annotation_coco\annotations\instance_train.json --output_dir D:\env\data\coco_split --slice_size 640 --overlap_ratio 0.25

 然后我就得到了split过的数据,切图倒是一切都好,就是吧,有个叫2.jpg的图一直在搞事情,

 

 我看了一下,json里确实有2.jpg,但是val的文件夹里确实没有2.jpg,反倒有个3.jpg,验证了一下,点位基本能对的上,我私下猜测,是x2coco的问题,预计是个小bug,暂时先不管吧。

接下来进入训练

训练卡了挺久的,主要是有三方面的困惑,第一自定义的数据是否正确,第二yaml文件怎么改才好,第三gpu总是跑失败,

第一个不说了,直接说第二个,多次运行未果,群里大神说与技术gpu内存满了的原因,调试方法

set GLOG_v=5
python tools/train.py -c configs/smalldet/ppyoloe_crn_l_80e_sliced_visdrone_640_025.yml -o  worker_num=1  --eval

##就能把详细的log打印到终端上,所以,真的蛮好用,好几次我都是allocate 25m数据失败造成的闪退。

其次,官方给的训练的命令我给去掉了个LearningRate.base_lr=0.00125,因为我直接在yaml中改了,如何改呢?我找到了ppyoloe给的公式:

 

 看起来batch-size要改(据说batch-size越小需要的显存越小)顺带一提,batch-size一改,学习率也要改,修改方式见上图(我认为,lr-default是0.01,batch_size-default是8,八个卡训练的)所以我把configs/smalldet/ppyoloe_crn_l_80e_sliced_visdrone_640_025.yml内的内容改成了这样(部分截图):

 

 

经过一晚上的奋斗,就得到了一堆模型。加载进来评估一下哈。

默认的是子图评估方式

这个评估方式的配置文件

EvalDataset:
  !COCODataSet
    image_dir: val_images_640_025
    anno_path: val_640_025.json
    dataset_dir: dataset/visdrone_sliced

运行方式

python tools/eval.py -c  configs/smalldet/ppyoloe_crn_l_80e_sliced_visdrone_640_025.yml

说实话没大看懂这个结果,但是感觉还不错的样子

[12/06 10:18:00] ppdet.utils.checkpoint INFO: Finish loading model weights: output/ppyoloe_crn_l_80e_sliced_visdrone_640_025/model_final.pdparams
[12/06 10:18:02] ppdet.engine INFO: Eval iter: 0
[12/06 10:18:07] ppdet.metrics.metrics INFO: The bbox result is saved to bbox.json.
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
[12/06 10:18:07] ppdet.metrics.coco_utils INFO: Start evaluate...
Loading and preparing results...
DONE (t=0.17s)
creating index...
index created!
Running per image evaluation...
Evaluate annotation type *bbox*
DONE (t=0.84s).
Accumulating evaluation results...
DONE (t=0.06s).
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.146
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.338
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.103
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.069
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.234
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.002
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.109
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.264
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.478
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.205
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.530
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.525
[12/06 10:18:08] ppdet.engine INFO: Total sample number: 76, averge FPS: 12.006301623620626

然后再来个原图评估

首先改配置

#改ppyoloe_crn_l_80e_sliced_visdrone_640_025.yaml为这样
EvalDataset:   !SlicedCOCODataSet     image_dir: val     anno_path: annotations/instance_val.json     dataset_dir: dataset/visdrone     sliced_size: [640,640]     overlap_ratio: [0.25,0.25]

评估一下是这样:

Running per image evaluation...
Evaluate annotation type *bbox*
DONE (t=0.42s).
Accumulating evaluation results...
DONE (t=0.01s).
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.097
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.260
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.062
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.076
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.167
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.002
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.009
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.142
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.253
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.185
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.241
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.167
[12/09 15:52:26] ppdet.engine INFO: Total sample number: 7, averge FPS: 0.10782975663969391

看不大懂的样子

子图自动拼图评估

配置是这样的

EvalDataset:
  !SlicedCOCODataSet
    image_dir: val
    anno_path: annotations/instance_val.json
    dataset_dir: dataset/visdrone
    sliced_size: [640,640]
    overlap_ratio: [0.25,0.25]

执行命令

python tools/eval.py -c configs/smalldet/ppyoloe_crn_l_80e_sliced_visdrone_640_025.yml --slice_infer --combine_method=nms --match_threshold=0.6 --match_metric=ios

结果

懒得往上怼了,因为我训练结果确实很一般,估计是因为我lr设置的有点小,所以导致数据信度都比较低。

评估完了跑个图来看一下哈

子图

python tools/infer.py -c configs/smalldet/ppyoloe_crn_l_80e_sliced_visdrone_640_025.yml   --infer_img=dataset/visdrone_sliced/val_images_640_025/3_0_1408_640_2048.jpg  --output_dir=output  --draw_threshold=0.3 -o weights=output/ppyoloe_crn_l_80e_sliced_visdrone_640_025/model_final --use_vdl=True

然后果然在output下看到了输出的图片

原图切图推理,推理完成以后拼合

python tools/infer.py -c configs/smalldet/ppyoloe_crn_l_80e_sliced_visdrone_640_025.yml   --infer_img=dataset/visdrone/val/26.jpg  --output_dir=output  --draw_threshold=0.25 -o weights=output/ppyoloe_crn_l_80e_sliced_visdrone_640_025/model_final --use_vdl=True  --slice_infer --slice_size 640 640 --overlap_ratio 0.25 0.25 --combine_method=nms --match_threshold=0.6 --match_metric=ios

就不上图了,感觉蛮不错的,就是score比较低,低到啥程度呢,0.3-0.4的样子,这就很诡异。我原以为这是lr的问题,但是群里大佬说,这是batchsize的问题

后来评估发现好像确实是batch-size的问题,并且这个batch-size的机制还挺复杂的,大佬给出了改进方向,代码一改,单卡batch-size能得到很大提升,

需要在train.py上添加以下三行代码

# freeze backbone
    for k, v in trainer.model.state_dict().items():
        if k.split(".")[0] == "backbone":
            v.stop_gradient = True

图片是这样的:

 

 然后改过以后我的lr就变成了5(3050的显卡)lr按照公式设置为0.00078125,训练100个epoch感觉还不错。尽管score低,但是还挺准

模型导出:

python tools/export_model.py -c configs/smalldet/ppyoloe_crn_l_80e_sliced_visdrone_640_025.yml -o weights=output\ppyoloe_crn_l_80e_sliced_visdrone_640_025\model_final.pdparams

使用导出的模型进行推理

python deploy/python/infer.py --model_dir=output_inference\ppyoloe_crn_l_80e_sliced_visdrone_640_025 --image_file=D:\env\data\JPEGImages\0.jpg  --output_dir=output   --threshold=0.27  --slice_infer --slice_size 640 640 --overlap_ratio 0.25 0.25 --combine_method=nms --match_threshold=0.6 --match_metric=iou

模型评估以及识别代码:

 

 

4.pp-yolo-r旋转框

教程:  辅助

1)安装paddleDetection的一些依赖,首先你要有vistual studio 2017及以上的c++环境,然后通过下列方式安装ppdet的一些依赖,据说是个算子

cd ppdet/ext_op
python setup.py install

检查刚刚的安装是否成功

python ppdet/ext_op/unittest/test_matched_rbox_iou.py

不出意外是成功的,

2)安装旋转框的标注工具

去git的项目上拷贝源码:https://github.com/cgvict/roLabelImg,然后想办法安装

pip install lxml
pip install PyQt5    #虽然官方说依赖pyqt4,而qt5和qt4本质上是不同的东西,但是在csdn上看到有大佬用qt5也成功了,而我的python3.8根部装不上qt4,所以也用qt5

#下载好的labelImg-master文件夹内部D:\env\paddledetection\ppyoloe_r\fuzhu\roLabelImg-master,运行
pyrcc5 -o resources.py resources.qrc
#然后启动命令如下:出现操作页面就表示成功了
python roLabelImg.py

装好了以后待用,这个先放着,先用官方给的数据走一遍,再来自定义数据。 

3)准备数据dota遥感数据集,以及切图等

数据下载请访问:链接,下载的时候需要注意,2.0版本对于1.0版本的数据有依赖,所以需要整合才能搞出来一套数据,拿到的数据基本是这样的

 

然后根据教程做一下图片切分,2.0版本的数据我切分的时候报错了,所以最后使用的是1.0版本的数据。数据切分加转coco

python configs/rotate/tools/prepare_data.py  --input_dirs D:\env\data\DOTA-v1.0/train/ D:\env\data\DOTA-v1.0/val/   --output_dir D:\env\paddledetection\PaddleDetection\dataset\dota_sliced/    --coco_json_file DOTA_trainval1024.json --subsize 1024   --gap 200    --rates 1.0

切分以后得到的数据:

 

然后数据储存位置对着yaml文件调整以后进行了一定的调整(如果不调整数据,就要去改yaml配置)

4)启动训练

python tools/train.py -c configs/rotate/ppyoloe_r/ppyoloe_r_crn_l_3x_dota.yml -o LearningRate.base_lr=0.002
#注意,lr和batch size等是根据公式修改过的哦

5)初步看一下计算效果

python tools/infer.py -c configs\rotate\ppyoloe_r\ppyoloe_r_crn_l_3x_dota.yml   --infer_img=dataset\dota\test1024\images/P0012__1.0__824___0.png  --output_dir=output  --draw_threshold=0.3 -o weights=output\ppyoloe_r_crn_l_3x_dota\model_final --use_vdl=True

 

这样的效果确实还行,所以暂时不评估了哈,本意是搞自己的数据集。

 

标签:paddleDection,640,--,Average,py,python,使用,安装,IoU
From: https://www.cnblogs.com/0-lingdu/p/16921596.html

相关文章

  • 不使用构建工具的vue组件书写方式
    将vue组件转换为普通的js文件(IIFE)先写个简单的,使用ESM方式组织的componentexportdefault{data(){return{count:0}},template:`<button@click="count++">Youclickedme{{count}}times.</button>`}我们把这个组件保存为mycomponent.js这个组件......
  • 首次使用服务器需要注意什么
    在如今互联网快速发展的时候服务器被越来越多的人了解并使用,那么很多新手朋友在初次使用服务器的时候我们需要注意哪些呢。下面就跟大家聊聊。1.首先我们在用服务器的时候一定要选择正规的服务商去购买,这样可以规避很多风险和不必要的麻烦。当我们服务器拿到手第一时间先更改admini......
  • nflog 使用
      xx产品有个功能是对任何端口的访问都会被记录。它的实现原理是iptables的NFLOGNFLOG是什么它是一个target,就像ACCEPT、DROP等可以作为iptables-j后的参数值iptables-AINPUT-ptcp-mtcp--dport80-jNFLOG--nflog-group40--nflog-prefixTCPDUMP-PCAP-INtcpdump-in......
  • iptables使用示例
    iptable的各种targetiptables的结构:iptables由上而下,由Tables,Chains,Rules组成。一、iptables的表tables与链chainsiptables有Filter,NAT,Mangle,Raw四种内建表:1.Filter表Filter是iptables的默认表,它有以下三种内建链(chains):INPUT链 –处理来自外部的数据。OUTPUT链 –处理......
  • React Router的使用方法和功能
    ReactRouter是一个用于处理路由的库,为React应用程序提供了路由管理功能,使得构建单页面应用(SPA)的导航变得更加简单和灵活。下面是ReactRouter的一些常见使用方法和功能:安装ReactRouter:使用npm或yarn安装ReactRouter。在项目根目录下运行以下命令:npminstallreact-router-dom或......
  • 移动端H5使用pdf.js预览
    1.下载pdf.js文件GettingStarted(mozilla.github.io) 2.将下载的文件放进uniapp项目中 3.创建预览页面 代码:<template>   <view>      <web-view:src="allUrl"></web-view>   </view></template><script>   importrequestfro......
  • CentOS7安装Nginx并添加成服务【转】
    当我们使用Nginx作为Web服务器时,将其添加为系统服务可以更方便地管理它的启动和停止。下面是CentOS7将Nginx添加系统服务的方法步骤:创建nginx服务配置文件首先,创建一个nginx服务配置文件,并将以下内容复制到文件中:[Unit]Description=TheNGINXHTTPandreverseprox......
  • 实用小脚本——Windows系统使用dos命令删除文件
    @echooff&color0aset/pff=输入文件名:title查找%ff%echo.&set/p=正在查找<nulfor%%iin(cdefgh)do(ifexist%%i:\ (cd/d%%i:\set/p=%%i:<nulfor/f "delims="%%jin('dir/b/a-d/s"%ff%"2^>nul')do(echo.&......
  • Kubernetes 中使用consul-template渲染配置
    Kubernetes中使用consul-template渲染配置当前公司使用consul来实现服务发现,如Prometheue配置中的target和alertmanager注册都采用了consul服务发现的方式,以此来灵活应对服务的变更。但对于其他服务,是否也有一个通用的方式来使用consul管理配置文件?本文中描述如何使用consul-tem......
  • 在Windows和Linux终端下使用代理的方式
    背景在快乐上网的时候,网页会经过代理,但是有些在终端运行的程序不一定会经过代理,比如用gitclonegithub仓库的时候,或者curl下载githubrelease的时候,如果不走代理,下载可能会很慢很慢。Windows在执行gitclone前,在终端执行sethttps_proxy=localhost:7890sethttp_proxy=loca......