PaddleDetection目标检测套件

这是我参与8月更文挑战的第9天

软硬件环境

  • ubuntu 18.04 64bit
  • nvidia 1070Ti
  • anaconda with python 3.7
  • cuda 10.1
  • cudnn 7.6
  • paddlepaddle 1.8.4
  • paddledetection 0.5

简介

引用官方的项目介绍

PaddleDetection飞桨目标检测开发套件,旨在帮助开发者更快更好地完成检测模型的组建、训练、优化及部署等全开发流程。PaddleDetection模块化地实现了多种主流目标检测算法,提供了丰富的数据增强策略、网络模块组件(如骨干网络)、损失函数等,并集成了模型压缩和跨平台高性能部署能力。经过长时间产业实践打磨,PaddleDetection已拥有顺畅、卓越的使用体验,被工业质检、遥感图像检测、无人巡检、新零售、互联网、科研等十多个行业的开发者广泛应用。

总结成一句话就是非常牛逼!

再来看看套件结构概览

Architectures Backbones Components Data Augmentation
  • Two-Stage Detection
    • Faster RCNN
    • FPN
    • Cascade-RCNN
    • Libra RCNN
    • Hybrid Task RCNN
    • PSS-Det RCNN
  • One-Stage Detection
    • RetinaNet
    • YOLOv3
    • YOLOv4
    • PP-YOLO
    • SSD
  • Anchor Free
    • CornerNet-Squeeze
    • FCOS
    • TTFNet
  • Instance Segmentation
    • Mask RCNN
    • SOLOv2
  • Face-Detction
    • FaceBoxes
    • BlazeFace
    • BlazeFace-NAS
  • ResNet(&vd)
  • ResNeXt(&vd)
  • SENet
  • Res2Net
  • HRNet
  • Hourglass
  • CBNet
  • GCNet
  • DarkNet
  • CSPDarkNet
  • VGG
  • MobileNetv1/v3
  • GhostNet
  • Efficientnet
  • Common
    • Sync-BN
    • Group Norm
    • DCNv2
    • Non-local
  • FPN
    • BiFPN
    • BFP
    • HRFPN
    • ACFPN
  • Loss
    • Smooth-L1
    • GIoU/DIoU/CIoU
    • IoUAware
  • Post-processing
    • SoftNMS
    • MatrixNMS
  • Speed
    • FP16 training
    • Multi-machine training
  • Resize
  • Flipping
  • Expand
  • Crop
  • Color Distort
  • Random Erasing
  • Mixup
  • Cutmix
  • Grid Mask
  • Auto Augment

眼睛都看花了,支持的也太xx全面了。除了功能,再来看看性能

各模型结构和骨干网络的代表模型在COCO数据集上精度mAP和单卡Tesla V100上预测速度(FPS)对比图

paddledetection

图中模型均可在模型库中获取,地址是 github.com/PaddlePaddl…

安装PaddlePaddle

飞桨(PaddlePaddle)是百度研发的中国首个开源开放、技术领先、功能完备的产业级深度学习平台,集深度学习核心训练和推理框架、基础模型库、端到端开发套件和丰富的工具组件于一体。

首先创建python的虚拟环境,然后安装paddlepaddle-gpu

conda create -n ppdetection python=3.7
conda activate ppdetection
pip install paddlepaddle-gpu==1.8.4.post107 -i https://mirror.baidu.com/pypi/simple
复制代码

如果需要使用到多gpu的话,还要安装nvidiaNCCL框架,它是用来进行多卡通讯的,下载地址是 developer.nvidia.com/nccl/nccl-d…,选择匹配CUDA版本的下载

使用以下命令进行验证

(ppdetection) xugaoxiang@1070Ti:~/Works/github/PaddleDetection-release-0.5$ ipython
Python 3.7.9 (default, Aug 31 2020, 12:42:55)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import paddle.fluid as fluid

In [2]: fluid.install_check.run_check()
Running Verify Fluid Program ...
W1208 13:28:59.964426 13251 device_context.cc:252] Please NOTE: device: 0, CUDA Capability: 61, Driver API Version: 11.0, Runtime API Version: 10.0
W1208 13:29:00.090900 13251 device_context.cc:260] device: 0, cuDNN Version: 7.6.
Your Paddle Fluid works well on SINGLE GPU or CPU.
Your Paddle Fluid works well on MUTIPLE GPU or CPU.
Your Paddle Fluid is installed successfully! Let's start deep Learning with Paddle Fluid now

In [3]: import paddle

In [4]: paddle.__version__
Out[4]: '1.8.4'

In [5]:

复制代码

安装其它依赖

pip install pycocotools
复制代码

安装PaddleDetection

目前最新的版本是0.5,下载后进入目录安装必要的依赖

wget https://github.com/PaddlePaddle/PaddleDetection/archive/release/0.5.zip
unzip PaddleDetection-release-0.5.zip
cd PaddleDetection-release-0.5
pip install -r requirements.txt
复制代码

确认下面测试通过

(ppdetection) xugaoxiang@1070Ti:~/Works/github/PaddleDetection-release-0.5$ python ppdet/modeling/tests/test_architectures.py
ss/home/xugaoxiang/Works/github/PaddleDetection-release-0.5/ppdet/core/workspace.py:118: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working 
 isinstance(merge_dct[k], collections.Mapping)):
..........
----------------------------------------------------------------------
Ran 12 tests in 2.866s

OK (skipped=2)
复制代码

使用官方提供的预训练模型预测图片,快速体验模型预测效果

# 通过use_gpu参数设置是否使用GPU
python tools/infer.py -c configs/ppyolo/ppyolo.yml -o use_gpu=true weights=https://paddlemodels.bj.bcebos.com/object_detection/ppyolo.pdparams --infer_img=demo/000000014439.jpg
复制代码

程序运行结束后,会在output文件夹下生成一个画有预测结果的同名图像

paddledetection

paddledetection

paddledetection

模型训练

这里以paddledetection自带的苹果、香蕉和桔子数据集为例,官方代码中提供了下载脚本及配置文件

cd dataset/fruit

# 下载数据集,vod格式
python download_fruit.py
复制代码

这个水果数据集是采用的VOC格式,下载完成后,目录结构是这样的

paddledetection

接下来就可以开始训练了,这里使用YOLOv3作为训练模型,backbonemobilenet_v1

python tools/train.py -c configs/yolov3_mobilenet_v1_fruit.yml --eval
复制代码

其中-c指定训练配置文件,--eval表示边训练边测试,配置文件中的参数解释可以参考 github.com/PaddlePaddl…,非常的详细

paddledetection

通过visualdl命令可以实时查看变化曲线

# 设置visualdl参数
python tools/train.py -c configs/yolov3_mobilenet_v1_roadsign.yml --eval -o use_gpu=true --use_vdl=True --vdl_log_dir=vdl_dir/scalar

# 打开visualdl
visualdl --logdir vdl_dir/scalar/ --host <host_IP> --port <port_num>
复制代码

paddledetection

训练好的模型存放在output/yolov3_mobilenet_v1_fruit

paddledetection

使用训练好的模型进行预测

# 使用参数--infer_dir来预测图片文件夹
python tools/infer.py -c configs/yolov3_mobilenet_v1_fruit.yml -o weights=output/yolov3_mobilenet_v1_fruit/best_model.pdmodel --infer_img=demo/orange_71.jpg --output_dir=output
复制代码

paddledetection

paddledetection

部署

使用PaddleServing部署方式,首先安装依赖包paddle-serving-clientpaddle-serving-server-gpu

pip install paddle-serving-client -i https://mirror.baidu.com/pypi/simple
pip install paddle-serving-server-gpu -i https://mirror.baidu.com/pypi/simple
复制代码

导出模块

python tools/export_serving_model.py -c configs/yolov3_mobilenet_v1_fruit.yml -o use_gpu=true weights=output/yolov3_mobilenet_v1_fruit/best_model.pdmodel --output_dir=./inference_model
复制代码

以上命令会在./inference_model文件夹下生成一个yolov3_mobilenet_v1_fruit文件夹,目录结构是这样的

inference_model
│   ├── yolov3_mobilenet_v1_fruit
│   │   ├── infer_cfg.yml
│   │   ├── serving_client
│   │   │   ├── serving_client_conf.prototxt
│   │   │   ├── serving_client_conf.stream.prototxt
│   │   ├── serving_server
│   │   │   ├── conv1_bn_mean
│   │   │   ├── conv1_bn_offset
│   │   │   ├── conv1_bn_scale
│   │   │   ├── ...
复制代码

serving_client文件夹下serving_client_conf.prototxt详细说明了模型输入输出信息,serving_client_conf.prototxt文件内容为:

feed_var {
  name: "image"
  alias_name: "image"
  is_lod_tensor: false
  feed_type: 1
  shape: 3
  shape: 608
  shape: 608
}
feed_var {
  name: "im_size"
  alias_name: "im_size"
  is_lod_tensor: false
  feed_type: 2
  shape: 2
}
fetch_var {
  name: "multiclass_nms_0.tmp_0"
  alias_name: "multiclass_nms_0.tmp_0"
  is_lod_tensor: true
  fetch_type: 1
  shape: -1
}

复制代码

接下来启动PaddleServing服务,需要一直开着

cd inference_model/yolov3_mobilenet_v1_fruit
python -m paddle_serving_server_gpu.serve --model serving_server --port 9393 --gpu_ids 0
复制代码

准备label_list.txt文件

cd inference_model/yolov3_mobilenet_v1_fruit

# 将水果数据集对应的label_list.txt文件拷贝到当前文件夹下
cp ../../dataset/fruit/label_list.txt .
复制代码

开始测试

# 进入目录
cd inference_model/yolov3_mobilenet_v1_fruit/

# 测试代码 test_client.py
python ../../deploy/serving/test_client.py ../../demo/orange_71.png
复制代码

参考资料

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享