PaddleDetection 快速上手

本项目以路标数据集roadsign为例,详细说明了如何使用PaddleDetection训练一个目标检测模型,并对模型进行评估和预测。

本项目提供voc格式的roadsign数据集和coco格式的roadsign数据集。

本项目提供 YOLOv3、FasterRCNN、FCOS这几个算法的配置文件。

您可以选择其中一个配置开始训练,快速体验PaddleDeteciton。

效果请戳这里:

PaddleDetection

欢迎到PaddleDetection主页查看更快更好的模型。

您也可以扫下面的二维码访问PaddleDetection github主页,欢迎关注和点赞_

环境安装

1. AiStudio环境设置

# 查看当前挂载的数据集目录, 该目录下的变更重启环境后会自动还原
# View dataset directory. This directory will be recovered automatically after resetting environment.
!ls /home/aistudio/data
# 查看工作区文件, 该目录下的变更将会持久保存. 请及时清理不必要的文件, 避免加载过慢.
# View personal work directory. All changes under this directory will be kept even after reset. Please clean unnecessary files in time to speed up environment loading.
!ls /home/aistudio/work
# 如果需要进行持久化安装, 需要使用持久化路径, 如下方代码示例:
# If a persistence installation is required, you need to use the persistence path as the following:
!mkdir /home/aistudio/external-libraries
!pip install beautifulsoup4 -t /home/aistudio/external-libraries
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可:
# Also add the following code, so that every time the environment (kernel) starts, just run the following code:
import sys
sys.path.append('/home/aistudio/external-libraries')

2. 安装Paddle

AIStudio上已经安装好paddlepaddle 1.8.4。

import paddle
print(paddle.__version__)

3. 克隆PaddleDetection

通过以下命令克隆最新的PaddleDetection代码库。

! git clone https://github.com/PaddlePaddle/PaddleDetection

如果因为网络问题clone较慢,可以:

  1. 通过github加速通道clone

git clone https://hub.fastgit.org/PaddlePaddle/PaddleDetection.git

  1. 选择使用码云上的托管

git clone https://gitee.com/paddlepaddle/PaddleDetection

注:码云托管代码可能无法实时同步本github项目更新,存在3~5天延时,请优先从github上克隆。

  1. 使用本项目提供的代码库,存放路径work/PaddleDetection.zip

这里采用项目提供的代码库

! ls ~/work/PaddleDetection.zip
%cd ~/work/
! unzip -o PaddleDetection.zip

4. PaddleDetection依赖安装及设置

通过如下方式安装PaddleDetection依赖,并设置环境变量

安装 cocoapi

如果因为网络问题clone较慢,可以:

  1. 通过github加速通道clone

pip install "git+https://hub.fastgit.org/cocodataset/cocoapi.git#subdirectory=PythonAPI"

# github
#! pip install "git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI" # fast github
# ! pip install "git+https://hub.fastgit.org/cocodataset/cocoapi.git#subdirectory=PythonAPI" #
! pip install pycocotools

设置环境

%cd ~/work/PaddleDetection/
!pip install -r requirements.txt %env PYTHONPATH=.:$PYTHONPATH
%env CUDA_VISIBLE_DEVICES=0

验证安装

! python ppdet/modeling/tests/test_architectures.py

准备数据

本项目使用road-sign-detection 比赛数据,检测4种路标:

  • speedlimit
  • crosswalk
  • trafficlight
  • stop

划分成训练集和测试集,总共877张图,其中训练集701张图、测试集176张图。

本项目提供voc格式和coco格式的数据:

  1. voc格式:

    划分好的数据下载地址为: roadsign_voc.tar

    AiStudio上数据地址:roadsign_voc

  2. coco格式:

    划分好的数据下载地址为::roadsign_coco.tar

    AiStudio上数据地址:roadsign_coco

~/data/文件夹下的数据解压到PaddleDetection/dataset/文件夹下。

%cd ~/work/PaddleDetection/dataset/
! pwd
! ls ~/data -l

1. voc格式数介绍

VOC数据格式的目标检测数据,是指每个图像文件对应一个同名的xml文件,xml文件中标记物体框的坐标和类别等信息。

Pascal VOC比赛对目标检测任务,对目标物体是否遮挡、是否被截断、是否是难检测物体进行了标注。对于用户自定义数据可根据实际情况对这些字段进行标注。

xml文件中包含以下字段:

  • filename,表示图像名称。
<filename>road650.png</filename>
  • size,表示图像尺寸。包括:图像宽度、图像高度、图像深度
<size>
<width>300</width>
<height>400</height>
<depth>3</depth>
</size>
  • object字段,表示每个物体。包括

    • name: 目标物体类别名称
    • pose: 关于目标物体姿态描述(非必须字段)
    • truncated: 目标物体目标因为各种原因被截断(非必须字段)
    • occluded: 目标物体是否被遮挡(非必须字段)
    • difficult: 目标物体是否是很难识别(非必须字段)
    • bndbox: 物体位置坐标,用左上角坐标和右下角坐标表示:xminyminxmaxymax

~/data/data49531/roadsign_voc.tar解压到PaddleDetection/dataset/roadsign_voc

%cd ~/work/PaddleDetection/dataset/roadsign_voc/
! pwd
# copy roadsign_voc.tar and extract
! cp ~/data/data49531/roadsign_voc.tar .
! tar -xvf roadsign_voc.tar
! rm -rf roadsign_voc.tar
# 查看一条数据
! cat ./annotations/road650.xml

2. coco格式数介绍

coco数据格式,是指将所有训练图像的标注都存放到一个json文件中。数据以字典嵌套的形式存放。

json文件中存放了 info licenses images annotations categories的信息:

  • info中存放标注文件标注时间、版本等信息。
  • licenses中存放数据许可信息。
  • images中存放一个list,存放所有图像的图像名,下载地址,图像宽度,图像高度,图像在数据集中的id等信息。
  • annotations中存放一个list,存放所有图像的所有物体区域的标注信息,每个目标物体标注以下信息:
    {
'area': 899,
'iscrowd': 0,
'image_id': 839,
'bbox': [114, 126, 31, 29],
'category_id': 0, 'id': 1,
'ignore': 0,
'segmentation': []
}

~/data/data49531/roadsign_coco.tar解压到PaddleDetection/dataset/roadsign_coco

%cd ~/work/PaddleDetection/dataset/
! mkdir roadsign_coco
%cd ~/work/PaddleDetection/dataset/roadsign_coco/
! pwd
# copy roadsign_coco.tar and extract
! cp ~/data/data52968/roadsign_coco.tar .
! tar -xvf roadsign_coco.tar
! rm -rf roadsign_coco.tar
# 查看一条数据
import json
coco_anno = json.load(open('./annotations/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])

开始训练

本项目在work/hw_configs/目录下提供以下配置文件

  • yolov3_mobilenet_v1_roadsign_voc_template.yml
  • yolov3_mobilenet_v1_roadsign_coco_template.yml
  • ppyolo_resnet50_vd_roadsign_coco_template.yml
  • faster_rcnn_r50_roadsign_coco_template.yml
  • faster_rcnn_r50_vd_fpn_roadsign_coco_template.yml
  • fcos_r50_roadsign_coco_template.yml

~/work/hw_configs.zip解压到 configs 文件夹下

%cd ~/work/PaddleDetection/

!unzip -o ~/work/hw_configs.zip -d configs/

! ls configs/hw_configs/
# 选择配置开始训练。可以通过 -o 选项覆盖配置文件中的参数

# faster_rcnn_r50_vd_fpn
! python -u tools/train.py -c configs/hw_configs/faster_rcnn_r50_vd_fpn_roadsign_coco_template.yml -o use_gpu=True --eval # yolov3
#! python -u tools/train.py -c configs/hw_configs/yolov3_mobilenet_v1_roadsign_voc_template.yml -o use_gpu=True --eval # fcos
#! python -u tools/train.py -c configs/hw_configs/fcos_r50_roadsign_coco_template.yml -o use_gpu=True --eval

您可以通过指定visualDL可视化工具,对loss变化曲线可视化。您仅需要指定 use_vdl 参数和 vdl_log_dir 参加即可。

点击左侧 可视化 按钮,设置 logdir 和模型文件,就可以对训练过程loss变化曲线和模型进行可视化。

# 选择配置开始训练。可以通过 -o 选项覆盖配置文件中的参数 vdl_log_dir 设置vdl日志文件保存路径

# faster_rcnn_r50_vd_fpn
! python -u tools/train.py -c configs/hw_configs/faster_rcnn_r50_vd_fpn_roadsign_coco_template.yml -o use_gpu=True --use_vdl=True --vdl_log_dir=vdl_dir/scalar --eval # yolov3
#! python -u tools/train.py -c configs/hw_configs/yolov3_mobilenet_v1_roadsign_voc_template.yml -o use_gpu=True --use_vdl=True --vdl_log_dir=vdl_dir/scalar --eval # fcos
#! python -u tools/train.py -c configs/hw_configs/fcos_r50_roadsign_coco_template.yml -o use_gpu=True --use_vdl=True --vdl_log_dir=vdl_dir/scalar --eval

评估和预测

PaddleDetection也提供了tools/eval.py脚本用于评估模型,评估是可以通过-o weights=指定待评估权重。

PaddleDetection训练过程中若开始了--eval,会将所有checkpoint中评估结果最好的checkpoint保存为best_model.pdparams,可以通过如下命令一键式评估最优checkpoint

这里我们加载预训练好的权重进行预测:

  • https://paddlemodels.bj.bcebos.com/object_detection/yolov3_best_model_roadsign.pdparams
  • https://paddlemodels.bj.bcebos.com/object_detection/faster_r50_fpn_best_model_roadsign.pdparams
  • https://paddlemodels.bj.bcebos.com/object_detection/fcos_best_model_roadsign.pdparams
# 评估

# faster_rcnn_r50_vd_fpn
! python -u tools/eval.py -c configs/hw_configs/faster_rcnn_r50_vd_fpn_roadsign_coco_template.yml -o use_gpu=True weights=https://paddlemodels.bj.bcebos.com/object_detection/faster_r50_fpn_best_model_roadsign.pdparams # yolov3
#! python -u tools/eval.py -c configs/hw_configs/yolov3_mobilenet_v1_roadsign_coco_template.yml -o use_gpu=True weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_best_model_roadsign.pdparams # fcos
#! python -u tools/eval.py -c configs/hw_configs/fcos_r50_roadsign_coco_template.yml -o use_gpu=True weights=https://paddlemodels.bj.bcebos.com/object_detection/fcos_best_model_roadsign.pdparams

PaddleDetection提供了tools/infer.py预测工具,可以使用训练好的模型预测图像并可视化,通过-o weights=指定加载训练过程中保存的权重。

预测脚本如下:

img_path = './dataset/roadsign_voc/images/road554.png'

# faster_rcnn_r50_vd_fpn
! python tools/infer.py -c configs/hw_configs/faster_rcnn_r50_vd_fpn_roadsign_coco_template.yml -o use_gpu=True weights=https://paddlemodels.bj.bcebos.com/object_detection/faster_r50_fpn_best_model_roadsign.pdparams --infer_img=dataset/roadsign_voc/images/road554.png # yolov3
#! python tools/infer.py -c configs/hw_configs/yolov3_mobilenet_v1_roadsign_voc_template.yml -o use_gpu=True weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_best_model_roadsign.pdparams --infer_img=dataset/roadsign_voc/images/road554.png # fcos
#! python tools/infer.py -c configs/hw_configs/fcos_r50_roadsign_coco_template.yml -o use_gpu=True weights=https://paddlemodels.bj.bcebos.com/object_detection/fcos_best_model_roadsign.pdparams --infer_img=dataset/roadsign_voc/images/road554.png
%matplotlib inline
import matplotlib.pyplot as plt
import cv2 infer_img = cv2.imread("output/road554.png")
plt.figure(figsize=(15,10))
plt.imshow(cv2.cvtColor(infer_img, cv2.COLOR_BGR2RGB))
plt.show()

模型压缩

如果您要对模型进行压缩,PaddleDetection中模型压缩部分提供以下模型压缩方式:

模型部署

如果您要部署模型,请参考模型部署部分提供以下部署方式:

PaddleDetection 快速上手的更多相关文章

  1. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

  2. 快速上手Unity原生Json库

    现在新版的Unity(印象中是从5.3开始)已经提供了原生的Json库,以前一直使用LitJson,研究了一下Unity用的JsonUtility工具类的使用,发现使用还挺方便的,所以打算把项目中的J ...

  3. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen快速上手

    原文链接:Hello, Android Multiscreen Quickstart. 译文链接:Hello,Android Multiscreen快速上手 本部分介绍利用Xamarin.Androi ...

  4. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

  5. 快速上手seajs——简单易用Seajs

    快速上手seajs——简单易用Seajs   原文  http://www.cnblogs.com/xjchenhao/p/4021775.html 主题 SeaJS 简易手册 http://yslo ...

  6. Git版本控制Windows版快速上手

    说到版本控制,之前用过VSS,SVN,Git接触不久,感觉用着还行.写篇博文给大家分享一下使用Git的小经验,让大家对Git快速上手. 说白了Git就是一个控制版本的工具,其实没想象中的那么复杂,咱在 ...

  7. Objective-C快速上手

    最近在开发iOS程序,这篇博文的内容是刚学习Objective-C时做的笔记,力图达到用最短的时间了解OC并使用OC.Objective-C是OS X 和 iOS平台上面的主要编程语言,它是C语言的超 ...

  8. Netron开发快速上手(二):Netron序列化

    Netron是一个C#开源图形库,可以帮助开发人员开发出类似Visio的作图软件.本文继前文”Netron开发快速上手(一)“讨论如何利用Netron里的序列化功能快速保存自己开发的图形对象. 一个用 ...

  9. Netron开发快速上手(一):GraphControl,Shape,Connector和Connection

    版权所有,引用请注明出处:<<http://www.cnblogs.com/dragon/p/5203663.html >> 本文所用示例下载FlowChart.zip 一个用 ...

  10. NHibernate3快速上手教程FluentNHibernate配置与DBHelper

    很多学习NHibernate的新手很容易卡在配置文件这一关,正所谓万事开头难,上手后再配合官方文档就比较容易了. 网上关于配置文件的资料非常多,但由于版本的问题,许多老的教程中都没有明确指出类库的版本 ...

随机推荐

  1. JavaScript 字符串的相关方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. mysql 排序ROW_NUMBER() RANK() DENSE_RANK()

    with 月业绩 as (SELECT 年份,月份, ROUND(sum(总业绩)/100000) 业绩 FROM `myj` group by 年份,月份) select * ,ROW_NUMBER ...

  3. 【建造者设计模式详解】Java/JS/Go/Python/TS不同语言实现

    简介 建造者模式(Builder Pattern),也叫生成器模式,属于创建型模式.它使用多个简单的对象一步一步构建成一个复杂的对象.它允许你使用相同的创建代码生成不同类型和形式的对象. 当你希望使用 ...

  4. Android笔记--监听短信内容

    监听短信内容 就比如说是在我们用一个软件需要使用"获取验证码"的功能时,能够跟短信的验证码互通,实现较为完整的登录功能: 监听短信内容主要是利用了contentObserver实现 ...

  5. 自己动手从零写桌面操作系统GrapeOS系列教程——13.向MBR中写入程序

    学习操作系统原理最好的方法是自己写一个简单的操作系统. 前面铺垫了这么久,今天终于开始写程序了.本讲将介绍3个逐步深入但非常简单的程序,一方面是让大家熟悉开发流程,另一方面是顺便解决前面遇到的CPU占 ...

  6. File 未释放文件权柄问题处理

    Unreleased Resource: Files Abstract 程序可能无法释放某个文件句柄. Explanation 程序可能无法成功释放某一个文件句柄. 资源泄露至少有两种常见的原因: - ...

  7. GPT-4 来了!这些开源的 GPT 应用又要变强了

    近日,在 GPT-3.5 发布的半年后,OpenAI 正式推出了大版本的 GPT-4,不同于 GPT-3 到 GPT-3.5 耗时两年,这次版本升级只用了半年.如果你对 OpenAI 不熟悉,答应我读 ...

  8. 一次spark任务提交参数的优化

    起因 新接触一个spark集群,明明集群资源(core,内存)还有剩余,但是提交的任务却申请不到资源. 分析 环境 spark 2.2.0 基于yarn集群 参数 spark任务提交参数中最重要的几个 ...

  9. openwrt 刷回梅林或者原厂固件

    路由器刷了openwrt固件后,访问不了CFE恢复模式了.本人最近用腾达AC18路由器,刷了AC68U的梅林改版固件.但是后面再用CFE刷了openwrt固件之后,发现wifi不能用,所以又想刷回梅林 ...

  10. Kali中python问题

    Kali中python问题 1.查看python有哪些版本 update-alternatives --display python 2.如果没有,可以去/usr/bin查看kali自带哪些版本 查看 ...