毕设做铁路轨道检测,发现Lane Detection的大部分开源代码都是跑的公用数据集CULane(或Tusimple),而我们自己采集的数据用labelme标注完以后不是CULane的标准格式。为了能直接用公开代码训练我们自己的数据集,需要先把labelme标注的json数据转化成CULane标准格式。
项目地址:[labelme_to_culane]
CULane数据集
根据官网的介绍,CULane数据集文件包括:
1 | - driver_23_30frame |
三个训练集&验证集ground truth图像与标注:
1
2
3- driver_23_30frame
- driver_161_90frame
- driver_182_30frame每个文件夹下都包含若干视频中抽帧形成的子文件夹,每个子文件夹又包含若干图像数据文件(eg. xxxx.jpg)和一个对应的标注文件(xxxx.lines.txt),以182_30文件为例:
1
2
3
4
5
6
7
8
9
10- driver_182_30frame
- 05312327_0001.MP4
|- 00000.jpg
|- 00000.lines.txt
|- 00030.jpg
|- 00030.lines.txt
|- 00060.jpg
|- 00060.lines.txt
...
...标注文件中每一行都给出了车道线上关键点的对应(x,y)坐标,以
05130.lines.txt
为例:1
2
3
4104.092 590 123.101 580 144.826 570 165.645 560 187.369 550 208.189 540 229.913 530 250.733 520 272.457 510 293.277 500 315.001 490 335.82 480 357.545 470 379.269 460 399.746 450 421.471 440 442.29 430 464.015 420 485.373 410 506.192 400 527.551 390 549.275 380 570.095 370 591.452 360 613.176 350 633.996 340 655.72 330 677.001 320 698.726 310 719.545 300 740.828 290 762.552 280 783.371 270
661.843 590 665.482 580 669.121 570 673.124 560 677.128 550 681.131 540 684.77 530 688.773 520 692.775 510 696.778 500 700.417 490 704.419 480 708.422 470 712.06 460 716.093 450 720.096 440 724.099 430 727.918 420 731.922 410 735.562 400 739.746 390 743.385 380 747.387 370 751.206 360 755.208 350 759.211 340 763.215 330 766.854 320 770.858 310 774.862 300 778.5 290 782.503 280 786.505 270
1457.13 590 1438.25 580 1418.46 570 1397.78 560 1377.09 550 1356.41 540 1335.96 530 1315.27 520 1294.59 510 1273.91 500 1253.22 490 1232.77 480 1212.09 470 1192.3 460 1171.62 450 1150.94 440 1130.47 430 1109.79 420 1089.11 410 1068.42 400 1047.74 390 1027.84 380 1007.16 370 986.473 360 965.79 350 945.106 340 924.422 330 903.617 320 883.833 310 863.149 300 842.466 290 821.782 280 801.099 270
1676.79 450 1632.17 440 1587.27 430 1542.37 420 1497.07 410 1452.17 400 1406.89 390 1361.98 380 1317.08 370 1272.76 360 1227.86 350 1182.96 340 1137.76 330 1092.86 320 1047.96 310 1003.06 300 957.841 290 912.94 280 868.04 270其中,关键点选取的y坐标,是固定的,称其为行锚点 ,默认图像大小为288 * 800:
1
culane_row_anchor = [121, 131, 141, 150, 160, 170, 180, 189, 199, 209, 219, 228, 238, 248, 258, 267, 277, 287]
测试集ground truth图像及标注:
1
2
3- driver_37_30frame
- driver_100_30frame
- driver_193_90frame格式与训练集/验证集相同
训练集/验证集车道线分割label图像:
1
- laneseg_label_w16
该文件夹下为训练集/验证集中所有ground truth图像所对应的逐像素label图,即每个像素点的值表示它所在的车道线id,0表示背景。
训练集/验证集/测试集列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17-
- list
|- test_split
|- test0_normal.txt
|- test1_crowd.txt
|- test2_hlight.txt
|- test3_shadow.txt
|- test4_noline.txt
|- test5_arrow.txt
|- test6_curve.txt
|- test7_cross.txt
|- test8_night.txt
|- test.txt
|- train.txt
|- train_gt.txt
|- val.txt
|- val_gt.txttrian.txt
val.txt
test.txt
都是对应训练集/验证集/测试集图像的相对路径,以test.txt
为例:1
2
3
4/driver_100_30frame/05251517_0433.MP4/00000.jpg
/driver_100_30frame/05251517_0433.MP4/00030.jpg
/driver_100_30frame/05251517_0433.MP4/00060.jpg
...test_split
文件夹下的文件是将测试集test.txt
分为不同的环境后重组,本质也是图像的相对路径train_gt.txt
和val_gt.txt
中每行的格式为:gt图像相对路径 逐像素label图像相对路径 四个0/1数字表示\<左2><左1><右1><右2>四个车道是否存在
1
2
3/driver_23_30frame/05171102_0766.MP4/00020.jpg /laneseg_label_w16/driver_23_30frame/05171102_0766.MP4/00020.png 1 1 1 0
/driver_23_30frame/05171102_0766.MP4/00050.jpg /laneseg_label_w16/driver_23_30frame/05171102_0766.MP4/00050.png 1 1 1 0
/driver_23_30frame/05171102_0766.MP4/00080.jpg /laneseg_label_w16/driver_23_30frame/05171102_0766.MP4/00080.png 1 1 1 0
从json标注文件到label.png
labelme提供了将json文件转为label.png的方法:
1 | labelme_json_to_dataset [-h] [-o output_file] json_file.json |
此方法实现对一个json文件的转换,将生成以下文件:
1 | - output_file |
实现json文件批量转化:
1 | import os |
如果在标注的时候不是用的纯数字,labelme在进行转换的时候会首先对标注进行字符串排序,排序后的结果在 label_names.txt
中;label.png
虽然看上去是彩色图,但用 PIL.Image
读入后会发现,这其实是个逐像素分类的图,像素值由 label_names.txt
中的标注顺序生成(下标/像素从0开始,其中0表示的是背景,即 label_names.txt
中的第一个默认分类 _background_
)。存在的像素值对应 *_gt.txt
中的值为1,否则为0
1 | import numpy as np |
这样就得到了我们需要的 xxxx_label.png
文件
从label.png到 xxxx.lines.txt 和 *_gt.txt 文件
- 根据
label.png
和culane_row_anchor
获取轨道线上关键点的坐标生成xxxx.lines.txt
1 | # image = Image.open(image_path) |
- 根据
label.png
生成*_gt.txt
1 | lines = "" |