計算機視覺:經典數據格式(VOC、YOLO、COCO)解析與轉換(附代碼)

第一章:計算機視覺中圖像的基礎認知
第二章:計算機視覺:卷積神經網絡(CNN)基本概念(一)
第三章:計算機視覺:卷積神經網絡(CNN)基本概念(二)
第四章:搭建一個經典的LeNet5神經網絡(附代碼)
第五章:計算機視覺:神經網絡實戰之手勢識別(附代碼)
第六章:計算機視覺:目標檢測從簡單到容易(附代碼)
第七章:MTCNN 人臉檢測技術揭秘:原理、實現與實戰(附代碼)
第八章:探索YOLO技術:目標檢測的高效解決方案
第九章:計算機視覺:主流數據集整理
第十章:生成對抗網絡(GAN):從概念到代碼實踐(附代碼)
第十一章:計算機視覺:經典數據格式(VOC、YOLO、COCO)解析與轉換(附代碼)
第十二章:計算機視覺:YOLOv11遙感圖像目標檢測(附代碼)

在計算機視覺(CV)領域,無論是進行目標檢測、圖像分類還是其他任務,理解如何處理不同格式的數據集以及掌握訓練過程中涉及的關鍵指標至關重要。本文將探討三種經典的數據格式(VOC、YOLO、COCO)

一、VOC 格式

VOC(Visual Object Classes)格式是一種廣泛應用于目標檢測任務的數據標注標準,尤其常見于PASCAL VOC挑戰賽中。它使用XML文件來存儲圖像中的對象位置信息和類別信息。

文件結構與內容

每個圖像對應一個XML文件,該文件包含了圖像的基本信息以及圖像中每個對象的位置和類別標簽。以下是一個典型的VOC格式XML文件的內容示例:

<annotation><folder>images</folder><filename>000001.jpg</filename><size><width>500</width><height>375</height><depth>3</depth></size><object><name>dog</name><pose>Left</pose><truncated>1</truncated><difficult>0</difficult><bndbox><xmin>263</xmin><ymin>211</ymin><xmax>324</xmax><ymax>339</ymax></bndbox></object><object><name>person</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>159</xmin><ymin>59</ymin><xmax>281</xmax><ymax>287</ymax></bndbox></object>
</annotation>

關鍵元素說明

  • <folder>:包含圖像的文件夾名稱。
  • <filename>:圖像文件名。
  • <size>:描述圖像尺寸,包括寬度、高度和深度(通常是3表示RGB圖像)。
  • <object>:每個對象的信息塊,可以有多個,每個對象包含:
    • <name>:對象類別名稱。
    • <pose>:拍攝時物體的姿態。
    • <truncated>:指示物體是否被裁剪(部分位于圖像外)。
    • <difficult>:指示物體是否難以識別。
    • <bndbox>:邊界框坐標,包括:
      • <xmin>, <ymin>:邊界框左上角的絕對坐標(像素值)。
      • <xmax>, <ymax>:邊界框右下角的絕對坐標(像素值)。

處理VOC數據的Python代碼示例

下面是一個簡單的例子,展示如何讀取并解析VOC格式的XML文件,并提取其中的對象信息:

from xml.etree import ElementTreedef parse_voc_xml(file_path):tree = ElementTree.parse(file_path)root = tree.getroot()# 獲取圖像尺寸img_width = int(root.find("size/width").text)img_height = int(root.find("size/height").text)objects = []for obj in root.findall("object"):name = obj.find("name").textxmin = int(obj.find("bndbox/xmin").text)ymin = int(obj.find("bndbox/ymin").text)xmax = int(obj.find("bndbox/xmax").text)ymax = int(obj.find("bndbox/ymax").text)objects.append({"name": name,"bbox": [xmin, ymin, xmax, ymax]})return img_width, img_height, objects# 使用示例
file_path = "path/to/voc_annotation.xml"
width, height, objs = parse_voc_xml(file_path)
print(f"Image width: {width}, height: {height}")
for obj in objs:print(obj)

此代碼段展示如何從給定的VOC格式XML文件中提取圖像尺寸和每個對象的位置及類別信息。

二、YOLO 格式

YOLO(You Only Look Once)是一種流行的目標檢測算法,它使用一種特定的數據標注格式來描述圖像中的對象位置和類別信息。與VOC或COCO等其他數據格式不同,YOLO格式采用文本文件(.txt)存儲每個圖像的標注信息,這些信息包括對象的類別ID及其邊界框的位置坐標。

文件結構與內容

對于每張圖像,YOLO格式會有一個對應的文本文件,該文件中每一行代表一個對象,并且包含五個數值:

  1. 類別ID(cls_id
  2. 邊界框中心點的x坐標(x_center
  3. 邊界框中心點的y坐標(y_center
  4. 邊界框的寬度(w
  5. 邊界框的高度(h

所有坐標都是相對坐標,即相對于圖像寬度和高度的比例值(0到1之間的小數),而不是絕對像素值。以下是YOLO格式的一個簡單示例:

假設有一張分辨率為640x480的圖片,其中包含兩個對象:一只狗和一個人。相應的YOLO格式標注文件可能如下所示:

0 0.500000 0.600000 0.250000 0.300000 # 狗
1 0.300000 0.200000 0.100000 0.150000 # 人
  • 第一行表示“狗”的類別ID為0,其邊界框中心位于圖像寬度的50%、高度的60%,寬度占整個圖像寬度的25%,高度占30%。
  • 第二行表示“人”的類別ID為1,其邊界框中心位于圖像寬度的30%、高度的20%,寬度占整個圖像寬度的10%,高度占15%。
    在這里插入圖片描述

處理YOLO數據的Python代碼示例

以下是一個簡單的例子,展示如何將VOC格式轉換為YOLO格式,并讀取YOLO格式的數據。

from xml.etree import ElementTreedef voc_to_yolo(voc_file_path, output_file_path, label2idx):tree = ElementTree.parse(voc_file_path)root = tree.getroot()img_width = int(root.find("size/width").text)img_height = int(root.find("size/height").text)with open(output_file_path, 'w') as f:for obj in root.findall("object"):name = obj.find("name").textcls_id = label2idx[name]xmin = int(obj.find("bndbox/xmin").text)ymin = int(obj.find("bndbox/ymin").text)xmax = int(obj.find("bndbox/xmax").text)ymax = int(obj.find("bndbox/ymax").text)# 這是計算邊界框左上角和右下角的x坐標的平均值,即邊界框中心點的x坐標(以像素為單位)。x_center = (xmin + xmax) / 2.0 / img_width# 這是計算邊界框左上角和右下角的y坐標的平均值,即邊界框中心點的y坐標(以像素為單位)。y_center = (ymin + ymax) / 2.0 / img_heightwidth = (xmax - xmin) / float(img_width)height = (ymax - ymin) / float(img_height)line = f"{cls_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n"f.write(line)# 示例用法
label2idx = {"dog": 0, "person": 1}
voc_file_path = "path/to/voc_annotation.xml"
output_file_path = "path/to/output.txt"
voc_to_yolo(voc_file_path, output_file_path, label2idx)

在YOLO格式中,邊界框的坐標是以相對坐標的形式表示的,而不是絕對像素值。具體來說,x_centery_center 分別代表邊界框中心點相對于圖像寬度和高度的比例值(范圍從0到1),而 wh 分別代表邊界框的寬度和高度相對于圖像寬度和高度的比例值。

公式解釋

x_center = (xmin + xmax) / 2.0 / img_width
y_center = (ymin + ymax) / 2.0 / img_height

計算邊界框中心點的相對坐標

  1. 計算邊界框中心點的絕對坐標

    • (xmin + xmax) / 2.0:這是計算邊界框左上角和右下角的x坐標的平均值,即邊界框中心點的x坐標(以像素為單位)。
    • (ymin + ymax) / 2.0:這是計算邊界框左上角和右下角的y坐標的平均值,即邊界框中心點的y坐標(以像素為單位)。
  2. 轉換為相對坐標

    • / img_width:將邊界框中心點的x坐標除以圖像的寬度,得到一個比例值(范圍從0到1)。例如,如果邊界框中心點的x坐標是320像素,而圖像的寬度是640像素,則 x_center 的值為 320 / 640 = 0.5
    • / img_height:將邊界框中心點的y坐標除以圖像的高度,得到一個比例值(范圍從0到1)。例如,如果邊界框中心點的y坐標是240像素,而圖像的高度是480像素,則 y_center 的值為 240 / 480 = 0.5

示例

假設有一張分辨率為640x480的圖片,其中有一個對象的邊界框坐標如下:

  • xmin = 100
  • ymin = 150
  • xmax = 300
  • ymax = 350

根據上述公式計算:

  1. 計算邊界框中心點的絕對坐標

    • x_center_abs = (100 + 300) / 2.0 = 200
    • y_center_abs = (150 + 350) / 2.0 = 250
  2. 轉換為相對坐標

    • x_center_rel = 200 / 640 ≈ 0.3125
    • y_center_rel = 250 / 480 ≈ 0.5208

因此,在YOLO格式的標注文件中,該對象的標注信息可能如下所示:

0 0.3125 0.5208 0.3125 0.4167

其中:

  • 0 是類別ID。
  • 0.3125 是邊界框中心點的x坐標相對于圖像寬度的比例值。
  • 0.5208 是邊界框中心點的y坐標相對于圖像高度的比例值。
  • 0.3125 是邊界框寬度相對于圖像寬度的比例值((300 - 100) / 640 = 200 / 640 ≈ 0.3125)。
  • 0.4167 是邊界框高度相對于圖像高度的比例值((350 - 150) / 480 = 200 / 480 ≈ 0.4167)。

讀取YOLO格式數據

def read_yolo_annotations(file_path):annotations = []with open(file_path, 'r') as f:lines = f.readlines()for line in lines:parts = line.strip().split()cls_id = int(parts[0])x_center, y_center, w, h = map(float, parts[1:])annotations.append({"cls_id": cls_id,"bbox": [x_center, y_center, w, h]})return annotations# 示例用法
file_path = "path/to/yolo_annotation.txt"
annotations = read_yolo_annotations(file_path)
for annotation in annotations:print(annotation)

通過上述示例,可以輕松地在VOC格式和YOLO格式之間進行轉換,并讀取YOLO格式的數據。這對于準備訓練數據集或進行數據分析非常有用。

三、COCO 格式

COCO(Common Objects in Context)格式是一種廣泛用于計算機視覺任務,特別是目標檢測、分割和關鍵點檢測的數據標注標準。它采用JSON文件來存儲圖像及其對應的注釋信息,具有高度結構化的特點,支持復雜的多對象標注。

文件結構與內容

COCO格式的JSON文件通常包含以下幾個主要部分:

  1. images: 包含圖像的基本信息。
  2. annotations: 描述圖像中的每個對象或區域的信息。
  3. categories: 定義所有可能的對象類別。

以下是一個簡化的COCO格式JSON文件示例:

{"images": [{"id": 0,"width": 640,"height": 480,"file_name": "000000000009.jpg"}],"annotations": [{"id": 1,"image_id": 0,"category_id": 1,"bbox": [100, 150, 200, 200],"area": 40000,"iscrowd": 0},{"id": 2,"image_id": 0,"category_id": 2,"bbox": [300, 200, 100, 150],"area": 15000,"iscrowd": 0}],"categories": [{"id": 1,"name": "person","supercategory": "person"},{"id": 2,"name": "dog","supercategory": "animal"}]
}
  • images: 每個元素包含一個圖像的信息,如ID、寬度、高度和文件名。
  • annotations: 每個元素描述一個對象的位置(通過邊界框bbox)、面積area、是否為群體對象iscrowd等信息。
  • categories: 定義了所有可能的對象類別及其ID。

關鍵字段解釋

  • bbox: 邊界框的坐標,格式為 [x, y, width, height],其中xy是邊界框左上角的絕對坐標(像素值),widthheight是邊界框的寬度和高度(同樣以像素為單位)。
  • area: 對象的面積,對于目標檢測任務,這通常是邊界框的面積(寬度乘以高度)。
  • iscrowd: 標記該對象是否為群體對象(例如一群人聚集在一起)。如果為1,則表示該對象是一個群體;如果為0,則表示單獨的對象。

處理COCO數據的Python代碼示例

下面是一個簡單的例子,展示如何讀取并解析COCO格式的JSON文件,并提取其中的對象信息:

import jsondef parse_coco_json(file_path):with open(file_path, 'r') as f:data = json.load(f)images = {img['id']: img for img in data['images']}categories = {cat['id']: cat for cat in data['categories']}annotations = []for ann in data['annotations']:image_info = images[ann['image_id']]category_info = categories[ann['category_id']]annotation = {"image_id": ann['image_id'],"filename": image_info['file_name'],"category_id": ann['category_id'],"category_name": category_info['name'],"bbox": ann['bbox'],"area": ann['area']}annotations.append(annotation)return annotations# 示例用法
file_path = "path/to/coco_annotation.json"
annotations = parse_coco_json(file_path)
for annotation in annotations:print(annotation)

輸出結果:

{'image_id': 0, 'filename': '000000000009.jpg', 'category_id': 1, 'category_name': 'person', 'bbox': [100, 150, 200, 200], 'area': 40000}
{'image_id': 0, 'filename': '000000000009.jpg', 'category_id': 2, 'category_name': 'dog', 'bbox': [300, 200, 100, 150], 'area': 15000}

上述代碼首先將imagescategories轉換為字典以便快速查找,然后遍歷所有的annotations,從中提取相關信息并打印出來。

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

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

相關文章

linux--多進程基礎(2)GDB多進程調試(面試會問)

將其中的命令記住就行。 總結&#xff1a;GDB下默認調試父進程&#xff0c;可以設置調試父進程還是子進程&#xff0c;也可以設置調試模式&#xff0c;調試模式默認是on即一個在調試另一個直接運行&#xff0c;off就是另一個進程掛起&#xff0c;最后可以查看調試進程 一般默認…

Cramér-Rao界:參數估計精度的“理論底線”

Cramr-Rao界&#xff1a;參數估計精度的“理論底線” 在統計學中&#xff0c;當我們用數據估計一個模型的參數時&#xff0c;總希望估計結果盡可能精確。但精度有沒有一個理論上的“底線”呢&#xff1f;答案是有的&#xff0c;這就是Cramr-Rao界&#xff08;Cramr-Rao Lower …

【復習】Redis

數據結構 Redis常見的數據結構 String&#xff1a;緩存對象Hash&#xff1a;緩存對象、購物車List&#xff1a;消息隊列Set&#xff1a;點贊、共同關注ZSet&#xff1a;排序 Zset底層&#xff1f; Zset底層的數據結構是由壓縮鏈表或跳表實現的 如果有序集合的元素 < 12…

Git add --- error: Filename too long

0 Preface/Foreword 1 解決辦法 git config --system core.longpaths true

在 Spring Boot 中使用 `@Autowired` 和 `@Bean` 注解

文章目錄 在 Spring Boot 中使用 Autowired 和 Bean 注解示例背景 1. 定義 Student 類2. 配置類&#xff1a;初始化 Bean3. 測試類&#xff1a;使用 Autowired 注解自動注入 Bean4. Spring Boot 的自動裝配5. 總結 在 Spring Boot 中使用 Autowired 和 Bean 注解 在 Spring Bo…

【AI+智造】DeepSeek價值重構:當采購與物控遇上數字化轉型的化學反應

作者&#xff1a;Odoo技術開發/資深信息化負責人 日期&#xff1a;2025年2月24日 引言&#xff1a;從事企業信息化工作16年&#xff0c;我見證過無數企業從手工臺賬到ERP系統的跨越。但真正讓采購和物控部門脫胎換骨的&#xff0c;是融合了Deepseek AI的Odoo數字化解決方案——…

qt-C++筆記之創建和初始化 `QGraphicsScene` 和 `QGraphicsView` 并關聯視圖和場景的方法

qt-C++筆記之創建和初始化 QGraphicsScene 和 QGraphicsView 并關聯視圖和場景的方法 code review! 參考筆記 1.qt-C++筆記之創建和初始化 QGraphicsScene 和 QGraphicsView 并關聯視圖和場景的方法 2.qt-C++筆記之QGraphicsScene和 QGraphicsView中setScene、通過scene得到vie…

Java Map實現類面試題

Java Map實現類面試題 HashMap Q1: HashMap的實現原理是什么&#xff1f; HashMap基于哈希表實現&#xff0c;使用數組鏈表紅黑樹&#xff08;Java 8&#xff09;的數據結構。 public class HashMapPrincipleExample {// 模擬HashMap的基本結構public class SimpleHashMap&…

Win32/ C++ 簡易對話框封裝框架(多語言, 通知欄菜單, 拖拽文件處理)

Win32 簡易對話框封裝簡易框架示例 1. 菜單操作: 多語言 2. 通知欄圖標菜單 3. 其他操作: 接受拖拽文件等等 CDialogFrame.h #pragma once #include "CWindow/CDialogBase.h" #include "CNSFHeader.h" #include "Win32Utils/CBytesUtils.h" …

如何在WordPress網站中查看移動版本—快速預覽與自定義設置

在WordPress網站的構建過程中&#xff0c;確保網站在移動端的顯示效果至關重要。畢竟&#xff0c;隨著越來越多的用戶通過手機訪問互聯網&#xff0c;一個優化良好的移動版網站將直接影響用戶的留存率和訪問體驗。 如果你是WordPress網站的所有者&#xff0c;本文將向你介紹如…

課程1. 深度學習簡介

課程1. 深度學習簡介 神經網絡結構邏輯回歸XOR問題&#xff08;異或問題&#xff09; 中間特征的生成全連接神經網絡中間網絡層的激活函數Sigmoid函數Tanh函數ReLU函數其它激活函數 使用全連接神經網絡解決 XOR 問題神經網絡用于回歸問題訓練神經網絡 不同類型的神經網絡 附加材…

Vue.js Vue 測試工具:Vue Test Utils 與 Jest

Vue.js Vue 測試工具&#xff1a;Vue Test Utils 與 Jest 在 Vue.js 的開發過程中&#xff0c;編寫和執行測試是確保應用質量和穩定性的關鍵步驟。Vue Test Utils 和 Jest 是 Vue.js 官方推薦的測試工具&#xff0c;二者結合使用&#xff0c;可以高效地進行單元測試和集成測試…

數據結構 1-2 線性表的鏈式存儲-鏈表

1 原理 順序表的缺點&#xff1a; 插入和刪除移動大量元素數組的大小不好控制占用一大段連續的存儲空間&#xff0c;造成很多碎片 鏈表規避了上述順序表缺點 邏輯上相鄰的兩個元素在物理位置上不相鄰 頭結點 L&#xff1a;頭指針 頭指針&#xff1a;鏈表中第一個結點的存儲…

各種以太坊Rollup技術

以太坊Rollup技術是一種通過將大量交易批處理并在主鏈上記錄較小的數據摘要來擴展以太坊網絡的方法。Rollup技術主要分為兩種類型&#xff1a;樂觀Rollup&#xff08;Optimistic Rollup&#xff09;和零知識Rollup&#xff08;ZK-Rollup&#xff09;。下面詳細介紹這兩種技術及…

Kubernetes開發環境minikube | 開發部署MySQL單節點應用

minikube是一個主要用于開發與測試Kubernetes應用的運行環境 本文主要描述在minikube運行環境中部署MySQL單節點應用 minikube start --force kubectl get nodes 如上所示&#xff0c;啟動minikube單節點運行環境 minikube ssh docker pull 如上所示&#xff0c;從MySQL官…

DeepSeek 助力 Vue 開發:打造絲滑的二維碼生成(QR Code)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

一文詳解U盤啟動UEFI/Legacy方式以及GPT/MBR關系

對于裝系統的老手而說一直想研究一下裝系統的原理&#xff0c;以及面對一些問題時的解決思路&#xff0c;故對以前的方法進行原理上的解釋&#xff0c;主要想理解其底層原理。 引導模式 MBR分區可以同時支持UEFI和Legacy引導&#xff0c;我們可以看一下微pe制作的啟動盤&#…

回合制游戲文字版(升級)

//在上一篇博客的基礎上&#xff0c;加了細節的改動 //改動&#xff1a;添加了外貌&#xff0c;性別&#xff0c;招式的細節描繪&#xff1b;添加了個人信息展示界面 //一創建java文件1&#xff0c;命名為playGame package test2;import java.util.Random;public class play…

halcon三維點云數據處理(二十五)moments_object_model_3d

目錄 一、moments_object_model_3d例程二、moments_object_model_3d函數三、效果圖一、moments_object_model_3d例程 這個例子說明了如何使用moments_object_model_3d運算符來將3D數據與x、y、z坐標軸對齊。在實際應用中,通過3D傳感器獲取的物體模型可能具有一個與物體主軸不…

一周學會Flask3 Python Web開發-flask3上下文全局變量session,g和current_app

鋒哥原創的Flask3 Python Web開發 Flask3視頻教程&#xff1a; 2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili flask3提供了session,g和current_app上下文全局變量來方便我們操作訪問數據。 以下是一個表格&#xff0c;用于比較Flask中的…