paddle学习

1. paddlepaddle安装

1.1 paddle_env 搭建与测试

conda create -n paddle_env python=3.9 -y

conda activate paddle_env

# 如果不能运行, 那就把 https 改为 http
# conda install paddlepaddle-gpu==2.2.2 cudatoolkit=10.2
conda install paddlepaddle-gpu==2.2.2 cudatoolkit=10.2 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -y


python -c 'import paddle; paddle.utils.run_check()'
python -c "import paddle; print(paddle.__version__)"

1.2 PaddleDetection 测试

# https://github.com/PaddlePaddle/PaddleDetection.git
git clone https://github.do/https://github.com/PaddlePaddle/PaddleDetection.git
python dataset/voc/download_voc.py

cd PaddleDetection
python setup.py install
python ppdet/modeling/tests/test_architectures.py  # 输出 OK

# 预测一张图片
export CUDA_VISIBLE_DEVICES=0
python tools/infer.py -c configs/ppyolo/ppyolo_r50vd_dcn_1x_coco.yml -o use_gpu=true weights=https://paddledet.bj.bcebos.com/models/ppyolo_r50vd_dcn_1x_coco.pdparams --infer_img=demo/000000014439.jpg  # output 文件夹下会保存预测的图片

2. 数据集准备

python dataset/voc/download_voc.py  # 我下载了然后代码中有 bug, 然后我就重新调整了代码. 修复过程如下:
"""
note: 通过 ariac2 下载的会提示 md5sum 不符合, 不知道是不是我的问题; 我是通过aistudio保存并下载的, 放置到了硬盘<扬帆起航: /LY/datasets/voc>
1. 首先下载数据集: https://aistudio.baidu.com/aistudio/datasetdetail/9837
2. 将3个压缩包放入: {PaddleDetection}/dataset/voc/
3. 修改代码:  vim {anaconda3/envs/paddle_env}/lib/python3.9/site-packages/paddledet-2.3.0-py3.9.egg/ppdet/utils/download.py  的 395行附近, 在下面添加 `return fullname`
4. 运行 `python dataset/voc/download_voc.py `
"""

上述的数据集比较大, 因此我选择其中一个小的;

python dataset/roadsign_voc/download_roadsign_voc.py

下载完之后数据集格式为:

  ├── download_roadsign_voc.py
  ├── annotations
  │   ├── road0.xml
  │   ├── road1.xml
  │   |   ...
  ├── images
  │   ├── road0.png
  │   ├── road1.png
  │   |   ...
  ├── label_list.txt
  ├── train.txt
  ├── valid.txt

3. 配置文件解释与修改指南

configs/yolov3/yolov3_mobilenet_v1_roadsign.yml

文件内容如下:

_BASE_: [
  '../datasets/roadsign_voc.yml',  # 主要说明了训练数据和验证数据的路径
  '../runtime.yml',  # 主要说明了公共的运行参数,比如说是否使用GPU、每多少个epoch存储checkpoint等
  '_base_/optimizer_40e.yml',  # 主要说明了学习率和优化器的配置。
  '_base_/yolov3_mobilenet_v1.yml',  # 主要说明模型、和主干网络的情况。
  '_base_/yolov3_reader.yml',  # 主要说明数据读取器配置,如batch size,并发加载子进程数等,同时包含读取后预处理操作,如resize、数据增强等等
]
pretrain_weights: https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_270e_coco.pdparams
weights: output/yolov3_mobilenet_v1_roadsign/model_final

YOLOv3Loss:
  ignore_thresh: 0.7
  label_smooth: true

4. 训练

export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令. 
python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml
# 如果是多卡, 则为: 
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 #windows和Mac下不需要执行该命令
python -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml
# 如果做微调(形状不匹配的参数将自动忽略):
export CUDA_VISIBLE_DEVICES=0
  # 如果模型中参数形状与加载权重形状不同,将不会加载这类参数
python -m paddle.distributed.launch --gpus 0 tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml -o pretrain_weights=output/model_final
# 模型恢复训练, 参数  -r
export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml -r output/faster_rcnn_r50_1x_coco/10000

5. 评估

# paddle 线上模型(如果是自己训练的 `weights` 则位于: output 文件夹)
export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
python tools/eval.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml -o weights=https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_roadsign.pdparams
# 评估自己训练的了模型
export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
python tools/eval.py -c  configs/yolov3/yolov3_mobilenet_v1_roadsign.yml -o weights=output/yolov3_mobilenet_v1_roadsign/model_final.pdparams
# 边训练, 边评估, 参数:  --eval
export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
python -m paddle.distributed.launch --gpus 0 tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml --eval

# 在训练中交替执行评估, 评估在每个epoch训练结束后开始。每次评估后还会评出最佳mAP模型保存到best_model文件夹下。
# 如果验证集很大,测试将会比较耗时,建议调整configs/runtime.yml 文件中的 snapshot_epoch配置以减少评估次数,或训练完成后再进行评估。
# 通过 json文件 评估(#TODO: 有问题)
export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
# 下面的指令中没有加载模型的选项,则使用配置文件中weights的默认配置
# json文件必须命名为bbox.json或者mask.json,放在evaluation目录下。
python tools/eval.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml \
             --json_eval \
             -output_eval evaluation/

6. 预测

python tools/infer.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml --infer_img=demo/000000570688.jpg -o weights=https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_roadsign.pdparams
# 设置参数预测
export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
python tools/infer.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml \
                    --infer_img=demo/road554.png \
                    --output_dir=infer_output/ \
                    --draw_threshold=0.5 \  # 可选参数,
                    -o weights=output/yolov3_mobilenet_v1_roadsign/model_final \
                    --use_vdl=Ture
                    
                    # keep_top_k表示设置输出目标的最大数量,默认值为100,用户可以根据自己的实际情况进行设定。

7. 训练可视化

  1. loss 变化趋势
  2. mAP变化趋势
export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
# 训练过程中需要添加的参数  --use_vdl=true    --vdl_log_dir=vdl_dir/scalar 
python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml \
                        --use_vdl=true \
                        --vdl_log_dir=vdl_dir/scalar \
# 然后启动 VisualDL 查看日志
# 下述命令会在127.0.0.1上启动一个服务,支持通过前端web页面查看,可以通过--host这个参数指定实际ip地址
visualdl --logdir vdl_dir/scalar/

note: 更详尽的参数列表(https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.4/docs/tutorials/GETTING_STARTED_cn.md):

FLAG 支持脚本 用途 默认值 备注
-c ALL 指定配置文件 None 必选,例如-c configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.yml
-o ALL 设置或更改配置文件里的参数内容 None 相较于-c设置的配置文件有更高优先级,例如:-o use_gpu=False
–eval train 是否边训练边测试 False 如需指定,直接--eval即可
-r/–resume_checkpoint train 恢复训练加载的权重路径 None 例如:-r output/faster_rcnn_r50_1x_coco/10000
–slim_config ALL 模型压缩策略配置文件 None 例如--slim_config configs/slim/prune/yolov3_prune_l1_norm.yml
–use_vdl train/infer 是否使用VisualDL记录数据,进而在VisualDL面板中显示 False VisualDL需Python>=3.5
–vdl_log_dir train/infer 指定 VisualDL 记录数据的存储路径 train:vdl_log_dir/scalar infer: vdl_log_dir/image VisualDL需Python>=3.5
–output_eval eval 评估阶段保存json路径 None 例如 --output_eval=eval_output, 默认为当前路径
–json_eval eval 是否通过已存在的bbox.json或者mask.json进行评估 False 如需指定,直接--json_eval即可, json文件路径在--output_eval中设置
–classwise eval 是否评估单类AP和绘制单类PR曲线 False 如需指定,直接--classwise即可
–output_dir infer/export_model 预测后结果或导出模型保存路径 ./output 例如--output_dir=output
–draw_threshold infer 可视化时分数阈值 0.5 例如--draw_threshold=0.7
–infer_dir infer 用于预测的图片文件夹路径 None --infer_img--infer_dir必须至少设置一个
–infer_img infer 用于预测的图片路径 None --infer_img--infer_dir必须至少设置一个,infer_img具有更高优先级
–save_txt infer 是否在文件夹下将图片的预测结果保存到文本文件中 False 可选

8. 模型导出

在模型训练过程中保存的模型文件是包含前向预测和反向传播的过程,在实际的工业部署则不需要反向传播,因此需要将模型进行导成部署需要的模型格式。 在PaddleDetection中提供了 tools/export_model.py脚本来导出模型(https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.4/deploy/EXPORT_MODEL.md)

python tools/export_model.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml --output_dir=./inference_model  -o weights=output/yolov3_mobilenet_v1_roadsign/best_model

预测模型会导出到inference_model/yolov3_mobilenet_v1_roadsign目录下,分别为infer_cfg.yml, model.pdiparams, model.pdiparams.info,model.pdmodel 如果不指定文件夹,模型则会导出在output_inference

9. 模型压缩

文档: https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.4/configs/slim/README.md

pip install paddleslim -i https://pypi.tuna.tsinghua.edu.cn/simple

10. 预测部署

文档: https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.4/deploy/python.md

python deploy/python/infer.py --model_dir=./output_inference/yolov3_mobilenet_v1_roadsign --image_file=demo/road554.png --device=GPU

reference

@online{PaddlePaddle2022Mar,
author = {PaddlePaddle},
title = {{PaddleDetection}},
organization = {GitHub},
year = {2022},
month = {3},
date = {2022-03-30},
urldate = {2022-03-30},
language = {english},
hyphenation = {english},
note = {[Online; accessed 30. Mar. 2022]},
url = {https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.4/docs/tutorials/GETTING_STARTED_cn.md},
abstract = {{Object Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection. - PaddleDetection/GETTING_STARTED_cn.md at release/2.4 · PaddlePaddle/PaddleDetection}}
}

你可能感兴趣的:(分类,机器学习,python)