【数据集转换】DarkLabel 制作的目标跟踪数据集 转换为 coco格式

DarkLabel 制作的目标跟踪数据集转换为coco格式

写在前面:
自己制作的目标跟踪数据集是按照visdrone来制作的。因此,由于日常需要,转换为coco格式数据集的时候,小编先转换为了mot格式,然后有转换为了coco格式。由于文件目录和标注文件内容较为复杂,小编决定出此文记录下。

1. 目前数据集现状

由于并没有开源的XXX方向数据集,因此自己简单制作了少量数据集。但是由于个人制作,在生成数据标注文件的时候仅仅有gt.txt。

2. visdrone 转换为mot格式数据集

import os
import shutil
from tqdm import tqdm
from PIL import Image


def copyfile(old_folder_path,new_folder_path):
    '''

    :param old_folder_path:
    :param new_folder_path:
    :return:
    '''
    print('---------------------')
    for file in os.listdir(old_folder_path):
        old_file_path=os.path.join(old_folder_path,file)
        # print(file)
        # print(new_folder_path)
        shutil.copy(old_file_path, new_folder_path)

def makedir(filepath):
    if not os.path.exists(filepath):
        os.mkdir(filepath)

def process(path):
    annotations_path = os.path.join(path, "annotations")
    ann_set = os.listdir(annotations_path)
    # print(ann_set)
    file_path=os.path.join(path,'sequences')
    file_set=os.listdir(file_path)
    # print(file_set)
    for i in tqdm(ann_set):
        f = open(annotations_path + "/" + i, "r")
        print(i)
        name = i.replace(".txt", "")
        print(name)
        img_path=os.path.join(file_path,name)
        img_set=os.listdir(img_path)
        img=Image.open(os.path.join(img_path,img_set[0]))

        for line in f.readlines():
            line = line.replace("\n", "")
            if line.endswith(","):  # filter data
                line = line.rstrip(",")
            line_list = [int(i) for i in line.split(",")]
            new_line_list=[line_list[i] for i in range(0,8)]
            print(line_list)
            # print(new_line_list)
            if(line_list[8]==0 and line_list[9]==0):
                new_line_list.append(1)
            if (line_list[8] == 0 and line_list[9] == 1):
                new_line_list.append(0.9)
            if (line_list[8] == 1 and line_list[9] == 0):
                new_line_list.append(0.8)
            if (line_list[8] == 0 and line_list[9] == 2):
                new_line_list.append(0.7)
            if (line_list[8] == 1 and line_list[9] == 1):
                new_line_list.append(0.5)
            if (line_list[8] == 1 and line_list[9] == 2):
                new_line_list.append(0.3)
            # print(new_line_list)
            url1 = os.path.join(path,name)
            makedir(url1)
            print('url1:',url1)
            url2=os.path.join(url1,'gt')
            print('url2:',url2)
            makedir(url2)
            file_url=url2+'/gt.txt'
            print(url2)
            print(file_url)
            if not os.path.isfile(file_url):
                fd = open(file_url, mode="w", encoding="utf-8")
            makedir(file_url)
            with open(file_url, 'a') as file_name:
                str_text = str(new_line_list[0]) + ',' + str(new_line_list[1]) + ',' + str(new_line_list[2]) + ',' + str(
                    new_line_list[3]) + ',' + str(new_line_list[4]) + ',' + str(new_line_list[5]) + ',' + str(
                    new_line_list[6]) + ',' + str(new_line_list[7])+ ',' + str(new_line_list[8])
                print(str_text)
                file_name.write(str_text + '\n')

        ini_path = os.path.join(path, name)
        ini_file=ini_path+'/seqinfo.ini'
        print('***********************************')
        if not os.path.isfile(ini_file):
            fd = open(ini_file, mode="w", encoding="utf-8")
        with open(ini_file, 'a') as ini_name:
            ini_text ='[Sequence]\n'+'name='+name+'\n'+'imDir=img1\n'+'frameRate=30\n'+'seqLength='+str(len(img_set))+'\n'+'imWidth = '+str(img.size[0])+'\n'+'imHeight = '+str(img.size[1])+'\n'+'imExt =.jpg\n'
            print(ini_text)
            ini_name.write(ini_text + '\n')
        old_path = os.path.join(file_path, name)
        new_path = os.path.join(path, name, 'img1')
        print(old_path)
        print(new_path)
        move(old_path, new_path)
        # break


def move(old_path,new_path):
    makedir(new_path)
    copyfile(old_path,new_path)

if __name__ == '__main__':
    path=r'E:\dataset\visdrone\VisDrone2019-MOT-test-dev'
    process(path)

3. mot 转换为coco格式数据集

注意:并不是完全一致的mot数据集,而是没有det.txt文件的mot数据集。

import os
import numpy as np
import json
import cv2


DATA_PATH = '/path/to/mot2coco/'
OUT_PATH = os.path.join(DATA_PATH, 'annotations')
SPLITS = ['train', 'test']

for split in SPLITS:
    data_path=os.path.join(DATA_PATH,split)
    out_path = os.path.join(OUT_PATH, f'{
      
      split}.json')
    print(data_path)

    seqs = os.listdir(data_path)
    print(seqs)

    out = {
    
    'images': [], 'annotations': [], 'videos': [],'categories': []}
    cat = [
           {
    
    "id": 1, "name": "..."},
           {
    
    "id": 2, "name": "..."},
           {
    
    "id": 3, "name": "..."}...]
    out['categories'] = cat
    image_cnt = 0
    image_num = 0
    object_cnt = 0
    ann_cnt = 0
    video_cnt = 0

    for seq in seqs:
        video_cnt += 1
        out['videos'].append({
    
    'id': video_cnt, 'file_name': seq})
        seq_path= os.path.join(data_path,seq)
        print(seq_path)
        img_path = os.path.join(seq_path, 'img1')
        ann_path = os.path.join(seq_path, 'gt/gt.txt')
        images = os.listdir(img_path)
        num_images = len([image for image in images if 'png' in image])
        print('num_images:',num_images)
        image_range = [0, num_images - 1]

        for k in range(num_images):
            if k < image_range[0] or k > image_range[1]:
                continue

            img = cv2.imread(os.path.join(data_path, f'{
      
      seq}/img1/{
      
      k+1}.png'))
            height, width = img.shape[:2]

            image_info = {
    
    'file_name': f'{
      
      seq}/img1/{
      
      k+1}.png',
                          'id': str(image_cnt + image_num + 1),
                          'height': height, 'width': width}

            print(image_info)

            out['images'].append(image_info)
            image_num += 1

            anns = np.loadtxt(ann_path, dtype=np.int, delimiter=',')
            for i in range(0,anns.shape[0]):
                frame_id = int(anns[i][0])
                if frame_id  < image_range[0] or frame_id  > image_range[1]:
                    continue
                track_id = int(anns[i][1])
                cat_id = int(anns[i][7])
                object_cnt += 1
                ann_cnt += 1
                category_id = anns[i][7]

                ann = {
    
    'id': ann_cnt,
                       'category_id': int(category_id),
                       'image_id': image_cnt + image_num,
                       'bbox': anns[i][2:6].tolist(),
                       'iscrowd': 0,
                       'area': float(anns[i][4] * anns[i][5])
                }
                out['annotations'].append(ann)
                # print(ann)

        image_cnt += num_images

    json.dump(out, open(out_path, 'w'))

本文首发于:https://zhuanlan.zhihu.com/p/609550664

猜你喜欢

转载自blog.csdn.net/qq_44824148/article/details/129135200