行人跟踪数据集转为yolov5格式的数据集Labelme以及可视化

Posted AI浩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行人跟踪数据集转为yolov5格式的数据集Labelme以及可视化相关的知识,希望对你有一定的参考价值。

摘要

最近,在做行人检测的项目,想找一些行人的检测数据,来增强模型的效果,发现行人跟踪数据集可用,只需要把跟踪数据转为yolov5格式即可。

数据集

这些数据集来自百度飞桨的PaddleDetection项目。飞桨对一些特殊格式的数据做了格式的统一。格式如下:

Caltech
   |——————images
   |        └——————00001.jpg
   |        |—————— ...
   |        └——————0000N.jpg
   └——————labels_with_ids
            └——————00001.txt
            |—————— ...
            └——————0000N.txt
MOT17
   |——————images
   |        └——————train
   |        └——————test
   └——————labels_with_ids
            └——————train

行人跟踪

数据集下载链接备注
MOT17download-
MOT16download-
Caltechdownload-
Cityscapesdownload-
CUHKSYSUdownload-
PRWdownload-
ETHZdownload-

车辆跟踪

数据集下载链接备注
AICity21download-

人头跟踪

数据集下载链接备注
HT21download-

多类别跟踪

数据集下载链接备注
VisDrone-MOTdownload-

数据转换

将数据集转为yolov5用的数据集

以CUHKSYSU为例,首先将其转为yolov5格式,代码如下:

import os
import shutil
import numpy as np
import configparser
import glob
if not os.path.exists('images'):
    os.makedirs('images/train')
if not os.path.exists('labels'):
    os.makedirs('labels/train')


txt_list=glob.glob('./CUHKSYSU/labels_with_ids/*.txt')
print(txt_list)
for  txt in txt_list:
    label_list=[]
    with open(txt,'r') as fs:
        txt_lines=fs.readlines()
        if len(txt_lines) <1:
            continue
        for txt_line in txt_lines:
            txt_line=txt_line.replace('\\n','').split()
            line_new=str(txt_line[0]+' '+txt_line[2]+' '+txt_line[3]+' '+txt_line[4]+' '+txt_line[5])
            label_list.append(line_new)
    txt_write=txt.replace('\\\\','/').split('/')[-1]
    image_path='./CUHKSYSU/images/'+txt_write.replace('txt','jpg')
    txt_pull_path="./labels/train/"+txt_write
    image_path_new='./images/train/'+txt_write.replace('txt','jpg')
    # image_new_path="./labels/train"+
    with open(txt_pull_path, 'w') as fw:
        for label in label_list:
            fw.write(label+'\\n')
    shutil.copy(image_path,image_path_new)

完成之后就可以看到images和labels的文件夹

可视化YoloV5数据

转换完成后,查看数据是否正确,对其做可视化操作。代码如下:

import cv2
import os

def draw_box_in_single_image(image_path, txt_path):
    # 读取图像
    image = cv2.imread(image_path)

    # 读取txt文件信息
    def read_list(txt_path):
        pos = []
        with open(txt_path, 'r') as file_to_read:
            while True:
                lines = file_to_read.readline()  # 整行读取数据
                if not lines:
                    break
                # 将整行数据分割处理,如果分割符是空格,括号里就不用传入参数,如果是逗号, 则传入‘,'字符。
                p_tmp = [float(i) for i in lines.split(' ')]
                pos.append(p_tmp)  # 添加新读取的数据
                # Efield.append(E_tmp)
                pass
        return pos


    # txt转换为box
    def convert(size, box):
        xmin = (box[1]-box[3]/2.)*size[1]
        xmax = (box[1]+box[3]/2.)*size[1]
        ymin = (box[2]-box[4]/2.)*size[0]
        ymax = (box[2]+box[4]/2.)*size[0]
        box = (int(xmin), int(ymin), int(xmax), int(ymax))
        return box

    pos = read_list(txt_path)
    print(pos)
    tl = int((image.shape[0]+image.shape[1])/2)
    lf = max(tl-1,1)
    for i in range(len(pos)):
        label = str(int(pos[i][0]))
        print('label is '+label)
        box = convert(image.shape, pos[i])
        image = cv2.rectangle(image,(box[0], box[1]),(box[2],box[3]),(0,0,255),2)
        cv2.putText(image,label,(box[0],box[1]-2), 0, 1, [0,0,255], thickness=2, lineType=cv2.LINE_AA)
        pass

    if pos:
        cv2.imwrite('./VOCData/see_images/.png'.format(image_path.split('\\\\')[-1][:-4]), image)
    else:
        print('None')

    print('./VOCData/see_images/.png'.format(image_path.split('\\\\')[-1][:-4]))
    # cv2.imshow("images", image)
    # cv2.waitKey(0)
    # cv2.destroyAllWindows()


img_folder = "./images/train"
img_list = os.listdir(img_folder)
img_list.sort()

label_folder = "./labels/train"
label_list = os.listdir(label_folder)
label_list.sort()
if not os.path.exists('./VOCData/see_images'):
    os.makedirs('./VOCData/see_images')
for i in range(len(img_list)):
    image_path = img_folder + "\\\\" + img_list[i]
    txt_path = label_folder + "\\\\" + label_list[i]
    draw_box_in_single_image(image_path, txt_path)


转为Labelme格式的数据

将yolov5格式的数据转为Labelme数据格式的数据集,可以使用Labelme对其做微调和更改。代码如下:

import os
import json
import cv2
import base64

version = '3.16.7'
flags = 
lineColor = [0, 255, 0, 128]
fillColor = [255, 0, 0, 128]
filelist=os.listdir('./images/train/')
for file in filelist:
    if 'jpg' in file:
        dic = 
        dic['version'] = version
        dic['flags'] = flags
        dic['shapes'] = []
        img = cv2.imread('./images/train/'.format(file))
        imageHeight, imageWidth, _ = img.shape
        with open('./labels/train/.txt'.format(file.split('.')[0])) as f:
            datas = f.readlines()
            for data in datas:
                shape = 
                shape['label'] = 'person'
                shape['line_color'] = None
                shape['fill_color'] = None
                data = data.strip().split(' ')
                x = float(data[1]) * imageWidth
                y = float(data[2]) * imageHeight
                w = float(data[3]) * imageWidth
                h = float(data[4]) * imageHeight
                x1 = x - w / 2
                y1 = y - h / 2
                x2 = x1 + w
                y2 = y1 + h
                shape['points'] = [[x1, y1], [x2, y2]]
                shape['shape_type'] = 'rectangle'
                shape['flags'] = 
                dic['shapes'].append(shape)
        dic['lineColor'] = lineColor
        dic['fillColor'] = fillColor
        dic['imagePath'] = file
        dic['imageData'] = base64.b64encode(
            open('./images/train/'.format(file), "rb").read()).decode('utf-8')
        dic['imageHeight'] = imageHeight
        dic['imageWidth'] = imageWidth
        fw = open('./images/train/.json'.format(file.split('.')[0]), 'w')
        json.dump(dic, fw)
        fw.close()

结果如下:

以上是关于行人跟踪数据集转为yolov5格式的数据集Labelme以及可视化的主要内容,如果未能解决你的问题,请参考以下文章

跟踪数据集汇总

行人检测(人体检测)2:YOLOv5实现人体检测(含人体检测数据集和训练代码)

MOT20数据集转VOC和Labelme标注的数据集,以及YoloV5的数据集。

行人检测数据集

行人重识别多个数据集格式统一为market1501格式

YOLOYOLOv5+Deep Sort 实现MOT评估(开源数据集+自定义数据集)