1、克隆项目
2、创建虚拟环境,安装依赖包
3、进行labelme标注
关注下“labelme”、“points”
4、生成culane格式
以生成训练集为例
首先新建文件夹,放入图片集
mkdir train_dataset
将json文件放入train_dataset中,执行
python scripts/json2culane.py
这时候会在train_dataset生成文件夹
其中images_dir存储原始图片;
labels_dir存储掩码图,打开基本漆黑一片,实际存车道线的掩码图;
train_gt.txt存储标签
执行$ python json2culane.py前需要修改下列部分
data_root = "/home/lyn/Desktop/cdx0822/train_dataset/"
json_file = "/home/lyn/Desktop/cdx0822/train_dataset/train_json/"
dir_img = '/images_dir/'
dir_labelimg = '/labels_dir/'
train_gt_txt = data_root + 'list/train_gt.txt'
json2culane.py代码如下:
# encoding:utf-8
import argparse
import json
import os
import os.path as osp
import base64
import warnings
import PIL.Image
import yaml
from labelme import utils
#import cv2
import numpy as np
#from skimage import img_as_ubyte
def json2point_txt(path_json, path_txt): # 可修改生成格式生成
with open(path_json, 'r') as path_json:
jsonx = json.load(path_json)
with open(path_txt, 'w+') as ftxt:
for shape in jsonx['shapes']:
label = str(shape['label']) + ' '
xy = np.array(shape['points'])
strxy = ''
for m, n in xy:
m = int(m)
n = int(n)
# print('m:',m)
# print('n:',n)
strxy += str(m) + ' ' + str(n) + ' '
label = strxy
ftxt.writelines(label + "\n")
def json2gt_txt(path_json, path_img, path_labelimg, train_gt_txt): # 可修改生成格式
with open(path_json, 'r') as path_json:
jsonx = json.load(path_json)
with open(train_gt_txt, 'a+') as ftxt:
labelarray = [0,0,0,0]
for shape in jsonx['shapes']:
# label = int(shape['label'])
'''if(shape['label'] == "left_lanes"):
label =2
elif(shape['label'] == "right_lanes"):
label =3
else:
label =1'''
if(shape['label'] == "line1"):
label=1
elif(shape['label'] == "line2"):
label=2
elif(shape['label'] == "line3"):
label=3
elif(shape['label'] == "line4"):
label=4
if label == 1:
labelarray[0] = 1
if label == 2:
labelarray[1] = 1
if label == 3:
labelarray[2] = 1
if label == 4:
labelarray[3] = 1
labelstr = str(labelarray[0])+ " " + str(labelarray[1])+ " " + str(labelarray[2])+ " " + str(labelarray[3])
ftxt.writelines(labelstr + "\n")
def main():
#json_file = args.json_file
data_root = "/home/lyn/Desktop/cdx0829/val/"
json_file = "/home/lyn/Desktop/cdx0829/val/val_json/"
dir_img = '/images_dir/'
dir_labelimg = '/labels_dir/'
train_gt_txt = data_root + 'list/val_gt.txt'
list_path = os.listdir(json_file)
# line_txt = '/home/lyn/Desktop/cdx0829/val/line_txt/' # txt存储目录
list_dir = osp.join(data_root, 'list')
if not osp.exists(list_dir):
os.mkdir(list_dir)
images_dir = osp.join(data_root, 'images_dir')
if not osp.exists(images_dir):
os.mkdir(images_dir)
labels_dir = osp.join(data_root, 'labels_dir')
if not osp.exists(labels_dir):
os.mkdir(labels_dir)
# if not os.path.exists(line_txt):
# os.makedirs(line_txt)
for i in range(0, len(list_path)):
if list_path[i].endswith('.json'):
path_json = os.path.join(json_file, list_path[i])
if os.path.isfile(path_json):
data = json.load(open(path_json))
img = utils.img_b64_to_arr(data['imageData'])
lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])
captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]
lbl_viz = utils.draw_label(lbl, img, captions)
save_file_name = osp.basename(path_json).split('.')[0]
PIL.Image.fromarray(img).save(osp.join(images_dir, '{}.jpg'.format(save_file_name)))
PIL.Image.fromarray(lbl).save(osp.join(labels_dir, '{}.png'.format(save_file_name)))
# 生成lines.txt
path_txt = images_dir + "/" + list_path[i].replace('.json', '.lines.txt')
# print(path_txt)
json2point_txt(path_json, path_txt)
# 生成train_gt_txt
path_img = dir_img + list_path[i].replace('.json', '.jpg')
path_labelimg = dir_labelimg + list_path[i].replace('.json', '.png')
with open(train_gt_txt, 'a+') as ftxt:
ftxt.writelines(path_img + " " + path_labelimg + " ") #写入txt文件
json2gt_txt(path_json, path_img, path_labelimg, train_gt_txt)
if __name__ == '__main__':
# base64path = argv[1]
main()
5、配置culane参数,进行训练
python train.py configs/culane.py
其中configs/culane.py 需要修改一下 训练集的数据 海可以更改训练参数比如:
# epoch , batch_size ,optimizer ,learning_rate,adam
其中log_path项必填
log_path = "./result"
dataset='CULane'
# 训练集的数据路径,
data_root = './train_dataset'
python train.py configs/culane.py --batch_size 8
每一轮epoch都会生成一次pth
6、可视化日志
tensorboard --logdir ./result --bind_all
7、demo展示生成avi
修改demo.py对应参数,其中train_gt.txt只是为了方便,此时你应该用你的验证集看看效果。不然训练的数据去看是不合理的。
python demo.py configs/culane.py --test_model xxx/xxx/ep099.pth(权重文件的地址)