导出数据结构
关系结构
任务 -> 批次 -> 条目 -> 帧
YOLO
一张图片对应一个文本文件
.txt
<object-class> <x> <y> <width> <height>
归一化处理
找到物体在图像中的中心点的 x,y 坐标
物体在图像中的宽度和高度
VOC
一张图片对应一个XML文件
.xml
<annotation>
<folder />
<filename>IMG20240423143425.jpg</filename> # 文件名
<path>NjY4Y2Y5NzAwZjdmMjU4NDVkZTkzODlm/20240709164944/番茄照片_副本/IMG20240423143425.jpg</path>
<source>
<database>Unknown</database>
</source>
<size> # 图片尺寸,用于对bbox左上和右下坐标点做归一化操作
<width>3072</width>
<height>4096</height>
<depth>3</depth>
</size>
<segmented>0</segmented> # 是否用于分割
<object>
<name>无遮挡</name> # 物体类别
<pose>Unspecified</pose> # 拍摄角度: front, rear, left, right, unspecified
<truncated>Unspecified</truncated> # 目标是否被截断(比如在图片之外),或者被遮挡(超过15%)
<difficult>0</difficult> # 检测难易程度,这个主要是根据目标的大小,光照变化,图片质量来判断
<bndbox> # boundingbox左上角点的横纵坐标, 右下角点的横纵坐标
<xmin>1403</xmin>
<ymin>522</ymin>
<xmax>1894</xmax>
<ymax>1137</ymax>
</bndbox>
</object>
</annotation>
LabelMe
一个图片对应一个JSON文件
version:版本信息
flags:可以为空
shapes:包含图片所有标注信息的数组
imagePath:图片路径
imageData:图片的Base64形式
imageHeight:图片的高
imageWidth:图片的宽
shapes字段是包含多个目标的标注信息的数组。
[
{
"label": "people",
"points": [[x1,y1],[x2,y2],...[xn,yn]]
},
{
"label": "car",
"points": [[x1,y1],[x2,y2],...[xn,yn]]
},
...
]
COCO
一个批次一个JSON文件
.json
边界框(bbox)以[x_min, y_min, width, height]形式标注
分别为边界框的左上角坐标,宽度和高度
{
"images" : 图片信息
"categories" : 标注种类
"annotations" : 标注
}
JSON
可视化
from PIL import Image, ImageDraw
import json
from pathlib import Path
from urllib.parse import urlparse
json_path = Path("D:/0815change/2024-08-16_07_33_35-export/data/ZGY_2824.json")
with json_path.open(encoding="utf-8") as f:
json_data = json.load(f)
# 0 代表无遮挡 1 代表有遮挡
mode = 0
for img in json_data:
url = img['info']
urls = urlparse(url)
filename = Path(urls.path).name
# 获取到文件名
print(filename)
img_url = "D:/0815change/2024-08-16_07_33_35-export/resource/20240709164944/番茄照片_副本/" + filename
image = Image.open(img_url)
# 获取点的信息
points = img['labels']
for j in points:
for k in j.items():
if k[0] == "label" and k[1] == "无遮挡":
mode = 0
if k[0] == "label" and k[1] == "被遮挡":
mode = 1
if k[0] == "points":
x1 = k[1][0]
y1 = k[1][1]
x2 = k[1][2]
y2 = k[1][3]
rect_coords = (x1, y1, x2, y2)
draw = ImageDraw.Draw(image)
if mode == 0:
draw.rectangle(rect_coords, outline="blue", width=5)
else:
draw.rectangle(rect_coords, outline="green", width=5)
image.show()