车道线数据集CULane处理裁剪
0.前言
目前使用较多的车道线数据集有2个,tusimple和culane,tusimple数据集图片原始分辨率为720P的,而culane数据集原始分辨率为1640x590,由于SCNN开源时候,使用了等比缩放到288x800分辨率,导致以后绝大部分方法都是使用这个分辨率训练的,首先自己数据集跟culane不同,而且288x800分辨率使用基于分割的方法运算量较大,在板卡上运行太慢,也做了相关试验,更改了backbone和分辨率,在UFLD上使用mbv2和256x512的分辨率训练,模型较resnet18,F1降低了大约3个点,但是在板卡速度为20ms(288x800 rensnet18为70多),提升较大,所以对于图片分辨率,个人感觉可以将原始图片上方天空部分去除,在原图上降低图像分辨率,记录下生成脚本
1.实现
统计了下CULane整个数据集上车道线点最小的纵坐标为250,个人把数据集高裁剪为360,所以在原图590上需要减去230
import os
import cv2
import glob
import numpy as np
# culane datasets ymain = 250
data_dir = ['driver_100_30frame', 'driver_161_90frame', 'driver_182_30frame', 'driver_193_90frame', 'driver_23_30frame', 'driver_37_30frame']
ymin = 590
count = 0
img_num = 0
txt_num = 0
for s in data_dir:
img_dir = glob.glob(os.path.join(s,'*/*.jpg'))
txt_dir = glob.glob(os.path.join(s,'*/*.txt'))
print('{}: img num {} txt num {} total num: {}'.format(s,len(img_dir), len(txt_dir),len(img_dir) + len(txt_dir)))
for img_path in img_dir:
img = cv2.imread(img_path)
img = img[230:,:,:]
clip_path = os.path.join('/opt/sda5/BL01_Data/Lane_Data/CULane_Clip', img_path)
if not os.path.exists(os.path.split(clip_path)[0]):
os.makedirs(os.path.split(clip_path)[0])
cv2.imwrite(clip_path, img)
img_num += 1
txt_path = img_path.replace('.jpg', '.lines.txt')
if not os.path.exists(txt_path):
continue
with open(txt_path, 'r') as f:
lines = f.readlines()
#if len(lines) == 0:
# print(txt_path)
lab_path = clip_path.replace('.jpg', '.lines.txt')
with open(lab_path, 'w') as ff:
for line in lines:
points = []
for index, p in enumerate(line.strip().split(' ')):
if index % 2 != 0:
p = str(float(p) - 230) + ' '
else:
p = p + ' '
points.append(str(p))
points.append('\n')
#points = np.array([int(float(x)) for x in points]).reshape(-1,2)
#for x_y in points:
# cv2.circle(img, tuple(x_y), 2, (255,0,0), -1)
ff.writelines(points)
txt_num += 1
print('{}: img num {} txt num {} total num: {}'.format(s, img_num, txt_num, img_num + txt_num))