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'))