当前位置:   article > 正文

道路病害分割项目_automatic road crack detection using random struct

automatic road crack detection using random structured forests

道路病害分割项目

一、项目背景

从图片中识别道路病害是道路日场养护的重要的工作

在这里插入图片描述

也有类似的比赛:

Global Road Damage Detection Challenge 2020数据集

在这里插入图片描述

自动化系统:

在这里插入图片描述

本任务具备应用与科研价值。

本项目探索不同网络结构的语义模型在此应用场景下的差异

选取多个模型进行训练,验证精度

三、准备工作

  • 准备环境,下载paddleseg,安装依赖
  • 原数据是mat格式,上传前已经处理为png格式
  • 标注与预期不符,删除以下三对数据:093,097,101
  • 多分类数据转换为为2分类数据
  • 按照0.9 0.1比例划分训练集与验证集

删除数据展示如下:

在这里插入图片描述

此区域为块状裂缝区域,本项目目标为条状裂缝,因此删除

二、数据集介绍

数据集名为CrackForest-dataset,源自论文Automatic road crack detection using random structured forests

  • 数据示例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

标注精细且完整,标注质量极高

# clone PaddleSeg的项目
!git clone https://gitee.com/paddlepaddle/PaddleSeg
# 安装依赖
!pip install  -r PaddleSeg/requirements.txt

  • 1
  • 2
  • 3
  • 4
  • 5
#解压数据集
!mkdir dataset
!unzip -oq data/data132592/CrackForest.zip -d dataset/
# 删除部分歧义数据
!rm dataset/image/093.jpg
!rm dataset/image/097.jpg
!rm dataset/image/101.jpg
!rm dataset/label/093.png
!rm dataset/label/097.png
!rm dataset/label/101.png
# 更改标签为2分类数据
!python work/process_data.py --dir dataset/label
# 划分数据
!python PaddleSeg/tools/split_dataset_list.py dataset image label --split 0.9 0.1 0 --format jpg png
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

四、模型训练与预测

  1. transformer系列
  • 使用Transfomer系列的Segformer_b1,Segformer_b2,Segformer_b3,分别训练五万个step
  1. HRNet系列
  • 使用HRnet18,HRnet48分别训练五万个step

项目二次完善补充训练:

  1. UnetAttention,BiSeNet,未使用预训练模型
  • 训练十五万个step
  1. OCRNet
  • 使用HRnet18作为backbone分别训练五万个step

训练曲线都较为平滑,下图为OCRNet曲线:

在这里插入图片描述

# # 复制segformer_b3配置文件
!cp ./work/segformer_b3_cf.yml ./PaddleSeg/configs/
# 开始训练
!python PaddleSeg/train.py \
       --config PaddleSeg/configs/segformer_b3_cf.yml \
       --do_eval \
       --use_vdl \
       --save_interval 500 \
       --save_dir work/output_segformer_b3_train
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
# # 复制segformer_b2配置文件
!cp ./work/segformer_b2_cf.yml ./PaddleSeg/configs/
# 开始训练
!python PaddleSeg/train.py \
       --config PaddleSeg/configs/segformer_b2_cf.yml \
       --do_eval \
       --use_vdl \
       --save_interval 500 \
       --save_dir work/output_segformer_b2_train
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
# # 复制segformer_b1配置文件
!cp ./work/segformer_b1_cf.yml ./PaddleSeg/configs/
# 开始训练
!python PaddleSeg/train.py \
       --config PaddleSeg/configs/segformer_b1_cf.yml \
       --do_eval \
       --use_vdl \
       --save_interval 500 \
       --save_dir work/output_segformer_b1_train
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
# # 复制hrnet18配置文件
!cp ./work/HRNet_W18.yml ./PaddleSeg/configs/
# 开始训练
!python PaddleSeg/train.py \
       --config PaddleSeg/configs/HRNet_W18.yml \
       --do_eval \
       --use_vdl \
       --save_interval 500 \
       --save_dir work/output_HRNet_W18_train
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
# # 复制hrnet48配置文件
!cp ./work/HRNet_W48.yml ./PaddleSeg/configs/
# 开始训练
!python PaddleSeg/train.py \
       --config PaddleSeg/configs/HRNet_W48.yml \
       --do_eval \
       --use_vdl \
       --save_interval 500 \
       --save_dir work/output_HRNet_W48_train
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
# # 复制Unet配置文件
!cp ./work/AttentionUNet.yml ./PaddleSeg/configs/
# 开始训练
!python PaddleSeg/train.py \
       --config PaddleSeg/configs/AttentionUNet.yml \
       --do_eval \
       --use_vdl \
       --save_interval 500 \
       --save_dir work/output_AttentionUNet_train
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
# # 复制BiSeNet配置文件
!cp ./work/BiSeNet.yml ./PaddleSeg/configs/
# 开始训练
!python PaddleSeg/train.py \
       --config PaddleSeg/configs/BiSeNet.yml \
       --do_eval \
       --use_vdl \
       --save_interval 500 \
       --save_dir work/output_BiSeNet_train
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
# # 复制OCR配置文件
!cp ./work/OCRNet.yml ./PaddleSeg/configs/
# 开始训练
!python PaddleSeg/train.py \
       --config PaddleSeg/configs/OCRNet.yml \
       --do_eval \
       --use_vdl \
       --save_interval 500 \
       --save_dir work/output_OCRNet_train
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 模型预测

实验1 50000 step

模型segformerB1segformerB2segformerB3HRNet_W18HRNet_W48
IOU0.72360.71530.71170.71530.7160
训练时间3806.161秒5465.511秒8788.607秒11240.455秒11365.421秒

实验2 AttentionUNet与BiSeNet,150000 step ;OCRNet 50000 step

模型AttentionUNetBiSeNetOCRNet
IOU0.71240.67860.7260
训练时间12159.823秒13614.211秒16318.894秒

*实验1中,segformerB1 时间最短,效果最好

  • 惊不惊喜,意不意外 ?
  • 特别是比赛,时间与效果的博弈,可以考虑下segformerB1

*实验2中,ocrnet效果最好

  • 毕竟是2021年屠榜的存在
  • 训练时间最长

预训练模型验证代码如下:(其它模型需验证请自行修改)
例如:
–config PaddleSeg/configs/segformer_b1_cf.yml \ 修改为 --config PaddleSeg/configs/segformer_b2_cf.yml
–model_path work/output_segformer_b1/best_model/model.pdparams \ 修改为 --model_path work/output_segformer_b2/best_model_train/model.pdparams \

若使用自己训练的权重,修改如下:(其它模型需验证请自行修改)

–config PaddleSeg/configs/segformer_b1_cf.yml \ 无需修改

–model_path work/output_segformer_b1/best_model/model.pdparams \ 修改为

–model_path work/output_segformer_b1_train/best_model/model.pdparams \

# segformerB1
!python PaddleSeg/val.py \
       --config PaddleSeg/configs/segformer_b1_cf.yml \
       --model_path work/output_segformer_b1/best_model/model.pdparams \
  • 1
  • 2
  • 3
  • 4

五、推理

  • 对未标注的test数据进行推理
  • 运行以下代码,得到结果,分别存储于work/test/各文件夹下
  • 实验结果:
模型segformerB1segformerB2segformerB3HRNet_W18HRNet_W48
推理时长209ms/step345ms/step555ms/step780ms/step762ms/step
  • 备注
  1. crop_size 256 256 ,因为训练的时候用了crop_size,感觉统一参数效果会更好(当然也不一定,玄学)
  2. stride 128 128 ,个人经验,习惯了步长128这种相对保守的值,多余测几次,宁可错杀不可放过
!python PaddleSeg/predict.py \
       --config PaddleSeg/configs/segformer_b1_cf.yml \
       --model_path work/output_segformer_b1/best_model/model.pdparams \
       --image_path dataset/test \
       --save_dir ./work/test/segformer_b1result \
       --is_slide \
       --crop_size 256 256 \
       --stride 128 128

!python PaddleSeg/predict.py \
       --config PaddleSeg/configs/segformer_b2_cf.yml \
       --model_path work/output_segformer_b2/best_model/model.pdparams \
       --image_path dataset/test \
       --save_dir ./work/test/segformer_b2result \
       --is_slide \
       --crop_size 256 256 \
       --stride 128 128

!python PaddleSeg/predict.py \
       --config PaddleSeg/configs/segformer_b3_cf.yml \
       --model_path work/output_segformer_b3/best_model/model.pdparams \
       --image_path dataset/test \
       --save_dir ./work/test/segformer_b3result \
       --is_slide \
       --crop_size 256 256 \
       --stride 128 128

!python PaddleSeg/predict.py \
       --config PaddleSeg/configs/HRNet_W18.yml \
       --model_path work/output_HRNet_W18/best_model/model.pdparams \
       --image_path dataset/test \
       --save_dir ./work/test/HRNet_W18result \
       --is_slide \
       --crop_size 256 256 \
       --stride 128 128

!python PaddleSeg/predict.py \
       --config PaddleSeg/configs/HRNet_W48.yml \
       --model_path work/output_HRNet_W48/best_model/model.pdparams \
       --image_path dataset/test \
       --save_dir ./work/test/HRNet_W48result \
       --is_slide \
       --crop_size 256 256 \
       --stride 128 128
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

六、结果展示与分析

  • 对未标注的test数据进行推理
  • 运行以下代码,得到结果,分别存储于work/test/各文件夹下
  • 实验结果:
模型segformerB1segformerB2segformerB3HRNet_W18HRNet_W48
推理时长209ms/step345ms/step555ms/step780ms/step762ms/step
  • 备注
  1. crop_size 256 256 ,因为训练的时候用了crop_size,感觉统一参数效果会更好(当然也不一定,玄学)
  2. stride 128 128 ,个人经验,习惯了步长128这种相对保守的值,多预测几次,宁可错杀不可放过
  • 部分预测结果展示:

在这里插入图片描述

六、总结

1.各模型特点

  • Segformer系列模型训练速度,推理速度优于hrnet系列
  • 从val数据集效果上来看,早像素指标层面,相互之间差别在百分之2以内,transform系列占优势
  • 从test数据集效果上来看,若将每条裂缝当做一个对象,HRNet并不弱于segformer,甚至在连续性上略占优势

2.本项目不完善的地方

  1. 并未多次训练验证,理应多次训练计算均值方差,但个人若仅仅作为定性描述,对结果影响不大
  2. HRNet18与HRNet48的推理时间与训练时间让我感到迷惑,参数上HRNet48(存储空间251M+)比HRNet18(存储空间37M+)多几倍,但训练时间与预测时间基本一样,甚至参数少的HRNet18在预测时耗时更多,这不科学
  3. Segformer对全局语义具有更好的表现,可以较好的过滤噪音与局部区域相似的特征(例如路牙石等)
  4. CNN系列在局部区域完整性上更占优势
  5. FPN,unet++等网络并未验证,不够全面
  6. 不考虑算力与时间成本的话,不管做项目还是打比赛,模型集成才是王道,本项目为保持各模型的特点,并未增加此类操作
  7. 是否训练到收敛状态?继续训练iou可否继续提升?

本项目仅为搬运,原项目链接:https://aistudio.baidu.com/aistudio/projectdetail/3620417

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号