原文:
towardsdatascience.com/object-detection-coco-and-yolo-formats-and-conversion-between-them-0e0638f4ffc1
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4c1b3780afd5bb76a9afc9d14f5bdd89.png
图片由 Matt Briney 在 Unsplash 提供
如果您没有 Premium Medium 账户也想阅读这篇文章,可以通过这个友情链接进行:
www.learnml.wiki/object-detection-coco-and-yolo-formats-and-conversion-between-them/
简介
用于训练目标检测模型的图像注释可以有不同的格式,即使它们包含相同的信息。在存在的不同格式中,两种非常常用的格式是 COCO JSON 格式和 YOLOv5 PyTorch TXT 格式。前者因其名声归功于微软在 2015 年发布的 MS COCO 数据集[1],它是用于目标检测、分割和标题任务中最广泛使用的数据集之一。另一方面,YOLOv5 PyTorch TXT 格式的流行是由于 ultralytics[2]开发的 YOLOv8 架构(目标检测的最先进模型)使用它作为输入。
本文将首先介绍这两种格式的流行基础,正如上述所述,这两种格式是 MS COCO 数据集和 ultralytics 的 YOLOv8 架构。
文章将随后介绍 COCO JSON 和 YOLOv5 PyTorch TXT 格式的结构和组件。接下来,它将展示 MS COCO 数据集和 ultralytics 的 YOLOv8 API 所期望的数据集结构,最后将解释如何轻松地将数据集从 COCO JSON 格式转换为 YOLOv5 PyTorch TXT 格式。这一步骤在数据预处理过程中将非常有用,可以节省时间和工作,从而优化 YOLOv8 架构的训练过程。
YOLOv8 架构和 COCO 数据集
在目标检测领域,ultralytics 的 YOLOv8 架构(来自 YOLO[3]家族)是目前最广泛使用的最先进架构,它包括对先前版本(如低推理时间(实时检测)和在小物体检测中实现的良好精度)的改进。
另一方面,MS COCO 数据集是计算机视觉任务(如目标检测或分割)中最广泛使用的数据集之一。微软在 2015 年发布了这个数据集,包含超过 328K 张包含属于 80/91 个不同类别(80 个对象类别,91 个物品类别)的对象的图像,以及检测、分割和标题的注解。由于其大量高质量的图像和独特的类别,以及节省的工作量(即拥有标记数据),它通常用作评估新目标检测架构的基准。
COCO 数据集和 COCO JSON 格式
数据集的结构
dataset_directory ├── annotations │ ├── instances_train.json │ ├── instances_val.json │ └── instances_test.json │ └── images ├── train │ ├── image_00001.jpg │ ├── image_00002.jpg │ ├──...│ └── image_00100.jpg ├── val │ ├── image_00101.jpg │ ├── image_00102.jpg │ ├──...│ └── image_00200.jpg └── test ├── image_00201.jpg ├── image_00202.jpg ├──...└── image_00300.jpgCOCO JSON 注解文件的结构
在 COCO JSON 格式中,每个/images目录内的目录(图像集)都有一个 JSON 注解文件。
这些 COCO JSON 注解文件包含有关数据集、许可、注解中存在的不同类别/分类以及组成数据集的每张图像和所有注解的元数据的不同标题/部分。以下示例显示了 COCO JSON 注解文件的结构:
{"info":{"description":"COCO 2017 Dataset","url":"http://cocodataset.org","version":"1.0","year":2017,"contributor":"COCO Consortium","date_created":"2017/09/01"},"licenses":[{"url":"http://creativecommons.org/licenses/by/2.0/","id":4,"name":"Attribution License"}],"categories":[{"supercategory":"animal","id":0,"name":"cat"},{"supercategory":"animal","id":1,"name":"dog"}],"images":[{"id":123456,"license":4,"coco_url":"http://images.cocodataset.org/val2017/xxxxxxxxxxxx.jpg","flickr_url":"http://farm3.staticflickr.com/x/xxxxxxxxxxxx.jpg","width":img_width,"height":img_height,"file_name":"xxxxxxxxx.jpg","date_captured":"date"},{"id":123457,"license":4,"coco_url":"http://images.cocodataset.org/val2017/xxxxxxxxxxxx.jpg","flickr_url":"http://farm1.staticflickr.com/x/xxxxxxxxxxxx.jpg","width":img_width,"height":img_height,"file_name":"xxxxxxxxx.jpg","date_captured":"date"}],"annotations":[{"id":654321,"category_id":1,"iscrowd":0,"segmentation":[[float,float,..........float,float]],"image_id":123456,"area":float,"bbox":[float,float,float,float]},{"id":654322,"category_id":0,"iscrowd":0,"segmentation":[[float,float,..........float,float]],"image_id":123457,"area":float,"bbox":[float,float,float,float]},{"id":654323,"category_id":1,"iscrowd":0,"segmentation":[[float,float,..........float,float]],"image_id":123457,"area":float,"bbox":[float,float,float,float]},{"id":654324,"category_id":1,"iscrowd":0,"segmentation":[[float,float,..........float,float]],"image_id":123457,"area":float,"bbox":[float,float,float,float]}],}在“annotations”列表中的每个元素(每个注解)中,_categoryid对应于对象的类别 ID,_imageid对应于包含对象的图像的 ID,而bbox对应于一个包含 4 个值的数组:x、y、width和height,分别对应。
x和y是边界框左上角的 x 和 y 坐标,width和height是边界框的宽度和高度。
注解字典的其他键包括id(特定注解的唯一 ID)、iscrowd(布尔值,表示是否对大量对象进行标记)、area(分割区域)和segmentation(图像中对象实例的分割掩码)。
注意,使用此格式时,注解和图像信息位于不同的目录中,将注解与其对应的图像关联的唯一方式是注解字典中的 _imageid值。
YOLOv8 数据集和 YOLOv5 PyTorch TXT 格式
数据集的结构
dataset_directory ├── test │ ├── images │ │ ├── image_00001.png │ │ ├── image_00002.png │ │ ├──...│ └── labels │ ├── image_00001.txt │ ├── image_00002.txt │ ├──...├── train │ ├── images │ │ ├── image_00003.png │ │ ├── image_00004.png │ │ ├──...│ └── labels │ ├── image_00003.txt │ ├── image_00004.txt │ ├──...├── valid │ ├── images │ │ ├── image_00005.png │ │ ├── image_00006.png │ │ ├──...│ └── labels │ ├── image_00005.txt │ ├── image_00006.txt │ ├──...├── data.yaml ├── test.txt ├── train.txt └── valid.txtYOLOv5 PyTorch TXT 注解文件的结构
YOLOv5 PyTorch TXT 格式,这是 Darknet 注解格式的修改版本**[4],将一个图像的所有注解存储在一个文件中,文件名与图像相同,但扩展名为.txt**。这意味着对于每个名为xxxx.png的图像,必须存在一个具有相同名称但扩展名为*.txt*的注解/标签文件:xxxx.txt。
每个这些标签文件包含每个注解对象的文本行。例如,如果一张图像中有 3 个注解对象,标签文件将看起来像这样:
00.55917968750.66180751173708920.5335781250.631596244131455# First object00.22994531250.31767605633802820.2501093740.383849765258216# Second object10.60857031250.22136150234741780.2378593740.167323943661971# Third object第一个整数代表对象的类别 ID。第二个和第三个数字是Cx和Cy,它们是边界框中心的 x 和 y 坐标。最后,最后两个数字是w和h,分别是边界框的宽度和高度。Cx、Cy、w 和 h 值按图像大小归一化。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d55049088cb20c4970445566fcc7c216.png
此格式使得访问给定图像的注释变得更容易,因为它们将位于单个文件中。另一方面,对于 COCO JSON 格式,将需要遍历所有注释,选择那些 _imageid与图像 ID 相同的注释。
如何执行转换
转换将使用COCO_YOLO_dataset_generator存储库。此存储库包含一个脚本,使用户能够轻松地将数据集从 COCO JSON 格式转换为 YOLOv5 PyTorch TXT 格式。
1. 克隆存储库
此步骤将从 GitHub 下载存储库,并将其复制到具有存储库名称的目录中:_/COCO_YOLO_datasetgenerator。
git clone https://github.com/JavierMtz5/COCO_YOLO_dataset_generator.git2. 安装依赖项
此步骤将安装运行脚本所需的全部 Python 库。截至今天,脚本的唯一依赖项是tqdm库,用于在转换期间显示进度条。
cd COCO_YOLO_dataset_generator pip install-r requirements.txt3. 转换数据集
此最后一步将执行脚本,使用转换数据集从 COCO JSON 格式到 YOLOv5 PyTorch TXT 所需的参数。
第一个参数是相对于 _COCO_YOLO_datasetgenerator目录的原始数据集的路径。convert_to_yolo参数设置为 True,因为目标是转换数据集的格式和结构从 COCO 到 YOLO。最后,output_dir参数应设置为新转换数据集的名称。
python3 coco_to_yolo_extractor.py<path_to_the_original_dataset>--convert_to_yolo true--output_dir<path_to_new_dataset>4. 使用新数据集训练 YOLOv8 模型
脚本执行后,将创建一个新目录,其名称由用户为output_dir参数提供的名称指定。此目录将包含新的数据集,其中包含 YOLOv5 PyTorch TXT 格式的注释,以及 YOLOv8 架构预期的结构。
通过运行以下命令,将可以使用新数据集训练 YOLOv8 模型:
ultralytics库不包括在存储库的 requirements.txt 文件中,因此在运行训练之前可能需要安装它。
fromultralyticsimportYOLO model=YOLO('yolov8n.yaml')# Load the YOLOv8 nano architecturetraining_result=model.train(data='<dataset_directory>/data.yaml',epochs=100)结论
COCO JSON 以及更重要的是 YOLOv5 PyTorch TXT,是目标检测领域常用的格式,因此了解它们如何表示注释非常有趣且有用。此外,所使用的存储库 COCO_YOLO_dataset_generator 帮助并简化了用户将数据集从 COCO JSON 格式转换为 YOLOv5 PyTorch TXT 格式的操作,这可以用于训练任何介于 YOLOv5 和 YOLOv8 之间的 YOLO 模型。由于 YOLOv8 是最先进的架构,该存储库是使用原始 COCO JSON 格式的数据进行模型训练的有用预处理工具。如果你觉得这个存储库有用,请开始使用它!
存储库
GitHub – JavierMtz5/COCO_YOLO_dataset_generator: 获取图像和注释的脚本(用于…
数据集许可
MS COCO 图像数据集采用Creative Commons Attribution 4.0许可协议。
参考文献
[1]COCO 数据集cocodataset.org/#home[2]Ultralytics YOLOv8 文档docs.ultralytics.com[3]YOLO 家族模型的全面指南blog.roboflow.com/guide-to-yolo-models/[4] YOLO Darknet TXT****roboflow.com/formats/yolo-darknet-txt