计算机视觉:经典数据格式(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格式会有一个对应的文本文件,该文件中每一行代表一个对象,并且包含五个数值:
- 类别ID(
cls_id
) - 边界框中心点的x坐标(
x_center
) - 边界框中心点的y坐标(
y_center
) - 边界框的宽度(
w
) - 边界框的高度(
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_center
和 y_center
分别代表边界框中心点相对于图像宽度和高度的比例值(范围从0到1),而 w
和 h
分别代表边界框的宽度和高度相对于图像宽度和高度的比例值。
公式解释
x_center = (xmin + xmax) / 2.0 / img_width
y_center = (ymin + ymax) / 2.0 / img_height
计算边界框中心点的相对坐标
-
计算边界框中心点的绝对坐标:
(xmin + xmax) / 2.0
:这是计算边界框左上角和右下角的x坐标的平均值,即边界框中心点的x坐标(以像素为单位)。(ymin + ymax) / 2.0
:这是计算边界框左上角和右下角的y坐标的平均值,即边界框中心点的y坐标(以像素为单位)。
-
转换为相对坐标:
/ 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
根据上述公式计算:
-
计算边界框中心点的绝对坐标:
x_center_abs = (100 + 300) / 2.0 = 200
y_center_abs = (150 + 350) / 2.0 = 250
-
转换为相对坐标:
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文件通常包含以下几个主要部分:
- images: 包含图像的基本信息。
- annotations: 描述图像中的每个对象或区域的信息。
- 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]
,其中x
和y
是边界框左上角的绝对坐标(像素值),width
和height
是边界框的宽度和高度(同样以像素为单位)。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}
上述代码首先将images
和categories
转换为字典以便快速查找,然后遍历所有的annotations
,从中提取相关信息并打印出来。
相关文章:

计算机视觉:经典数据格式(VOC、YOLO、COCO)解析与转换(附代码)
第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络(附代码) 第五章࿱…...

FPGA DSP:Vivado 中带有 DDS 的 FIR 滤波器
本文使用 DDS 生成三个信号,并在 Vivado 中实现低通滤波器。低通滤波器将滤除相关信号。 介绍 用DDS生成三个信号,并在Vivado中实现低通滤波器。低通滤波器将滤除较快的信号。 本文分为几个主要部分: 信号生成:展示如何使用DDS&am…...

记录此刻:历时两月,初步实现基于FPGA的NVMe SSD固态硬盘存储控制器设计!
背景 为满足实验室横向项目需求,在2024年12月中下旬导师提出基于FPGA的NVMe SSD控制器研发项目。项目核心目标为:通过PCIe 3.0 x4接口实现单盘3000MB/s的持续读取速率。 实现过程 调研 花了半个月的时间查阅了一些使用FPGA实现NVME SSD控制器的论文、…...
【计算机网络】OSI模型、TCP/IP模型、路由器、集线器、交换机
一、计算机网络分层结构 计算机网络分层结构 指将计算机网络的功能划分为多个层次,每个层次都有其特定的功能和协议,并且层次之间通过接口进行通信。 分层设计的优势: 模块化:各层独立发展(如IPv4→IPv6,…...

正点原子[第三期]Arm(iMX6U)Linux系统移植和根文件系统构建-5.3 xxx_defconfig过程
前言: 本文是根据哔哩哔哩网站上“arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …...

250223-Linux/MacOS如何跳过Miniconda的条款阅读,直接安装Miniconda
你可以通过将 -b 参数传递给 Miniconda 的安装脚本,来跳过条款阅读并自动同意许可条款。这样安装会自动进行到下一步的选择项。下面是具体的安装命令: bash Miniconda3-latest-Linux-x86_64.sh -b这里的 -b 代表“批量模式”(batch mode&…...

点云的几何特征
点云的几何特征是基于一个点周围的邻域对该点周围几何形状的描述。例如,位于墙面上的一个点将具有较高的平面度planarity。 基于局部点云的特征值 λ1、λ2 和 λ3 以及特征向量 e1、e2 和e3计算得到的一系列几何特征,这些特征用于描述点云中点的局部几…...

月之暗面新发布: MUON 在 LLM 训练中的可扩展性
MUON 在 LLM 训练中的可扩展性 摘要 最近,基于矩阵正交化的 Muon 优化器(K. Jordan 等人,2024 年)在训练小型语言模型方面表现出色,但其在更大规模模型上的可扩展性尚未得到验证。我们确定了 Muon 放大的两个关键技术…...
10.Docker 仓库管理
Docker 仓库管理 Docker 仓库管理 Docker 仓库管理 Docker 仓库,类似于 yum 仓库,是用来保存镜像的仓库。为了方便的管理和使用 docker 镜像,可以将镜像集中保存至 Docker 仓库中,将制作好的镜像 push 到仓库集中保存,在需要镜像…...

Deepseek存算分离安全部署手册
Deepseek大火后,很多文章教大家部署Dfiy和ollamadeepseek,但是大部分都忽略了数据安全问题,本文重点介绍Deepseek存算分裂安全架设,GPU云主机只负责计算、CPU本地主机负责数据存储,确保数据不上云,保证私有…...

【Redis原理】底层数据结构 五种数据类型
文章目录 动态字符串SDS(simple dynamic string )SDS结构定义SDS动态扩容 IntSetIntSet 结构定义IntSet的升级 DictDict结构定义Dict的扩容Dict的收缩Dict 的rehash ZipListZipListEntryencoding 编码字符串整数 ZipList的连锁更新问题 QuickListQuickList源码 SkipListRedisOb…...
Java——抽象类
在Java中,抽象类(Abstract Class) 是一种特殊的类,用于定义部分实现的类结构,同时允许子类提供具体的实现。抽象类通常用于定义通用的行为或属性,而将具体的实现细节留给子类。 1. 抽象类的定义 语法&…...
DeepSeek在初创企业、教育和数字营销领域应用思考
如今,像 DeepSeek 这样的人工智能工具正在改变企业的运营方式,优化流程并显著提高生产力。通过重复任务的自动化、大量数据的分析以及内容创建效率的提高,组织正在寻找新的竞争和卓越方式。本文介绍了 DeepSeek 如何用于提高三个关键领域的生…...
java开发——为什么要使用动态代理?
举个例子:假如有一个杀手专杀男的,不杀女的。代码如下: public interface Killer {void kill(String name, String sex);void watch(String name); }public class ManKiller implements Killer {Overridepublic void kill(String name, Stri…...
c++中,什么时候应该使用mutable关键字?
在 C 中,mutable 关键字用于修饰类的成员变量,允许在 const 成员函数中修改这些变量。它的核心作用是区分 物理常量性(对象内存不可修改)和 逻辑常量性(对象对外表现的状态不变)。以下是详细解析࿱…...

deepseek本地部署,ragflow,docker
先下载ollama 1.官网下载 deepseek-r1:14bhttps://ollama.com/library/deepseek-r1:14b 2.GitHub下载GitHub - ollama/ollama: Get up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 2, and other large language models. 两种方式 安装完后,cmd-&g…...

智能优化算法:莲花算法(Lotus flower algorithm,LFA)介绍,提供MATLAB代码
一、 莲花算法 1.1 算法原理 莲花算法(Lotus flower algorithm,LFA)是一种受自然启发的优化算法,其灵感来源于莲花的自清洁特性和授粉过程。莲花的自清洁特性,即所谓的“莲花效应”,是由其叶片表面的微纳…...
通过AI辅助生成PPT (by quqi99)
作者:张华 发表于:2025-02-23 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) 问题 媳妇需要将一个pdf文件中的某些部分做成PPT课件,我在想是…...
P9631 [ICPC 2020 Nanjing R] Just Another Game of Stones Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作分两种: chmax ( l , r , k ) \operatorname{chmax}(l,r,k) chmax(l,r,k):对每个 i ∈ [ l , r ] i \in [l,r] i∈[l,…...

nodejs:vue 3 + vite 作为前端,将 html 填入<iframe>,在线查询英汉词典
向 doubao.com/chat/ 提问: node.js js-mdict 作为后端,vue 3 vite 作为前端,编写在线查询英汉词典 后端部分(express js-mdict ) 详见上一篇:nodejs:express js-mdict 作为后端ÿ…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...

SQLSERVER-DB操作记录
在SQL Server中,将查询结果放入一张新表可以通过几种方法实现。 方法1:使用SELECT INTO语句 SELECT INTO 语句可以直接将查询结果作为一个新表创建出来。这个新表的结构(包括列名和数据类型)将与查询结果匹配。 SELECT * INTO 新…...