# 道路裂缝缺陷检测 **Repository Path**: LNTUEE/road-crack-defect-detection ## Basic Information - **Project Name**: 道路裂缝缺陷检测 - **Description**: 使用unet实现的道路裂缝检测--语义分割,然后使用Tensorrt+cuda进行加速推理 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2024-02-08 - **Last Updated**: 2024-02-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目过程 ## 项目介绍 ### 道路裂缝缺陷检测:检测道路中的裂缝,无项目背景 - 数据:分为两类,正常、裂缝 ![001.jpg](data%2Ftrain%2Fimgs%2F001.jpg) ![001.png](data%2Ftrain%2Fmasks_color%2F001.png) ## 方案介绍 ### 数据预处理 - 将原始数据标签处理为两类,正常和裂缝 - 原始图片均为320*480,使用的显卡为2080,内存足够,不进行图片大小调整 ### 模型后处理 - 二分类使用softmax处理,使用最大值作为结果分类 - 效果如下,看着还行,但是还是存在一些问题,需要优化,使用dice_coeff作为评价,训练135轮,得分为0.7208,训练loss:0.0239 - 原图 - ![097.jpg](readme%2F097.jpg) - mask - ![097.png](readme%2F097.png) - pre - ![out_097.jpg](readme%2Fout_097.jpg) ### 算法选择 - 由于本项目是为了更加深入的熟悉语义分割,所以使用传统的unet网络进行训练,不做其他模型之间的对比 ### 推理加速方案 - 在推理方面,使用C++通过tensorrt+cuda的方式对模型推理进行加速,然后权衡是否使用量化技术 ## 方案优化过程以及结果 #### 1、加入边缘检测(弃用) - 对图片进行边缘检测(高斯模糊+canny) ![edges_115.jpg](readme%2Fedges_115.jpg) - 将边缘检测的结果作为原图像的一个维度,从最开始的RGB变为了RGB-edges(4通道) - 效果:得分为0.7171,没有提升,反而下降了;但是查看推理结果,模型学到了一些优化前没有学到的 - ![out_097_edges.jpg](readme%2Fout_097_edges.jpg) #### 2、将边缘检测替换为对比度调整,让裂痕更加明显 - 添加了对比度(第四通道变为对比度调整) ![contrast_97.jpg](readme%2Fcontrast_97.jpg) - 效果:得分为0.7252,有一定的提升,模型学习到了一些细节 ![out_097_contrast.jpg](readme%2Fout_097_contrast.jpg) #### 3、优化损失函数(弃用) - 因为是二分类,在加上是语义分割,所以是存在正负样本不均衡的情况的,需要对正负样本权重进行调节 - 根据正负样本的比例作为权重 - 效果:0.6725,效果变差了,结果如下:因为调整了类别的权重,所以模型的结果比较偏重于裂缝,也可以看到,模型的输出结果变粗了 ![out_097_contrast+class_weights.jpg](readme%2Fout_097_contrast%2Bclass_weights.jpg) #### 4、增加数据量 - 目前使用的数据量有118条,数据量较少,采用过采样的方式增加数据量 - 过程:因为该问题是道路的裂缝,所以是可以将数据进行上下翻转、左右翻转、上下+左右,将数据量增加到原来的四倍 - 效果:0.932,在第二步优化的基础上,提升了20个点,有较大的提升效果; - 在下面结果图中也可以看出来,模型学习到了更多关于裂缝的细节,效果也是比较显著 - ![out_097_contrast+sampling.jpg](readme%2Fout_097_contrast%2Bsampling.jpg) #### 5、尝试加入自注意力机制 - 在上一步的基础上就加入自注意力机制,使用CBAM混合注意力 - 使用上一步得到的预训练模型作为基础,初始化模型的权重 - 经过160轮的训练,最终评分为0.9939,提升了6个点,有较大的提升效果;耗时平均为50.62ms,帧率大约为20帧 - 看下方的效果图,也可以看出来,之前没有找到的一些细节,现在也更加完善了 ![out_097_contrast+sampling+attention.jpg](readme%2Fout_097_contrast%2Bsampling%2Battention.jpg) #### 6、一些结果展示 - 模型地址:https://www.aliyundrive.com/s/ymnSEacKSjT - 由于阿里云分享文件的限制,打开文件应该是空的,需要到云盘中找 - 最终的模型使用的方案,增加对比度通道、对数据集进行上下左右翻转以达到增加数据量的效果、增加注意力机制 ![out_097_contrast+sampling+attention_img.jpg](readme%2Fout_097_contrast%2Bsampling%2Battention_img.jpg) ![out_302_contrast+sampling+attention_img.jpg](readme%2Fout_302_contrast%2Bsampling%2Battention_img.jpg) ![out_322_contrast+sampling+attention_img.jpg](readme%2Fout_322_contrast%2Bsampling%2Battention_img.jpg) ## 推理加速 #### 使用C++ 的Tensorrt+cuda框架进行推理加速 - 1、使用cuda去做模型结果的后处理,平均耗时:33ms,提升17ms,帧率约为30帧;推理出的结果也与python中的一致 ![097_tensorrt_result.jpg](readme%2F097_tensorrt_result.jpg) ![097_tensorrt_result_2.jpg](readme%2F097_tensorrt_result_2.jpg)