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