HrSegNet 23年裂缝检测新文章基于PaddelPaddle和Paddleseg的复现

本文章是对2023年发表在Automation in Construction上论文

Real-time High-Resolution Neural Network with Semantic Guidance for Crack Segmentation

的复现。

我参考了作者上传至github的代码,并得到了作者的帮助。
https://github.com/CHDyshli/HrSegNet4CrackSegmentation

环境安装

安装Paddle

首先我在Linux服务器上安装了Paddle,可以参考Paddle官方的安装文档,非常的详细。
开始使用_飞桨-源于产业实践的开源深度学习平台
通过参考官方文档中的描述可以确认目前的python版本,pip版本,选择适合自己的Paddle版本即可,因为使用的3090显卡,CUDA版本是12.0,我安装的Paddle版本是2.5.0。具体安装过程参考官网,更加详细。

安装Paddleseg

Paddleseg应该是可以通过pip直接安装,不过我选择了使用原代码编译的方式,安装过程也很简单,通过git clone将github上的Paddleseg库下载到服务器上,然后按照步骤一步一步来就可以了。测试的方法官方给的也很清楚。我安装的Paddleseg版本是2.9.0。测试通过后就可以使用了。
https://github.com/PaddlePaddle/PaddleSeg

使用Paddleseg训练模型

使用Paddleseg训练模型比我想想的简单得多,我先按照官方的教程 “20分钟快速上手PaddleSeg”进行操作,发现非常的顺利,成功的实现了示例,大家可以参照官方的指引。
https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.9/docs/whole_process_cn.md

复现HrSegNet

配置文件和模型文件

我首先将HrSegNet Github上公开的代码clone了下来
GitHub - CHDyshli/HrSegNet4CrackSegmentation: Real-time High-Resolution Neural Network with Semantic Guidance for Crack Segmentation

之后将相应的文件放入相应的目录,主要是将configs文件夹中的文件copy到了./PaddleSeg/configs,将要models里面的模型文件copy到./PaddleSeg/paddleseg/models,并在./PaddleSeg/paddleseg/models/__init__.py中添加了所需模型的引用。如下示例,需要哪些就引入哪些。

from .hrsegnet_b16 import HrSegNetB16
from .hrsegnet_b48 import HrSegNetB48

准备数据集

文中用到了

  •  CrackSeg9k
  •  Asphalt3k
  •  Concrete3k

CrackSeg9k大家可以去官网下载。但我从官网先下载了CrackSeg9k version3.0 和 CrackSeg9K version 2.0数据集,发现本文是在2.0的基础上进行了一些删减,于是在Github上发起了提问,结果当天就得到了作者的解答,作者提供了本文使用的数据文件,这省去了我很多时间(本来准备自己准备这些数据)。

https://github.com/CHDyshli/HrSegNet4CrackSegmentation/issues/7

Asphalt3k 和 Concrete3k作者也将其划分出了Train Val Test,并上传到了OneDrive,我么可以直接下载。

进行训练

参考Paddleseg上的训练方法来训练HrSegNet即可,我在Paddleseg下运行了下面的代码,训练hrsegnetb48网络。

export CUDA_VISIBLE_DEVICES=0 # 设置1张可用的卡
python tools/train.py \
       --config configs/hrsegnetb48.yml \
       --save_interval 500 \
       --do_eval \
       --use_vdl \
       --save_dir output_hrsegnetb48_c9

我们也可以使用多卡训练,我进行了测试,发现多卡和单卡一个iter用的时间是一样的,因此该程序使用一张卡训练即可。

export CUDA_VISIBLE_DEVICES=0,1,2,3 # 设置4张可用的卡
python -m paddle.distributed.launch tools/train.py \
       --config configs/hrsegnetb48.yml \
       --do_eval \
       --use_vdl \
       --save_interval 500 \
       --save_dir output_hrsegnetb48_c9

进行验证

在训练过程中,我们设置了验证,因此没500个iter会进行验证,并记录最优结果。若想单独验证模型,使用以下代码即可(使用的是验证集 val set)

python tools/val.py \
       --config configs/hrsegnetb48.yml \
       --model_path output_hrsegnetb48_c9/best_model/model.pdparams

进行测试

测试和验证使用的代码是相同的,我们只需将yml配置文件中的验证集路径换为测试集路径。即将val_dataset中,val_path 从data/crackseg9k/val.txt 换为 data/crackseg9k/test.txt即可,然后重复执行上面验证的指令即可看到模型在测试集上的表现。

val_dataset:
  type: Dataset
  dataset_root: data/crackseg9k
  val_path: data/crackseg9k/val.txt

可视化

我发现paddleseg自带了可视化预测的指令,我进行了尝试,附上分割出来裂缝的效果(随便找了一张图,没有使用最优模型),官方的代码会在路径下生成两个文件夹,分别存放加在原图上的效果和只有颜色的效果。后续需要遍历测试集进行可视化的话可能还需要稍微修改下代码或者写一个批处理,如果后续我写了的话会将其放出。

python tools/predict.py \
       --config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \
       --model_path output/best_model/model.pdparams \
       --image_path data/optic_disc_seg/JPEGImages/H0002.jpg \
       --save_dir output/result

 

总结

这是我第一次使用PaddlePaddle和Paddleseg,比我预想到的要顺利很多,我依照官方提供的文档进行安装和使用,没有遇到什么问题,在复现HrSegNet的过程中也很顺利,在处理数据集时提了issue得到了论文作者的回复,整体使用下来很顺利。 

接下来我将对论文中的结果进行复现,并考虑在其基础上进行下一步的研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/264354.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】【线性回归】梯度下降

文章目录 [toc]数据集实际值估计值估计误差代价函数学习率参数更新Python实现线性拟合结果代价结果 数据集 ( x ( i ) , y ( i ) ) , i 1 , 2 , ⋯ , m \left(x^{(i)} , y^{(i)}\right) , i 1 , 2 , \cdots , m (x(i),y(i)),i1,2,⋯,m 实际值 y ( i ) y^{(i)} y(i) 估计值 h …

销量影响因素分析:从多维度解析商品市场表现

在商品市场中,销量是衡量一个商品或品牌成功与否的关键指标。然而,销量的影响因素众多,包括产品品质、价格、品牌知名度、营销策略、竞争环境等。为了深入了解商品市场的表现,我们需要从多个维度对销量影响因素进行分析。本文将通…

FreeRTOS之二值信号量(实践)

信号量相当于一个标志,实现对资源多少的管理。 比如停车场空位的数量。 这里使用的是二值信号量,其队列长度为1,只有空或满两种状态。 1、步骤: 1.1、创建信号量 1.2、释放信号量 1.3、获取信号量 注:若想深入还…

c++11特新:弱引用智能指针

弱引用智能指针std::weak_ptr可以看做是shared_ptr的助手,它不管理shared_ptr内部的指针。std::weak_ptr没有重载操作符*和->,因为它不共享指针,不能操作资源,所以它的构造不会增加引用计数,析构也不会减少引用计数…

DMR与DPMR以及DMR的分层

数字移动无线电 (DMR) 和数字专用移动无线电 (dPMR) 是数字对讲机中使用的流行通信技术。 与传统模拟无线电相比,这两种技术都提供了改进的音频质量、增强的安全功能和增加的网络容量。 但是,DMR 和 dPMR 无线电之间使用的技术存在重大差异&#xff…

【三维生成与重建】ZeroRF:Zero Pretraining的快速稀疏视图360°重建

系列文章目录 题目:ZeroRF: Fast Sparse View 360◦ Reconstruction with Zero Pretraining 任务:稀疏重建;拓展:Image to 3D、文本到3D 作者:Ruoxi Shi* Xinyue Wei* Cheng Wang Hao Su ,来自UC San Dieg…

Redis 6 性能大揭秘:如何优化缓存命中率?

Redis 6的性能优化,特别是关于如何优化缓存命中率。 这篇文章会包含10个代码示例,帮助深入理解和应用相关的技巧 1、 监控缓存命中率 在优化之前,首先要了解当前的缓存命中率。Redis提供了INFO命令来查看性能指标,包括命中率。…

51单片机模数转换ADC原理与代码一

51单片机模数转换ADC原理与代码一 1.概述 这篇文章是模数转换的入门文章,这篇文章主要介绍模数的概念、原理、核心指标、专业术语,以及一个模数转换的实例代码实现检测电位器的数值变化。 2.ADC介绍 2.1.ADC概念 ADC(Analog-to-Digital Converter)是…

TrustZone之安全启动与引导失败处理

一、引导和信任链 引导是任何TrustZone系统的关键部分。只有在引导流程中之前运行的所有软件组件都是可信的情况下,才能信任某个软件组件。这通常被称为信任链。下图显示了一个简化的信任链: 在我们的示例中,首先运行的代码是boot ROM。我们必须隐式信任boot ROM,因…

「完美世界」石昊调戏清漪,告白欲以身相许,渡劫神莲淬炼肉身

Hello,小伙伴们,我是拾荒君。 《完美世界》第142集已经更新。石昊在齐道临赠予的令牌庇护下,成功潜入仙池,借助着他的重瞳,他发现那神秘的渡劫神莲正位于这仙池之中。然而,渡劫神莲的位置上空雷云翻滚,宛如…

【JavaWeb学习笔记】14 - 三大组件其二 Listener Filter

API文档JAVA_EE_api_中英文对照版 Listener 一、监听器Listener 1. Listener监听器它是JavaWeb的三大组件之一。 JavaWeb的三大组件分别是: Servlet程序、Listener监听器、Filter过滤器 2. Listener是JavaEE的规范,就是接口 3.监听器的作用是,监听某…

uniapp纯CSS实现圆形进度条组件

uniapp纯CSS实现圆形进度条组件。圆形进度条组件组合做一个步骤进度组件是非常常见。 纯 CSS 实现圆形进度条组件有以下几个好处: 轻量级:由于纯 CSS 实现,无需额外的 JavaScript 或图像资源,所以组件的文件大小相对较小&#xf…

HTML5文档

目录 HTML5文档结构1.HTML5页面结构2.HTML5新增结构元素 HTML5新增页面元素1.hgroup标记2.figure标记与figcaption标记3.mark标记与time标记4.details标记与summary标记5.progress标记与meter标记6.input标记与datalist标记 HTML5文档结构 HTML5文档结构同样是由头部和主体两部…

Postman报:400 Bad Request

● 使用Postman发送Post请求报400,入参为JSON; 二、分析 1、Postman请求并没有请求到后台Api(由于语法错误,服务器无法理解请求); 2、入参出错范围:cookie、header、body、form-data、x-www-f…

3.[BUU]warmup_csaw_20161

1.checksec 检查文件类型 ELF-64-little ,无其他限权,直接用ida检查代码。 2.IDA进行反编译,进行代码审计 查看各个名称的内容: 了解基本攻击思路: 攻击思路:gets输入垃圾数据覆盖v5内容,再将s…

FPGA-Xilinx ZYNQ PS端实现SD卡文件数据读取-完整代码

FPGA-Xilinx ZYNQ PS端实现SD卡文件数据读取 本章节记录Xilinx ZYNQ PS端实现SD卡txt文件的数据读取。 踩坑记录,本章节主要内容参考原子哥 板子:xilinx zynq 7010 文章目录 FPGA-Xilinx ZYNQ PS端实现SD卡文件数据读取一、开发板引脚配置二、PS端导入F…

嵌入式科普(5)ARM GNU Toolchain相关概念和逻辑

一、目的/概述 二、资料来源 三、逻辑和包含关系 四、Arm GNU Toolchain最常用的命令 嵌入式科普(5)ARM GNU Toolchain相关概念和逻辑 一、目的/概述 对比高集成度的IDE(MDK、IAR等),Linux开发需要自己写Makefile等多种脚本。eclipse、Visual Studio等需要了解预处…

高德地图逆地理编码踩坑日志

本人是一枚Java小白,公司项目中用到根据经纬度反查该地址中文信息的场景,因为一开始调用的经纬度是能反查出区域编码的,以为towncode都是String返回结果,如下图: 没想到当没有名字任何一个城市区域的时候,…

在Linux安装卸载文件

目录 一、Linux系统应用程序 1.典型的应用程序的目录结构 2、常见的软件包封装类型 二、RPM软件包管理 1、RPM是什么? 2、rpm一般命名格式 3、RPM安装包从何而来?如何挂载? 4、挂载的注意事项: 5、目的:提供安装包 6、查…

MyBatis——MyBatis的延迟加载

MyBatis的延迟加载(一对多查询案例) 1.什么是延迟加载? 开启延迟加载后,在真正使用数据的时候才发起级联查询,不用的时候不查询。 2.pojo User类: package com.wt.pojo;import java.io.Serializable; …