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
启动训练进程即可