第一次接触LaneNet和TuSimple数据集时,最让人头疼的就是环境配置和数据准备。记得我刚开始做这个项目时,光是配环境就折腾了两天。为了让你们少走弯路,我把这些坑都整理出来了。
先说Python环境,建议直接用Anaconda创建虚拟环境。别像我当初那样偷懒用系统环境,后来各种包冲突差点重装系统。具体命令如下:
bash复制conda create -n lanenet python=3.6
conda activate lanenet
重点来了!必须用Python 3.6,我试过3.7和3.8都会出现奇怪的兼容性问题。安装依赖包时最容易出问题的是tensorflow版本,官方文档说支持1.12+,但实测1.15最稳定:
bash复制pip install tensorflow-gpu==1.15.0
数据集下载确实是个大坑。官方GitHub的下载链接速度慢得像蜗牛,我试过挂一晚上才下完10%。后来发现百度网盘有个备份(链接: https://pan.baidu.com/s/1iyEMu0tcKaVX8nv0zBnSKw 提取码: fccj),但要注意网盘只有压缩包,json文件还是得去官网复制。解压后目录结构应该是这样的:
code复制tusimple/
├── train_set/
├── test_set/
├── label_data_0313.json
├── label_data_0531.json
└── label_data_0601.json
解压train_set.zip后,你会看到一堆以数字命名的文件夹。这里有个隐藏坑点:Windows系统路径长度限制。建议直接把解压后的文件夹放在磁盘根目录,比如D:/tusimple/。我最初放在"文档"文件夹里,结果脚本运行时疯狂报路径不存在的错误。
运行generate_tusimple_dataset.py脚本时,90%的人会遇到这两个问题:
第一个问题的解决方案:
python复制python tools/generate_tusimple_dataset.py --src_dir D:/tusimple/train_set
第二个问题其实不是真卡住,是在默默处理数据。我专门看了源码,它在处理大尺寸图片时会消耗大量内存。如果你的电脑内存小于8GB,建议先处理部分数据测试:
python复制# 在脚本中添加这行,只处理前100张图片
os.environ['MAX_SAMPLES'] = '100'
处理完成后会生成三个关键目录:
打开tusimple_lanenet.yaml文件,需要修改的不仅是路径。我整理了必须检查的5个参数:
| 参数名 | 推荐值 | 说明 |
|---|---|---|
| batch_size | 1(无GPU) / 4(有GPU) | 无GPU必须调小 |
| train_list | 绝对路径 | 建议用r'D:\path'格式 |
| test_list | 绝对路径 | 同上 |
| num_epochs | 10(测试) / 100(训练) | 首次运行建议小值 |
| learning_rate | 0.0005 | 无GPU可降到0.0001 |
运行make_tusimple_tfrecords.py时最常见的两个报错:
"No such file or directory":
检查yaml文件中的路径是否包含中文或空格,最好全英文路径
"Invalid argument":
通常是图片损坏导致的,运行这个预处理脚本检查:
python复制from PIL import Image
import os
for img in os.listdir('gt_binary_image'):
try:
Image.open(f'gt_binary_image/{img}').verify()
except:
print(f'损坏文件: {img}')
没有GPU还想跑训练?别担心,我在这台2015年的MacBook Pro上都跑起来了。关键是要调整这些参数:
修改tusimple_lanenet.yaml:
yaml复制batch_size: 1 # 必须设为1
save_interval: 100 # 减少保存频率
修改train_lanenet_tusimple.py:
python复制# 在训练循环前添加
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
# 改为
config = tf.ConfigProto(device_count={'GPU': 0})
在无GPU环境下,一定要监控内存使用。我写了个简单的监控脚本:
python复制import psutil
import time
while True:
mem = psutil.virtual_memory()
print(f'内存使用率: {mem.percent}%')
if mem.percent > 90:
print('警告:内存不足!')
time.sleep(5)
如果内存不足,可以尝试这两个方案:
即使在没有GPU的情况下,也可以运行验证脚本检查模型效果:
bash复制python tools/test_lanenet_tusimple.py --weights_path model/tusimple_lanenet.ckpt
如果遇到"维度不匹配"错误,八成是因为训练和测试时的图片尺寸不一致。检查yaml文件中的img_width和img_height是否统一。
官方代码的结果输出比较简陋,我改进了一个可视化脚本:
python复制import matplotlib.pyplot as plt
def visualize_results(binary_img, instance_img):
plt.figure(figsize=(12,6))
plt.subplot(121)
plt.imshow(binary_img, cmap='gray')
plt.title('Binary Prediction')
plt.subplot(122)
plt.imshow(instance_img, cmap='nipy_spectral')
plt.title('Instance Prediction')
plt.show()
把这个函数加到test脚本里,就能同时看到二值化和实例分割的结果对比。