mat标注文件转COCO格式标注文件(shanghaiTech数据集)

ShanghaiTech数据集转换为COCO格式
本文详细介绍了将ShanghaiTech数据集的mat标注文件转换为COCO格式的过程,包括代码实现与可视化验证,确保转换准确性。

1.数据集介绍

    shanghaiTech数据集是一个用于行人计数的数据集,里面包含了大量的人群图片,它由两部分组成:part_A_final文件夹 和 part_B_final文件夹,它们内部都由 train_data 和 test_data 两部分组成,意思为训练集和测试集,对于train_data 和 test_data 其中包括 images 和 ground_truth,images储存着图片文件、ground_truth里储存着对应的标注文件,一张图片对应一个标注文件。
    shanghaiTech结构如下所示:
在这里插入图片描述
    标注文件为mat文件,标注方式为点标注,标注位置为人头中心。

2.mat标注文件转COCO格式标注文件(shanghaiTech数据集)

    参考CSRNet的官方源码(https://github.com/leeyeehoo/CSRNet-pytorch)中的make_dataset.py可以得知,读取mat标注文件并获取其点坐标的代码如下:

mat = io.loadmat(img_path.replace('.jpg','.mat').replace('images','ground_truth').replace('IMG_','GT_IMG_'))
gt = mat["image_info"][0,0][0,0][0] #gt为用列表存储的点坐标对

    知道如何获取mat文件的点坐标后,参考网络上的YOLO格式文件转化为COCO格式文件的脚本就可以写出mat标注文件转COCO格式标注文件的脚本了。
    定义Mat2COCO函数,传入的参数为图片地址、shanghaiTech根目录地址和COCO文件保存地址,然后初始化变量记录标注文件地址、图片地址、图片名、标注点类别名和字典型变量dataset用于记录COCO信息,代码如下:

def Mat2COCO(path_sets,root,save_path):
    assert os.path.exists(path_sets)
    LabelDir = path_sets.replace('images','ground_truth') # 标签位置
    ImageDir = path_sets                                  # 图片位置
    with open(os.path.join(root, 'classes.txt')) as f:
        classes = f.read().strip().split()                      # 类别
    indexes = os.listdir(ImageDir)                       # 图片名
    dataset = {
   
   'categories': [], 'annotations': [], 'images': [],'licenses':[]} #字典型变量用于记录COCO信息

    读取categories(类别)信息并写入dataset变量中,licenses信息一般用不上,这里就进行了简单的置空操作,代码如下:

    for i, cls in enumerate(classes, 0):
        print(i)
        print(cls)
        dataset['categories'].append({
   
   'id': i+1, 'name': cls, 'supercategory': 'person'})

    dataset['licenses'].append({
   
   
        'name': "",
        'id': 0,
        'url': "",
    })

    读取图片信息写入dataset变量的images里,读取标注信息写入dataset变量的annotations里,代码里的注释已经解释的比较清楚了,这里再做几点说明,(1)labelList 里存储的是多个坐标对,格式类似[ [坐标x1,坐标y1] , [坐标x2,坐标y2 ] …];(2)由于shanghaiTech是点标注且只有person类别的点标注,所以类别id:cls_id置为了固定值,area的值和bbox里的后两个值设置为了0;(3)keypoints记录的就是关键点坐标(x,y)及可见性信息(0不可见,1被遮挡,2完全可见)由于shanghaiTech里并没有提供可见性信息,我这里就将其统一设置为了2。

    ann_id_cnt = 0
    for k, index in enumerate(tqdm(indexes)):
        # jpg 格式的图片。
        matFile = index.replace('.jpg'
### 使用MAT格式数据集训练YOLOv5模型的方法 YOLOv5 是一种高效的实时目标检测框架,通常支持 COCO 或自定义格式数据集。然而,默认情况下 YOLOv5 并不直接支持 MAT 文件格式作为输入数据源。为了实现这一需求,需要完成以下几个方面的调整: #### 1. 数据MAT 文件是一种 MATLAB 的二进制存储格式,无法被 YOLOv5 原生解析。因此,第一步是将 MAT 文件中的标注信息提取并化为 YOLO 支持的标准格式——通常是基于 TXT 文件的标签表示方法。 - **读取 MAT 文件**: 可以利用 Python 中的 `scipy.io` 库来加载和处理 MAT 文件。 ```python import scipy.io as sio mat_data = sio.loadmat('path_to_mat_file.mat') # 加载 MAT 文件 annotations = mat_data['annotations'] # 提取标注字段 ``` - **化成 YOLO 格式**: 将提取到的信息按照 YOLO 所需的格式保存至对应的 TXT 文件中。每一行代表一个边界框,其格式如下: ``` class_id center_x center_y width height ``` 这些值均应归一化为相对于图像宽度和高度的比例[^1]。 下面是一个简单的脚本用于生成这些文件: ```python def convert_to_yolo_format(mat_annotations, output_dir): for img_name, bbox_list in zip(mat_annotations['image_names'], mat_annotations['bboxes']): with open(f"{output_dir}/{img_name}.txt", 'w') as f: for box in bbox_list: x_min, y_min, x_max, y_max = box[:4] w = (x_max - x_min) / image_width h = (y_max - y_min) / image_height cx = ((x_min + x_max) / 2) / image_width cy = ((y_min + y_max) / 2) / image_height line = f"0 {cx} {cy} {w} {h}\n" f.write(line) ``` #### 2. 配置 YAML 文件 YOLOv5 要求提供一个描述数据结构的 YAML 文件。此文件应该指定类别名称以及训练/验证图片路径的位置。 示例配置可能看起来像这样: ```yaml train: ../data/images/train/ val: ../data/images/valid/ nc: 1 # 类别数量 names: ['object'] ``` 确保更新该文件以便指向已换后的图像及其对应标签所在目录[^2]。 #### 3. 修改 train.py 参数设置 打开项目根目录下的 `train.py` 文件,并按以下方式设定必要参数(假设已经完成了上述准备工作): - 初始权重 (`weights`) : 设置为你希望初始化使用的预训练模型路径; - 数据配置 (`data`) :填入刚刚编辑好的 `.yaml` 文件全名含扩展名; - 训练周期数(`epochs`); - Batch Size; 以及其他硬件相关的选项比如 GPU ID 和 Workers 数量等依据实际环境而定。 执行命令启动训练过程: ```bash python train.py --img 640 --batch 16 --epochs 100 --data numpuzzles.yaml --cfg yolov5s.yaml --weights '' --name custom_training_results ``` 通过以上步骤就可以成功使用来自 MAT 文件形式的数据集来进行 YOLOv5 模型的学习了!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值