Paddle实现单目标检测

单目标检测

单目标检测(Single Object Detection)是人工智能领域中的一个重要研究方向,旨在通过计算机视觉技术,识别和定位图像中的特定目标物体。单目标检测可以应用于各种场景,如智能监控、自动驾驶、医疗影像分析等。

简单来说,单目标检测就是在确定一个目标在图片中的位置:

检测亮起的信号灯在图像中的位置

 本文将以信号灯检测为例,介绍单目标检测的方法

环境准备

这个案例需要安装以下两个库:

pip install paddlepaddle-gpu
pip install lxml

数据集准备

本文采用如下数据集:红绿灯检测_练习_训练集(非比赛数据)_数据集-飞桨AI Studio星河社区 (baidu.com)

这个数据集共有2000张信号灯的照片,其中1000张绿灯,1000张红灯。每张照片都对应着一个xml文件,标注着信号灯在图片中的位置:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<annotation><folder>Images</folder><filename>green_0.jpg</filename><source><database>Unknown</database></source><size><width>424</width><height>240</height><depth>3</depth></size><segmented>0</segmented><object><name>green</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><occluded>0</occluded><bndbox><xmin>247</xmin><ymin>147</ymin><xmax>301</xmax><ymax>190</ymax></bndbox></object>
</annotation>

这里面,<width>和<height>标签分别定义了宽和高,<name>定义了样本的类别(red或者green),<bndbox>里的标签则是定义了信号灯的位置(矩形框)

接下来我们编写dataset.py,用于定义数据集类:

import paddle
import glob
from lxml import etree
from PIL import Image  
import numpy as np # 定义一个字典,将颜色名称映射到ID  
name_to_id = {'red': 0, 'green': 1}  # 将绝对坐标转换为相对坐标  
def to_labels(path):  # 读取XML文件内容  text = open(f'{path}').read().encode('utf8')  # 解析XML内容  xml = etree.HTML(text)  # 提取图像的宽度和高度  width = int(xml.xpath('//size/width/text()')[0])  height = int(xml.xpath('//size/height/text()')[0])  # 提取边界框的坐标  xmin = int(xml.xpath('//bndbox/xmin/text()')[0])  xmax = int(xml.xpath('//bndbox/xmax/text()')[0])  ymin = int(xml.xpath('//bndbox/ymin/text()')[0])  ymax = int(xml.xpath('//bndbox/ymax/text()')[0])  # 将绝对坐标转换为相对坐标  return xmin / width, ymin / height, xmax / width, ymax / height  # 定义一个PaddlePaddle数据集类  
class Dataset(paddle.io.Dataset):  def __init__(self, pos='training_data'):  super().__init__()  # 调用父类构造函数  # 查找指定目录下的所有.jpg图片和.xml标签文件  self.imgs = glob.glob(f'{pos}/*.jpg')  self.labels = glob.glob(f'{pos}/*.xml')  def __getitem__(self, idx):  # 根据索引获取图片和标签  img = self.imgs[idx]  label = to_labels(self.labels[idx])  # 打开图片并转换为RGB模式  pil_img = Image.open(img).convert('RGB')  # 将PIL图片转换为numpy数组,并转换为float32类型  # 同时将通道顺序从HWC转换为CHW(PaddlePaddle默认输入格式)  t = paddle.to_tensor(np.array(pil_img, dtype=np.float32).transpose((2, 0, 1)))  # 返回图片张量和标签张量  return t, paddle.to_tensor(label[:4])  def __len__(self):  # 返回数据集中图片的数量  return len(self.imgs)

训练脚本

单目标检测可以看作一个回归问题,输出4个值,用于确定目标的坐标,因此我们可以使用resnet,并指定其类别数量为4(即输出4个值),并采用MSE损失函数(因为这是回归问题),据此,可以写出训练脚本的代码:

import paddle  
from dataset import Dataset  # 初始化Dataset实例,设置数据位置为'training_data'  
dataset = Dataset(pos='training_data')  # 使用ResNet18网络结构,并设置输出类别数为4  
net = paddle.vision.resnet18(num_classes=4)  
# 将网络封装为PaddlePaddle的Model对象  
model = paddle.Model(net)  # 准备模型训练,包括优化器(Adam)和损失函数(均方误差损失)  
model.prepare(  paddle.optimizer.Adam(parameters=model.parameters()),  paddle.nn.MSELoss(),  
)  # 训练模型,设置训练轮数为160,批处理大小为16 
model.fit(dataset, epochs=160, batch_size=16, verbose=1)  # 保存模型到'output/model'路径  
model.save('output/model')

可以看到,训练脚本还是非常简单的。

简单使用

使用脚本也很简单:

import matplotlib.pyplot as plt  
import matplotlib.patches as patches  
import numpy as np  
from PIL import Image  
import paddle  # 图片路径  
img_path = 'testing_data/red_1003.jpg' 
# 打开图片并转换为RGB格式  
pil_img = Image.open(img_path).convert('RGB')  
# 将PIL图片转换为Paddle Tensor,并调整通道顺序  
t = paddle.to_tensor([np.array(pil_img, dtype=np.float32).transpose((2, 0, 1))])  # 加载ResNet18模型,并设置为4个类别  
net = paddle.vision.resnet18(num_classes=4)  
model = paddle.Model(net)  
# 加载训练好的模型权重  
model.load('output/model')  # 预测图片  
pred = model.predict_batch(t)[0][0]  
print(f'预测结果:{pred}')  # 根据预测结果计算边界框坐标  
xmin = float(pred[0]) * 424  
ymin = float(pred[1]) * 240  
xmax = float(pred[2]) * 424  
ymax = float(pred[3]) * 240  # 显示原始图片  
plt.imshow(np.array(t[0], dtype=np.int32).transpose((1, 2, 0)))  # 定义多边形的顶点坐标(这里是预测的边界框)  
vertices = np.array([[xmin, ymin], [xmin, ymax], [xmax, ymax], [xmax, ymin]])  
# 创建一个多边形对象,用于绘制边界框  
polygon = patches.Polygon(vertices, closed=True, edgecolor='black', facecolor='none')  
# 将多边形添加到当前坐标轴上  
plt.gca().add_patch(polygon)  
# 显示图片和边界框  
plt.show()

输出:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/21666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

短视频矩阵系统搭建开发,ai智能剪辑系统,矩阵发布,一键管理多个账户

前言&#xff1a; 企业短视频矩阵是企业通过搭建多个短视频平台账号&#xff0c;形成一个多元化的内容传播网络。它旨在通过多平台内容的同步传播&#xff0c;实现企业品牌价值的最大化。短视频矩阵包括抖音、快手、视频号、小红书、百家号等热门短视频平台&#xff0c;其核心…

LeetCode 每日一题 数学篇 2520.统计能整除数字的位数

给你一个整数 num &#xff0c;返回 num 中能整除 num 的数位的数目。 如果满足 nums % val 0 &#xff0c;则认为整数 val 可以整除 nums 。 int countDigits(int num) {int t num, res 0;while (t) {if (num % (t % 10) 0) {res 1;}t / 10;}return res; }解题思路&…

AT_abc348_c [ABC348C] Colorful Beans 题解

题目传送门 解题思路 对于每种颜色的豆子&#xff0c;我们先找到美味度最小的那个&#xff0c;最后找出这些不同种类的豆子中美味度最大的即可。 那我们怎么找到第 i i i 种豆子中美味度最小的那个呢&#xff1f;这里给出两种思路&#xff1a; 使用桶的思想标记。对于每一…

向日葵抓住哪三个要点,帮助企业构建专业技术支持服务体系?

售后技术支持是销售行为的延续&#xff0c;在存量时代企业是否能够提供优质专业的售后技术支持服务显得尤为重要&#xff0c;它直接关系到企业产品在市场中的口碑&#xff0c;进而影响企业的发展命运。 因此&#xff0c;企业势必需要重视技术支持服务体系的搭建&#xff0c;引…

JavaScript 事件循环竟还能这样玩!

JavaScript 是一种单线程的编程语言&#xff0c;这意味着它一次只能执行一个任务。为了能够处理异步操作&#xff0c;JavaScript 使用了一种称为事件循环&#xff08;Event Loop&#xff09;的机制。 本文将深入探讨事件循环的工作原理&#xff0c;并展示如何基于这一原理实现一…

git-commit-id-plugin maven插件笔记(git commitId跟踪工具)

文章目录 maven依赖git.properties 例子 代码版本管理比较混乱&#xff0c;如何记录呢? 一种是手动记录&#xff0c;也可以实现&#xff0c;显得有点笨。 也可以通过插件。 maven依赖 <plugin><groupId>pl.project13.maven</groupId><artifactId>git…

面试题系列:Python是什么?使用Python有什么好处?你对 PEP 8 有什么理解?

###面试题系列:Python是什么?使用Python有什么好处?你对 PEP 8 有什么理解? 1、Python是什么? Python是一门动态的(dynamic)且强类型(strong)语言 延伸: 1)静态类型语言和动态类型语言的判别的标准 如果类型检查发生在编译阶段(compile time),那么是静态类型语言(s…

【数据分享】水体分布与五级水系和流域矢量数据+2000-2022年植被指数(NDVI)数据(全国/分省/分市)

1. 数据介绍 数据分为3个层次结构&#xff0c;分别为省、地级市、县。其中&#xff0c;省级水体31个&#xff08;不包含香港、台湾等&#xff09;&#xff0c; 地级市水体366个&#xff0c;县级市水体2847个。每一个文件夹中都包含该省、地级市或者县的水体矢量数据、行政边界…

数学建模 —— 灰色系统(4)

目录 什么是灰色系统&#xff1f; 一、灰色关联分析 1.1 灰色关联分析模型 1.2 灰色关联因素和关联算子集 1.2.1 灰色关联因素 1.2.2 关联算子集 1.3 灰色关联公理与灰色关联度 1.3.1 灰色关联度 1.3.2 灰色关联度计算步骤 1.4 广义关联度 1.4.1 灰色绝对关联…

一文读懂GDPR

GDPR将对人们的网络足迹、使用的APP和服务如何保护或利用这些数据产生重大影响。 下面我们将对有关GDPR人们最关心的问题进行解读。 GDPR是什么&#xff1f; 一般数据保护条例&#xff08;General Data Protection Regulation&#xff09;是一项全面的法律&#xff0c;赋予了…

风电Weibull+随机出力!利用ARMA模型随机生成风速+风速Weibull分布程序代码!

前言 随着能源问题日益突出&#xff0c;风力发电等以可再生能源为基础的发电技术越来越受到关注。建立能够正确反映实际风速特性的风速模型是研究风力发电系统控制策略以及并网运行特性的重要基础叫。由于风速的随机性和波动性&#xff0c;系统中的机械设备和电气设备以及电网…

计算机网络⑩ —— Linux系统如何收发网络包

转载于小林coding&#xff1a;https://www.xiaolincoding.com/network/1_base/how_os_deal_network_package.html 1. OSI七层模型 应用层&#xff0c;负责给应用程序提供统一的接口&#xff1b;表示层&#xff0c;负责把数据转换成兼容另一个系统能识别的格式&#xff1b;会话…

深度剖析云边对接技术:探索开放API接口的价值与意义

在当今数字化时代的浪潮中&#xff0c;云边对接与开放API接口成为了塑造行业生态的重要驱动力。随着云计算、物联网和边缘计算等技术的快速发展&#xff0c;传统产业正在迈向数字化转型的关键时刻。而在这个过程中&#xff0c;云边对接技术以及开放的应用程序接口(API)扮演着举…

处理STM32 DMA方式下的HAL_UART_ERROR_ORE错误

1. 检查并调整DMA和UART配置 确保初始化顺序&#xff1a;需要确保USART的CR寄存器UE位开关留到最后打开&#xff0c;即完成USART和DMA的所有配置初始化后再使能USART。这样可以避免初始化顺序不当导致的通信问题。配置合适的DMA缓冲区&#xff1a;确保DMA缓冲区足够大&#xf…

Facebook海外三不限 | 如何降低Facebook频繁被封的风险

本文将讨论Facebook账户被封的原因及降低封禁风险的方法&#xff0c;以维护用户的账户安全和社交乐趣。 1. 常见原因&#xff1a;账户被封通常与发布违反社区标准的内容有关&#xff0c;如仇恨言论、暴力内容、欺诈虚假信息、非法活动、骚扰、版权侵权等。此外&#xff0c;未授…

el-date-picker选择开始日期的近半年

<el-date-pickerv-model"form[val.key]":type"val.datePickerType || daterange":clearable"val.clearable && true"range-separator"~"start-placeholder"开始日期"end-placeholder"结束日期"style&q…

玩转Linux进度条

准备工作&#xff1a; 一.关于缓冲区 首先&#xff0c;咱们先来一段有意思的代码&#xff1a; #include<stdio.h> #include<unistd.h> int main() {printf("you can see me");sleep(5);} 你可以在你的本地运行一下&#xff0c;这里我告诉大家运行结果…

【SAP HANA 33】前端参数多选情况下HANA如何使用in来匹配?

场面描述: 在操作界面经常会出现某个文本框需要多选的情况,然后后台需要根据多选的值进行匹配搜索。 一般处理的情况是: 1、在Java后端动态生成SQL 2、不改变动态SQL的情况,直接当做一个正常的参数进行传递 本次方案是第二个,直接当做一个正常的字符串参数进行传递即…

【面试题-014】Mysql数据库有哪些索引类型?

文章目录 B 树和 B 树区别B 树B 树 mysql聚簇索引和非聚簇索引聚簇索引&#xff08;Clustered Index&#xff09;非聚簇索引&#xff08;Non-Clustered Index&#xff09;总结 MyISAM和InnoDB两种常见的存储引擎区别MySQL的主从同步原理如何确保主从同步的数据一致性&#xff1…

使用C++实现高效的套接字连接池

在现代网络应用中&#xff0c;高效管理网络连接是实现高并发和低延迟的重要因素。下面将详细介绍如何使用C实现一个高效的套接字连接池&#xff0c;以便在需要时快速复用连接&#xff0c;从而提高系统性能和资源利用率。 一、什么是连接池&#xff1f; 连接池是一种管理网络连…