使用PyTorch實現目標檢測邊界框轉換與可視化

一、引言

在目標檢測任務中,邊界框(Bounding Box)的坐標表示與轉換是核心基礎操作。本文將演示如何:

  1. 實現邊界框的兩種表示形式(角點坐標 vs 中心坐標)之間的轉換

  2. 使用Matplotlib在圖像上可視化邊界框

  3. 驗證坐標轉換的正確性


二、環境準備

import torch
from d2l import torch as d2l
  • PyTorch 1.12+

  • d2l 0.17.0+

  • Matplotlib 3.5+

三、代碼實現與解析

1. 圖像加載與顯示

d2l.set_figsize()  # 設置畫布大小
img = d2l.plt.imread('./data/catdog.jpg')  # 讀取圖像
d2l.plt.imshow(img)  # 顯示圖像

2. 坐標轉換函數

角點坐標 → 中心坐標
def box_corner_to_center(boxes):x1, y1, x2, y2 = boxes[:,0], boxes[:,1], boxes[:,2], boxes[:,3]cx = (x1 + x2) / 2  # 中心x坐標cy = (y1 + y2) / 2  # 中心y坐標w = x2 - x1         # 寬度h = y2 - y1         # 高度return torch.stack((cx, cy, w, h), axis=-1)
中心坐標 → 角點坐標
def box_center_to_corner(boxes):cx, cy, w, h = boxes[:,0], boxes[:,1], boxes[:,2], boxes[:,3]x1 = cx - w/2  # 左上角xy1 = cy - h/2  # 左上角yx2 = cx + w/2  # 右下角xy2 = cy + h/2  # 右下角yreturn torch.stack((x1, y1, x2, y2), axis=-1)

3. 轉換驗證

dog_bbox = [10.0, 50.0, 80.0, 110.0]  # 狗的邊界框(左上x,左上y,右下x,右下y)
cat_bbox = [90.0, 40.0, 160.0, 110.0] # 貓的邊界框
boxes = torch.tensor([dog_bbox, cat_bbox])# 驗證轉換的正確性
print(box_center_to_corner(box_corner_to_center(boxes)) == boxes)

輸出結果

tensor([[True, True, True, True],[True, True, True, True]])

4. 邊界框可視化

def bbox_to_rect(bbox, color):return d2l.plt.Rectangle(xy=(bbox[0], bbox[1]),  # 左上角坐標width=bbox[2]-bbox[0],  # 寬度height=bbox[3]-bbox[1], # 高度fill=False, edgecolor=color, linewidth=2)fig = d2l.plt.imshow(img)
fig.axes.add_patch(bbox_to_rect(dog_bbox, 'blue'))  # 添加藍色狗框
fig.axes.add_patch(bbox_to_rect(cat_bbox, 'red'))   # 添加紅色貓框

可視化效果

  • X軸范圍:0-150

  • Y軸范圍:0-125

  • 藍色矩形框標注狗的位置

  • 紅色矩形框標注貓的位置


四、完整代碼

import torch
from d2l import torch as d2l# 設置畫布并加載圖像
d2l.set_figsize()
img = d2l.plt.imread('./data/catdog.jpg')
d2l.plt.imshow(img)# 坐標轉換函數
def box_corner_to_center(boxes):x1, y1, x2, y2 = boxes[:,0], boxes[:,1], boxes[:,2], boxes[:,3]cx, cy = (x1+x2)/2, (y1+y2)/2w, h = x2-x1, y2-y1return torch.stack((cx, cy, w, h), axis=-1)def box_center_to_corner(boxes):cx, cy, w, h = boxes[:,0], boxes[:,1], boxes[:,2], boxes[:,3]x1, y1 = cx-w/2, cy-h/2x2, y2 = cx+w/2, cy+h/2return torch.stack((x1, y1, x2, y2), axis=-1)# 定義邊界框并驗證轉換
dog_bbox, cat_bbox = [10.0,50.0,80.0,110.0], [90.0,40.0,160.0,110.0]
boxes = torch.tensor([dog_bbox, cat_bbox])
print(box_center_to_corner(box_corner_to_center(boxes)) == boxes)# 可視化邊界框
def bbox_to_rect(bbox, color):return d2l.plt.Rectangle((bbox[0], bbox[1]), bbox[2]-bbox[0], bbox[3]-bbox[1], fill=False, edgecolor=color, linewidth=2)fig = d2l.plt.imshow(img)
fig.axes.add_patch(bbox_to_rect(dog_bbox, 'blue'))
fig.axes.add_patch(bbox_to_rect(cat_bbox, 'red'))

五、關鍵點解析

  1. 坐標表示形式

    • 角點表示:(左上x, 左上y, 右下x, 右下y)

    • 中心表示:(中心x, 中心y, 寬度, 高度)

  2. 轉換驗證

    • 通過兩次轉換后與原值對比,全True結果證明轉換正確性

  3. 可視化技巧

    • 使用Matplotlib的Rectangle對象創建邊界框

    • 通過add_patch方法將圖形元素添加到坐標軸


六、總結

本文實現了目標檢測中邊界框的坐標轉換與可視化,驗證了:

  1. 兩種坐標表示形式的等價性

  2. 邊界框在圖像上的準確定位

  3. 轉換函數的正確性

該技術可應用于目標檢測數據預處理、結果可視化等場景。讀者可以嘗試修改邊界框坐標,觀察不同位置的可視化效果。


實際運行效果示意圖

(注:需自行準備包含貓狗的圖像,保存為./data/catdog.jpg

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76084.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76084.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76084.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電影推薦及數據分析可視化系統(Python+Echarts+Mysql+Flask框架)

提升自己,掌握數據分析的能力,最快的方式就是實踐! 下面是對本項目的一些功能展示、介紹以及部分核心代碼的展示,附項目系統展示的視頻,制作不易如需完整代碼后臺私信我有償獲取! 一 、系統分析及功能介紹 1.系統分析 系統采用Python作為開發…

Android Jetpack Compose 高級開發核心技術

Android Compose 高級技術總結 1. 性能優化 1.1 狀態管理優化 狀態提升原則:將狀態提升到共享的最近共同父組件derivedStateOf:當需要基于多個狀態計算派生狀態時使用 val scrollState rememberScrollState() val showButton by remember {derivedS…

Java堆結構深度解析:原理、實現與應用全指南

一、堆的核心概念體系 1. 堆的定義與性質 graph TBROOT((最大堆)) --> A[父節點 ≥ 子節點]ROOT --> B[完全二叉樹結構]ROOT --> C[數組存儲]ROOT --> D[快速獲取極值] 2. 堆類型對比 類型特性典型應用場景最大堆父節點值 ≥ 子節點值獲取前K大元素最小堆父節點…

SpringMVC學習(請求與響應。常見參數類型接收與響應。@RequestParam、@RequestBody的使用)(詳細示例)

目錄 一、請求與響應。(RequestMapping) (1)使用注解RequestMapping對業務模塊區分。 StudentController。 TeacherController。 (2)Apifox請求與響應。 "/student/login"。 "/teacher/login"。 二、常見參數…

回溯算法+對稱剪枝——從八皇后問題到數獨問題(二)

引入: 本節我們進一步完善八皇后問題,學習剪枝、八皇后殘局問題 進一步領會邏輯編程的概念,深入體會回溯算法,回顧上一節提到的啟發搜索策略。 回顧: 八皇后問題:我們需要在一個空棋盤上放置 n 個皇后&a…

【玩泰山派】MISC(雜項)- 使用vscode遠程連接泰山派進行開發

文章目錄 前言流程1、安裝、啟動sshd2、配置一下允許root登錄3、vscode中配置1、安裝remote插件2、登錄 **注意** 前言 有時候要在開發板中寫一寫代碼,直接在終端中使用vim這種工具有時候也不是很方便。這里準備使用vscode去通過ssh遠程連接泰山派去操作&#xff0…

【VsCode】設置文件自動保存

目錄 一、前言 二、操作步驟 一、前言 VSCode中開啟自動保存功能可以通過訪問設置、修改settings.json文件、使用自動保存延遲功能來實現。這些方法能有效提升編程效率、避免數據丟失、實時同步更改。 二、操作步驟 在 Visual Studio Code (VS Code) 中設置自動保存功能非…

Adobe After Effects的插件--------Optical Flares之Options概述

Optical Flares插件的Options是對整個效果的組裝和設置。點擊該按鈕會彈出一個組裝室彈窗。 Options組裝室就是對每個【鏡頭對象】進行加工處理,再將其組裝在一起,拼湊成完整的光效。 接下來是我對組裝室的探索: 面板 面板中有預覽、堆棧、編輯和瀏覽按鈕,其作用是調節窗…

如何用 esProc 補充數據庫 SQL 的缺失能力

某些數據庫 SQL 缺失必要的能力,通常要編寫大段的代碼,才能間接實現類似的功能,有些情況甚至要改用存儲過程,連結構都變了。常見的比如:生成時間序列、保持分組子集、動態行列轉換、自然序號、相對位置、按序列和集合生…

迷你世界腳本腳本常見問題

腳本常見問題 彼得兔 更新時間: 2024-05-22 17:54:44 在查閱開發者學院中的腳本API時,若有任何問題或建議,歡迎通過問卷進行反饋!【點我填寫問卷】 1.Block中的data在什么地方使用 data使用有具體需求,此處不建議開發者使用。開發者盡可能使…

四、Appium Inspector

一、介紹 Appium Inspector 是一個用于移動應用自動化測試的圖形化工具,主要用于檢查和交互應用的 UI 元素,幫助生成和調試自動化測試腳本。類似于瀏覽器的F12(開發者工具),Appium Inspector 的主要作用包括:? 1.?檢查 UI 元素? …

android11通過白名單卸載安裝應用

目錄 1.源碼路徑: 2.準備文件package.conf: 3.安裝方法installPackagesLI 4.卸載方法deletePackageX 1.源碼路徑: frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java public static final String WHITELIST_PATH="/data/misc/pa…

qt mapFrom返回的QPoint和event->pos()區別和globalPos區別

mousePressEvent 和 eventFilter 里 event.pos 不一樣,一定要注意 eventFilter里event.pos 直接返回相對于label左上角的坐標,就不要再mapFrom mousePressEvent 里event.pos 返回是相對于窗口左上角的坐標,需要用mapFrom返回label左上角的…

Hadoop四 Hive語法

一 數據庫操作 Hive數據庫操作,與MySql有很多都是一致的 創建數據庫 create database if not exists myhive; use myhive;查看數據庫詳細信息 desc database myhive;數據庫本質上就是在HDFS之上的文件夾,是一個以.db結尾的目錄,默認存…

前端VUE框架理論與應用(10)

1、記住全局注冊的行為必須在根 Vue 實例 (通過 new Vue) 創建之前發生。 2、要注意,以 / 開頭的嵌套路徑會被當作根路徑。 這讓你充分的使用嵌套組件而無須設置嵌套的路徑。 3、注意:在 Vue 實例內部,你可以通過 $router 訪問路由實例。因此你可以調用 this.$router.push…

leetcode-單調棧26

關于單調棧的順序總結: 尋找右邊第一個比我大的:從左到右遍歷,棧單調遞減 尋找左邊第一個比我小的:從左到右遍歷,棧單調遞增 尋找右邊第一個比我小的:從右到左遍歷,棧單調遞增 尋找左邊第一個比…

Linux:安裝 CentOS 7(完整教程)

文章目錄 一、簡介二、安裝 CentOS 72.1 虛擬機配置2.2 安裝CentOS 7 三、連接遠程服務器(擴展)3.1 獲取虛擬機 IP 地址3.2 連接遠程服務器 四、結語 一、簡介 CentOS(Community ENTerprise Operating System)是一個基于 Linux 的…

Nautilus 正式發布:為 Sui 帶來可驗證的鏈下隱私計算

作為 Sui 安全工具包中的強大新成員,Nautilus 現已上線 Sui 測試網。它專為 Web3 開發者打造,支持保密且可驗證的鏈下計算。Nautilus 應用運行于開發者自主管理的可信執行環境(Trusted Execution Environment,TEE)中&a…

Git完全指南:從入門到精通版本控制 ------- Git 工作流程 (3)

Git工作流程完全指南:從入門到高效協作 引言 Git作為分布式版本控制系統的行業標準,其高效的分支管理能力是團隊協作的基石。本文將深入解析標準Git工作流程,助你掌握從代碼提交到團隊協作的全鏈路實踐。 一、Git核心概念速覽 三大工作區域 …

Distortion, Animation Raymarching

這節課的主要目的是對uv進行操作,實現一些動畫的效果,實際就是采樣的動畫 struct texDistort {float2 texScale(float2 uv, float2 scale){float2 texScale (uv - 0.5) * scale 0.5;return texScale;}float2 texRotate(float2 uv, float angle){float…