FairMOT用kitti object数据集训练前的准备工作

1.第一步将训练标签用 typel类型用数字表示 标签含义:

The label files contain the following information, which can be read and
written using the matlab tools (readLabels.m, writeLabels.m) provided within
this devkit. All values (numerical or strings) are separated via spaces,
each row corresponds to one object. The 15 columns represent:

#Values    Name      Description
----------------------------------------------------------------------------
   1    type         Describes the type of object: 'Car', 'Van', 'Truck',
                     'Pedestrian', 'Person_sitting', 'Cyclist', 'Tram',
                     'Misc' or 'DontCare'
   1    truncated    Float from 0 (non-truncated) to 1 (truncated), where
                     truncated refers to the object leaving image boundaries
   1    occluded     Integer (0,1,2,3) indicating occlusion state:
                     0 = fully visible, 1 = partly occluded
                     2 = largely occluded, 3 = unknown
   1    alpha        Observation angle of object, ranging [-pi..pi]
   4    bbox         2D bounding box of object in the image (0-based index):
                     contains left, top, right, bottom pixel coordinates
   3    dimensions   3D object dimensions: height, width, length (in meters)
   3    location     3D object location x,y,z in camera coordinates (in meters)
   1    rotation_y   Rotation ry around Y-axis in camera coordinates [-pi..pi]
   1    score        Only for results: Float, indicating confidence in
                     detection, needed for p/r curves, higher is better.

附代码:

# -*- coding:utf-8 -*-
import os
import numpy as np
import pandas as pd
import os.path as osp

def replace(file, old_content, new_content):
    content = read_file(file)
    content = content.replace(old_content, new_content)
    rewrite_file(file, content)

# 读文件内容
def read_file(file):
    with open(file, encoding='UTF-8') as f:
        read_all = f.read()
        f.close()

    return read_all

# 写内容到文件
def rewrite_file(file, data):
    with open(file, 'w', encoding='UTF-8') as f:
        f.write(data)
        f.close()


src_data='/media/ckq/data/kitti/data_object/training/label_2'
seqs = [s for s in os.listdir(src_data)]
seqs.sort()  #排个序
#print(seqs)
for seq in seqs:
    #path=osp.join(src_data,seq,'gt/gt.txt')
    #path = '/media/ckq/data/kitti/MOT/images/train/0001/gt/gt.txt'
    path=osp.join(src_data,seq)
    print(path)
    #replace(path, ' ', ',')
    replace(path, 'DontCare', '10')
    replace(path, 'Person', '1')
    replace(path, 'Pedestrian', '2')
    replace(path, 'Car', '3')
    replace(path, 'Person_sitting', '4')
    replace(path, 'Cyclist', '5')
    replace(path, 'Van', '6')
    replace(path, 'Truck', '7')
    replace(path, 'Tram', '8')
    replace(path, 'Misc', '9')

2. 筛选 !!!!生成训练要的标签:

附代码:

# -*- coding:utf-8 -*-
import os
import shutil
import numpy as np
import pandas as pd
import os.path as osp

src_labels_path='/media/ckq/data/kitti/data_object/training/label_2'
dis_labels_path='/media/ckq/data/kitti/data_object/training/do_all'
src_imgs_path='/media/ckq/data/kitti/data_object/data_object_image_2/data_object_image_2/training/image_2'
dis_img_path='/media/ckq/data/kitti/data_object/data_object_image_2/data_object_image_2/training/do_all'

labels_name=os.listdir(src_labels_path)
labels_name.sort()

imgs_name=os.listdir(src_imgs_path)
imgs_name.sort()

obj_num=0
print(labels_name)

seq_info_path='/media/ckq/data/kitti/data_object/data_object_image_2/data_object_image_2/training/seqinfo.ini'
with open(seq_info_path) as seq_info_h:  # 读取 *.ini 文件
    seq_info = seq_info_h.read()
    seq_width = int(seq_info[seq_info.find('imWidth=') + 8:seq_info.find('\nimHeight')])  # 视频的宽
    seq_height = int(seq_info[seq_info.find('imHeight=') + 9:seq_info.find('\nimExt')])  # 视频的高
    # print('seq_width:',seq_width)
    # print('seq_height:', seq_height)


for label_name in labels_name:
    six_lable_name =label_name[0:6]
    six_img_name=label_name[0:6]
    # print(six_lable_name)
    # print("------")
    # print(six_img_name)
   #拼接地址
    label_path=osp.join(src_labels_path, label_name)
    new_label_path = osp.join(dis_labels_path, label_name)
    #加载图片格式等信息
import os
import sys
import os.path as osp
import shutil
from PIL import Image
import os.path as osp

def mkdirs(d):
    # if not osp.exists(d):
    if not osp.isdir(d):
        os.makedirs(d)

src_folder = '/media/ckq/data/kitti/data_object/data_object_image_2/data_object_image_2/training/do_all'   # 源文件夹,包含.png格式图片
dist_folder = '/media/ckq/data/kitti/data_object/data_object_image_2/data_object_image_2/training/do_all_jpg'   # 输出文件夹


output_folder = osp.join(dist_folder,  'img1')  # 输出文件夹
if not os.path.isdir(output_folder):
    mkdirs(output_folder)
else:  # 如果之前已经生成过: 递归删除目录和文件, 重新生成目录
    shutil.rmtree(output_folder)
    os.makedirs(output_folder)
print(output_folder)
a = []
for root, dirs, files in os.walk(src_folder):
    for filename in (x for x in files if x.endswith('.png')):
        filepath = os.path.join(root, filename)

        object_class = filename.split('.')[0]
        a.append(object_class)
    print(a)

for i in a:
    old_path = src_folder + "/" + str(i) + '.png'
    new_path = output_folder + "/" + str(i) + '.jpg'
    img = Image.open(old_path)
    img.save(new_path)


    #img_path=osp.join(src_imgs_path, label_name)
    #new_img_path = osp.join(dis_img_path, label_name)
    f=open(label_path, "r", encoding='utf-8', errors='ignore')
    #print(f)
    for line in f.readlines():
        type_id=int(line.split(' ')[0])
        #print(type_id)
        if (type_id ==3 or type_id ==6 or type_id ==7):#文档中存在一个3 6 7 就将改行写进新的文档 进行存储
            #读取图片 拼接地址
            img_path = osp.join(src_imgs_path, six_img_name+".png")
            print(img_path)
            #复制图片从原先地址到目的地址
            shutil.copy(img_path,dis_img_path)
            #读取
            #new_label_path = osp.join(dis_labels_path, label_name)
            file = open(new_label_path, 'a')  #有 3  6 7 才创建新的txt
            #print(type_id)
            #id数量  由于这里的图片 不是连续拍摄 所以前后两张图片上的物体可能不是同一个物体 所以每张图中物体的id都是在前一张上面的累加
            obj_num +=1
            trc_id=obj_num
            bbox_left=float(line.split(' ')[4])
            bbox_top=float(line.split(' ')[5])
            bbox_right=float(line.split(' ')[6])
            bbox_bottom=float(line.split(' ')[7])
            print(bbox_left)
            print(bbox_top)
            print(bbox_right)
            print(bbox_bottom)
            w = float(bbox_right - bbox_left)
            h = float(bbox_bottom - bbox_top)
            x = int(bbox_left + 0.5)
            y = int(bbox_top + 0.5)

            # bbox中心点坐标
            x += w / 2
            y += h / 2

            label_str = '0 {:d} {:.6f} {:.6f} {:.6f} {:.6f}\n'.format(
                trc_id,
                x / seq_width,  # center_x    后期加载图片height和width之后在做整改
                y / seq_height,  # center_y
                w / seq_width,  # bbox_w
                h / seq_height)  # bbox_h
            file.write(label_str)
            continue

3.png改jpg

发现转成jpg格式后 图片size变小了差不多十倍!!!
不太懂这个机制
看了网上有人说同样一张图片,jpg格式的图片占内存更大?????
what????
我感觉是我的code處理的有點問題

附代码:

import os
import sys
import os.path as osp
import shutil
from PIL import Image
import os.path as osp

def mkdirs(d):
    # if not osp.exists(d):
    if not osp.isdir(d):
        os.makedirs(d)

src_folder = '/media/ckq/data/kitti/data_object/data_object_image_2/data_object_image_2/training/do_all'   # 源文件夹,包含.png格式图片
dist_folder = '/media/ckq/data/kitti/data_object/data_object_image_2/data_object_image_2/training/do_all_jpg'   # 输出文件夹


output_folder = osp.join(dist_folder,  'img1')  # 输出文件夹
if not os.path.isdir(output_folder):
    mkdirs(output_folder)
else:  # 如果之前已经生成过: 递归删除目录和文件, 重新生成目录
    shutil.rmtree(output_folder)
    os.makedirs(output_folder)
print(output_folder)
a = []
for root, dirs, files in os.walk(src_folder):
    for filename in (x for x in files if x.endswith('.png')):
        filepath = os.path.join(root, filename)

        object_class = filename.split('.')[0]
        a.append(object_class)
    print(a)

for i in a:
    old_path = src_folder + "/" + str(i) + '.png'
    new_path = output_folder + "/" + str(i) + '.jpg'
    img = Image.open(old_path)
    img.save(new_path)

4. 图片和标签重新命名

附代码:

import os
import re
import sys
import os
import os.path as osp
#由于图片是筛选过的  所以图片序号都不是连续的  要重新命排序
def rename_photo_all(path):
    fileList = os.listdir(path)  # 待修改文件夹
    fileList.sort()
    print("修改前:" + str(fileList))  # 输出文件夹中包含的文件
    os.chdir(path)  # 将当前工作目录修改为待修改文件夹的位置
    num = 1  # 名称变量
    for fileName in fileList:  # 遍历文件夹中所有文件
        seq_num=num
        name = str(seq_num).zfill(6)  # 设置宽度
        all_name='img'+name
        print(all_name)


        pat = ".+\.(jpg|jpeg|JPG)"  # 匹配文件名正则表达式
        pattern = re.findall(pat, fileName)  # 进行匹配
        print('pattern[0]:', pattern)
        print('num:', num, 'filename:', fileName)
        os.rename(fileName, (all_name + '.' + pattern[0]))  # 文件重新命名

        num = num + 1  # 改变编号,继续下一项
    print("---------------------------------------------------")
    sys.stdin.flush()  # 刷新
    print("修改后:" + str(os.listdir(path)))  # 输出修改后文件夹中包含的文件


def rename_gt_all(path):
    fileList = os.listdir(path)  # 待修改文件夹
    fileList.sort()
    print("修改前:" + str(fileList))  # 输出文件夹中包含的文件
    os.chdir(path)  # 将当前工作目录修改为待修改文件夹的位置
    num = 1  # 名称变量
    for fileName in fileList:  # 遍历文件夹中所有文件
        seq_num=num
        name = str(seq_num).zfill(6)  # 设置宽度
        all_name='img'+name
        print(all_name)


        pat = ".+\.(txt)"  # 匹配文件名正则表达式
        pattern = re.findall(pat, fileName)  # 进行匹配
        print('pattern[0]:', pattern)
        print('num:', num, 'filename:', fileName)
        os.rename(fileName, (all_name + '.' + pattern[0]))  # 文件重新命名

        num = num + 1  # 改变编号,继续下一项
    print("---------------------------------------------------")
    sys.stdin.flush()  # 刷新
    print("修改后:" + str(os.listdir(path)))  # 输出修改后文件夹中包含的文件





src_path='/media/ckq/data/kitti/data_object/MOT/images/train'
imgs_name = os.listdir(src_path)
imgs_name.sort()
print(imgs_name)
for img_name in imgs_name:
    img_path=osp.join(src_path,img_name,'img1')
    print(img_path)
    rename_photo_all(img_path)

src_labels_path='/media/ckq/data/kitti/data_object/MOT/labels_with_ids/train'
labels_name = os.listdir(src_labels_path)
labels_name.sort()
print(labels_name)
for label_name in labels_name:
    label_path=osp.join(src_labels_path,label_name,'img1')
    print(label_path)
    rename_gt_all(label_path)

第五步貌似并不需要 除去 5.gt去除空格(用逗号表示)

附代码:

-- coding:utf-8 --

import os
import os.path as osp

def replace(file, old_content, new_content):
    content = read_file(file)
    content = content.replace(old_content, new_content)
    rewrite_file(file, content)

# 读文件内容
def read_file(file):
    with open(file, encoding='UTF-8') as f:# -*- coding:utf-8 -*-
import os
import os.path as osp

def replace(file, old_content, new_content):
    content = read_file(file)
    content = content.replace(old_content, new_content)
    rewrite_file(file, content)

# 读文件内容
def read_file(file):
        read_all = f.read()
        f.close()

    return read_all

# 写内容到文件
def rewrite_file(file, data):
    with open(file, 'w', encoding='UTF-8') as f:
        f.write(data)
        f.close()


src_data='/media/ckq/data/kitti/data_object/MOT/labels_with_ids/train/data_object_all/img1'
seqs = [s for s in os.listdir(src_data)]
seqs.sort()  #排个序
#print(seqs)
for seq in seqs:
    path=osp.join(src_data,seq)
    print(path)
    replace(path, ' ', ',')

6.检验标签标注的图片汽车是否正确 附代码

# -*- coding:utf-8 -*-
import os
import cv2
import os.path as osp
'''
显示跟踪训练数据集标注
'''

root_path ='/media/ckq/data/kitti/data_object/MOT'
img_dir = "images/train"
label_dir = "labels_with_ids/train"


imgs = os.listdir(root_path + "/" + img_dir)  #遍历图片数据集列表  0000 0001........
imgs.sort()
for i, img in enumerate(imgs):  #一个一个遍历
    #img_name = img[:-1]   #img[:-1] -1代表从右往左 第一个不取
    #print(img)
    img_name=img #每个图片集名字
    print(img_name)
    label_path=osp.join(root_path,label_dir,img_name,'img1')
    print(label_path)
    label_gts_name=os.listdir(label_path)
    label_gts_name.sort()
    print(label_gts_name)
    for frame_gt in label_gts_name:
        #print(frame_gt)
        frame_gt_name=frame_gt[:9]
        #print(frame_gt_name)
        label_f = open(label_path + "/" +frame_gt_name+".txt", "r") #路劲标签名
        #print(label_f)
        lines = label_f.readlines()
        #print(lines)
        #print(root_path + "/" + img_dir + "/" + img+"/img/"+frame_gt_name)
        img_data = cv2.imread(root_path + "/" + img_dir + "/" + img+"/img1/"+frame_gt_name+".jpg") #gt对应的图片序号
        # img_data = cv2.imread(root_path + "/" + img_dir + "/" + img + "/img1/" + frame_gt_name + ".png")  # gt对应的图片序号
        print(img_data)
        H, W, C = img_data.shape
        # print(H)
        # print(W)
        # print(C)
        for line in lines:
            line_list = line.strip().split()
            class_num = int(line_list[0])  # 类别号
            obj_ID = int(line_list[1])  # 目标ID
            x, y, w, h = line_list[2:]  # 中心坐标,宽高(经过原图宽高归一化后)
            x = int(float(x) * W)
            y = int(float(y) * H)
            w = int(float(w) * W)
            h = int(float(h) * H)
            left = int(x - w / 2)
            top = int(y - h / 2)
            right = left + w
            bottom = top + h
            cv2.circle(img_data, (x, y), 1, (0, 0, 255))
            cv2.rectangle(img_data, (left, top), (right, bottom), (0, 255, 0), 2)
            cv2.putText(img_data, str(obj_ID), (left, top), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 255), 1)
        resized_img = cv2.resize(img_data, (800, 416))
        cv2.imshow("label", resized_img)
        cv2.waitKey(100)

效果图:

在这里插入图片描述

在这里插入图片描述

由于是是在程序运行时 截图 所以看到的事图片有点问题!!!

7.生成用于训练的.train文件kittiobjectcar.train 将其复制到src/data/文件夹下面

import os
import os.path as osp
image_flder = '/media/ckq/data/kitti/data_object/MOT/images/train'
#image_flder = "/home/ckq/Desktop/MOT/images/train"   #用来test
need_image_flder="MOT/images/train"
imgs = os.listdir(image_flder)
#print(imgs)
train_f = open('/media/ckq/data/kitti/data_object/MOT/kittiobjectcar.train', "w")
#train_f = open("/home/ckq/Desktop/MOT/kitt_car.train", "w")  #用来test
for img_name in imgs:
    image_path=osp.join(image_flder,img_name,'img1')
    need_image_path=osp.join(need_image_flder,img_name,'img1')
    #print(image_path)
    #print(need_image_path)
    image_names=os.listdir(image_path)
    image_names.sort()
    #print(image_names)
    for image_name in image_names:
        #save_str = image_path + '/' + image_name +"\n"   #这里保存的路径是绝对路径  代码中不需要绝对路径  相对路径即可
        save_str = need_image_path + '/' + image_name + "\n"
        print(save_str)
        train_f.write(save_str)
train_f.close()

到此基本上训练前准备工作已经准备好,之后只需要在代码中 修改训练的训练集路径 同时编写好编写json格式的cfg文件./src/lib/cfg/kittiobjectcar.json:

{
    "root":"/media/ckq/data/kitti/data_object",
    "train":
    {
        "kitti":"./data/kittiobjectcar.train"
    },
    "test_emb":
    {
        "kitti":"./data/kittiobjectcar.train"
    },
    "test":
    {
        "kitti":"./data/kittiobjectcar.train"
    }
}


同时需要修改的是代码中的opts.py

1.修改–load_model参数, 选择一个断点模型, 如 ctdet_coco_dla_2x.pth, 从这个预训练模型开始训练
2.修改----data_cfg参数, 选择训练、测试数据,如 …/src/lib/cfg/kittiobjectcar.json

同时修改这下面的数据加载路径

之后在终端或者在pychram的终端运行:

(FairMOT) ckq@ckq:~/git/FairMOTVehicle/src$   python train.py

启动训练进程即可

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值