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.pswp.cn/bicheng/21666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21666.shtml
英文地址,請注明出處:http://en.pswp.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; 連接池是一種管理網絡連…