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;其核心…

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

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

【数据分享】水体分布与五级水系和流域矢量数据+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)扮演着举…

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的情况,直接当做一个正常的参数进行传递 本次方案是第二个,直接当做一个正常的字符串参数进行传递即…

RFID防盗门:守护您的商品资产安全!

在新零售运营管理中&#xff0c;防盗是至关重要的一环。根据美国零售联合会发布的年度零售安全调查&#xff0c;2022年美国零售商损失了创纪录的1121亿美元。其中年度损失最大因素是由外部盗窃导致库存损失和员工内部盗窃造成的。 然而传统零售业商品资产盘点往往依赖人工排查&…

《科技与健康》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《科技与健康》期刊万方网可查吗 答&#xff1a;万方、维普可查 问&#xff1a;《科技与健康》是正规期刊吗&#xff1f; 答&#xff1a;万方维普收录的正规期刊。主管单位&#xff1a;长江出版传媒股份有限公司 主办单位&#xff1a;湖北科学技术…

孩子出生后为什么要做听力筛查?

孩子出生后为什么要做听力筛查&#xff1f; 新生儿听力筛查&#xff0c;就是对所有新生儿在尽早的时间&#xff08;出生48小时后&#xff09;进行系统的听力筛查测试。据相关文献报道&#xff0c;在我国&#xff0c;正常分娩的新生儿听力障碍的发生率约为0.1&#xff5e;0.3%&a…

机场专用手持激光驱鸟器原理及优势

在机场的驱鸟工作中&#xff0c;各类驱鸟设备共同构建起一道坚不可摧的防线&#xff0c;以保障航班的安全起降。其中激光驱鸟器以其卓越的性能和显著效果&#xff0c;在机场鸟击防治中发挥着至关重要的作用。 激光驱鸟器&#xff0c;分为大型自动式和小型手持式&#xff0c;其有…

Python 技能提升(二)

理想的类结构 Property装饰器 # 传统写法 class Square1:def __init__(self):self.__side Nonedef get_side(self):return self.__sidedef set_side(self, side):assert side > 0, 边长不能为负数&#xff01;self.__side sidedef del_side(self):# del self.__sideself.…

2024年有什么值得入手的5G长期套餐大流量卡推荐?大流量手机卡入手指南(超4款正规手机卡实测总结)

前言 24年有什么值得入手的5G大流量卡推荐&#xff1f;大流量手机卡入手指南&#xff08;超4款正规手机卡实测总结&#xff09; 四大运营商有哪些大流量卡&#xff0c;可电话&#xff0c;非物联网卡 所有卡激活后&#xff0c;均可以在官方app可查、 所有都是优惠长期 5G大流…

抖音直播统计、直播间无人互动直播效果软件--抖音大师!

抖音大师介绍 抖音大师是抖音直播统计、直播间无人互动直播效果软件&#xff0c;通过它&#xff0c;你可以快速添加直播互动效果&#xff01;软件使用C#开发&#xff0c;无论是内存占用还是执行效果都远比同行的效果高太多&#xff01;&#xff01;电脑所需性能大大降低&#x…

做软件测试需要懂代码吗?

随着大数据、机器学习时代的到来&#xff0c;不少人有了“测试不需要懂代码&#xff0c;那我就试试”的想法。这就引发了一系列疑问&#xff1a;不懂代码可以做测试吗&#xff1f;测试人员到底需不需要懂代码&#xff1f;测试人员需要写代码吗&#xff1f; 其实&#xff0c;在…