PaddleDetection的学习笔记

2023-11-01

1. PaddleDetection介绍

PaddleDetection是由百度推出的目标检测开源模型库;

1.1 常见格式

.pdparams:保存参数权重的文件格式。

2. 安装PaddleDetection

Python版本:python <= 3.10;

PaddlePaddle

PaddlePaddle版本:[PaddlePaddle/PaddleDetection],需要到安装说明中查看,一般是在满足最低版本要求后安装最新的稳定版本;
PaddlePaddle安装:开始使用_飞桨

3. 数据集设置:COCO

数据集目录结构如下:

PaddleDetection
└── dataset
    └── coco
        ├── train2017
        ├── val2017 
        └── annotations  

4. 模型训练/评估/预测

train.py —— 模型训练

python -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 tools/train.py -c configs/ppyoloe/ppyoloe_plus_crn_l_80e_coco.yml --eval --amp

-c:指定配置文件

-r: resume,恢复训练

后面加上存档的epoch索引(从0开始);

infer.py —— 模型预测

# 预测
python tools/infer.py -c configs/faster_rcnn_r50_1x.yml --infer_img=demo/000000570688.jpg

# 在CPU上进行推理
python tools/infer.py -c configs/ppyolo/ppyolo_r50vd_dcn_1x_coco.yml -o use_gpu=false weights=https://paddledet.bj.bcebos.com/models/ppyolo_r50vd_dcn_1x_coco.pdparams --infer_img=demo/000000014439.jpg
# CPU推理需要显式指定:use_gpu=false
# demo/000000014439.jpg已经内置在PaddleDetection的repo文件夹中

Note:在output目录下生成的同名的测试文件会被替换。

4 模型配置说明

4.2 模型设置:model.yml

在PaddleDetection使用model.yml来配置模型的结构,配置文件的路径一般如下所示:

PaddleDetection/configs/model/model_***_coco.yml

模型参数:

  • Model:模型整体设置
  • Backbone:主干网络设置
  • PostProcess:后处理操作,(仅用于“CornerNet”模型)

4.2.1 模型类设置:Model

输入参数:

  • backbone:主干网络类名
  • neck:检测颈类名
  • head:检测头类名

4.2.2 主干类设置:Backbone

输入参数:

  • depth:主干网络深度
  • variant:变体型号
  • norm_type:归一化层类名

4.2.2 检测颈设置:Neck

输入参数:

  • in_channelslist,输入通道数
  • out_channelint,输出通道数(所有输出stage的通道数一样)
  • extra_stage:额外输出的层数
FPN:特征金字塔

Note
FPN模块在初始化时,会使用backbone输出的out_shape更新FPN的输入参数,而导致config中FPN.in_channels的设置失效。

4.3 优化器设置:optimizer.yml

参数 描述
TrainReader.batch_size 每张卡上的batch-size

5 代码文件说明

5.1 configs/rotate:旋转框数据集处理

5.1.1 configs/rotate/tools:旋转框处理工具

configs/rotate/tools/prepare_data.py: 进行DOTA数据集的切图处理

5.2 ppdet/utils:训练和调优的工具类和函数

5.2.1 utils/checkpoint.py

load_weight():载入模型权重

存档权重的格式要求是.pdparams

5.2 ppdet/optimizer.py:优化器设置

ppdet/optimizer.py包含了PaddleDetection优化器的设置代码;

Class Description
OptimizerBuilder 根据config的设置构建优化器

5.3 tools/infer.py

用于进行图像的预测

5.3.1 路径预设代码

import os, sys
# add python path of PadleDetection to sys.path
parent_path = os.path.abspath(os.path.join(__file__, *(['..'] * 2)))
if parent_path not in sys.path:
    sys.path.append(parent_path)
    # 使用sys.path.append添加环境变量,在脚本执行完成之后则会失效

5.4 utils/post_process.py

用于目标检测的后处理;

5.4.1 corner_post_process()

用于CornerNet的后处理函数;
参数:

  • results:
    dict{‘bbox’, ‘im_id’},检测结果;其中字典中的属性含义如下:
    • bbox: 检测框信息,包含类别和坐标信息
    • im_id: 图像id
代码说明:
def corner_post_process(results, config, num_classes):
    detections = results['bbox'][0]
    keep_inds = (detections[:, 1] > -1)
    detections = detections[keep_inds]
    labels = detections[:, 0]
    scores = detections[:, 1]
    boxes = detections[:, 2:6]
    cls_boxes = get_nms_result(
        boxes, scores, config, num_classes, background_label=-1, labels=labels)
    results.update({'bbox': (cls_boxes, [[len(cls_boxes)]])})

6 函数和类说明

6.1 数据集处理函数

process_single_sample():处理单个样本

def process_single_sample(info, image_id, class_names):
    image_file = info['image_file']
    single_image = dict()
    single_image['file_name'] = os.path.split(image_file)[-1]
    single_image['id'] = image_id
    image = cv2.imread(image_file)
    height, width, _ = image.shape
    single_image['width'] = width
    single_image['height'] = height

    # process annotation field
    single_objs = []
    objects = info['annotation']
    for obj in objects:
        poly, name, difficult = obj['poly'], obj['name'], obj['difficult']
        if difficult == '2':
            continue

        single_obj = dict()
        single_obj['category_id'] = class_names.index(name) + 1
        single_obj['segmentation'] = [poly]
        single_obj['iscrowd'] = 0
        xmin, ymin, xmax, ymax = min(poly[0::2]), min(poly[1::2]), max(poly[
            0::2]), max(poly[1::2])
        # 使用间隔索引的方法获得四个点的X或Y坐标,并取最小值和最大值,作为bbox的坐标
        width, height = xmax - xmin, ymax - ymin
        single_obj['bbox'] = [xmin, ymin, width, height]
        single_obj['area'] = height * width
        single_obj['image_id'] = image_id
        single_objs.append(single_obj)

    return (single_image, single_objs)

6.2 预处理和数据增广:sample_transforms

官方文档:数据预处理算子 - PaddleDetection/READER.md at release/2.5

6.2.1 Decode:图像解码操作(从文件中读取图像)

7 PaddlePaddle学习笔记

7.1 张量

7.1.1 Paddle张量不支持括号索引:img_tensor[:, (2, 1, 0), :, :]

今天在使用Paddle时,使用括号索引改变颜色分量顺序时,代码报错了,
期望改变图像张量的颜色分量顺序:

img_tensor = img_tensor[:, (2, 1, 0), :, :]

Paddle报错:

...
  File "D:\Professional\Paddle\Paddle_oriented_reppoints\ppdet\engine\train_aligner.py", line 461, in train
    img_tensor = img_tensor[:, (2, 1, 0), :, :]
  File "C:\Users\songyuc\.conda\envs\conda-paddle\lib\site-packages\paddle\fluid\dygraph\varbase_patch_methods.py", line 753, in __getitem__
    return self._getitem_index_not_tensor(item)
ValueError: (InvalidArgument) Currently, Tensor.__indices__() only allows indexing by Integers,
Slices, Ellipsis, None, tuples of these types and list of Bool and Integers, but received tuple in
2th slice item (at ..\paddle/fluid/pybind/slice_utils.h:295)

感觉好像就是Paddle不支持这种索引操作;

8 PP-YOLOE

关于PP-YOLOE的论文学习笔记,请参考《PP-YOLOE的译读笔记》
学习资料:
Paddle目标检测算法课程——PPYOLOE
Paddle目标检测算法课程——PPYOLOE | PPT
技术一览表:

名称 超参数
Input size 640
Down sample AdaptiveAvgPool2d
(目前是在Head部分的代码中看到此算子作为下采样的方式)
Act Swish (SiLU)
Head PPYOLOEHead
Optimizer SGD with momentum and L2-regularization
Weight decay 0.0005

5.1 PyTorch实现:[miemie2013/miemiedetection]

关于这个repo的说明文档,请参阅《PPYOLO、PPYOLOv2、PPYOLOE的pytorch实现三合一!尽在miemiedetection!》

5.2 学习笔记

PP-YOLOE对bias项的weight_decay是怎么处理的呢?

关于PP-YOLOE对bias项weight_decay的处理,请参考[PaddleDetection | backbones/cspresnet.py]
总的来说,就是对BN层的所有参数不使用weight_decay,即:

self.bn = nn.BatchNorm2D(
    ch_out,
    weight_attr=ParamAttr(regularizer=L2Decay(0.0)),
    bias_attr=ParamAttr(regularizer=L2Decay(0.0)))

如何在使用PyTorch实现L2Decay呢?

这里我们参考的是[miemie2013/miemiedetection]的实现方法:[miemiedetection]是从[mmdetection]中移植过来的,这里继承了mmdetection的书写方式[code – add_param_group]
在这里插入图片描述
这里的model.add_param_group调用的是模型的.add_param_group()方法[ppyoloe.py – add_param_group()]

7 自定义 Paddle-C++算子

数据类型宏转换

Paddle文档:《自定义C++算子-PaddlePaddle文档 | 支持多种数据类型》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PaddleDetection的学习笔记 的相关文章

  • 无人驾驶:Term-1-p2-traffic-sign-classifier

    简介 Term 1第二节课是进行交通标志分类 xff0c 数据集主要来自于German Traffic Sign xff0c 包含了42种交通标志 xff0c 通过深度学习网络进行分类 环境准备 python 2 7numpyscikit
  • 无人驾驶(四)---远程桌面控制工具: NoMachine踩坑记录

    NoMachine for mac是一款免费的远程桌面访问工具 xff0c 这款软件的连接到远程桌面后延迟可以非常低 xff0c NX协议在高延迟低带宽的链路上提供了近乎本地速度的响应能力 xff0c 打破空间和时间的障碍 xff0c 让您
  • python无人驾驶_无人驾驶技术入门(四):无人车传感器 IMU 深入剖析

    上一次的分享里 xff0c 我介绍了GPS的原理 xff08 三角定位 xff09 及特性 xff08 精度 频率 xff09 xff0c 同时也从无人车控制的角度 xff0c 讨论了为什么仅有GPS无法满足无人车的定位要求 为了能让无人驾
  • 无人驾驶——激光雷达篇

    激光雷达技术简介 无人驾驶技术是多项技术的集成 xff0c 包括传感器 定位与深度学习 高精地图 路径规划 障碍物检测与规避 机械控制 系统集成与优化 能耗与散热管理等 无人车系统的感知端由不同的传感器组成 xff0c 其中包括GPS xf
  • 【无人驾驶】自动驾驶领域有哪些岗位可选?

    导读 想要进入自动驾驶这个领域 xff0c 便首先去调查了下这个领域的岗位 xff0c 希冀能从中找出自己最感兴趣且匹配度也比较高的方向 废话不多说 xff0c 见下 下图为自动驾驶方向的所有岗位 xff0c 总量的来说 xff0c 方向可
  • 2、无人驾驶--路径规划算法:Dijkstra

    目录 2 Dijkstra2 1 算法简介2 2 算法思路具体流程 xff1a 2 3 算法具体实现2 3 1 程序详解 2 Dijkstra 声明 xff1a 本文是学习古月居 基于栅格地图的机器人路径规划算法指南 黎万洪 后写的笔记 x
  • costmap 代价地图

    转自 https sychaichangkun gitbooks io ros tutorial icourse163 content chapter10 10 3 html 10 3 costmap costmap是Navigation
  • 整理的apollo 入门课程

    转自 https blog csdn net weixin 36662031 article details 81081744 转载自 https mp csdn net postedit 81081744 自动驾驶系统主要包含三个部分 感
  • Apollo如何通知/订阅主题topic

    转自 https blog csdn net u012423865 article details 80024870 How to advertise and subscribe a topic 导读 众所周知 Apollo是基于ROS开发
  • 一种基于光流的无人机仿生智能避障方法

    转自 https patents google com patent CN106155082A zh 一种基于光流的无人机仿生智能避障方法 技术领域 0001 本发明涉及一种单目视觉的基于光流的无人机智能仿生避障方法 特别是属于人 工智能以
  • PaddleDetection的学习笔记

    1 PaddleDetection介绍 PaddleDetection是由百度推出的目标检测开源模型库 1 1 常见格式 pdparams 保存参数权重的文件格式 2 安装PaddleDetection Python版本 python lt
  • 无人驾驶实战(二)——TensorFlow实现基于 LeNet5 网络的交通标志识别

    引言 交通标志是道路基础设施的重要组成部分 它们为驾驶员及行人提供了道路行驶关键信息 并要求驾 驶员及时调整驾驶行为 以确保遵守道路安全规定 无人驾驶车辆同样必须遵守交通法规 因此它需要识 别和理解交通标志 一般来说 我们可以使用计算机视觉
  • 【仿真】Carla介绍与使用 [1] (附代码手把手讲解)

    0 参考与前言 主要介绍无人驾驶的仿真环境CARLA 开源社区维护 以下为相关参考链接 Carla官方文档 建议后续找的时候 先按好版本号 有些功能 api 是新版本里有的 Carla官方github Youtube Python Wind
  • 机器人学习书籍

    1 概率机器人 2 机器人学的几何基础 3 Eigen学习 https blog csdn net u012936940 article details 79691911 eigen 使用手册 平时使用参考 4 opencv opencv
  • 概率机器人教学课件

    http www probabilistic robotics org
  • 汽车LiDAR的“先行者”——机械式LiDAR

    转自 http www mems me mems system integrator 201711 5547 html http www mems me mems system integrator 201711 5636 html 机械式
  • 无人驾驶论坛

    1 百度Apollo论坛 http www 51apollo com 2 人工智能中文资讯网 http www ailab cn
  • CARLA平台+Q-learning的尝试(gym-carla)

    接触强化学习大概有半年了 也了解了一些算法 一些简单的算法在gym框架也实现了 那么结合仿真平台Carla该怎么用呢 由于比较熟悉gym框架 就偷个懒先从这个开始写代码 项目地址 https github com cjy1992 gym c
  • KITTI数据集--参数

    一 kitti数据集 label解析 16个数代表的含义 第1个字符串 代表物体类别 Car Van Truck Pedestrian Person sitting Cyclist Tram Misc or DontCare 注意 Dont
  • 《学习篇》学会这18个常用ROS命令集合就能入门ROS了

    常用ROS命令概述 ROS常用命令可以按照其使用场景分为ROSshell命令 ROS执行命令 ROS信息命令 ROS catkin命令与ROS功能包命令 虽然很难从一开始就很熟练地使用所有的命令 但是随着使用的次数增多 你会发现常用的几个R

随机推荐

  • STM32F103-时钟树

    STM32F1 时钟树 参考 野火 零死角玩转STM32 F103指南者 时钟源 HSI 高速内部时钟 RC振荡器 频率为8MHz HSE 高速外部时钟 可接石英 陶瓷谐振器 或者接外部时钟源 频率范围为4MHz 16MHz LSI 低速内
  • redis 优缺点 使用场景

    1 使用redis有哪些好处 1 速度快 因为数据存在内存中 类似于HashMap HashMap的优势就是查找和操作的时间复杂度都是O 1 2 支持丰富数据类型 支持string list set sorted set hash 3 支持
  • BootStrap----table

    项目场景 需要涉及到BootStrap table表格的 因为最后也没有使用bootstrap 现在只是简单的整理一下搜集到的资料 问题描述 提示 对于参数信息的涉及和查阅 参考 8条消息 bootstrapTable常用参数与方法 王小小
  • ubuntu18.04在vscode中配置c++环境

    1 安装gcc g sudo apt install gcc sudo apt install g 检查是否安装成功 gcc verison g version 2 在vscode商店中安装c 插件 3 在根目录创建 vscode文件夹 然
  • 常见查找算法-JAVA实现

    package org nxt algorithm search the bean of comparable author nanxiaotao public class ComparableBean implements Compara
  • csrf攻击原理及防范

    CSRF 全拼为 Cross Site Request Forgery 跨站请求伪造 CSRF指的是攻击者盗用了你的身份 以你的名义发送恶意的请求 给你造成个人隐私泄露及财产安全 CSRF攻击的原理 用户正常登录A银行网站 A网站返回coo
  • k8s四层负载均衡之Service

    为什么要有Service 在kubernetes中 Pod是有生命周期的 如果Pod重启它的IP很有可能会发生变化 如果我们的服务都是将Pod的IP地址写死 Pod挂掉或者重启 和刚才重启的pod相关联的其他服务将会找不到它所关联的Pod
  • 【python基础知识】10.用Python实现石头剪刀布小游戏-函数实操篇

    文章目录 引言 游戏规则 练习目标 步骤拆解 双方出拳 双方亮拳 判断胜负 判断输赢逻辑优化 具体实现 引入random模块 创建选项列表 验证用户输入 计算机随机选择 判断胜负关系 完整代码 运行示例 总结 结语 引言 石头剪刀布是一款经
  • 集成测试策略

    集成测试的基础策略有很多 通常分为两种 非增量式集成测试策略和增量式集成测试策略 第一种 非增量式集成测试策略 非增量式集成测试策略也叫做大爆炸集成 一次性集成 即在最短的时间内把所有的系统组件一次性集成到被测系统中 并通过最少的用例来验证
  • 【前端】如何像取数组一样地取对象

    目标 例如 a a b c 可以通过a 0 得到 a 那么info success text yes warning text wrong url home 能不能通过类似info 0 的方式对应到 text yes 呢 当然是可以的 实现
  • 金币问题解析

    金币问题 本人小白 望各位大佬批评指正 谢谢 题目 国王将金币作为工资 发放给忠诚的骑士 第一天 骑士收到一枚金币 之后两天 第二天和第三天 每天收到两枚金币 之后三天 第四 五 六天 每天收到三枚金币 之后四天 第七 八 九 十天 每天收
  • 利用油猴Tampermonkey自动登录

    当然也可以用 Chrome User Script Handler 插件 function 获取元素 function getElementByXpath path return document evaluate path documen
  • gdb test

    gdb test b main b 8 b hello cpp 9 b hello cpp add tb 9 r 可以带参数 c n s bt info b info local info args info display l l hel
  • 史上最细,自动化测试-logging日志采集详细实战(一)

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • Android:NDK

    3 1 NDK 一 NDK的作用 1 NDK产生的背景 Android平台从诞生起 就已经支持C C 开发 众所周知 Android的SDK基于Java实现 这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言 但这
  • 安装mysql 8.0后navicat不能连接的解决方法

    主要原因是因为mysql8使用的是caching sha2 password加密方式 而mysql8之前使用的加密方式是 mysql native passowrd 所以我们将加密方式改回mysql native passowrd即可 重要
  • 史上最全安装Maven教程

    简单了解一下什么是Maven 1 Maven翻译为 专家 内行 的意思 是著名Apache公司下基于Java开发的开源项目 2 Maven项目对象模型 POM 是一个项目管理工具软件 可以通过简短的中央信息描述来管理项目的搭建 报告和文档等
  • 轨道交通中TCN、TRDP、TSN的理解

    轨道交通中TCN TSN TRDP的理解 1 TCN 2 TSN 3 TRDP 1 TCN TCN Train Communication Network 是列车通信网络 是列车通信网络的总称 在IEC 61375 1 以及GB T 280
  • 问题:利用输入输出流重载实现一个整数数组的输入和输出。 要求:输入一个数组大小 及 所有元素的值,排序后输出该数组的所有元素。

    define CRT SECURE NO WARNINGS include
  • PaddleDetection的学习笔记

    1 PaddleDetection介绍 PaddleDetection是由百度推出的目标检测开源模型库 1 1 常见格式 pdparams 保存参数权重的文件格式 2 安装PaddleDetection Python版本 python lt