本文用来整理回顾所学知识,也能使视觉领域初学者的同伴们少走些弯路。
参考链接:无人驾驶汽车系统入门(三十)——基于深度神经网络LaneNet的车道线检测及ROS实现_AdamShan的博客-CSDN博客
论文原文地址:Towards End-to-End Lane Detection: an Instance Segmentation Approach
Tensorflow代码地址:lanenet-lane-detection
现在作者维护的版本更新到了2021.4.29。我上传到了百度网盘里:
链接:https://pan.baidu.com/s/1XydBVV-niTo9GybRDhquww
提取码:yos4
文件夹结构为:
``` lanenet-lane-detection-master ├─ .idea │ └─ vcs.xml ├─ config │ └─ tusimple_lanenet.yaml ├─ data │ ├─ source_image │ │ ├─ accuracy.png │ │ ├─ binary_seg_loss.png │ │ ├─ instance_seg_loss.png │ │ ├─ lanenet_batch_test.gif │ │ ├─ lanenet_binary_seg.png │ │ ├─ lanenet_embedding.png │ │ ├─ lanenet_instance_seg.png │ │ ├─ lanenet_mask_result.png │ │ ├─ network_architecture.png │ │ ├─ qr.jpg │ │ └─ total_loss.png │ ├─ training_data_example │ │ ├─ gt_binary_image │ │ │ ├─ 0000.png │ │ │ ├─ 0001.png │ │ │ ├─ 0002.png │ │ │ ├─ 0003.png │ │ │ ├─ 0004.png │ │ │ └─ 0005.png │ │ ├─ gt_instance_image │ │ │ ├─ 0000.png │ │ │ ├─ 0001.png │ │ │ ├─ 0002.png │ │ │ ├─ 0003.png │ │ │ ├─ 0004.png │ │ │ └─ 0005.png │ │ ├─ image │ │ │ ├─ 0000.png │ │ │ ├─ 0001.png │ │ │ ├─ 0002.png │ │ │ ├─ 0003.png │ │ │ ├─ 0004.png │ │ │ └─ 0005.png │ │ ├─ train.txt │ │ └─ val.txt │ ├─ tusimple_ipm_remap.yml │ └─ tusimple_test_image │ ├─ 0.jpg │ ├─ 1.jpg │ ├─ 2.jpg │ └─ 3.jpg ├─ data_provider │ ├─ lanenet_data_feed_pipline.py │ └─ tf_io_pipline_tools.py ├─ lanenet_model │ ├─ lanenet.py │ ├─ lanenet_back_end.py │ ├─ lanenet_discriminative_loss.py │ ├─ lanenet_front_end.py │ ├─ lanenet_postprocess.py │ └─ __init__.py ├─ LICENSE ├─ local_utils │ ├─ config_utils │ │ ├─ parse_config_utils.py │ │ └─ __init__.py │ └─ log_util │ ├─ init_logger.py │ └─ __init__.py ├─ mnn_project │ ├─ config.ini │ ├─ config_parser.cpp │ ├─ config_parser.h │ ├─ convert_lanenet_model_into_mnn_model.sh │ ├─ dbscan.hpp │ ├─ freeze_lanenet_model.py │ ├─ kdtree.cpp │ ├─ kdtree.h │ ├─ lanenet_model.cpp │ ├─ lanenet_model.h │ └─ __init__.py ├─ README.md ├─ requirements.txt ├─ semantic_segmentation_zoo │ ├─ bisenet_v2.py │ ├─ cnn_basenet.py │ ├─ vgg16_based_fcn.py │ └─ __init__.py ├─ tools │ ├─ evaluate_lanenet_on_tusimple.py │ ├─ evaluate_model_utils.py │ ├─ generate_tusimple_dataset.py │ ├─ make_tusimple_tfrecords.py │ ├─ test_lanenet.py │ └─ train_lanenet_tusimple.py ├─ trainner │ ├─ tusimple_lanenet_multi_gpu_trainner.py │ ├─ tusimple_lanenet_single_gpu_trainner.py │ └─ __init__.py └─ _config.yml ```使用TensorFlow2.4.0实现及基于tuSimple数据集的模型训练 tuSimple数据集准备
下载地址:tusimple数据集
我也将它上传到了百度网盘:
下载完成后解压缩到一个目录下,目录内容如下:
tuSimple/ ├── clips │ ├── 0313-1 │ ├── 0313-2 │ ├── 0530 │ ├── 0531 │ └── 0601 ├── label_data_0313.json ├── label_data_0531.json ├── label_data_0601.json ├── readme.md └── test_tasks_0627.json
我们使用项目lanenet-lane-detection中的脚本generate_tusimple_dataset.py产生用于训练的binary mask和instance mask:根据json文件转换训练集,生成图片文件夹gt_image、gt_binary_image、gt_instance_image 以及文本文件 train.txt
cd lanenet-lane-detection/tools python3 generate_tusimple_dataset.py --src_dir=/home/adam/data/tusimple_dataset/tuSimple/
如上所示,会自动在tuSimple目录下生成training和testing两个目录,如下所示:
training/ ├── gt_binary_image ├── gt_image ├── gt_instance_image ├── label_data_0313.json ├── label_data_0531.json ├── label_data_0601.json └── train.txt testing/ └── test_tasks_0627.json
可见该脚本仅生成了train.txt,我们可以手动分割一下train set和val set,也就是剪切train.txt中的一部分到一个新建的val.txt文件中。该数据集共包含 3626 × 3 = 10878 3626times 3 = 108783626×3=10878 张图片,我们选取1200张图片作为验证集(test:val约9:1)的比例。
接着使用脚本生成tfrecord文件,命令如下:
脚本会在项目的data/training_data_example/tfrecords目录下生成相应的tfrecord文件,如下所示。生成test.txt 以及val.txt, 将标注格式转换成TFRecord
tfrecords/ ├── test_0_363.tfrecords ├── train_0_1000.tfrecords ├── train_1000_2000.tfrecords ├── train_2000_3000.tfrecords ├── train_3000_3082.tfrecords └── val_0_181.tfrecords
1) 修改 config文件夹下tusimple_lanenet.yaml文件
修改内容如下图所示,绿色的为原作者的数据路径,将数据集路径修改为自己的即可,具体路径参考上一步。
2)执行 python tools/make_tusimple_tfrecords.py



