游乐游手机版
首页/AI热点日报/热点详情

基于深度学习技术的高效路面坑洞检测方案

类型:热点整理2026-05-29
基于YOLOv4和Darknet框架构建路面坑洞检测系统,融合两个开源数据集训练。对比YOLOv4-Tiny的固定与多分辨率及完整YOLOv4模型,完整YOLOv4在608×608固定分辨率下mAP最优。
```html

在自动驾驶和道路安全领域,坑洞检测一直是个让人头疼的问题。高速行驶时,一个不起眼的坑洼就可能引发严重事故——驾驶员来不及刹车,后方车辆躲闪不及,连锁反应接踵而至。但如果能让车辆提前感知远处的坑洞呢?这正是我们今天要聊的内容:利用YOLOv4目标检测模型和Darknet框架,构建一套实用的路面坑洞检测系统。

背景介绍

高速行驶中的坑洼有多危险,开过车的人都懂。当驾驶员无法从远处发现坑洞并提前制动或安全变道时,风险会急剧上升——急刹车可能引发追尾,强行变道可能撞上邻车。而深度学习和目标检测技术,恰好能帮我们解决这个痛点。通过摄像头实时捕捉前方路面,让模型在远处就识别出坑洞并发出预警,这听起来很理想,也是我们今天要动手实现的目标。

Darknet与YOLOv4简介

Darknet这个开源项目,做目标检测的朋友应该都不陌生。它最出名的就是为YOLO模型提供训练和推理支持,而且整个框架是用C语言写的,轻量高效。

Darknet框架示意图

Darknet由Joseph Redmon于2014年启动,并发布了第一版YOLO论文。YOLOv3发布后不久,项目转由Alexey Bochkovskiy维护,他现在负责原始仓库的一个活跃分支,并且加入了YOLOv4模型的支持。YOLOv4、YOLOv4-Tiny和YOLOv4-CSP是这个仓库里知名度高、应用广泛的几个模型。除了模型本身,Alexey还为代码库增添了不少实用特性:

  • 混合精度训练:支持带有Tensor核心的GPU,训练速度能提升约3倍。
  • 马赛克增强:在训练中加入图像拼接,让模型学会在更复杂的场景中检测物体。
  • 多分辨率训练:每10个批次会随机将图像分辨率调整为基准分辨率的±50%,帮助模型适应不同尺寸的目标。不过代价是显存需求更高——分辨率增大50%时,同样批次大小需要更多显存。

坑洞数据集

要训练一个靠谱的检测模型,数据是基础。我们这次合并了两个开源数据集,以获得足够多样化的样本。

第一个来自Roboflow,总共665张图像,已经按465/133/67划分为训练、验证和测试集。第二个数据集出自一篇ResearchGate文章,虽然作者提供了完整数据集链接,但我们根据需求选取了其中一部分。将两者随机混合后,得到新的数据划分:训练图像1265张,验证图像401张,测试图像118张。数据集只有一个类别,就是“Pothole”。

数据预处理部分你们不用担心,后续代码会直接提供最终可用的数据集,我们只需要做一点简单的路径整理工作。

训练YOLOv4模型

接下来进入正题——编码与实验。这包括生成图像路径的文本文件、配置训练参数、创建数据文件、执行训练以及评估结果。我们有两种实现路径:一是直接在本地系统用终端和IDE操作,二是使用Jupyter Notebook(本地、Colab或云端环境均可)。Jupyter Notebook已提供下载,方便大家直接运行。这里我们按本地终端方式讲解,这样你能同时掌握两种工作流。需要注意的是,如果使用Windows系统,建议用提供的Notebook在Colab上跑。以下步骤基于Ubuntu系统,且某些实验需要超过10GB的GPU显存。

下载数据集

在终端中执行以下命令即可下载和解压:

wget https://learnopencv.s3.us-west-2.amazonaws.com/pothole-dataset.zip
unzip pothole-dataset.zip

数据集目录结构如下:

数据集目录结构

train、valid、test文件夹内包含图片和对应的标签文本文件。对于YOLOv4,边界框坐标需采用[x_center, y_center, width, height]格式,且相对于图像尺寸归一化。由于只有一类,所有标签的类别编号都是0。下面是一个标签文件的示例:

标签文件示例

每一行代表一个目标,第一个数字0是类别,后面四个浮点数依次是归一化后的中心点x、中心点y、宽度和高度。

克隆和构建Darknet

克隆官方仓库并进入目录:

git clone https://github.com/AlexeyAB/darknet.git
cd darknet

后续所有命令都在Darknet目录下执行,数据集文件夹也放在相对路径下。构建Darknet前,需要确保系统已安装CUDA和cuDNN。打开Makefile,修改前7行:

Makefile修改

保存后运行make。如果遇到opencv.hpp: No such file or directory错误,先安装OpenCV:apt install libopencv-dev,再重新make。完成后就得到支持GPU的Darknet了。

为图像路径准备文本文件

Darknet训练时需要将所有图像路径保存在.txt文件中,且路径要相对于Darknet目录。我们写了一个Python脚本prepare_darknet_image_txt_paths.py来生成train.txt、valid.txt和test.txt:

import os

DATA_ROOT_TRAIN = os.path.join('..', 'dataset', 'train')
DATA_ROOT_VALID = os.path.join('..', 'dataset', 'valid')
DATA_ROOT_TEST = os.path.join('..', 'dataset', 'test')

train_image_files_names = os.listdir(os.path.join(DATA_ROOT_TRAIN))
with open('train.txt', 'w') as f:
    for file_name in train_image_files_names:
        if not '.txt' in file_name:
            write_name = os.path.join(DATA_ROOT_TRAIN, file_name)
            f.writelines(write_name+'\n')

valid_data_files__names = os.listdir(os.path.join(DATA_ROOT_VALID))
with open('valid.txt', 'w') as f:
    for file_name in valid_data_files__names:
        if not '.txt' in file_name:
            write_name = os.path.join(DATA_ROOT_VALID, file_name)
            f.writelines(write_name+'\n')

test_data_files__names = os.listdir(os.path.join(DATA_ROOT_TEST))
with open('test.txt', 'w') as f:
    for file_name in test_data_files__names:
        if not '.txt' in file_name:
            write_name = os.path.join(DATA_ROOT_TEST, file_name)
            f.writelines(write_name+'\n')

脚本遍历三个文件夹,生成包含相对路径的文本文件。以下是train.txt的部分内容示例:

train.txt示例

需要注意两点:文件顺序已经随机化,且所有路径相对于Darknet目录。至此,数据集准备和Darknet构建都已完成,可以开始核心实验了。

训练固定分辨率的YOLOv4-Tiny模型

先从YOLOv4-Tiny开始。我们需要创建配置文件和data文件。大部分参数保持默认,只调整批次大小和训练步数。

设置模型配置和数据文件

darknet/cfg目录下,复制yolov4-tiny-custom.cfg并重命名为yolov4-tiny-pothole.cfg。所有配置基于Colab上的16GB Tesla P100 GPU,你可根据自身情况调整,但以下实验结果基于此硬件。

修改配置文件:将batch从64改为32,max_batches设为8000,steps设为6400,7200(即学习率在6400和7200步时下降)。然后调整[yolo]层前的[convolutional]层参数——将classes从80改为1,将filters改为18(计算公式:(num_classes+5)*3)。在小型模型配置中,有两个[yolo]层,需要分别修改各自前面的卷积层。

接着创建类别名称文件build/darknet/x64/data/pothole.names,内容只有一行:pothole

然后创建data文件build/darknet/x64/data/pothole_yolov4_tiny.data,内容如下:

classes = 1
train  = train.txt
valid  = valid.txt
names = build/darknet/x64/data/pothole.names
backup = backup_yolov4_tiny

注意需要在Darknet目录下新建backup_yolov4_tiny文件夹,否则训练时因目录不存在会报错。

开始训练

下载预训练权重:

wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.conv.29

执行训练命令:

./darknet detector train build/darknet/x64/data/pothole_yolov4_tiny.data cfg/yolov4-tiny-pothole.cfg yolov4-tiny.conv.29

训练耗时取决于硬件。完成后会看到类似输出:

Sa ving weights to backup_yolov4_tiny/yolov4-tiny-pothole_8000.weights
Sa ving weights to backup_yolov4_tiny/yolov4-tiny-pothole_last.weights
Sa ving weights to backup_yolov4_tiny/yolov4-tiny-pothole_final.weights
If you want to train from the beginning, then use flag in the end of training command: -clear

训练过程中的loss曲线如下:

loss曲线

固定分辨率416×416下,最终loss约0.12,看起来不错。但真正的性能要看mAP。创建测试用的data文件build/darknet/x64/data/pothole_test.data

classes = 1
train  = train.txt
valid  = test.txt
names = build/darknet/x64/data/pothole.names
backup = backup_test/

计算mAP(IoU=0.5):

./darknet detector map build/darknet/x64/data/pothole_test.data cfg/yolov4-tiny-pothole.cfg backup_yolov4_tiny/yolov4-tiny-pothole_final.weights

结果:mAP@0.50 = 40.02%。对一个小型模型和416分辨率来说,不算差。

使用多分辨率图像训练YOLOv4-Tiny模型

Darknet支持多分辨率训练,每10个批次将分辨率随机调整为基准的±50%。

这有什么帮助?

模型在训练中同时看到大小不同的图像,能学习到更丰富的特征,理论上mAP会更高。复制配置并命名为yolov4-tiny-multi-res-pothole.cfg,将random参数设为1,其余参数不变。创建对应的data文件:

classes = 1
train  = train.txt
valid  = valid.txt
names = build/darknet/x64/data/pothole.names
backup = backup_yolov4_tiny_multi_res

同样需创建backup_yolov4_tiny_multi_res文件夹。执行训练:

./darknet detector train build/darknet/x64/data/pothole_yolov4_tiny_multi_res.data cfg/yolov4-tiny-multi-res-pothole.cfg yolov4-tiny.conv.29

训练会更耗时,因为部分批次图像更大。loss曲线如下:

多分辨率loss曲线

最终loss为0.32,比单分辨率高——这在意料之中,因为训练数据难度增加了。但模型应该学得更好。测试mAP:

./darknet detector map build/darknet/x64/data/pothole_test.data cfg/yolov4-tiny-multi-res-pothole.cfg backup_yolov4_tiny_multi_res/yolov4-tiny-multi-res-pothole_final.weights

结果:mAP@0.50 = 41.50%,果然略高。

使用多分辨率和固定分辨率训练YOLOv4完整模型

YOLOv4训练曲线

YOLOv4多分辨率曲线

所有模型的mAP对比

下图展示了全部四个模型在IoU=0.5时的mAP比较:

mAP对比图

有趣的是,大模型(YOLOv4)在固定分辨率608×608下表现最佳。多分辨率版本反而略低,这有点反直觉——按理说多尺度训练应带来优势。可能的原因是不同尺度让数据集更难,需要更多训练轮次才能收敛。我们所有模型都只训练了8000批次(约200个epoch),对多分辨率模型来说,增加epoch应该会改善mAP。此外,多分辨率模型见过更多样化的图像,在实际场景中泛化能力可能不输固定分辨率模型。

现实场景推理

我们用四个训练好的模型对真实视频进行推理。如果你们也想用自己的视频测试,记得将备份目录放到Darknet目录下。推理脚本darknet_video.py稍作修改后可显示FPS,已包含在下载的代码中。

以固定分辨率YOLOv4-Tiny为例,执行:

python darknet_video.py --data_file build/darknet/x64/data/pothole_yolov4_tiny.data --config_file cfg/yolov4-tiny-pothole.cfg --weights backup_yolov4_tiny/yolov4-tiny-pothole_final.weights --input inference_data/video_6.mp4 --out_filename tiny_singleres_vid6.a vi --dont_show

参数说明:--data_file--config_file--weights分别指向模型权重和配置;--input为输入视频;--out_filename指定输出视频文件名。

结果让人印象深刻。虽然固定分辨率模型在测试集上mAP高达69%,但在实际视频中,多分辨率模型反而检测到更多坑洞,尤其是远处或小尺寸的坑洼。这说明测试集指标不能完全代表真实世界的表现——多分辨率模型因为见过更多样化的训练样本,实际推理时更鲁棒。

总结

从Darknet环境搭建到多组模型训练,再到推理对比,我们完整走了一遍YOLOv4坑洞检测的流程。这篇文章覆盖了不少技术细节:配置修改、多分辨率训练、mAP评估等。不同模型给出的结果差异也提醒我们——用深度学习解决真实世界问题,往往比看上去更复杂。固定分辨率模型在特定数据集上指标高,但多分辨率模型在实际场景中反而更可靠。

要获得更好的效果,可以尝试更强的模型架构,或者往训练集里加入更多真实道路图像。如果你有兴趣,不妨动手试试——毕竟,真正的坑洞检测系统,最终要跑在城市道路上才算数。

```
来源:https://m.elecfans.com/article/2249707.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。