☰
目标检测数据集制作全流程:从清洗标注到VOC/COCO/YOLO格式互转
2026/9/29 18:19:13 网站建设 项目流程

做了几年目标检测项目的朋友估计都有同感:模型结构选型、损失函数调参、训练脚本这些都还算好办,真正让项目拖期的,往往是数据集那摊子事。采集回来的图杂乱无章,标到一半发现工具不顺手,好不容易标完准备开训,又卡在VOC、COCO、YOLO三种格式互转上——类别对不上、坐标翻车、路径报错,一个晚上就耗进去了。

这篇就把检测数据集制作的全流程捋一遍:怎么收集清洗、用什么工具标注、三种主流格式的本质区别,以及格式互转时最容易踩的坑。全程用我自己实测过的方案和代码说话,从鸟类检测、开关闭合检测、电力红外巡检到车辆检测(比如BDD100K)、传送带异物检测这类典型场景都有涉及。无论你是刚接触目标检测的新手,还是被数据集折磨过的老手,照着这套流程走,能少走不少弯路。

1. 数据集制作的整体思路与需求拆解

1.1 "数据决定上限"不是口号

深度学习圈子里流传着一句话:模型决定了你能逼近上限多快,数据决定了上限在哪。这句话放到目标检测里尤其扎心。同样是YOLOv8,有人只在公共数据集上跑了个demo,换到自己业务场景就掉点严重;而有人自己攒了三千张高质量标注图,小模型也能吊打大模型。差别就在数据这一环。

我做检测项目这几年,见过太多人一上来就下开源模型,然后对着自己的业务数据哀嚎"为什么迁移效果这么差"。原因很简单——检测模型学到的东西,全是从标注框里来的。框得准不准、类别定义清不清楚、正负样本平不平衡,直接决定模型能不能在你的场景里work。所以数据集制作这件事,值得在项目启动时就当成一个正式工程来做,它的优先级不比模型选型低。

1.2 动手前先想清楚的四件事

我踩过的坑告诉我,制作数据集之前必须想清楚四件事,否则后面全是返工:

第一,任务类型是什么。是纯目标检测(框住就行),还是实例分割(要抠出轮廓),还是旋转框检测(比如遥感、电力巡检里的小目标)?任务类型不同,标注内容完全不同。你按检测框去标,后面想做分割就得全部重新标一遍。比如电力红外数据集firc-dataset这类场景,往往需要分割或者旋转框,一开始就要定好。

第二,类别体系怎么定。类别名称要稳定、互斥、覆盖完整。"开关闭合状态"和"开关打开状态"是两种类别,但"开关"这类笼统的叫法就是给自己挖坑。同类物体在不同形态下该不该算同一类,要在标注规范里写死,让标注员不用动脑子就能判断。

第三,数据规模和质量目标。一个实际场景的检测任务,起步通常要有几千张标注图,每类目标至少几百个实例。类别少的可以少一些,但难例(小目标、遮挡、光线变化)必须要补。

第四,最终喂给什么模型。这决定了你要输出什么格式。YOLO系用txt,老牌检测框架用VOC XML,很多开源评测和预训练用的是COCO JSON。虽然现在都有转换脚本,但一开始就定好目标格式,能让后续流程省心很多。

1.3 不同检测场景的数据集差异

不同业务的数据集,性格差异很大。我做过的几个项目就很典型:

  • 鸟类目标检测:目标小、姿态多变、背景复杂(树、水、天空),需要大量难例,标注时遮挡和欠遮挡的框要特别小心。
  • 开关闭合检测:目标种类固定但形态接近(开/关/半开),对边界框的精确度要求极高,因为类别区分可能就靠框内的细微结构差异。
  • 电力红外数据集(firc-dataset):图像分辨率高、目标小、热力图细节少,标注要看懂红外图像特征,普通标注员需要专门培训。
  • 车辆检测(BDD100K等):公开数据集本身就庞大,但天气、光照、城市场景差异巨大,做迁移时往往需要补充自己的业务场景数据。
  • 传送带异物检测:目标种类杂(各种杂物)、生产线背景固定、需要大量负样本,因为"异物"的本质就是"一切非正常物体"。

理解了这些差异,你才会明白为什么数据集制作不能靠一套模板打天下——清洗策略、标注规则、格式管理都要随场景调整。

2. 数据收集、清洗与平衡:标注前的最后一公里

2.1 数据从哪来:采集、公开集与合规

数据来源一般分三路,每路都要注意它的坑:

自有采集是最靠谱的。架好摄像头、摆好环境,按业务光照条件、角度、距离去采。关键是要覆盖极端情况——比如鸟类检测要拍逆光、远距离、部分遮挡;开关检测要拍不同角度、不同亮度、不同背景。采集时注意不要只拍"好看"的图,错过了那些难例就等于把模型的短板留到了线上。

公开数据集是启动项目最快的路子。像BDD100K、COCO、VOC、VisDrone这些都是现成的,下载后可以直接用来预训练或做负样本。但公开数据集最大的问题是"场景不匹配"。COCO里的车和你的停车场监控里的车,分布差着十万八千里。所以公开数据集只能当辅食,不能当主食。

网络爬取是获取多样性的捷径,但它有双重风险。第一是版权和合规问题,商用项目尤其要小心。第二是噪声大,网上图的分辨率、画质、水印参差不齐。我在项目中一般只用爬取数据做"难例补充"或"负样本扩充",比如火灾实时监控场景里补充各种烟雾、火焰的实拍图,而不作为主体数据。

2.2 清洗筛选的硬规则

数据采回来后,别急着标。先花半天做一轮清洗,我一般执行这几条硬规则:

模糊图直接淘汰。检测模型对模糊图天然不友好,你标得再准,模型也学不到清晰特征。判断标准很简单:把图放大到100%,如果边缘轮廓看不清,扔。

重复图去重。连拍带来的高度相似图、爬虫抓到的重复图,统统去重。重复图进数据集会造成两类问题:一是训练验证泄漏(同一场景既在训练又在验证,指标虚高),二是模型对重复特征过拟合。我用的是感知哈希(pHash)做初筛,两张图相似度超过阈值就只保留一张。

占比过小的目标要谨慎。如果目标在图中只有十几个像素,普通检测头根本学不动,标了也是浪费人力,还会拉偏loss。这种图要么裁剪放大后另存,要么直接剔除。当然,如果你专门做小目标检测研究,那是另一套玩法,需要专门的小目标增强策略。

负样本一定要留。传送带异物检测、火灾检测这类场景,负样本(空转的传送带、没有火焰的厂房)和正样本同等重要。没有负样本,模型会疯狂误报。我习惯按正负比3:1到5:1来控制,既保证模型见过足够多的负场景,又不让负样本压过正样本。

2.3 类别不平衡与难例挖掘

标着标着你会发现,数据分布永远是不均衡的。比如开关闭合检测里,"闭合"占了80%,"半开"只有5%。这种不均衡如果不处理,模型学出来的边界就是"闭着眼猜闭合"。

处理办法分三步:第一步统计各类别实例数,画个柱状图,谁少一目了然。第二步针对少数类做定向采集或增强——翻转变换、亮度扰动、Mosaic拼图对少数类都有效,但要小心不要过度增强导致失真。第三步是难例挖掘,训练完第一批模型后,把误检样本(False Positive)和漏检样本(False Negative)捞出来,回到标注流程里补充修正,这个循环通常要跑两到三轮。

我自己特别喜欢用"难例优先"的策略:清洗数据时就把模糊、遮挡、小目标、暗光这四类单独建目录,标注时优先处理这些,保证模型第一批喂进去的就是最难啃的骨头。

3. 标注工具选型与标注规范落地

3.1 五款常用标注工具横评

标注工具选得好不好,直接决定标注效率和返工率。我用过的主流工具有五个,各有利弊:

工具导出格式优势劣势适合场景
LabelImgVOC XML、YOLO txt轻量、上手快、单机可用功能单一、不适合团队协作个人小项目、快速出活
LabelStudio几乎所有格式支持协作、多种任务类型、Web部署配置稍复杂、大图会卡团队协作、多任务混合
X-AnyLabelingVOC、COCO、YOLO、分割自带AI辅助标注(SAM)依赖显存、部分功能收费需要半自动标注的中大型项目
CVATVOC、COCO、YOLO、KITTI功能全面、支持多人协作和自动标注部署成本高、学习曲线陡专业标注团队
Roboflow格式全在线标注+增强+导出一站式数据要上传云端、付费功能多不想折腾本地环境的人

我的建议很直接:个人项目用LabelImg够了,别花时间折腾重型工具;项目超过两个人合标,直接上LabelStudio或CVAT;如果有GPU,X-AnyLabeling的SAM辅助标注能省一半时间——先用SAM自动生成候选框,人工修正,效率提升明显。

3.2 标注规范:怎么框才叫"框对了"

标注规范是数据集质量的灵魂。很多项目翻车,不是因为框没框上,而是因为十个人有十种框法。我在项目里强制标注员遵守以下几条规则:

框的边界原则。目标检测框要紧贴目标的可见轮廓,不包含背景。有人习惯把动物的毛、物体的投影也框进去,这会引入噪声。对于鸟类检测这类目标,我要求框到"身体主体"为止,尾巴和长喙如果超出主体很多,可以不全含,但要全项目统一口径。

遮挡处理。目标被遮挡超过30%时,我倾向于标注为难例并在属性里标记(VOC有difficult字段,COCO有iscrowd)。完全看不清的不标。遮挡处理最常见的错误是为了"不漏标"硬框出半个身子的目标,结果训练时模型学到一堆错误边界。

类别边界。一个框只能属于一个类别。如果目标同时具备两类特征,按项目优先级排序决定。开关半开状态在很多项目里是不设的,只分"开"和"关",这时候"半开"归到哪类要写死。

边界框不能出图。目标正好在图像边缘时,框要截断在图像边界内,不要超出图像范围。这一点看起来简单,但VOC转YOLO时超出的坐标归一化后会变成大于1的值,是整个转换流程最常报的错。

3.3 质检与返工流程

标注完成后,必须做质检,不能直接开训。我的质检流程分三层:

第一层是机器检查。写个脚本检查所有标注文件:框的坐标是否在图像范围内、类别ID是否在配置内、文件是否为空、标注文件和图片是否一一对应。这层能拦掉80%的低级错误。

第二层是随机抽检。按标注员分组,每组抽10%~15%的图,把标注框画回图上人工看。主要检查框的贴合度、类别是否标错、有没有漏标。

第三层是难例复审。把所有difficult/遮挡/小目标的标注样本专门过一遍,这些是最容易出错的。

返工规则也要定好:抽检错误率超过5%,整批退回重标。别心疼那点返工时间——错误标注进训练集,模型学到的就是错误,后面排查成本高出一个数量级。

4. 把VOC、COCO、YOLO三种格式彻底看穿

4.1 VOC:XML盒子里的老牌标准

VOC格式源自PASCAL VOC挑战赛,是目标检测界资历最老的标准之一。每张图片对应一个XML文件,与图片同名。核心结构长这样:

<annotation> <folder>images</folder> <filename>bird_001.jpg</filename> <size> <width>1280</width> <height>720</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>bird</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>120</xmin> <ymin>240</ymin> <xmax>380</xmax> <ymax>520</ymax> </bndbox> </object> </annotation>

几个关键点:bndbox里存的是像素坐标,左上角(xmin, ymin)和右下角(xmax, ymax),都是绝对坐标;difficult标记难例,训练时很多框架会忽略掉;pose和truncated这些字段在很多工具里不填,但格式里要留着。

VOC格式最大的优点是人眼可读——XML打开就能看明白,调试方便。缺点也明显:每个文件一堆重复标签,大量小文件对文件系统和网络IO不友好,不适合万级以上的数据集管理。

4.2 COCO:JSON巨无霸的严谨体系

COCO格式是微软COCO数据集确立的,现在几乎成了学术界的通用交流语言。它把整个数据集打包成一个JSON文件,包含五个顶层字段:info、licenses、images、annotations、categories。

images是一个列表,每条记录一张图:

{ "id": 1, "width": 1280, "height": 720, "file_name": "bird_001.jpg", "license": 0 }

annotations列表里每条记录一个目标框:

{ "id": 1, "image_id": 1, "category_id": 1, "bbox": [120, 240, 260, 280], "area": 72800, "segmentation": [], "iscrowd": 0 }

注意bbox是xywh格式:左上角x坐标、左上角y坐标、宽度、高度,跟VOC的xyxy(两个角点)是两套逻辑。area是可选的,但做coco评测时必须要有,对多边形推荐用polygon面积。segmentation字段是给实例分割用的,纯检测任务置空即可。

COCO格式最大的好处是结构严谨、可扩展性强,做评测、做统一管理都方便。缺点就是JSON文件动辄几十MB,人眼几乎没法直接检查,必须靠脚本和工具来操作。

4.3 YOLO:一行txt走天下的简洁派

YOLO系列带火了它的极简标注格式:每个图片对应一个txt文件,每一行代表一个目标框:

0 0.445312 0.527778 0.203125 0.194444 1 0.734375 0.312500 0.132812 0.355556

四个数字分别是:类别ID、归一化中心x坐标、归一化中心y坐标、归一化宽度、归一化高度。归一化是指除以图片宽高,所以所有值都在0到1之间。

这里有几个容易混的点:一是类别ID必须从0开始,跟类别的字母顺序或定义顺序一一对应,没有地方存类别名,类别映射全靠你脑子里那张表;二是坐标为浮点数,精度至少保留6位小数,转得太粗会带来框偏移;三是文件里没有图片宽高信息,一旦图片尺寸变了,标注就跟着失效。

YOLO格式的优点就是极致简单——一个txt一个图片,读起来快,处理起来快,文件小。它的缺点是信息量少,类别映射表、图片尺寸、难例标记全都不在里面,这些信息散落在你的目录结构和配置文件里,一旦没管理好,整个数据集就乱套了。

4.4 三种格式体系对照

维度VOC XMLCOCO JSONYOLO txt
文件组织一图一XML一数据集一JSON一图一txt
坐标体系绝对坐标xyxy绝对坐标xywh归一化xywh(中心点)
类别信息框内含类别名categories字段映射仅类别ID(从0开始)
图片信息XML内含宽高images字段含宽高不含,依赖外部
难例标记有difficult字段有iscrowd字段无
可读性好差中
主流场景老框架、VOC评测学术评测、检测框架通用YOLO系训练

理解了这张表,你就能明白为什么格式互转不是简单的"改个后缀"——三套体系在坐标表示、信息承载、类别管理上都有本质差异。转换的本质是坐标系的数学变换加语义信息的重新组织,缺一不可。

5. 格式互转实战:脚本、代码与校验

5.1 转换的本质:坐标与语义的双重映射

格式互转要做两件事。第一件事是把一种坐标表示换算成另一种:VOC的绝对xyxy转YOLO的归一化中心xywh,中间要经过一次"取中心点/交点"和一次"除以宽高"的数学变换。第二件事是语义映射:把类别名转成类别ID,或者把一套类别体系映射到另一套。这两件事任何一件出错,转出来的数据集都是废的。

我在所有转换脚本里贯穿一个原则:转换前后必须能无损还原。如果VOC转YOLO再转回VOC,坐标差超过1个像素,说明你的脚本有精度问题。这个自检原则能帮你抓住很多隐蔽bug。

5.2 核心换算公式

三种格式的坐标换算公式其实就几组,我直接列出来:

VOC(xyxy)转YOLO(归一化中心xywh):

x_center = (xmin + xmax) / 2 / img_width y_center = (ymin + ymax) / 2 / img_height w = (xmax - xmin) / img_width h = (ymax - ymin) / img_height

COCO(绝对xywh)转YOLO(归一化中心xywh):

x_center = (bbox_x + bbox_w / 2) / img_width y_center = (bbox_y + bbox_h / 2) / img_height w = bbox_w / img_width h = bbox_h / img_height

YOLO(归一化中心xywh)转VOC(绝对xyxy):

xmin = (x_center - w / 2) * img_width ymin = (y_center - h / 2) * img_height xmax = (x_center + w / 2) * img_width ymax = (y_center + h / 2) * img_height

这些公式看着简单,但我在实际项目里见过太多因为"忘了除以宽高"或"把xywh当xyxy用"导致的翻车。建议你写进脚本后,先用三张图手动算一遍验证,再批量跑。

5.3 VOC转YOLO代码实操

下面这段是我在项目里常用的VOC转YOLO脚本,精简过但保留了所有关键处理:

import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, out_dir, classes): """把单张VOC XML转为YOLO txt。 classes: 类别名列表,顺序即类别ID顺序,ID从0开始。 """ tree = ET.parse(xml_path) root = tree.getroot() size = root.find('size') img_w = int(size.find('width').text) img_h = int(size.find('height').text) lines = [] for obj in root.iter('object'): name = obj.find('name').text if name not in classes: print(f"[跳过] 未在类别表中找到: {name}") continue cls_id = classes.index(name) bndbox = obj.find('bndbox') xmin = float(bndbox.find('xmin').text) ymin = float(bndbox.find('ymin').text) xmax = float(bndbox.find('xmax').text) ymax = float(bndbox.find('ymax').text) # 防止标注出图导致的越界 xmin = max(xmin, 0) ymin = max(ymin, 0) xmax = min(xmax, img_w) ymax = min(ymax, img_h) x_center = (xmin + xmax) / 2.0 / img_w y_center = (ymin + ymax) / 2.0 / img_h w = (xmax - xmin) / img_w h = (ymax - ymin) / img_h # 防止宽高为0或负值 if w <= 0 or h <= 0: print(f"[警告] 无效框: {name} {xmin},{ymin},{xmax},{ymax}") continue lines.append(f"{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}") out_name = os.path.splitext(os.path.basename(xml_path))[0] + '.txt' with open(os.path.join(out_dir, out_name), 'w') as f: f.write('\n'.join(lines))

调用时指定类别表,顺序一定要和训练配置保持一致:

classes = ['bird', 'nest', 'egg'] # 按你的需求定义 voc_to_yolo('annotations/bird_001.xml', 'labels', classes)

几个处理细节值得说:越界裁剪我单独处理了,因为很多标注工具会在图片边界外生成坐标,不裁的话转出来的YOLO值可能大于1,训练脚本就会报警;宽高为0或负数的框直接跳过,这种框十有八九是标注员手误;类别表里没有的名字打日志提醒,不静默丢弃——否则你都不知道哪些类别被丢了。

5.4 COCO转YOLO与反向转换的注意事项

COCO转YOLO也很常用,尤其是从公共数据集出发做迁移。核心是按照image_id把annotations分组,再逐图写txt:

import json import os from collections import defaultdict def coco_to_yolo(coco_json_path, out_dir, cat_id_map=None): """ cat_id_map: 可选,自定义COCO category_id到新ID的映射。 不传则按categories列表原顺序生成0基ID。 """ with open(coco_json_path, 'r', encoding='utf-8') as f: coco = json.load(f) images = {img['id']: img for img in coco['images']} if cat_id_map is None: # 按category id排序,保证确定性 cats = sorted(coco['categories'], key=lambda c: c['id']) cat_id_map = {c['id']: i for i, c in enumerate(cats)} # 按image_id聚合所有标注 anns_by_img = defaultdict(list) for ann in coco['annotations']: if ann.get('iscrowd', 0) == 1: continue # 群体目标通常不适用于YOLO检测 anns_by_img[ann['image_id']].append(ann) for img_id, anns in anns_by_img.items(): img = images[img_id] img_w, img_h = img['width'], img['height'] base = os.path.splitext(os.path.basename(img['file_name']))[0] lines = [] for ann in anns: x, y, w, h = ann['bbox'] # COCO bbox是xywh if w <= 0 or h <= 0: continue cls_id = cat_id_map.get(ann['category_id']) if cls_id is None: continue x_center = (x + w / 2) / img_w y_center = (y + h / 2) / img_h nw = w / img_w nh = h / img_h lines.append(f"{cls_id} {x_center:.6f} {y_center:.6f} {nw:.6f} {nh:.6f}") with open(os.path.join(out_dir, base + '.txt'), 'w') as f: f.write('\n'.join(lines))

这里特别说了iscrowd要跳过——COCO里有些标注是群体性的,比如一堆人标成一个框,这种对YOLO训练没意义。反向操作(YOLO转COCO)麻烦的地方在于category_id的映射,因为YOLO的类别只有ID没有名字,你必须提供一个可靠的类别名列表,按ID顺序反查回去。我曾经在这个环节吃过亏:用的是同一个类别表,但排序方式不同(一个按字母序一个按自定义序),结果转出来所有类别都错位了。解决方案很简单,把类别表文件(通常是classes.txt)当作数据集的基准,任何转换都以它为唯一真相来源。

5.5 转换后的自动校验

转换完不算完,一定要跑校验。我每次都跑三件套:

第一,数量校验。统计转换前后的图片数、标注框数,对不上就去查日志。第二,坐标合法性校验。写个脚本扫描所有txt,检查是不是每行5个字段、类别ID是否越界、归一化坐标是否在[0,1]范围内。第三,可视化抽查。最关键的一步——随机挑几十张图,用OpenCV把标注框画回图上,人工扫一遍:

import cv2 import os def draw_yolo_boxes(image_path, label_path, classes, out_path): img = cv2.imread(image_path) h, w = img.shape[:2] with open(label_path) as f: for line in f: parts = line.strip().split() if len(parts) != 5: continue cls_id, xc, yc, bw, bh = map(float, parts) x1 = int((xc - bw / 2) * w) y1 = int((yc - bh / 2) * h) x2 = int((xc + bw / 2) * w) y2 = int((yc + bh / 2) * h) cls_name = classes[int(cls_id)] if int(cls_id) < len(classes) else '?' cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, cls_name, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1) cv2.imwrite(out_path, img)

画框这步看着土,但真能发现问题。我最多的一次从可视化抽查里抓到了200多张图的框偏移,原因是一个坐标转换函数里把中心点求错了。

6. 常见问题与排查技巧实录

6.1 高频翻车现场速查表

把这几年的翻车经验整理成一张表,基本覆盖了格式互转的绝大部分问题:

问题现象根因解决方案
训练时报"标签越界"VOC转YOLO时框坐标超出图片范围,归一化值大于1转换时先clamp坐标;加合法性校验脚本
所有框类别全错位类别映射表顺序不一致,YOLO的ID和COCO的category_id没对上以classes.txt为唯一基准,转换前打印映射表人工核对
部分图片没有label原标注里没有对象,或清洗时漏了空XML批量生成空txt文件;检查文件一一对应
Loss异常高且不收敛标签文件中混入了空文件、脏数据或类别ID越界写脚本扫描全部txt,过滤非法行
验证精度高但实际检测差标注框不贴边、边界框包含大量背景回退到标注阶段,严格按框边界原则返工
图片和标注文件名不匹配数据集改名、拷贝时丢失配对文件用脚本做集合差集检查;目录中只保留成对文件
中文路径导致读取失败OpenCV / PIL不支持中文路径或编码问题项目统一用英文路径;或用支持中文的读取方式
COCO的JSON文件特别大打不开图片上万后JSON体积巨大不要手动编辑,用脚本或专门工具操作

6.2 独家避坑经验

最后分享几条常规文档里不会写的经验,都是我拿实际项目时间换来的。

第一,转换脚本要保留中间日志。我的脚本每次批量转换都会输出一份报告:转换了多少张、跳过了多少、警告了多少条、哪些文件有问题。有了这份日志,后续排查效率高十倍。别嫌麻烦,这个习惯值回票价。

第二,不要用Excel当类别映射表。有人喜欢在Excel里维护类别映射,然后导出CSV让脚本读取。听着方便,但Excel的编码问题(尤其是中文环境下的BOM)和单元格自动纠正常常让映射错乱。我后来只用纯文本的classes.txt,一行动一个类名,ID就是行号减一,简单可靠。

第三,训练集和验证集的分流要在格式转换前做。先按图片名哈希或随机种子把图片分成train/val/test三个目录,再各自转标注格式。如果先转换后分流,容易在复制过程中把标注文件搞丢或串目录。

第四,学会用可视化框做"最后一道门"。不管你的转换脚本写得有多自信,每批新数据集转换后,都画一批框目检。我见过很多自认为没问题的人在第一次训练时才暴露问题,那时候排查的难度已经是标注阶段的十倍了。

第五,把坐标系规则写到项目文档里。团队协作时,每个人对"框的坐标"理解都可能不同。我在项目里明确规定:统一以VOC的xyxy(绝对像素)为中间交换格式,所有工具都往这个格式靠拢,再按需导出YOLO或COCO。这样团队讨论问题时,说的坐标含义没有歧义。

说起来,数据集制作这件事本身没有太多高深的技术,但它特别考验一个人的工程习惯。我做过的项目里,凡是数据集流程规范、格式转换有校验、可视化抽查做得到位的,后面训练调参阶段几乎没在数据上踩过坑;凡是偷懒跳过这些步骤的,最后都在补各种数据债。如果你现在正要做一个检测项目,我建议你从第一步就把流程立起来——类别表用纯文本、转换脚本带日志、转换后必可视化抽样,这三件事坚持做下来,整个训练流程会顺畅得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询