一次深度学习项目实践:道路遗撒物检测
1 项目简介
道路遗撒物是指在道路上非正常掉落、抛撒、遗留的物体,通常由运输车辆、施工活动或人为行为造成。这些物体可能影响交通安全、污染环境,甚至引发交通事故。
该项目旨在使用车载摄像机和轻量计算设备,实时检测道路遗撒物。
拟支持的识别模式:批量图片识别、相机视频流、相机视频采样。
2 路面分割模型训练
2.1 数据集收集和预处理
数据集采用的是实验室在 2025 年 3 月 11 日外出采集的真实照片,共约 240 张。
使用 labelme 对其进行数据标注。
labelme 的 README 中说可以直接使用pip install labelme
安装、执行labelme
启动。但是在我这里并不可行。因此尝试从源代码安装 labelme。
建议准备虚拟环境:
conda create --name labelme python==3.10 -y
conda activate labelme
首先克隆 labelme 仓库。
git clone git@github.com:wkentaro/labelme.git
进入项目安装依赖:
pip install -e .
pip install pyqt5 # 可选
在命令行中启动 labelme。
labelme
2.2 YOLO 数据集准备
由于 labelme 标注的 json 文件并不能被 YOLO 使用,因此需要进行格式转换。
格式转换所需的工具可以在 Github 仓库中找到。
转换后的数据集结构为:
dataset
images
train
2025-03-11_116.26749-39.7505798_124.jpg
...
val
2025-03-11_116.27584-39.7512162_70.jpg
...
labels
train
2025-03-11_116.26749-39.7505798_124.txt
...
val
2025-03-11_116.27584-39.7512162_70.txt
...
data.yaml
其中data.yaml
的内容为:
path: # 数据集目录路径
train: images/train # 训练集相对于数据集的相对路径
val: images/val # 验证集相对于数据集的相对路径
names:
0: road # 分类名称,这里只有一个分类,即路面
2.3 模型训练
YOLOv8 的训练非常简单,只需要在终端中执行命令:
yolo task=segment \
mode=train \
model=yolov8n-seg \
data=./dataset/data.yaml \
epochs=100 \
imgsz=640
即可以 YOLOv8n-seg 为基座模型训练。
提示
如果在训练开始前卡在
Downloading https://github.com/ultralytics/assets/releases/download/v8.3.0/yolov8n-seg.pt to 'yolov8n-seg.pt'...
可以前往该地址下载基座模型到本地。
然后在训练命令中把model
的路径改为yolov8n-seg.pt
的路径。
最新训练的权重一般在项目的runs/segment/train/weights
目录中,一般有两个文件:
weights
best.pt训练过程中效果最好的权重
last.pt最新一次训练的权重
2.4 模型预测
使用 YOLO 模型进行预测也非常简单:
yolo task=segment \
mode=predict \
model=runs/segment/train/weights/best.pt \
source=dataset/images/val
预测结果将会保存在项目的runs/segment/predict
目录中。
3 遗撒物检测模型训练
3.1 数据集收集和预处理
数据集使用的是 2023 年 11 月 24 日收集的以路面为背景的遗撒物照片、以及从网络收集的常见道路垃圾照片。
使用 labelimg 进行数据标注。
同样我使用pip install labelimg
安装的 labelimg 不能正常启动,因此从源代码安装。
建议准备虚拟环境:
conda create --name labelimg python==3.9 -y
conda activate labelimg
首先克隆 labelimg 仓库:
git clone https://github.com/heartexlabs/labelImg.git
安装依赖:
pip install pyqt5 lxml
pyrcc5 -o libs/resources.py resources.qrc
安装项目:
pip install .
在命令行中启动 labelimg。
labelimg
3.2 YOLO 数据集准备
labelimg 可以直接输出 YOLO 格式的标注文件,因此只需要划分训练集和验证集即可。
dataset
images
train
2023-11-24_116.28432-39.7442325_62.jpg
...
val
2023-11-24_116.284309-39.744354_165.jpg
...
labels
train
2023-11-24_116.28432-39.7442325_62.txt
...
val
2023-11-24_116.284309-39.744354_165.txt
...
data.yaml
其中data.yaml
的内容为:
path: # 数据集目录路径
train: images/train # 训练集相对于数据集的相对路径
val: images/val # 验证集相对于数据集的相对路径
nc: 1 # 分类数,这里只有一个分类即遗撒物
names: ["debris"] # 分类名称
3.3 模型训练
与语义分割训练时类似:
yolo train \
model=yolov8n \
data=./dataset/data.yaml \
epochs=100 \
imgsz=640
同样地,最新训练的权重一般在项目的runs/detect/train/weights
目录中,包含最新训练权重last.pt
和最佳训练权重best.pt
。
3.4 模型预测
yolo predict \
model=runs/detect/train/weights/best.pt \
source=dataset/images/val2
预测结果将会保存在项目的runs/detect/predict
目录中。
4 协同工作框架
core核心推理模块
image_batch.py用于批量识别图片
...
models权重,命名格式为“基座模型_任务_训练日期”
model_loader.pyModel Loader
yolov8n_det_250507.pt
yolov8n_seg_250507.pt
...
utils工具集
logger.py日志记录器
...
config.py配置文件
main.py程序入口
4.1 配置文件
设置配置文件的目的是以一种优雅的方式管理程序中出现的可能会改变的常量。如模型路径、输入输出文件夹等,避免需要改动时到处修改配置。
当前配置文件如下:
# 模型权重路径
SEGMENT_MODEL_PATH = "models/yolov8n_seg_250521.pt"
DETECT_MODEL_PATH = "models/yolov8n_det_250521.pt"
# 工作模式:图像文件夹(image_batch)、摄像头抽帧(camera_sample)、摄像头视频流(camera_stream)
WORK_MODE = "image_batch"
# 当检测模式为“image_batch”时,配置以下参数
# 输入图片文件夹
INPUT_IMAGE_DIR = "input"
# 输出图片文件夹
OUTPUT_IMAGE_DIR = "output"
# Debug 模式:打开调试模式后,程序会保存路面分割中间结果
IS_DEBUG_MODE = False
# 是否保存未检测到物体的图片
IS_SAVE_NONE_DETECT = False
# 当检测模式为“camera_sample”时,配置以下参数
# 采样率,每秒抽取多少帧
SAMPLE_RATE = 5
# 当检测模式为“camera_stream”时,配置以下参数
# 尚未实现
5 训练日志
5.1 YOYOv8 路面检测模型训练
路面分割数据集 | 样本数量 | 训练集 | 验证集 | 备注 |
---|---|---|---|---|
250311 | 253 | 193 | 49 | - |
250515 | 87 | 70 | 17 | - |
首次训练
基座模型为yolov8n-seg
,训练集为 250311,训练权重结果为 yolov8n_seg_250507.pt
。
该权重在验证集 250311 上表现良好。
(补充)在 2025 年 5 月 15 日采集的图像上出现问题,判断为反光和树荫影响。挑选代表性图像组成数据集 250515。
2025-05-07
第二次训练
基座模型为yolov8n_seg_20250507.pt
,训练集为 250515。
训练结果严重偏离预期。查阅资料发现是由于新训练集和原训练集的场景差别过大,导致模型灾难性遗忘原有特征。
2025-05-20
第三次训练
基座模型为yolov8n-seg
,训练集为 250311 和 250515 的合并数据集,训练权重结果为yolov8n_seg_250521.pt
。
该权重在验证集 250311 和 250515 上表现良好,基本解决了反光和树荫干扰路面识别的问题。
2025-05-21
5.2 YOYOv8 遗撒物检测模型训练
遗撒物检测数据集 | 样本数量 | 训练集 | 验证集 | 备注 |
---|---|---|---|---|
online-1 | 227 | 179 | 48 | - |
231124 | 47 | 41 | 6 | - |
250520 | 147 | 59 | 88 | 负样本 |
首次训练
基座模型为yolov8n
,训练集为 online-1 和 231124 的合并数据集,训练权重结果为yolov8n_det_250507.pt
。
该权重在该验证集上表现良好。
(补充)在 2025 年 3 月 11 日和 5 月 15 日采集的图像上出现问题,表现为将车道线错误识别为遗撒物。挑选代表车道线图片组成负样本数据集 250520。
2025-05-07
第二次训练
基座模型为yolov8n
,训练集为 online-1、231124 和 250520 的合并数据集,训练权重结果为yolov8n_det_250521.pt
。
该权重基本解决了车道线的误判问题,大幅降低误判概率。
2025-05-21