裂缝分割(Crack Segmentation)
本文介绍了针对路面和混凝土材料的裂缝分割问题的解决方案。文章详细描述了所采用的方法、实验数据集以及结果展示。我的方法基于UNet网络,并结合了两种流行的架构进行迁移学习:VGG16和ResNet101。实验结果表明,大规模的裂缝分割数据集有助于提升模型在实际应用中的性能。
目录
- 推理结果预览
- 概述
- 数据集
- 依赖项
- 测试图像收集
- 推理
- 训练
- 结果
- 引用
推理结果预览
以下是几个测试案例的结果。更多测试案例结果请查看./test_results
文件夹中的图像。
概述
裂缝分割是结构检测中的重要任务。例如,在桥梁检测项目中,无人机被控制围绕桥梁飞行,拍摄桥梁表面的照片。这些照片随后由计算机处理,以检测桥梁表面可能受损的区域。模型的准确性越高,处理这些图像所需的人力就越少。否则,操作员将不得不逐一检查每张图像,这既枯燥又容易出错。该任务的一个挑战是模型对噪声和其他物体(如裂缝上的苔藓、瓷砖线等)的敏感性。在本项目中,我标注了来自大学裂缝数据集的300多张高分辨率图像,并合并了互联网上可用的9个不同的裂缝分割数据集。实验结果表明,该模型能够区分裂缝、树木、瓷砖线和其他现实中的噪声。
数据集
据我所知,本项目使用的数据集是目前最大的裂缝分割数据集。它包含约11,200张图像,这些图像是从12个可用的裂缝分割数据集中合并而来的。
每张图像的文件名前缀被分配为其所属数据集的名称。还有一些图像没有裂缝像素,可以通过文件名模式noncrack*
进行过滤。
所有图像都被调整为 448 × 448 448 \times 448 448×448的尺寸。
images
和masks
文件夹包含所有图像。train
和test
文件夹包含从上述两个文件夹中拆分出的训练和测试图像。拆分是分层的,以确保每个数据集在训练和测试文件夹中的比例相似。
依赖项
conda create --name crack
conda install -c anaconda pytorch-gpu
conda install -c conda-forge opencv
conda install matplotlib scipy numpy tqdm pillow
推理
- 下载预训练模型
unet_vgg16
或unet_resnet_101
。 - 将下载的模型放在
./models
文件夹下。 - 运行以下代码:
python inference_unet.py -in_dir ./test_images -model_path ./models/model_unet_resnet_101_best.pt -out_dir ./test_result
测试图像收集
该模型在图像中几乎只有裂缝像素和混凝土背景的情况下表现良好。然而,现实中往往并非如此,许多不同的物体可能会同时出现在图像中。因此,为了评估裂缝模型的鲁棒性,我尝试提出几种可能发生的实际案例。这些图像可以在同一仓库的./test_imgs
文件夹中找到。
• 纯裂缝:理想情况下,图像中只有裂缝物体。
• 类似裂缝:包含看起来像裂缝的细节的图像。
• 带苔藓的裂缝:裂缝上有苔藓。这些情况在现实中经常发生。
• 带噪声的裂缝:背景(墙壁、混凝土)不平整。
• 大背景中的裂缝:背景大而多样。例如,整个房屋或街道上有人。
纯裂缝 | 类似裂缝 | 带苔藓的裂缝 |
---|---|---|
纯裂缝 | ||
无裂 |
训练
- 从链接下载数据集。
- 运行训练代码。
- 执行以下命令:
python train_unet.py -data_dir PATH_TO_THE_DATASET_FOLDER -model_dir PATH_TO_MODEL_DIRECTORY -model_type resnet_101
结果
最佳结果由UNet_Resnet_101实现,IoU和Dice指标如下:
模型 | IoU(均值,标准差) | Dice(均值,标准差) |
---|---|---|
UNet_VGG16 | 0.4687, 0.2217 | 0.6033, 0.2382 |
UNet_Resnet_101 | 0.3861, 0.2123 | 0.51877, 0.2538 |
DenseNet |