深度学习混凝土结构裂纹检测
2020年01月04日 由 sunlei 发表
281148
0
介绍
混凝土表面裂缝检测是混凝土结构健康监测的重要内容。如果裂缝出现并继续延伸,就会减少有效承载面积,久而久之会导致结构失效。人工检测裂纹的过程费时费力,而且受到检查员的主观判断的影响。对于高层建筑和桥梁,也很难进行人工检查。在这篇文章中,我们使用深度学习来建立一个简单但非常精确的裂纹检测模型。此外,我们在实际数据上对该模型进行了测试,结果表明该模型在检测混凝土和非混凝土结构的路面裂缝方面是准确的。代码是在我的
Github的link上开源的。
[caption id="attachment_49189" align="aligncenter" width="474"]
混凝土建筑物裂缝[/caption]
数据集
在这篇文章中,我们使用的是公开的
混凝土裂缝图像数据集。这个数据集是由Ozgenel和Gonenc在
论文中公开发表的。
该数据集包括20000幅有裂缝的混凝土结构图像和20000幅无裂缝的图像。数据集由458幅高分辨率图像(4032x3024像素)生成。数据集中的每个图像是227 x 227像素的RGB图像。一些有裂纹和无裂纹的样本图像如下所示:
[caption id="attachment_49191" align="aligncenter" width="778"]
带有裂纹的样本图像[/caption]
[caption id="attachment_49192" align="aligncenter" width="806"]
无裂纹样本图像[/caption]
可以看到,数据集有各种各样的图像——不同颜色的平板、不同强度和形状的裂缝。
模型构建
对于这个问题,让我们在Pytorch中建立一个卷积神经网络(CNN)。由于我们的图像数量有限,我们将以预训练网络为起点,并使用图像增强来进一步提高精度。图像增强允许我们做一些转换,如垂直和水平翻转、旋转和亮度变化从而显著增加了样本并帮助模型推广。
下面的步骤和我在
Github上的代码一起执行。
将输入数据洗牌并拆分为Train和Val
下载的数据将有两个文件夹,一个为正,一个为负。我们需要将其分为train和val,下面的代码片段将为train和val创建新的文件夹,并随机将85%的数据拖放到train中,其余的放到val中。
[caption id="attachment_49193" align="aligncenter" width="894"]
分为train和val[/caption]
应用转换
Pytorch使得应用数据转换变得容易,可以增加训练数据并帮助模型推广。我选择的变换是随机旋转、随机水平和垂直翻转以及随机颜色抖动。此外,每个通道除以255,然后进行标准化。这有助于神经网络的训练。
[caption id="attachment_49194" align="aligncenter" width="941"]
变换[/caption]
Pretrained模型
我们使用在ImageNet上预先训练的Resnet 50模型来启动这个模型。如下图所示,ResNet50模型由5个阶段组成,每个阶段包含一个卷积和一个单位块。每个卷积块有3个卷积层每个单位块也有3个卷积层。ResNet-50有超过2300万个可训练参数。我们将冻结所有这些权重和2个更完整的连接层-第一层有128个神经元输出,第二层有2个神经元输出,这是最后的预测。
[caption id="attachment_49195" align="aligncenter" width="1117"]
ResNet50 模型[/caption]
[caption id="attachment_49196" align="aligncenter" width="903"]
ResNet模型层[/caption]
模型总结表明,该模型有2300万个不可训练参数和262K个可训练参数。
[caption id="attachment_49197" align="aligncenter" width="499"]
模型参数[/caption]
我们使用Adam作为优化器,对模型进行了6个阶段的训练。
真实图像的模型训练与预测
我们使用转移学习在训练数据集上训练模型,同时在验证集上测量损失和精度。如下面的损失和精度数字所示,该模型训练非常迅速。第一个历元后,列车精度为87%,验证精度为97%!这就是转移学习的力量。最终模型的验证精度为98.4%。
[caption id="attachment_49198" align="aligncenter" width="439"]
模型的训练数据[/caption]
在真实图像上测试模型
现在是最有趣的部分。是的,该模型对验证数据有效,但我们希望确保它也对来自internet的未显示数据有效。为了验证这一点,我们随机拍摄了混凝土结构开裂和路面裂缝的图像。这些图像比我们的训练图像要大得多。记住,模型是在227,227像素的作物上训练的。我们现在将输入的图像分割成小块并对其进行预测。如果模型预测到裂缝,我们将补丁涂成红色(裂缝),否则将补丁涂成绿色。下面的代码片段将执行此操作。
[caption id="attachment_49199" align="aligncenter" width="831"]
作物预测[/caption]
这个模型对它以前从未见过的图像做得很好。如下图所示,该模型能够通过处理图像上的100个补丁来检测混凝土中的一个非常长的裂缝。
[caption id="attachment_49200" align="aligncenter" width="961"]
混凝土裂缝检测。左原始图像。右边的红色区域是有裂纹的预测,绿色区域是无裂纹的预测[/caption]
此外,我还测试了道路裂缝模型。这个模型没有在路面上训练,但它在识别路面裂缝方面也做得很好!
[caption id="attachment_49201" align="aligncenter" width="683"]
道路裂缝检测。左原始图像。右边的红色区域是有裂纹的预测,绿色区域是无裂纹的预测[/caption]
在这个项目的
github链接上分享了更多真实世界的图片和模型预测。
结论
这篇文章展示了使用深度学习和开源数据构建真实世界应用程序变得多么容易。整个工作花了半天的时间,得出了一个实用的解决方案。我希望你自己试试这个代码,并在更多真实世界的图片上进行测试。
原文链接:https://towardsdatascience.com/detection-of-surface-cracks-in-concrete-structures-using-deep-learning-f8f85cd8ac8b