目录
🍓🍓1.YOLO格式数据
🍭1.1数据格式
YOLO格式数据后缀为txt
🍋1.2YOLO格式数据示例
YOLO格式数据一般包含图片路径、图片宽度和高度、物体类别和物体位置信息等。其中物体位置信息通常由目标框的左上角坐标(x,y)、目标框的宽度和高度 (w,h) 构成,统称为bounding box (BBox)。
以下是一个YOLO格式数据的示例:
1 0.5685714285714286 0.39084507042253525 0.02 0.03051643192488263
0 0.8114285714285714 0.5363849765258216 0.022857142857142857 0.04460093896713615
1 0.845 0.6666666666666666 0.024285714285714285 0.046948356807511735
2 0.6335714285714286 0.18427230046948356 0.01 0.01643192488262911
每一行表示一个目标框,每个目标框由一组5个数字(归一化)组成,每个数字代表的含义如下。
- label_index :为标签名称在标签数组中的索引,下标从 0 开始。
- cx:标记框中心点的 x 坐标,数值是原始中心点 x 坐标除以 图宽 后的结果。
- cy:标记框中心点的 y 坐标,数值是原始中心点 y 坐标除以 图高 后的结果。
- w:标记框的 宽,数值为 原始标记框的 宽 除以 图宽 后的结果。
- h:标记框的 高,数值为 原始标记框的 高 除以 图高 后的结果。
🍇1.3YOLO格式可视化
YOLO格式的label可视化python代码:
import cv2
# 画在原图001.jpg上
img = cv2.imread('001.jpg')
h, w, _ = img.shape
# yolo标注数据文件名为001.txt
with open('001.txt', 'r') as f:
temp = f.read()
temp = temp.split()
# 根据公式进行转换
x_, y_, w_, h_ = eval(temp[1]), eval(temp[2]), eval(temp[3]), eval(temp[4])
x1 = w * x_ - 0.5 * w * w_
x2 = w * x_ + 0.5 * w * w_
y1 = h * y_ - 0.5 * h * h_
y2 = h * y_ + 0.5* h * h_
# 画图验证,注意画图坐标要转换成int格式
cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0))
cv2.imshow('yolo_display', img)
cv2.waitKey(0)
🍓🍓2.COCO数据格式
🍭2.1数据格式
coco格式数据后缀为json
COCO 数据集的格式是基于 JSON(JavaScript Object Notation)的,使用一个主 JSON 文件来描述整个数据集,以及其他辅助的 JSON 文件来存储图像和标注等信息。在 COCO 数据集格式中,主要的 JSON 文件通常被称为 "instance" 文件,它包含了以下重要字段:
- "info" 字段:用于描述数据集的基本信息,例如名称、版本、年份等。
- "license" 字段:包含了数据集使用的许可证信息,可以指定数据集的使用和共享方式。
- "images" 字段:存储了每张图像的相关信息,包括图像的唯一标识符、文件名、高度、宽度等。
- "annotations" 字段:记录了每个图像的标注信息,每个标注包含了一些必要的信息,如标注的唯一标识符、所属图像的标识符、类别、边界框信息等。
- "categories" 字段:定义了数据集中所有类别的信息,包括类别的唯一标识符、名称等。
🍋2.2COCO格式数据示例
以下是一个COCO数据格式的JSON文件的例子:
{
"info": {
"year": 2021,
"version": "1.0",
"description": "COCO Dataset Example",
"contributor": "John Doe",
"url": "http://example.com",
"date_created": "2021-06-01"
},
"licenses": [
{
"id": 1,
"name": "License 1",
"url": "http://example.com/license1"
},
{
"id": 2,
"name": "License 2",
"url": "http://example.com/license2"
}
],
"images": [
{
"id": 1,
"width": 500,
"height": 400,
"file_name": "image1.jpg",
"license": 1,
"date_captured": "2021-01-01"
},
{
"id": 2,
"width": 800,
"height": 600,
"file_name": "image2.jpg",
"license": 2,
"date_captured": "2021-02-01"
}
],
"annotations": [
{
"id": 1,
"image_id": 1,
"category_id": 1,
"bbox": [100, 100, 200, 200],
"area": 40000,
"iscrowd": 0
},
{
"id": 2,
"image_id": 1,
"category_id": 2,
"bbox": [300, 200, 150, 250],
"area": 37500,
"iscrowd": 1
},
{
"id": 3,
"image_id": 2,
"category_id": 1,
"bbox": [50, 50, 300, 400],
"area": 120000,
"iscrowd": 0
}
],
"categories": [
{
"id": 1,
"name": "cat",
"supercategory": "animal"
},
{
"id": 2,
"name": "dog",
"supercategory": "animal"
}
]
}
JSON文件包含了一个COCO数据集的基本信息。它包括了数据集的信息(年份、版本、描述等)、许可证信息、图像信息(宽度、高度、文件名等)、标注信息(标注ID、图像ID、类别ID、边界框、面积等)以及类别信息(类别ID、类别名称、超类别等)。
🍇2.3COCO格式可视化
coco格式的label可视化python代码:
import json
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from PIL import Image
def load_data(json_file, image_file):
with open(json_file, 'r') as f:
data = json.load(f)
image = Image.open(image_file)
return data, image
def draw_bbox(image, bbox, label):
ax = plt.gca()
rect = Rectangle((bbox[0], bbox[1]), bbox[2], bbox[3], linewidth=1, edgecolor='red', facecolor='none')
ax.add_patch(rect)
plt.text(bbox[0], bbox[1], label, fontsize=10, color='red', weight='bold')
def visualize(json_file, image_file):
data, image = load_data(json_file, image_file)
plt.imshow(image)
for ann in data['annotations']:
label = data['categories'][ann['category_id']]['name']
bbox = ann['bbox']
draw_bbox(image, bbox, label)
plt.axis('off')
plt.show()
json_file = 'path_to_json_file.json'
image_file = 'path_to_image_file.jpg'
visualize(json_file, image_file)
记得将path_to_json_file.json
和path_to_image_file.jpg
替换为实际的文件路径。
🍓🍓3.VOC数据格式
🍭3.1数据格式
VOC格式数据后缀为xml
🍋3.2VOC格式数据示例
VOC数据格式是一种用于图像标注的标准格式,它用于存储图像及其相关的标注信息。在VOC格式中,每张图片的标注标签信息会被保存到一个XML文件中。XML文件的结构包括以下几个部分:
- annotation:这是整个XML文件的主要部分,包含了图片的名字及基本信息。
- folder:图片所在的文件夹名称。
- filename:图片的文件名。
- path:图片的完整路径。
- source:图片的来源信息,例如图片来自哪个数据库。
- size:图片的尺寸信息,包括宽度、高度和深度。
- segmented:图片是否被分割,0表示未分割,1表示被分割。
- object:每个目标的标定框坐标,包括左上角的坐标和右下角的坐标。
以下是一个VOC数据格式的JSON文件的例子:
<annotation>
<folder>17</folder> # 图片所处文件夹
<filename>77258.bmp</filename> # 图片名
<path>~/frcnn-image/61/ADAS/image/frcnn-image/17/77258.bmp</path>
<source> #图片来源相关信息
<database>Unknown</database>
</source>
<size> #图片尺寸
<width>640</width>
<height>480</height>
<depth>3</depth>
</size>
<segmented>0</segmented> #是否有分割label
<object> 包含的物体
<name>car</name> #物体类别
<pose>Unspecified</pose> #物体的姿态
<truncated>0</truncated> #物体是否被部分遮挡(>15%)
<difficult>0</difficult> #是否为难以辨识的物体, 主要指要结体背景才能判断出类别的物体。虽有标注, 但一般忽略这类物体
<bndbox> #物体的bound box
<xmin>2</xmin> #左
<ymin>156</ymin> #上
<xmax>111</xmax> #右
<ymax>259</ymax> #下
</bndbox>
</object>
</annotation>
🍇3.3COCO格式可视化
coco格式的label可视化python代码:
import cv2
import xml.etree.ElementTree as ET
def visualize_labels(image_path, xml_path):
# 读取图像
image = cv2.imread(image_path)
# 读取XML文件
tree = ET.parse(xml_path)
root = tree.getroot()
# 遍历XML文件中的对象
for obj in root.findall('object'):
bbox = obj.find('bndbox')
# 提取边界框的坐标
xmin = int(bbox.find('xmin').text)
ymin = int(bbox.find('ymin').text)
xmax = int(bbox.find('xmax').text)
ymax = int(bbox.find('ymax').text)
# 在图像上绘制边界框
cv2.rectangle(image, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2)
# 提取对象的标签
label = obj.find('name').text
# 在图像上标注对象的标签
cv2.putText(image, label, (xmin, ymin - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
# 显示图像
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 示例用法
image_path = 'path_to_image.jpg'
xml_path = 'path_to_xml.xml'
visualize_labels(image_path, xml_path)
说明:
- 首先,需要将
path_to_image.jpg
替换为实际的图像文件路径。 - 然后,将
path_to_xml.xml
替换为相应图像的VOC格式的XML标签文件路径。 - 使用
cv2.rectangle
函数绘制边界框,使用cv2.putText
函数标注对象的标签。 - 最后,使用
cv2.imshow
函数显示可视化结果,按任意键关闭图像窗口。
整理不易,欢迎一键三连!!!
送你们一条美丽的--分割线--
🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸⛵⛵⭐⭐🍎🍎👍👍🌷🌷