目录

1.视频数据提取图像帧

2.labelme标注车道线

3.运行脚本,生成标注数据


​​​​​​​

由于需要使用自己的数据制作TuSimple格式的数据集,但是未找到合适的标注工具,只好自己写一个简单的脚本实现.

目前实现功能只能对直线进行自动标注,曲线部分还没有时间搞.

步骤:

  1. 将视频数据提取图像帧保存;
  2. 使用labelme工具对车道线进行标注,使用Line标注,存储json文件;
  3. 运行脚本程序,自动将标注数据存储到test_label.json文件中;

结果:

{"lanes": [[-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 545, 551, 557, 564, 570, 576, 582, 588, 594, 600, 606, 612, 619, 625, 631, 637, 643, 649, 655, 661, 667, 674, 680, 686, 692, 698, 704, 710]], "h_sample": [160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710], "raw_file": "clips/143/1641432916348132559.jpg"}
{"lanes": [[-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 556, 560, 565, 569, 574, 578, 582, 587, 591, 596, 600, 605, 609, 614, 618, 622, 627, 631, 636, 640, 645, 649, 654, 658, 662, 667, 671, 676]], "h_sample": [160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710], "raw_file": "clips/143/1641432907120901694.jpg"}
{"lanes": [[-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 538, 543, 548, 553, 558, 563, 568, 573, 577, 582, 587, 592, 597, 602, 607, 612, 616, 621, 626, 631, 636, 641, 646, 651, 656, 660, 665]], "h_sample": [160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710], "raw_file": "clips/143/1641432928394809381.jpg"}

1.视频数据提取图像帧

此功能代码是用C++实现的,功能比较简单,可以自己写一个python脚本.

/** @Author: hw* @Date: 2022-01-05 16:35:58* @LastEditTime: 2022-01-10 15:40:00* @Description: 将视频数据的图像帧保存* @FilePath: /lane_detect_opencv/src/lane_det/src/tools/video2frame.cpp*/
#include "ros/ros.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>int main(int argc, char **argv)
{ros::init(argc, argv, "video2frame");ros::NodeHandle nh_;ROS_INFO("[video2frame] node run");//打开视频文件:其实就是建立一个VideoCapture结构,"path to video"cv::VideoCapture capture("/home/hw/project/LaneDetection/datasets/video/lane_test.flv");//检测是否正常打开:成功打开时,isOpened返回tureif (!capture.isOpened())std::cout << "fail toopen!" << std::endl;//获取整个帧数long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);std::cout << "整个视频共" << totalFrameNumber << "帧" << std::endl;//设置开始帧()long frameToStart = 1;capture.set(CV_CAP_PROP_POS_FRAMES, frameToStart);std::cout << "从第" << frameToStart << "帧开始读" << std::endl;//设置结束帧long frameToStop = totalFrameNumber;if (frameToStop < frameToStart){std::cout << "结束帧小于开始帧,程序错误,即将退出!" << std::endl;return -1;}else{std::cout << "结束帧为:第" << frameToStop << "帧" << std::endl;}//获取帧率double FPS = capture.get(CV_CAP_PROP_FPS);std::cout << "帧率为:" << FPS << std::endl;//定义一个用来控制读取视频循环结束的变量bool stop = false;//承载每一帧的图像cv::Mat frame;//显示每一帧的窗口// namedWindow( "Extractedframe" );//两帧间的间隔时间:// int delay = 1000/FPS;double delay = 1000 / FPS;//利用while循环读取帧// currentFrame是在循环体中控制读取到指定的帧后循环结束的变量long currentFrame = frameToStart;while (!stop){//读取下一帧if (!capture.read(frame)){std::cout << "读取视频失败" << std::endl;return -1;}// cout << "正在读取第" << currentFrame << "帧" << endl;// imshow( "Extractedframe", frame );//此处为跳帧操作if (currentFrame % 20 == 0) //此处为帧数间隔,修改这里就可以了{std::cout << "正在写第" << currentFrame << "帧" << std::endl;std::stringstream str;std::string time = std::to_string( ros::Time::now().toNSec());std::string image_folder = "/home/hw/project/LaneDetection/datasets/video2frame/lane_test/";str << image_folder << time << ".jpg"; /*图片存储位置*/std::cout << str.str() << std::endl;cv::imwrite(str.str(), frame);}// waitKey(intdelay=0)当delay≤ 0时会永远等待;当delay>0时会等待delay毫秒//当时间结束前没有按键按下时,返回值为-1;否则返回按键int c = cv::waitKey(delay);//按下ESC或者到达指定的结束帧后退出读取视频if ((char)c == 27 || currentFrame > frameToStop){stop = true;}//按下按键后会停留在当前帧,等待下一次按键if (c >= 0){cv::waitKey(0);}currentFrame++;}//关闭视频文件capture.release();cv::waitKey(0);return 0;
}

2.labelme标注车道线

我的文件结构如下,其中clips存放图片,clips_jsons存放标注后的json文件.

TuSimple_self
├── clip_jsons
│   ├── 143
│   ├── 144
│   └── test
└── clips
    ├── 143
    ├── 144
    └── test

3.运行脚本,生成标注数据

import json
import os# 计算线段与行直线的交点
def getLinesData(x1, y1, x2, y2):intersection_x = []for h in h_samples:if h < y1 and h < y2:intersection_x.append(-2)else:sign = 1a = y2 - y1if a < 0:sign = -1a = sign * ab = sign * (x1 - x2)c = sign * (y1 * x2 - x1 * y2)x = -(b * h + c) / aintersection_x.append(int(x))return intersection_x# 得到文件夹下所有label.json的文件名列表
def getLabelFilesNameList():# 遍历文件夹内所有json文件,找出所有标注数据文件file_list = os.listdir(clip_json_path)json_name = 'json'json_list = []for file_name in file_list:if json_name in file_name and file_name != 'test_label.json':json_list.append(file_name)return json_list# 计算车道线与h_lines的交点,并存储到json文件中
def saveJson(json_list):for file_name in json_list:file_path = clip_json_path + file_nameimage_name = file_name.strip('.json')# 读取直线两个端点file = open(file_path, 'r', encoding='utf-8')data = json.load(file)x1 = int(data['shapes'][0]['points'][0][0])y1 = int(data['shapes'][0]['points'][0][1])x2 = int(data['shapes'][0]['points'][1][0])y2 = int(data['shapes'][0]['points'][1][1])intersection_x = getLinesData(x1, y1, x2, y2)file.close()# 构建test_label.json数据结构,写入数据lanes = [intersection_x]row_file = 'clips/144/' + image_name + '.jpg'info1 = {"lanes": lanes, "h_sample": h_samples, "raw_file": row_file}fr = open(test_label_path, 'a')model = json.dumps(info1)fr.write(model)fr.write('\r\n')fr.close()print(file_name + " " + "handle succeed")# 创建test_label.json文件
def createJson():if not os.access(test_label_path, os.F_OK):file = open(test_label_path, 'a')file.close()print("create test_label.json success")else:print("test_label.json exist")# 存放结果文件夹路径
folder_path = '/home/hw/project/LaneDetection/datasets/TuSimple_self/'
# label文件存储路径
clip_json_path = folder_path + 'clip_jsons/144/'
# 结果文件名
test_label = 'test_label.json'
# 结果文件路径
test_label_path = folder_path + test_label# 图片行位置
h_samples = [160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360,370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570,580, 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710]# Press the green button in the gutter to run the script.
if __name__ == '__main__':print('fuck day')createJson()label_json_list = getLabelFilesNameList()saveJson(label_json_list)

TuSimple数据集格式标注自己的数据集相关推荐

  1. VOC数据集格式转化成COCO数据集格式

    VOC数据集格式转化成COCO数据集格式 一.唠叨      之前写过一篇关于coco数据集转化成VOC格式的博客COCO2VOC,最近读到CenterNet的官方代码,实现上则是将voc转化成coc ...

  2. yolo数据集txt标注转voc数据集xml标注格式

    yolo数据集txt标注格式为: 0 0.159375 0.552083 0.121875 0.381944 0 0.776953 0.747222 0.099219 0.361111 代码如下: i ...

  3. 【舰船数据集格式转换】HRSID数据集VOC转COCO

    系列文章目录 [舰船数据集格式转换]AIR-SARShip-1.0数据集VOC转COCO [舰船数据集格式转换]AIR-SARShip-2.0数据集VOC转COCO 文章目录 系列文章目录 前言 一. ...

  4. WPI交通信号灯数据集格式转换成VOC2007

    WPI交通信号灯数据集格式转换成VOC2007 1.简述 初学交通信号灯目标检测时,总是苦于找不到合适的交通灯数据集.即使找到了数据集,也往往因为格式不同而无法直接使用.因为大部分目标检测代码都只支持 ...

  5. yolo图像检测数据集格式转换:xml 与 txt格式相互转换

    格式介绍 一图流介绍的比较详细,一般图像检测数据集格式为txt或者xml格式,在使用labelimg进行标注的时候,可以设置获得不同格式的数据集,以满足不同算法训练格式要求: 一般建议使用pascal ...

  6. 制作 tusimple 数据集格式的数据

    1.tusimple 数据集介绍 标注json 文件中每一行包括三个字段 : raw_file : 每一个数据段的第20帧图像的的 path 路径 lanes 和 h_samples 是数据具体的标注 ...

  7. 创建自己的tusimple数据集格式

    为了训练自己的车道线检测模型,由于tusimple数据集场景较为单一,因此自己标注了一个数据集 模型:lanenet 数据集格式:tusimple 标注工具:labelme 第一步:原始数据集标注 1 ...

  8. 【数据集】香烟目标检测数据集(YOLO格式标注)

    [来源] https://blog.csdn.net/qq_46098574/article/details/107334954 [链接及提取码](免费下载) 链接:https://pan.baidu ...

  9. VOC/YOLO/COCO数据集格式转换及LabelImg/Labelme/精灵标注助手Colabeler标注工具介绍

    数据集格式:VOC(xml).YOLO(txt).COCO(json) 本文主要对Label格式,以及LabelImg.Labelme.精灵标注助手Colabeler这常用的三种数据标注软件进行介绍. ...

最新文章

  1. 如何测试ASP.NET Core Web API
  2. angular监听图片加载完成_angular1.0 如何监听页面渲染完毕 (转)
  3. Android NDK开发method GetStringUTFChars’could not be resolved
  4. git上传分支的原理_几张图让你彻底弄懂git工作流(二) ——git分支
  5. java 168转换成861_java实验-java语言面向对象编程基础
  6. e.preventdefault() 别滥用
  7. python中的dict函数什么意思_3分钟搞懂Python中dict函数的含义是什么
  8. Ubuntu 12.04下搭建Web服务器 (MySQL+PHP+Apache)(转)
  9. linux 777权限_认识Linux之Linux命令-用户、权限管理(8)
  10. 全网首发:JDK绘制文字:二、绘制句柄的初始化流程
  11. oracle查看数据库文件大小
  12. 分享盒子直播软件.已测试,网络机顶盒看电视直播哪个软件好(最好用的三款免费直播软件分享)...
  13. kvaser 驱动修复(linux)
  14. 一些模板(按字典序排序)
  15. 买不起MacBook,使用Windows 10配置zsh命令行做开发
  16. 如何在Google Chrome中手动设置位置信息
  17. python随机生成彩色图像
  18. 大律法(OTSU法)
  19. myeclipse web mysql_myEclipse,web项目连接数据库
  20. 深读5G发展的趋势后带给我的感受

热门文章

  1. 使用overlay挂载squashfs
  2. execlp函数详解
  3. Python 遍历文件
  4. win10修改用户文件夹名称
  5. jmeter参数化的四种方法
  6. Jenkins+Gitlab实现自动部署
  7. 用java实现简单的图像处理基础篇之像素点数据的移位计算
  8. 行天礼重风水的程序员行业
  9. 服务器连接显示屏不亮怎么回事,服务器 主机 怎么接显示器不亮
  10. 【lvcreate】创建lv需要在vg上创建