在建筑和桥梁等结构的损伤检测中,传统的人工检查方法不仅成本高昂,而且存在一定的危险性。为了全面检查结构的每一部分,需要近距离观察并记录所有表面。无人机搭载的近距离拍摄技术已被证明在结构评估中非常有效,但如何从大量图像中快速识别损伤,而不需要人工逐一评估,成为了一个亟待解决的问题。这时,计算机视觉技术便发挥了重要作用。
本文将详细介绍如何构建一个计算机视觉模型,以识别包括裂缝、碱骨料反应(ASR)、混凝土退化等在内的结构损伤,适用于高层建筑、桥梁和房屋等基础设施。
系统工作原理
在这个系统中,无人机捕获的图像数据被输入到使用Roboflow平台构建的目标检测模型中。该检测模型能够识别各种类型的结构损伤。一个简单的Python脚本接收实时摄像头流,并运行目标检测模型以检测裂缝。下图展示了系统的工作原理以及如何构建和部署。
构建结构损伤检测系统的过程涉及到收集建筑物裂缝的图像,然后使用这些图像进行标记和训练模型。Roboflow平台用于标记图像并准备在这些图像上训练的模型。此外,Roboflow还提供了一个按需API,该API可以在给定图像或视频的情况下,返回托管模型的结果。这个API使用Python脚本进行查询。
项目需求
要构建此项目,需要以下设备:
- 四旋翼无人机套件;
- AI Thinker ESP32 CAM开发板;
- Roboflow账户;
- Python开发环境。
例如,本项目使用了来自dronaaviation.com的Big Quad Expension Drone Kit和Primus X飞行控制器。可以使用任何其他无人机套件进行此项目。下图显示了用于收集数据和项目的无人机。
步骤1:收集和标记项目图像
收集了不同建筑物墙面裂缝的图像。总共收集了755张大小为800x800像素的图像。使用Roboflow将这些图像调整为640x640像素,这是训练前的标准化转换。然后,Roboflow将图像分为训练集、验证集和测试集:
- 527张图像用于训练。
- 149张图像用于验证。
- 79张图像用于测试。
以下是一些标记图像的示例:
数据集中的每个图像都使用Roboflow平台上的矩形“边界框”工具进行标记。下图展示了不同图像的标记方式:
在每张图像上,都会在建筑物墙面的每个裂缝周围绘制一个框。
步骤2:训练模型
在数据集标记完成后,使用Roboflow Train管理和托管模型的训练。要使用Roboflow训练模型,请点击界面中的“开始训练”按钮:
按下开始按钮后,将看到以下选项:
这提供了两个训练选项,“快速”和“准确”。可以选择其中任何一个。本项目使用了“准确”选项,以实现模型的更高准确性,尽管训练时间会更长。
点击“继续”后,将获得另一个对话框,其中有三个训练选项可供选择,如下所示。这些选项如下:
- 从上一个检查点训练;
- 从公共检查点训练;
- 从头开始训练。
由于没有现成的类似主题的已训练模型,因此选择了“从头开始训练”,这选择了Roboflow 2.0目标检测(准确)模型,并从头开始训练。Roboflow首先导出训练数据集,然后开始训练,如下所示:
显示训练过程已经开始的对话框。
在模型训练期间,Roboflow会显示一个漂亮的训练图,这有助于了解模型是如何被训练的。图表显示了模型在不同“周期”中的性能。一个周期是训练过程中的单次迭代。图表显示了平均精度均值(mAP)指标,该指标衡量模型性能,随着模型在更多周期上的训练而变化。随着时间的推移,mAP应该上升。
模型训练完成后,可以看到在验证集上的mAP为93.7%,精确度为92.8%,召回率为89.6%,类别平均精度为92%,在测试集上为89%。
下图显示了更详细的训练图。这些图表展示了精确度、召回率等方面的变化:
步骤3:使用模型进行预测
一旦模型训练完成,它就会自动部署在Roboflow平台上,并且可以被使用。Roboflow提供了多种测试和部署模型的选项,从在浏览器中实时尝试模型到将项目部署到像Luxonis OAK这样的边缘设备。这在下图中显示。
本项目使用Roboflow GitHub上的代码在个人计算机上使用模型。该代码接受摄像头输入,并将摄像头的视频数据通过训练好的模型运行。
在Python脚本中使用模型之前,需要用几个值填充“roboflow_config.json”配置文件。这些值包含有关模型和API密钥的信息,以便可以与Roboflow进行身份验证。
{
"__comment1": "通过Roboflow获得这些值",
"ROBOFLOW_API_KEY": "XXXXXXXXXX",
"ROBOFLOW_WORKSPACE_ID": "XXXXXXXXXX",
"ROBOFLOW_MODEL_ID": "XXXXXXXXXX",
"ROBOFLOW_VERSION_NUMBER": "XXXXXXXXXX",
"ROBOFLOW_SIZE": XXXX,
"EMAIL": "XXXXXXXXXX",
"__comment2": "以下仅infer-async.py需要",
"FRAMERATE": 24,
"BUFFER": 0.5
}
在上面的代码中,替换ROBOFLOW_API_KEY、ROBOFLOW_WORKSPACE_ID、ROBOFLOW_MODEL_ID、ROBOFLOW_VERSION_NUMBER、ROBOFLOW_SIZE和EMAIL的值。
在下面的Python代码中,添加了“confidence”参数,设置为20,因为希望突出显示检测到的每一个裂缝,即使精度较低。“20”值意味着任何预测的置信度超过20%将由模型返回。
upload_url = "".join([
"https://detect.roboflow.com/",
ROBOFLOW_MODEL_ID, "/",
ROBOFLOW_VERSION_NUMBER,
"?api_key=",
ROBOFLOW_API_KEY,
"&format=json",
"&confidence=20",
"&stroke=5"
])
在Python源文件中的以下代码行中,使用了安装在无人机上的ESP32摄像头的URL。摄像头的数据将反馈给模型,以识别建筑物中的裂缝。这个URL可能与ESP32摄像头部署不同。
URL = "http://192.168.175.247"
video = cv2.VideoCapture(URL + ":81/stream")
上面的代码应该替换以下代码行:
video = cv2.VideoCapture(0)
有关如何准备和使用ESP32 Cam进行此项目的详细教程,请参见此处。
可以使用前面复制的Python脚本的调整版本,使用以下命令运行:
python script.py
在Roboflow Universe上有一个名为damage-detection的公共版本项目,可以使用它来测试模型。从Roboflow Universe,还可以下载用于训练模型的数据集。
结果
现在是时候尝试模型了。让将无人机指向墙上的裂缝。结果如下:
在上面的图像中,无人机指向的墙上的裂缝被正确识别。可以使用这些信息作为记录建筑物结构问题的调查报告的一部分。下图显示了摄像头指向具有两个不同背景的墙壁,每个背景都穿过一个裂缝:
在上面的图像中,识别出了两个裂缝。这表明模型按预期工作。给定无人机镜头,成功地在墙壁上识别出裂缝。在终端输出中,每个裂缝都被赋予了“裂缝”类别。
可以扩展模型,以识别其他类型的结构损伤,例如屋顶上的碎瓦片。这将涉及遵循文章开头讨论的相同过程:收集代表性的结构损伤数据,标记图像中的损伤特征,然后训练使用数据的模型。
按照上述说明,并使用随附于此项目的公共数据集,可以构建自己的无人机,以识别结构中的裂缝。祝构建愉快!