python TT100K数据集标注转化为yolo格式

一、背景

       由于项目需要进行【交通标志检测】,我们选择TT100K数据集作为我们的训练测试数据集。又因为使用的目标检测网络为YOLO系列,所以需要将TT100K数据集的标注转换成yolo格式的标注,并根据项目需要,将TT100K数据集的交通标志分类分为3类:指示标志(标签为1,对应原数据集“i”开头的类别)、禁令标志(标签为2,对应原数据集“p”开头的类别)、警告标志(标签为3,对应原数据集“w”开头的类别)。

二、TT100K数据集标注文件解析

        TT100K数据集的标注文件为annotation.json文件,打开后发现标注文件是以字典的格式储存标注信息,字典的组织如下所示:

{
"imgs":
    {
    '32773':
	     {'path': 'test/32773.jpg', 
	    'objects':
		     [
		        {'category': 'ph2',
		         'bbox': {'xmin': 924.0, 'ymin': 1132.0, 'ymax': 1177.3333, 'xmax': 966.6667}, 
		        'ellipse_org': [[942.725, 1132.14], [926.19, 1144.18], [922.884, 1156.61], [931.746, 1173.02], [949.471, 1174.07], [959.921, 1169.58], [962.037, 1142.72]],
		         'ellipse': [[943.6439208984375, 1154.060791015625], [41.572391510009766, 45.09551239013672], 36.37429428100586]}, 

		        {'category': 'p11', 
		        'bbox': {'xmin': 970.667, 'ymin':
### 将TT100K数据集换为YOLO格式 为了将TT100K数据集换为适用于YOLO模型训练的格式,需要遵循特定的数据结构和标注文件的标准。以下是具体方法: #### 数据目录结构调整 在YOLO框架下,数据通常被分为`train`、`val`(验证集)以及可选的`test`(测试集)。每张图片都需要有一个对应的`.txt`标注文件。因此,首先需要创建相应的文件夹结构[^3]。 ```plaintext dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/ ``` #### 标注文件 原始TT100K数据集中的标注可能采用不同的格式存储,比如JSON或其他形式。目标是将其转化为YOLO所需的TXT格式。每个标注文件的内容应按照以下标准书写: - `<class_index> <x_center> <y_center> <width> <height>` 其中: - `<class_index>` 是类别的索引编号(从0开始计数)。 - `<x_center>` 和 `<y_center>` 表示边界框中心点相对于整幅图像宽高的比例位置。 - `<width>` 和 `<height>` 则表示边界框宽高相对于整幅图像宽高的比例尺寸。 假设已知某一幅图像是 `image_0001.jpg` ,其大小为 640×480 像素,并且其中一个交通标志位于 `(xmin=100, ymin=50, xmax=200, ymax=150)` 的矩形区域内,则可以计算得到该区域的相关参数如下所示: - 宽度:`(xmax-xmin)/image_width = (200-100)/640 ≈ 0.156` - 高度:`(ymax-ymin)/image_height = (150-50)/480 ≈ 0.208` - 中心横坐标:`(xmin+xmax)/(2*image_width) = (100+200)/(2*640) ≈ 0.234` - 中心纵坐标:`(ymin+ymax)/(2*image_height) = (50+150)/(2*480) ≈ 0.208` 如果此交通标志属于第3种类别,则最终写入到对应 `.txt` 文件的一行为: ```text 3 0.234 0.208 0.156 0.208 ``` #### 编程实现自动化换 下面是一个简单的 Python 脚本例子来完成上述过程。假定输入的是 JSON 格式TT100K 数据集。 ```python import json from pathlib import Path def convert_bbox(size, box): dw = 1./size[0] dh = 1./size[1] x = (box['xmin'] + box['xmax']) / 2.0 y = (box['ymin'] + box['ymax']) / 2.0 w = box['xmax'] - box['xmin'] h = box['ymax'] - box['ymin'] x *= dw w *= dw y *= dh h *= dh return (x,y,w,h) def process_dataset(json_file, output_dir): with open(json_file) as f: data = json.load(f) image_size = {'width':data['imgWidth'], 'height':data['imgHeight']} classes = {cls_name:i for i, cls_name in enumerate(data['types'].keys())} out_labels_dir = Path(output_dir) / "labels" out_images_dir = Path(output_dir) / "images" out_labels_dir.mkdir(parents=True, exist_ok=True) out_images_dir.mkdir(parents=True, exist_ok=True) for img_info in data['imgs']: filename = img_info['path'] objects = img_info.get('objects', []) label_path = str(out_labels_dir / Path(filename).with_suffix('.txt')) with open(label_path, 'w') as lbl_f: for obj in objects: class_id = classes[obj['category']] bbox = convert_bbox((image_size['width'], image_size['height']), obj['bbox']) lbl_f.write(f"{class_id} {' '.join(map(str,bbox))}\n") json_input = "/path/to/tt100k.json" output_directory = "./converted_yolo_data/" process_dataset(json_input, output_directory) ``` 以上脚本读取 JSON 文件并解析出所有的标签信息,随后逐条记录至指定路径下的 TXT 文档中[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值