1. tusimple数据集下载的地址:here
  2. 数据集保存格式
    |–dataset
    |----clips
    |----label_data_0313.json
    |----label_data_0531.json
    |----label_data_0601.json
    |----test_label.json

方法一

运行代码来生成二值化和实例化的数据集图片和对应txt文件

python tusimple_transform.py --src_dir path/to/your/unzipped/file --val True --test True

注释:如果–val/train设置为False,则不会生成val/train二值化和实例化的数据集和对应txt文件

tusimple_transform.py的代码如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-"""
generate tusimple training datasetOriginal code is copied from https://github.com/MaybeShewill-CV/lanenet-lane-detection
Dataset: https://github.com/TuSimple/tusimple-benchmark/issues/3Change by Iroh Cao1. Adding valiation set/test set
2. Fix some small error"""
import argparse
import glob
import json
import os
import os.path as ops
import shutilimport cv2
import numpy as npdef init_args():""":return:"""parser = argparse.ArgumentParser()parser.add_argument('--src_dir', type=str, help='The origin path of unzipped tusimple dataset')parser.add_argument('--val', type=bool, help='Tag for validation set', default=True)parser.add_argument('--test', type=bool, help='Tag for validation set', default=False)return parser.parse_args()def process_json_file(json_file_path, src_dir, ori_dst_dir, binary_dst_dir, instance_dst_dir):""":param json_file_path::param src_dir: origin clip file path:param ori_dst_dir::param binary_dst_dir::param instance_dst_dir::return:"""assert ops.exists(json_file_path), '{:s} not exist'.format(json_file_path)image_nums = len(os.listdir(ori_dst_dir))with open(json_file_path, 'r') as file:for line_index, line in enumerate(file):info_dict = json.loads(line)image_dir = ops.split(info_dict['raw_file'])[0]image_dir_split = image_dir.split('/')[1:]image_dir_split.append(ops.split(info_dict['raw_file'])[1])image_name = '_'.join(image_dir_split)image_path = ops.join(src_dir, info_dict['raw_file'])assert ops.exists(image_path), '{:s} not exist'.format(image_path)h_samples = info_dict['h_samples']lanes = info_dict['lanes']image_name_new = '{:s}.png'.format('{:d}'.format(line_index + image_nums).zfill(4))src_image = cv2.imread(image_path, cv2.IMREAD_COLOR)dst_binary_image = np.zeros([src_image.shape[0], src_image.shape[1]], np.uint8)dst_instance_image = np.zeros([src_image.shape[0], src_image.shape[1]], np.uint8)for lane_index, lane in enumerate(lanes):assert len(h_samples) == len(lane)lane_x = []lane_y = []for index in range(len(lane)):if lane[index] == -2:continueelse:ptx = lane[index]pty = h_samples[index]lane_x.append(ptx)lane_y.append(pty)if not lane_x:continuelane_pts = np.vstack((lane_x, lane_y)).transpose()lane_pts = np.array([lane_pts], np.int64)cv2.polylines(dst_binary_image, lane_pts, isClosed=False,color=255, thickness=5)cv2.polylines(dst_instance_image, lane_pts, isClosed=False,color=lane_index * 50 + 20, thickness=5)dst_binary_image_path = ops.join(binary_dst_dir, image_name_new)dst_instance_image_path = ops.join(instance_dst_dir, image_name_new)dst_rgb_image_path = ops.join(ori_dst_dir, image_name_new)cv2.imwrite(dst_binary_image_path, dst_binary_image)cv2.imwrite(dst_instance_image_path, dst_instance_image)cv2.imwrite(dst_rgb_image_path, src_image)print('Process {:s} success'.format(image_name))def gen_train_sample(src_dir, b_gt_image_dir, i_gt_image_dir, image_dir):"""generate sample index file:param src_dir::param b_gt_image_dir::param i_gt_image_dir::param image_dir::return:"""with open('{:s}/training/train.txt'.format(src_dir), 'w') as file:for image_name in os.listdir(b_gt_image_dir):if not image_name.endswith('.png'):continuebinary_gt_image_path = ops.join(b_gt_image_dir, image_name)instance_gt_image_path = ops.join(i_gt_image_dir, image_name)image_path = ops.join(image_dir, image_name)assert ops.exists(image_path), '{:s} not exist'.format(image_path)assert ops.exists(instance_gt_image_path), '{:s} not exist'.format(instance_gt_image_path)b_gt_image = cv2.imread(binary_gt_image_path, cv2.IMREAD_COLOR)i_gt_image = cv2.imread(instance_gt_image_path, cv2.IMREAD_COLOR)image = cv2.imread(image_path, cv2.IMREAD_COLOR)if b_gt_image is None or image is None or i_gt_image is None:print('图像对: {:s}损坏'.format(image_name))continueelse:info = '{:s} {:s} {:s}'.format(image_path, binary_gt_image_path, instance_gt_image_path)file.write(info + '\n')returndef gen_train_val_sample(src_dir, b_gt_image_dir, i_gt_image_dir, image_dir):"""generate sample index file:param src_dir::param b_gt_image_dir::param i_gt_image_dir::param image_dir::return:"""with open('{:s}/training/train.txt'.format(src_dir), 'w') as file:for image_name in os.listdir(b_gt_image_dir):if not image_name.endswith('.png'):continueif(int(image_name.split('.')[0]) % 13 == 0):continuebinary_gt_image_path = ops.join(b_gt_image_dir, image_name)instance_gt_image_path = ops.join(i_gt_image_dir, image_name)image_path = ops.join(image_dir, image_name)assert ops.exists(image_path), '{:s} not exist'.format(image_path)assert ops.exists(instance_gt_image_path), '{:s} not exist'.format(instance_gt_image_path)b_gt_image = cv2.imread(binary_gt_image_path, cv2.IMREAD_COLOR)i_gt_image = cv2.imread(instance_gt_image_path, cv2.IMREAD_COLOR)image = cv2.imread(image_path, cv2.IMREAD_COLOR)if b_gt_image is None or image is None or i_gt_image is None:print('图像对: {:s}损坏'.format(image_name))continueelse:info = '{:s} {:s} {:s}'.format(image_path, binary_gt_image_path, instance_gt_image_path)file.write(info + '\n')with open('{:s}/training/val.txt'.format(src_dir), 'w') as file:for image_name in os.listdir(b_gt_image_dir):if not image_name.endswith('.png'):continueif(int(image_name.split('.')[0]) % 13 != 0):continuebinary_gt_image_path = ops.join(b_gt_image_dir, image_name)instance_gt_image_path = ops.join(i_gt_image_dir, image_name)image_path = ops.join(image_dir, image_name)assert ops.exists(image_path), '{:s} not exist'.format(image_path)assert ops.exists(instance_gt_image_path), '{:s} not exist'.format(instance_gt_image_path)b_gt_image = cv2.imread(binary_gt_image_path, cv2.IMREAD_COLOR)i_gt_image = cv2.imread(instance_gt_image_path, cv2.IMREAD_COLOR)image = cv2.imread(image_path, cv2.IMREAD_COLOR)if b_gt_image is None or image is None or i_gt_image is None:print('图像对: {:s}损坏'.format(image_name))continueelse:info = '{:s} {:s} {:s}'.format(image_path, binary_gt_image_path, instance_gt_image_path)file.write(info + '\n')returndef gen_test_sample(src_dir, b_gt_image_dir, i_gt_image_dir, image_dir):"""generate sample index file:param src_dir::param b_gt_image_dir::param i_gt_image_dir::param image_dir::return:"""with open('{:s}/testing/test.txt'.format(src_dir), 'w') as file:for image_name in os.listdir(b_gt_image_dir):if not image_name.endswith('.png'):continuebinary_gt_image_path = ops.join(b_gt_image_dir, image_name)instance_gt_image_path = ops.join(i_gt_image_dir, image_name)image_path = ops.join(image_dir, image_name)assert ops.exists(image_path), '{:s} not exist'.format(image_path)assert ops.exists(instance_gt_image_path), '{:s} not exist'.format(instance_gt_image_path)b_gt_image = cv2.imread(binary_gt_image_path, cv2.IMREAD_COLOR)i_gt_image = cv2.imread(instance_gt_image_path, cv2.IMREAD_COLOR)image = cv2.imread(image_path, cv2.IMREAD_COLOR)if b_gt_image is None or image is None or i_gt_image is None:print('图像对: {:s}损坏'.format(image_name))continueelse:info = '{:s} {:s} {:s}'.format(image_path, binary_gt_image_path, instance_gt_image_path)file.write(info + '\n')returndef process_tusimple_dataset(src_dir, val_tag, test_tag):""":param src_dir::return:"""training_folder_path = ops.join(src_dir, 'training')testing_folder_path = ops.join(src_dir, 'testing')os.makedirs(training_folder_path, exist_ok=True)os.makedirs(testing_folder_path, exist_ok=True)for json_label_path in glob.glob('{:s}/label*.json'.format(src_dir)):json_label_name = ops.split(json_label_path)[1]shutil.copyfile(json_label_path, ops.join(training_folder_path, json_label_name))for json_label_path in glob.glob('{:s}/test*.json'.format(src_dir)):json_label_name = ops.split(json_label_path)[1]shutil.copyfile(json_label_path, ops.join(testing_folder_path, json_label_name))gt_image_dir = ops.join(training_folder_path, 'gt_image')gt_binary_dir = ops.join(training_folder_path, 'gt_binary_image')gt_instance_dir = ops.join(training_folder_path, 'gt_instance_image')os.makedirs(gt_image_dir, exist_ok=True)os.makedirs(gt_binary_dir, exist_ok=True)os.makedirs(gt_instance_dir, exist_ok=True)for json_label_path in glob.glob('{:s}/*.json'.format(training_folder_path)):process_json_file(json_label_path, src_dir, gt_image_dir, gt_binary_dir, gt_instance_dir)if(val_tag == False):gen_train_sample(src_dir, gt_binary_dir, gt_instance_dir, gt_image_dir)else:gen_train_val_sample(src_dir, gt_binary_dir, gt_instance_dir, gt_image_dir)if(test_tag == True):gt_image_dir_test = ops.join(testing_folder_path, 'gt_image')gt_binary_dir_test = ops.join(testing_folder_path, 'gt_binary_image')gt_instance_dir_test = ops.join(testing_folder_path, 'gt_instance_image')os.makedirs(gt_image_dir_test, exist_ok=True)os.makedirs(gt_binary_dir_test, exist_ok=True)os.makedirs(gt_instance_dir_test, exist_ok=True)for json_label_path in glob.glob('{:s}/*.json'.format(testing_folder_path)):process_json_file(json_label_path, src_dir, gt_image_dir_test, gt_binary_dir_test, gt_instance_dir_test)gen_test_sample(src_dir, gt_binary_dir_test, gt_instance_dir_test, gt_image_dir_test)returnif __name__ == '__main__':args = init_args()process_tusimple_dataset(args.src_dir, args.val, args.test)

方法二

也可以参考resa中生成车道线实例化的方法,标签从左到右,按照区域分为0到6

import json
import numpy as np
import cv2
import os
import argparseTRAIN_SET = ['2.json']
VAL_SET = ['record.json']
TRAIN_VAL_SET = TRAIN_SET + VAL_SET
TEST_SET = ['record.json']def gen_label_for_json(args, image_set):H, W = 720, 1280SEG_WIDTH = 30save_dir = args.savediros.makedirs(os.path.join(args.root, args.savedir, "list"), exist_ok=True)list_f = open(os.path.join(args.root, args.savedir, "list", "{}_gt.txt".format(image_set)), "w")json_path = os.path.join(args.root, args.savedir, "{}.json".format(image_set))with open(json_path) as f:for line in f:label = json.loads(line)# ---------- clean and sort lanes -------------lanes = []_lanes = []slope = [] # identify 0th, 1st, 2nd, 3rd, 4th, 5th lane through slopefor i in range(len(label['lanes'])):l = [(x, y) for x, y in zip(label['lanes'][i], label['h_samples']) if x >= 0]if (len(l)>1):_lanes.append(l)slope.append(np.arctan2(l[-1][1]-l[0][1], l[0][0]-l[-1][0]) / np.pi * 180)_lanes = [_lanes[i] for i in np.argsort(slope)]slope = [slope[i] for i in np.argsort(slope)]idx = [None for i in range(6)]for i in range(len(slope)):if slope[i] <= 90:idx[2] = iidx[1] = i-1 if i > 0 else Noneidx[0] = i-2 if i > 1 else Noneelse:idx[3] = iidx[4] = i+1 if i+1 < len(slope) else Noneidx[5] = i+2 if i+2 < len(slope) else Nonebreakfor i in range(6):lanes.append([] if idx[i] is None else _lanes[idx[i]])# ---------------------------------------------img_path = label['raw_file']seg_img = np.zeros((H, W, 3))list_str = []  # str to be written to list.txtfor i in range(len(lanes)):coords = lanes[i]if len(coords) < 4:list_str.append('0')continuefor j in range(len(coords)-1):cv2.line(seg_img, coords[j], coords[j+1], (i+1, i+1, i+1), SEG_WIDTH//2)list_str.append('1')seg_path = img_path.split("/")seg_path, img_name = os.path.join(args.root, args.savedir, seg_path[1], seg_path[2]), seg_path[3]os.makedirs(seg_path, exist_ok=True)seg_path = os.path.join(seg_path, img_name[:-3]+"png")cv2.imwrite(seg_path, seg_img)seg_path = "/".join([args.savedir, *img_path.split("/")[1:3], img_name[:-3]+"png"])if seg_path[0] != '/':seg_path = '/' + seg_pathif img_path[0] != '/':img_path = '/' + img_pathlist_str.insert(0, seg_path)list_str.insert(0, img_path)list_str = " ".join(list_str) + "\n"list_f.write(list_str)def generate_json_file(save_dir, json_file, image_set):with open(os.path.join(save_dir, json_file), "w") as outfile:for json_name in (image_set):with open(os.path.join(args.root, json_name)) as infile:for line in infile:outfile.write(line)def generate_label(args):save_dir = os.path.join(args.root, args.savedir)os.makedirs(save_dir, exist_ok=True)generate_json_file(save_dir, "train_val.json", TRAIN_VAL_SET)generate_json_file(save_dir, "test.json", TEST_SET)print("generating train_val set...")gen_label_for_json(args, 'train_val')print("generating test set...")gen_label_for_json(args, 'test')if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--root', required=True, help='The root of the Tusimple dataset')parser.add_argument('--savedir', type=str, default='seg_label', help='The root of the Tusimple dataset')args = parser.parse_args()generate_label(args)

生成车道线二值化的代码,车道线的标签都为1

import json
import numpy as np
import cv2
import os
import argparseTRAIN_SET = ['2.json']
VAL_SET = ['record.json']
TRAIN_VAL_SET = TRAIN_SET + VAL_SET
TEST_SET = ['record.json']def gen_label_for_json(args, image_set):H, W = 720, 1280SEG_WIDTH = 30save_dir = args.savediros.makedirs(os.path.join(args.root, args.savedir, "list"), exist_ok=True)list_f = open(os.path.join(args.root, args.savedir, "list", "{}_gt.txt".format(image_set)), "w")json_path = os.path.join(args.root, args.savedir, "{}.json".format(image_set))with open(json_path) as f:for line in f:label = json.loads(line)# ---------- clean and sort lanes -------------lanes = []_lanes = []slope = [] # identify 0th, 1st, 2nd, 3rd, 4th, 5th lane through slopefor i in range(len(label['lanes'])):l = [(x, y) for x, y in zip(label['lanes'][i], label['h_samples']) if x >= 0]if (len(l)>1):_lanes.append(l)slope.append(np.arctan2(l[-1][1]-l[0][1], l[0][0]-l[-1][0]) / np.pi * 180)_lanes = [_lanes[i] for i in np.argsort(slope)]slope = [slope[i] for i in np.argsort(slope)]idx = [None for i in range(6)]for i in range(len(slope)):if slope[i] <= 90:idx[2] = iidx[1] = i-1 if i > 0 else Noneidx[0] = i-2 if i > 1 else Noneelse:idx[3] = iidx[4] = i+1 if i+1 < len(slope) else Noneidx[5] = i+2 if i+2 < len(slope) else Nonebreakfor i in range(6):lanes.append([] if idx[i] is None else _lanes[idx[i]])# ---------------------------------------------img_path = label['raw_file']seg_img = np.zeros((H, W, 3))list_str = []  # str to be written to list.txtfor i in range(len(lanes)):coords = lanes[i]if len(coords) < 4:list_str.append('0')continuefor j in range(len(coords)-1):cv2.line(seg_img, coords[j], coords[j+1], (1, 1, 1), SEG_WIDTH//2)list_str.append('1')seg_path = img_path.split("/")seg_path, img_name = os.path.join(args.root, args.savedir, seg_path[1], seg_path[2]), seg_path[3]os.makedirs(seg_path, exist_ok=True)seg_path = os.path.join(seg_path, img_name[:-3]+"png")cv2.imwrite(seg_path, seg_img)seg_path = "/".join([args.savedir, *img_path.split("/")[1:3], img_name[:-3]+"png"])if seg_path[0] != '/':seg_path = '/' + seg_pathif img_path[0] != '/':img_path = '/' + img_pathlist_str.insert(0, seg_path)list_str.insert(0, img_path)list_str = " ".join(list_str) + "\n"list_f.write(list_str)def generate_json_file(save_dir, json_file, image_set):with open(os.path.join(save_dir, json_file), "w") as outfile:for json_name in (image_set):with open(os.path.join(args.root, json_name)) as infile:for line in infile:outfile.write(line)def generate_label(args):save_dir = os.path.join(args.root, args.savedir)os.makedirs(save_dir, exist_ok=True)generate_json_file(save_dir, "train_val.json", TRAIN_VAL_SET)generate_json_file(save_dir, "test.json", TEST_SET)print("generating train_val set...")gen_label_for_json(args, 'train_val')print("generating test set...")gen_label_for_json(args, 'test')if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--root', required=True, help='The root of the Tusimple dataset')parser.add_argument('--savedir', type=str, default='seg_label', help='The root of the Tusimple dataset')args = parser.parse_args()generate_label(args)

Tusimple数据集生成二值化和实例化图片相关推荐

  1. 如何利用Matlab制作色卡,(七)用matlab生成二值化图和24色卡

    [code]%生成4个半径依次为10,30,50,100的圆 clc; clear; close all; I = zeros(256,256); %定义一个256*256的灰度图 iter = [1 ...

  2. 图像二值化 php im2bw,图像二值化-MATLAB实现

    1.图像二值化代码: A=imread('hw1.chips1.GIF'); %读取到一张图片 %thresh = graythresh(A); %自动确定二值化阈值 I2 = im2bw(A,120 ...

  3. python对图像二值化_python如何二值化图像

    在python中二值化图像的方法:首先将图片转化为灰色图像:然后自定义灰度界限:最后输入"photo=Img.point(table,'1')"命令(table为自己创建的数组名) ...

  4. OpenCv之图像二值化(笔记12)

    # 图像处理中,Thresholding中文翻译过来叫二值化或者阈值化.二值化就是把图片转换成只有white赫尔black这俩种颜色.通过Thresholding,可以让图片中感兴趣 # 的颜色编程主 ...

  5. 使用tesserocr二值化识别知网登录验证码

    随机获取了知网登录界面的三个图片验证码,测试 tesserocr 识别验证码的准确度 编写代码,先测试pic1 import tesserocr # 导入tesserocr模块 from PIL im ...

  6. java图像处理:灰度化,二值化,降噪,切割,裁剪,识别,找相似等

    前段时间做爬虫,涉及到对图片验证码的破解,这里罗列一些常用的图像处理方法,都很简单并没用到什么复杂的算法,所以不涉及opencv,都是一些直接对rgb像素点的操作,很简单也很好理解,至于识别直接用的t ...

  7. 二值化图片数据解码显示(Grayscale8、Grayscale16、RGB888)————附带Qt版完整代码

    文章目录 1 效果 2 思路 3 实现代码 4 扩展 4.1 RGB888 4.2 Grayscale16 5 实验数据 1 效果 显示效果: 二值化后的图片数据: 原始数据信息: \x00\x1F\ ...

  8. 基于C++(QT)的车牌识别实现——二值化处理

    文章目录 拟采用的技术路线 车牌图片打开 图片二值化 窗口UI实现 拟采用的技术路线 本次设计计划以最快的速度实现一个清晰车牌的识别,后续再增加识别精确度,故采取以下技术路线本篇文章主要讲述图像二值化 ...

  9. 【按键精灵安卓版教程】二值化过QQ滑块验证【源码分享】

    测试设备:雷电模拟器 540*960 dpi 240 基本原理: 把滑块验证图片转化成0和1的二值化图片,也就是黑白图 原图 二值化后的图片 然后找滑块序列,匹配成功,就找到滑块位置了 代码分享: D ...

最新文章

  1. c语言逐步搜索法求有根区间,[C语言第五章.ppt
  2. .NET 线程问题汇总
  3. UA SIE545 优化理论基础4 对偶理论简介1 松弛问题与Lagrange对偶
  4. hibernate mysql 映射_hibernate与mysql映射类型对应表与mysql导入导出
  5. SAP 电商云 Spartacus UI added-to-cart 的端到端测试源代码解析
  6. matlab imfill孔洞填充
  7. 前端学习(1689):前端系列javascript之如何搞定面试题
  8. C语言中printf输出特殊字符(“%d“或者“\n“)
  9. backlog配置_Tomcat 配置详解和调优
  10. python入门——P39类和对象:拾遗
  11. tkinter 中给某个文本加上滚动条_Python Tkinter自制文本编辑器
  12. Foundation 框架 NSArray、NSMutableArray排序
  13. python连接微信运动_用Python霸屏微信运动,横扫支付宝榜单 !
  14. 黑莓BlackBerry手机刷机ROM常见问题
  15. Maya模型导入Unity3d快速烘焙光影【2020】
  16. 京东常用的API接口
  17. 类似捕鱼达人的金币效果
  18. 判断串口通信是否正常c语言,串口通信测试方法
  19. 新海诚画集[秒速5センチメートル:樱花抄·铁道]
  20. 考研复试—软件工程(一)

热门文章

  1. java syn攻击程序_SYN blood攻击
  2. 前端开发之js栈内存和堆内存的区别
  3. JQuery 三元运算
  4. Microsoft Project 2010简体中文专业版+注册密钥
  5. java实现舞伴分配问题
  6. 【github 自动部署】github实现自动部署
  7. vue渲染时数据对象里面的子对象的属性报错undefined,但页面正常渲染
  8. vue 幻灯片组件_带有vue的漂亮幻灯片组件
  9. 裸跑2440启动MMC后LED全亮或者全灭问题
  10. 低功耗蓝牙模块带屏蔽罩的作用有哪些