使用人工智能将结构检测带入 21 世纪!

问题陈述

虽然新技术几乎改变了我们生活的方方面面,但建筑领域似乎正在努力迎头赶上。目前,建筑物的结构状况仍主要由人工检查。简单来说,即使现在需要检查结构是否有任何损坏,工程师也会手动检查所有表面并拍摄一堆照片,同时记录任何裂缝的位置。然后需要在办公室再花几个小时来整理所有照片和笔记,试图从中做出有意义的报告。显然,这是一个费力、昂贵且主观的过程。最重要的是,由于结构的某些部分存在访问限制且难以到达,因此会引起安全问题。举个例子,金门大桥需要定期检查。换句话说,直到最近,还会有受过专门训练的人爬过这座风景如画的建筑,检查它的每一个位置。

幸运的是,可以部署无人驾驶飞机(例如无人机)来拍照,但仍然需要一个人花费数小时和数小时来检查拍摄的每张照片是否有损坏迹象。

这就是我们想要彻底改变检查过程的工作。更具体地说,深度学习通过训练我们的模型能够代替人类完成检测结构照片裂缝的繁琐任务。

根据照片进行裂纹检测分为三个步骤:

  • 图像被分成多个 patches,每个 patch 被分配一个 crack 或 non-crack 标签

  • 在任何检测到的裂纹周围绘制一个矩形

  • 每个图像都标有裂纹或非裂纹

使用图像块分类(左)、边界框回归(中)和像素分割(右)进行裂缝检测(Dais 等人,2021 年)

虽然用于裂缝检测的深度学习方法已针对混凝土表面或沥青进行了广泛研究,但在基于视觉的评估方面以及专门用于砖砌体表面缺陷检测方面的研究很少。我们工作的重点是检测砖石表面照片上的裂缝,包括补丁和像素级别。

数据集准备

训练深度学习模型最重要的部分是数据;模型的准确性在很大程度上取决于数据的质量和数量。真实世界的表现越好,模型在真实结构上“工作”的机会就越高。毫无疑问,与混凝土或沥青相比,砖石表面的均匀度较低,噪音也明显较大。此外,没有可用的砖石表面裂缝照片数据集。为了解决数据不足的问题,我在网上查找了相关的照片,同时我拿着相机把格罗宁根市中心的所有裂缝都拍了下来!

已开发的深度学习方法的一个普遍缺陷是,它们在单调背景上进行测试时取得了显著的效果,但在复杂背景的图像上进行测试时,它们的准确性会严重下降。窗户、门、装饰品、标签、灯、电缆、植被等物体在裂缝检测过程中可以被表征为噪声,网络需要学习消除它们以准确检测裂缝。因此,在拍照时也有意包括了这些物体。

因此,根据包含复杂背景的砖石结构照片准备了一个广泛的数据集,现在我们已准备好进行下一步:训练深度学习模型。

有裂缝和无裂缝的结构图像(Dais 等人,2021 年)

可以在结构立面上找到的物体(Dais 等人,2021 年)

训练模型

关于裂纹检测,本文检查了使用不同CNN将砖石表面图像分类为裂纹和非裂纹的基于 ImageNet 预训练模型效果。考虑的网络是:VGG16、MobileNet、MobileNetV2、InceptionV3、DenseNet121、DenseNet169、ResNet34 和 ResNet50。最好的结果是使用 MobileNet 的预训练模型,MobileNet 是一种轻量级网络,注定要在计算有限的平台上运行。特别注意的是,经过预训练的 MobileNet 获得了 95.3% 的准确率,而当不使用预训练模型时,准确率下降到 89.0%。

使用 MobileNet 获得的混淆矩阵(Dais 等人,2021 年)

对于裂缝分割 U-net 和特征金字塔网络(FPN),一种通用的金字塔表示,并将其与不同的 CNN 相结合,一起作为训练的主干网络。

U-net-MobileNet(U-Net as base-model with MobileNet as backbone)和 FPN-InceptionV3(FPN as base-model with InceptionV3 as backbone)获得了最高的 F1 分数,即 79.6%。未加载预训练的 U-net 和 U-net-MobileNet 的获得了相似的 F1 分数,分别为 75.7% 和 75.4%。因此,使用预训练网络作为主干网络可将 F1 分数提高约 4%。同样,迁移学习似乎可以解决我们很大问题!

用于裂纹分割的数据集的特点是存在严重的类别不平衡,即背景类占据照片的最大部分,而裂纹只存在于有限的像素。由于这种不平衡,如果不采取特殊措施,网络在预测背景类别时往往会变得过于自信,这可能导致裂缝的错误分类和大量的假阴性。为了克服这个问题,研究了不同的损失函数。加权交叉熵损失函数允许网络通过增加正错误成本的权重来关注正类,其表现优于其他函数。

原始图像、ground truth 和使用 U-net-MobileNet 的预测(Dais 等人,2021)

Code

import osfolder = {}
# Use this to easily run the code in different directories/devices
folder['initial'] = 'C:/Users/jimar/Dimitris/python/'
# The path where the repository is stored
folder['main'] = folder['initial'] + 'crack_detection_CNN_masonry/'# if folder['main'] == '', then the current working directory will be used
if folder['main'] == '':folder['main'] = os.getcwd()import sys
sys.path.append(folder['main'])from config_class import Configcnf = Config(folder['main'])
args = cnf.set_repository()# Set some parameters
IMAGE_DIMS = cnf.IMAGE_DIMS
BS = cnf.BS
epochs = cnf.epochs
INIT_LR = cnf.INIT_LR
N_FILTERS = cnf.N_FILTERS
info = cnf.info
mode = cnf.mode# When using DeepCrack, eager execution needs to be enabled
if args["model"] == 'DeepCrack':import tensorflow as tftf.enable_eager_execution()from subroutines.HDF5 import HDF5DatasetGeneratorMask#%%if mode == 'train':from keras.preprocessing.image import ImageDataGeneratorfrom keras.callbacks import ModelCheckpointfrom keras.callbacks import CSVLoggerfrom subroutines.callbacks import EpochCheckpointfrom subroutines.callbacks import TrainingMonitorfrom subroutines.visualize_model import visualize_model#%%  # Prepare model for training## Define metricsfrom metrics_class import Metricsmetrics = Metrics(args).define_Metrics()# Define lossfrom loss_class import Lossloss = Loss(args).define_Loss()# Define optimizerfrom optimizer_class import Optimizeropt = Optimizer(args, INIT_LR).define_Optimizer()# Define Network and compile modelfrom network_class import Networkmodel = Network(args, IMAGE_DIMS, N_FILTERS, BS, INIT_LR, opt, loss, metrics).define_Network()# Visualize modeltry:visualize_model(model, args['architecture'], args['summary'])except:from subroutines.visualize_model import visualize_model_tfvisualize_model_tf(model, args['architecture'], args['summary'])#%%# Data augmentation for training and validation setsif args['aug'] == True:aug = ImageDataGenerator(rotation_range=20, zoom_range=0.15,width_shift_range=0.2, height_shift_range=0.2, shear_range=0.15,horizontal_flip=True, fill_mode='nearest')else:aug = None# Load data generatorstrainGen = HDF5DatasetGeneratorMask(args['TRAIN_HDF5'], BS, aug=aug, shuffle=False, binarize=args['binarize'])valGen = HDF5DatasetGeneratorMask(args['VAL_HDF5'], BS, aug=aug, shuffle=False, binarize=args['binarize'])#%%# Callback that streams epoch results to a CSV file# https://keras.io/api/callbacks/csv_logger/csv_logger = CSVLogger(args['CSV_PATH'], append=True, separator=';')# serialize model to JSONtry:model_json = model.to_json()with open(args['model_json'], 'w') as json_file:json_file.write(model_json)except:pass# Define whether the whole model or the weights only will be saved from the ModelCheckpoint# Refer to the documentation of ModelCheckpoint for extra details# https://keras.io/api/callbacks/model_checkpoint/temp = '{}_{}'.format(info, args['counter']) + "_epoch_{epoch}_" + \args['metric_to_plot'] + "_{val_" + args['metric_to_plot'] +":.3f}.h5"if args['save_model_weights'] == 'model':ModelCheckpoint_file = args["checkpoints"] + tempsave_weights_only = Falseelif args['save_model_weights'] == 'weights':ModelCheckpoint_file = args['weights'] + tempsave_weights_only = Trueepoch_checkpoint = EpochCheckpoint(args['checkpoints'], args['weights'], args['save_model_weights'],every=args['every'], startAt=args['start_epoch'], info=info, counter=args['counter'])training_monitor = TrainingMonitor(args['FIG_PATH'], jsonPath=args['JSON_PATH'], startAt=args['start_epoch'], metric=args['metric_to_plot'])model_checkpoint = ModelCheckpoint(ModelCheckpoint_file, monitor='val_{}'.format(args['metric_to_plot']), verbose=1, save_best_only=True, mode='max', save_weights_only=save_weights_only)# Construct the set of callbackscallbacks = [csv_logger,epoch_checkpoint,training_monitor,model_checkpoint]   #%%  # Train the network#H = model.fit_generator(trainGen.generator(),steps_per_epoch=trainGen.numImages // BS,validation_data=valGen.generator(),validation_steps=valGen.numImages // BS,epochs=epochs,max_queue_size=BS * 2,callbacks=callbacks, verbose=1)#%%elif mode == 'evaluate':# load pretrained model/weightsfrom evaluate_class import LoadModelmodel = LoadModel(args, IMAGE_DIMS, BS).load_pretrained_model()# Do not use data augmentation when evaluating model: aug=NoneevalGen = HDF5DatasetGeneratorMask(args['EVAL_HDF5'], BS, aug=None, shuffle=False, binarize=args['binarize'])# Use the pretrained model to fenerate predictions for the input samples from a data generatorpredictions = model.predict_generator(evalGen.generator(),steps=evalGen.numImages // BS+1, max_queue_size=BS * 2, verbose=1)# Define folder where predictions will be storedpredictions_folder = '{}{}/'.format(args['predictions'], args['pretrained_filename'])# Create folder where predictions will be storedcnf.check_folder_exists(predictions_folder)# Visualize  predictions# Create a plot with original image, ground truth and prediction# Show the metrics for the prediction# Output will be stored in a subfolder of the predictions folder (args['predictions_subfolder'])from subroutines.visualize_predictions import Visualize_PredictionsVisualize_Predictions(args, predictions)

结论

通过我们的研究,我们展示了建筑行业的现代化,特别是检查过程的现代化是可行的。当然,这些新技术有着无限的可能性,只有通过进一步的研究才能揭示出来。

使用 3D 场景重建进行裂缝检测

·  END  ·

HAPPY LIFE

基于 U-net 的裂缝检测相关推荐

  1. 基于图像处理的路面裂缝检测系统设计与研究

    基于MATLAB的路面裂缝检测系统设计与研究 一.课题背景及研究目的 随着社会经济的不断发展,道路交通在国民经济和人民生活中起的作用愈发显著, 交通已成为人们日常出行和我国经济建设中重要的基础设施之一 ...

  2. 基于机器视觉的路面裂缝检测方法研究与实现

    基于MATLAB的路面裂缝检测系统[过程图,源码] 课题背景 裂缝是最常见的路面损坏,可能会危及公路和高速公路的安全.在路面裂缝变的更糟糕之前及时进行修补,可以大大节省路面维修的资金.路面裂缝是评估道 ...

  3. 施努卡:基于深度学习的裂缝检测技术

    不同于传统的裂缝检测方法,基于深度学习的检测方法不需要人工干预,能自主学习有代表性的特征,直接对输入图像的裂缝进行检测. 随着深度学习方法在许多应用场景中取得了很好的检测结果.国内众多研究人员也开始把 ...

  4. 【裂缝检测识别】基于计算机视觉实现路面裂缝检测识别系统设计含Matlab源码

    1 简介 作为国民经济发展的命脉,公路交通对于运输业.制造业.旅游业以及农业等国家支柱产业的发展都有着举足轻重的作用.近年来,随着我国公路使用寿命的延长和交通负荷的增加,路面破损检测和养护已成为公路交 ...

  5. 基于半交互式的裂缝检测方法

    裂缝的危害已深入经济社会发展的各个领域,比如交通运输领域中的公路路面裂缝,高速公路隧道壁裂缝等:工业产品领域中的光学玻璃裂缝,木材表面裂缝等等:其安全性检测直接关系到经济发展和安全等重大问题.裂缝虽然 ...

  6. 基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)

    主要内容 本文对裂缝检测技术进行了深入研究,并结合裂缝图像的特征,提出了一种基于传统机器学习和图像处理技术的裂缝检测方法,实现裂缝基本参数的计算和显示.内容如下: 1.裂缝图像采集(无人机) 2.裂缝 ...

  7. 【图像识别】基于计算机视觉实现路面裂缝检测识别系统matlab代码

    1 简介 随着公路与铁路事业的飞速发展,各类车辆和里程的增加,铁路的一次次提速,都对路面产生了巨大的压力.不论是公路路面还是铁路路面,路面裂纹都能随处可见,由路面裂纹造成的交通事故时有发生.研究路面裂 ...

  8. 图像处理(二)之 基于OpenCV的水泥裂缝检测(区域延申)

    一.基本逻辑思路 一.前期图像处理 1. 读取图形.修改尺寸.灰度图转换 # 读取图片origin = PreProcess.read_image("test_img/1.jpg" ...

  9. 基于MATLAB的路面裂缝检测识别算法仿真

    目录 1.算法仿真效果 2.MATLAB源码 3.算法概述 4.部分参考文献 1.算法仿真效果 matlab2022a仿真结果如下: 2.MATLAB源码 %********************

  10. 【文献阅读笔记】之基于注意力机制的深度学习路面裂缝检测

    中文,计算机辅助设计与图形学学报,第 32 卷 第 8 期,2020 年 8 月. DOI: 10.3724/SP.J.1089.2020.18059 摘要: 为实现自动准确地检测路面裂缝, 提升路面 ...

最新文章

  1. 如何写出一份优秀的软件设计文档
  2. Google将如何改变你观看电视的习惯
  3. SQL语言之DQL语言学习(九)多表查询/链接查询 SQL99学习
  4. Java各种数据类型的转换
  5. [转载] Python列表排序 list.sort方法和内置函数sorted
  6. 线程池和任务工厂实现多线程异步运行
  7. beego 最新版本_LFA (Linux For All) Build 191111 发布,基于Ubuntu由最新内核支持的新版本...
  8. php字符串分割函数,PHP字符串分割函数explode,strtok,str_split的用法
  9. 火山安卓解析某盘直连
  10. WS小世界网络模型构造算法
  11. 一篇文章看明白 Activity 与 Window 与 View 之间的关系
  12. VC版计算器(豪华界面)
  13. RK3328 编码H265问题
  14. 中兴手机可以刷鸿蒙系统吗,中兴:今年无计划使用华为鸿蒙系统
  15. java关于对于word或者pdf文件的批量下载实现,其中包括(Java实现创建word文档模板,根据模板导出word文档)
  16. [矩阵计算]Lanczos方法:求稀疏矩阵特征值
  17. 算法通识课发刊词:人机互动时代,懂点算法才能赢
  18. 【DB笔试面试606】在Oracle中,coe_xfr_sql_profile.sql脚本的作用是什么?
  19. Cs束氢脉泽原子钟行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  20. 室内地图在哪些方面提升了我们的生活便利性?

热门文章

  1. Android Studio绑定Git步骤
  2. 养老金已经交满了15年,现年50岁,什么时候可以办理退休手续呢?
  3. 全球及中国便携式锅行业需求量调研及投资竞争力分析报告2022-2028年
  4. mysql添加mul的语句_使用Key = MUL创建MySQL列?
  5. HihoCoder - 1846 dfs
  6. RTP/RTCP详解
  7. 2022年,又新出来一个Python学习神器
  8. CocosCreator2.x 开发笔记
  9. 基于AutoJs实现的薅羊毛专业版又一次大更新
  10. IOT网关平台及服务