回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

为古城墙(堡)“把脉”:基于二哈识图2墙砖病害AI智能巡诊系统 简单

头像 豆爸 2026.01.31 69 0

西安城墙是我国现存历史最悠久、保存最完整的古代城垣,也是首批全国重点文物保护单位。

4.jpg

西安城墙已建成“数字方舱综合管理平台”,打造了厘米级、高精度的西安城墙全域数据模型,3000余个变形监测点位和1300余个智感设备,能够及时反馈数据信息。

downloaded-image.jpg

经过650余年的洗礼,西安城墙的部分墙体出现了裂缝、破损、植被生长等病害。文保巡查员每日需要对城墙上、外墙和内墙进行巡查,记录病害情况。

fKafGb12H.jpeg

基于此,我们以中小学生创客视角,整合AI与物联网技术,打造出可手持的墙砖病害AI智能巡诊系统。

修改模拟数据照片为城墙图 (2).jpg

该设备作为数字平台的补充,能自动识别病害、精准记录信息、同步云端数据,让文保巡检高效规范,巡查数据全程可追溯。

一、 系统概述

本系统是适配古建筑一线文保巡查的轻量化 AI 智能巡诊助手,专为城墙砖表面病害检测设计,作为西安城墙 “数字方舱综合管理平台” 的补充工具,解决一线人工巡查的各类痛点。

系统以行空板 K10 为控制中枢,搭配二哈识图 2、GNSS 模块,结合 SIoT 物联网平台搭建软硬件链路,形成 “识别 - 记录 - 同步” 的闭环巡查流程,设备小巧便携,适配户外一线巡查需求。

系统具备三大核心功能:一是自动识别青砖五类常见病害,提升识别标准化;二是检测到病害后自动绑定经纬度、时间并拍摄照片,形成完整信息档案;三是巡检数据本地 + 云端双端存档,实现可追溯、可复用。

deepseek_mermaid_20260203_9ba6bf.jpg

二、 系统设计

本系统围绕轻量化、便携化、实操化核心原则设计,结合古建筑一线巡查需求,规划软硬件整体架构与 “图像采集 - AI 识别 - 定位记录 - 数据同步” 核心流程,明确各硬件功能分工,采用手持化设计形式,简化操作步骤,适配户外文保巡查场景。

downloaded-image.jpg

三、硬件选型及介绍

本项目结合中小学生创客实操能力、项目成本及功能需求,选取适配创客实践的核心硬件与平台,确定行空板 K10、二哈识图 2、GNSS 模块为核心硬件,SIoT 为物联网同步平台,所有选型均兼顾易上手、易调试的特点,贴合创客实践要求。

材料清单

硬件介绍

 

(1)行空板K10

 

969bc49876f1d677023387eaed32507c.png

 

详细信息,见官方WIKI:https://wiki.dfrobot.com.cn/_SKU_DFR0992_%E8%A1%8C%E7%A9%BA%E6%9D%BFK10

 

(2)二哈识图2

 

5cbf19aa5a99fd3a4c58ce5e02516d83.png

 

详细信息,见官方WIKI:https://wiki.dfrobot.com.cn/_SKU_SEN0638_Gravity_HUSKYLENS_2_AI_Camera_Vision_Sensor

 

(3)GNSS模块

 

91b3e007ff1152c3dd98af30ce8013a6.png

详细信息,见官方WIKI:https://wiki.dfrobot.com.cn/_SKU_TEL0157_Gravity_GNSS_Positioning_System

 

四、硬件连接

 

本系统硬件连接核心适配行空板 K10 的接口特性,因其只有一个 4P Gravity I2C 接口需优先连接二哈识图 2,故确定 GNSS 模块改用 UART 接口连接的解决方案,本部分将详细说明接线实操、设备开关调节及对应用户库配置的核心要点。

 

(1)硬件接线图

d8643e2f17946ad662365f3844088e9b.jpg

这里连接的时候,注意将GNSS模块的拨动开关拨至UART一侧。

 

(2)关于电源转接板使用的说明

 

3b2b0863a4961dc187b4d964c5ac55a4.png

 

根据《二哈识图 2 使用教程 wiki》的说明可知:HUSKYLENS 2 工作时对供电电压有特定要求,若需搭配常见主控(如 Arduino、行空板 K10、行空板M10 等)制作项目,建议通过其配套的电源转接板为其供电,以保障稳定运行。

 

(3)官方建议的行空板K10配合HUSKYLENS 2接线图

 

07b2087b6c20505fe30c4c22bc89620c.png

也就是说,二哈识图2在连接Arduino、行空板 K10、行空板M10 等其他开发板时,建议使用电源转接板。大家有条件的话,还是应该使用电源转接板。

 

五、 工作原理

 

本系统形成 “采集 - 识别 - 记录 - 同步” 的完整工作闭环,由行空板 K10 统筹各硬件协同工作,通过二哈识图 2 采集图像并完成 AI 病害识别,触发 GNSS 定位、时间记录、拍照后,实现巡检信息的本地归档与云端同步。

 

deepseek_mermaid_20260203_943dd4.jpg
 

六、项目实施步骤

 

本项目按中小学生创客实践的操作顺序分阶段推进,从前期需求分析与资料收集,到硬件准备调试、模型训练部署、程序编写,再到云端配置与系统联测试测,步骤循序渐进,贴合中小学生实操能力与认知节奏。

步骤1 开始前的准备

(1)驱动https://img.dfrobot.com.cn/wikicn/5cabf4771804207b131ae8cb/dc7c44cafd2aae3092745d00f24afbb8.rar

(2)固件

https://gitee.com/dfrobot/DFRobot_HuskylensV2/repository/archive/v1.2.1.zip

(3)烧录工具https://img.dfrobot.com.cn/wikicn/5cabf4771804207b131ae8cb/b88beb5b26ded320c15f24562ef9d340.zip

步骤2 二哈识图2驱动安装

按住二哈识图2 A键不放,插上USB线连接电脑。打开驱动程序Zadig,如下图所示,点击“Install Driver”安装驱动。

a94fe0ea005e7a6a164e140c8e39761c.png

步骤3 二哈识图2固件更新

打开烧录工具,选择刚才下载的固件,点击“开始”按钮进行烧录。

5af163a27647db8786add46dd214f106.png

步骤4 数据集的准备

获取数据:我们使用了一个开源的“古建筑青砖表面损伤数据集”。

https://www.modelscope.cn/datasets/destinylhj/greybrick-yolo/resolve/master/images.zip

该数据集包含800余张高清图像,已按YOLO格式标注了五类病害(CRACK, W_E, ALKALI, MISS, MOSS)。

数据检查:确保数据集包含 images(图片)和 labels(标注)文件夹,且标注文件(.txt)与图片一一对应。

步骤5 基于Mind+ V2的模型的训练

(1)打开Mind+ v2,选择“模型训练”里的“目标识别”功能”。

02E622D4-C6C2-4fea-A89A-1D4383ADAD38.png
(2)点击“上传”,选择“有标注数据(YOLO格式)”,选择前面下载的“古建筑青砖表面损伤数据集”上传。

82CFC7E4-8DFD-4a33-B893-5DB03600052C.png
(3)根据数据集大小,设置合适的训练参数(例如:迭代轮次Epochs=50,批大小Batch Size=16),点击“训练模型”。

da2177c218d8b2171da77a711a4bd831.png

(6)正在训练模型。

e84d48b9826da8b5fbae749fa2f8e488.png

(7)模型训练完成。

549ec05169bcb94a15a27e3d8b7a2400.png

步骤6 模型的转换

(1)在Mind+训练完成界面,点击“部署至二哈识图2”。

输入模型名称(如“AncientBrick_Damage_v1”),等待平台将模型转换为二哈识图2专用格式。

79b546febad3688a8b7c30c4fedd7d61.png

(2)文件上传中。

960b382a9e6237fb1294d0f0f7a25974.png

(3)模型转换成功。

88aecafedfb3eddc7fbb0bd105b56fc0.png

(4)点击“下载到本地电脑”,选择目录、文件名进行保存。

c77ab4ddd669d75ed12fc89ce49bd7d8.png

步骤7 模型的部署

(1)将下载的模型复制粘贴到二哈识图2的\Huskylens\storage\installation_package目录下。

4AF40DDA-A32B-4eca-972E-88B1756B136D.png

(2)点击二哈识图2屏幕,选择“模型安装”。

lQDPKHr7ST4lExfNCCDNEhCw7waC86LUzb4JVfIt_rkdAA_4624_2080.jpg

(3)选择“本地安装”。

lQDPJwpH7OgwI5fNCCDNEhCwXBmpf9kYXfAJVfIyb9E-AA_4624_2080.jpg

(4)安装成功。

lQDPJxW4f6w055fNCCDNEhCwJvn2liFZjdkJVfI2L1nFAA_4624_2080.jpg

步骤8 SIoTv2服务器的启动与配置

(1)解压下载的SIoT V2,双击start SIoT.bat即可启动新版SIoT,

bfb85324462fadb1f94fcd05280aa1db.png

(2)弹出的“Windows安全中心警报”对话框,勾选专用网络和公用网络,否则外部设备可能无法访问。

559a141f0cdaa126db77c1eb2ec8aa76.png

(3)出现下图所示弹窗,siot服务器运行正常。

7B956CD8-DEE4-4b67-91C5-254080E1CCD4.png

(2)在浏览器地址栏输入http://127.0.1:8080或者http://本机ip地址:8080,输入用户名siot,密码dfrobot登录。

18A06A46-98CE-40a7-9542-E207AFC9BB0B.png

(3)登录成功,点击“新建主题(Topic)”,新建inspectionLog主题。

A38D3644-470A-490e-A196-08B07E950B38.png

(6)当MQTT主题siot/inspectionLog收到消息,即可在该设备的“消息列表”中实时看到上报的MQTT消息。

6D110B24-E24E-4c2e-B172-B434E78E07F3.png

七、程序设计

本系统程序基于 Mind + 图形化编程平台开发,契合中小学生编程基础,采用分模块思路开发核心功能,同时编写各模块联动触发逻辑,实现系统检测病害后的自动化定位、记录与同步操作。

(1)打开Mind+ V1.8.1 RC3.0,选择“上传模式”,选择“行空板K10”。

23A54AE8-3449-4f43-BDEC-B173C91ED3DF.png

(2)搜索“二哈识图2”扩展库,点击并添加。

717F765E-D3FB-4b7f-8BB4-FFFDB2EDB611.png

(3)继续添加GNSS用户库,安装完成如下图所示。

3C8B522A-EB3A-44b6-8F16-D2A8F2FAFEF7.png

(4)依次添加“网络服务”里的Wi-Fi模块、MQTT模块。

696AAC59-8517-44ae-A0FE-16451D377B1C.png

(5)编写图形化程序(基础功能的实现)。

screenshots-青砖表面损伤.mp-1770219121937.png

八、完整程序代码

在前面mind+图形化的基础上,增加了ID到中文病害的映射函数、JSON数据格式转换、屏幕显示内容格式化等功能。

代码
#include <DFRobot_Iot.h>
#include "DFRobot_GNSS.h"
#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
#include <SD.h>
#include <base64.h>

// 静态常量
const String topics[5] = {"","","","",""};
// 创建对象
DFRobot_GNSS_UART gnss;
HuskylensV2       huskylens;
DFRobot_Iot       myIot;
UNIHIKER_K10      k10;
uint8_t           screen_dir=2;

// ID到中文病害类别的映射函数
String getDamageCategory(int id) {
  switch(id) {
    case 1: return "裂缝";
    case 2: return "风化";
    case 3: return "碱蚀";
    case 4: return "缺损";
    case 5: return "植被生长";
    default: return "UNKNOWN";
  }
}

// 辅助函数:读取图片文件并转换为base64编码
String imageToBase64(const char* filename) {
    File file = SD.open(filename, FILE_READ);
    if (!file) {
        return "";
    }
    
    // 获取文件大小
    size_t fileSize = file.size();
    
    // 读取文件内容
    uint8_t* buffer = new uint8_t[fileSize];
    if (!buffer) {
        file.close();
        return "";
    }
    
    file.read(buffer, fileSize);
    file.close();
    
    // Base64编码
    String base64Str = base64::encode(buffer, fileSize);
    
    // 清理内存
    delete[] buffer;
    
    return base64Str;
}

// 辅助函数:构建JSON字符串
String buildJsonMessage(String timestamp, double longitude, double latitude, 
                       String photoBase64, String damageCategory) {
    String json = "{";
    json += "\"time\":\"" + timestamp + "\",";
    json += "\"lng\":" + String(longitude, 6) + ",";
    json += "\"lat\":" + String(latitude, 6) + ",";
    json += "\"photo\":\"" + photoBase64 + "\",";
    json += "\"damageCategory\":\"" + damageCategory + "\"";
    json += "}";
    return json;
}

// 辅助函数:格式化时间字符串
String formatDateTime(sTim_t date, sTim_t utc) {
    String year = String(date.year);
    String month = (date.month < 10) ? "0" + String(date.month) : String(date.month);
    String day = (date.date < 10) ? "0" + String(date.date) : String(date.date);
    String hour = (utc.hour < 10) ? "0" + String(utc.hour) : String(utc.hour);
    String minute = (utc.minute < 10) ? "0" + String(utc.minute) : String(utc.minute);
    String second = (utc.second < 10) ? "0" + String(utc.second) : String(utc.second);
    
    return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
}

// 主程序开始
void setup() {
    k10.begin();
    gnss.begin(&Serial1, P0, P1);
    k10.initScreen(screen_dir);
    k10.initBgCamerImage();
    k10.setBgCamerImage(false);
    k10.creatCanvas();
    k10.initSDFile();
    Wire.begin();
    
    while (!huskylens.begin(Wire)) {
        delay(100);
    }
    huskylens.switchAlgorithm((eAlgorithm_t)128);
    delay(5000);
    
    myIot.wifiConnect("yourSSID", "yourPASSWD");
    while (!myIot.wifiStatus()) {}
    
    k10.canvas->canvasText(myIot.getWiFiLocalIP(), 11, 0x0000FF);
    k10.canvas->updateCanvas();
    
    myIot.init("127.0.0.1", "siot", "9455149370301812", "dfrobot", topics, 1883);
    myIot.connect();
    while (!myIot.connected()) {}
    
    k10.canvas->canvasText("MQTT已连接", 13, 0x0000FF);
    k10.canvas->updateCanvas();
}

void loop() {
    if ((huskylens.available((eAlgorithm_t)128))) {
        huskylens.getResult(ALGORITHM_FALLDOWN_RECOGNITION);
        
        // 1. 保存图片到SD卡
        k10.photoSaveToTFCard("S:/photo.bmp");
        
        // 2. 获取GNSS数据
        sTim_t utc = gnss.getUTC();
        sTim_t date = gnss.getDate();
        sLonLat_t lat = gnss.getLat();
        sLonLat_t lon = gnss.getLon();
        
        // 3. 获取识别的ID并映射到中文病害类别
        int detectedId = RET_ITEM_NUM(huskylens.getCachedCenterResult((eAlgorithm_t)128), Result, ID);
        String damageCategory = getDamageCategory(detectedId);
        
        // 4. 读取图片并转换为base64
        String photoBase64 = imageToBase64("S:/photo.bmp");
        
        // 5. 格式化时间
        String timestamp = formatDateTime(date, utc);
        
        // 6. 构建JSON消息
        String jsonMessage = buildJsonMessage(
            timestamp, 
            lon.lonitudeDegree, 
            lat.latitudeDegree, 
            photoBase64,
            damageCategory
        );
        
        // 7. 在屏幕上显示信息
        k10.canvas->canvasText(timestamp, 1, 0x0000FF);
        k10.canvas->canvasText("Lng: " + String(lon.lonitudeDegree, 6), 3, 0x0000FF);
        k10.canvas->canvasText("Lat: " + String(lat.latitudeDegree, 6), 5, 0x0000FF);
        k10.canvas->canvasText("ID: " + String(detectedId), 7, 0x0000FF);
        k10.canvas->canvasText("Damage: " + damageCategory, 9, 0x0000FF);
        k10.canvas->canvasText("Photo: " + String(photoBase64.length()) + " chars", 11, 0x0000FF);
        k10.canvas->updateCanvas();
        
        // 8. 发送MQTT消息
        myIot.publish("siot/inspectionLog", jsonMessage.c_str(), 1);
        
        delay(1000); // 防止过于频繁发送
    }
    
    // 可以添加一些延迟,减少CPU使用率
    delay(100);
}

代码说明:1. 需将代码中"yourSSID"、"yourPASSWD"等信息替换为自己Wifi的信息;2. 二哈识图 2 的标签 ID 需与实际训练的五类病害一一对应;3. 程序运行前需在 Mind + 中添加行空板、二哈识图 2、GNSS、SIoT 相关扩展库;4. 照片与日志均保存在行空板 SD 卡中,便于本地查看。

九、系统测试

本系统采用室内模拟测试 + 户外实地试测的方式,全面验证系统运行性能与实际适配性,验证识别、定位、同步的准确性与稳定性,同时记录复杂环境下的运行问题,为后续系统优化提供真实依据。

(1)准备有裂缝、霉斑等病害的青砖图案的测试图。

1.jpg

(2)点击“青砖损伤”启动模型识别。

lQDPJxGaZQzA-5fNCCDNEhCwwgSGde84jZ0JVfI6MocjAA_4624_2080.jpg

(3)“古建筑青砖表面损伤识别”系统启动。

lQDPJwkTm14gTBfNCCDNEhCw4jv3BI31q1kJVfI-PYP5AA_4624_2080.jpg

(4)手持设备对准测试图移动,青砖表面病害识别成功。

lQDPJxesuJ9FYhfNCCDNEhCwvbyqAUZebCYJVfJCMJFLAA_4624_2080.jpg

观察:a) 二哈屏幕是否准确标注;b) 行空板屏幕是否提示;c) SIoT网页是否收到数据;d) SD卡是否生成照片和日志。

(5)实地真实验证

前往古建筑园区,对真实的青砖墙进行扫描测试。重点验证在不同光照、不同角度下系统的稳定性和识别准确性。

28.jpg

215.jpg

(6)根据实地反馈,可能需要返回第二阶段的步骤2,用现场拍摄的新照片对模型进行增量训练,以提升实战能力。

十一、总结与展望

(1)本项目是将人工智能与物联网技术应用于文化遗产保护的创客实践尝试,紧扣西安城墙 “科技护城” 理念,作为 “数字方舱综合管理平台” 的轻量化补充,为古建筑一线巡查提供了便捷的辅助工具,也为文化遗产数字化 “单点创新” 积累了中小学生实践经验。

(2)目前系统与西安城墙专业监测水平仍有差距,后续我们计划从三方面优化:提升病害识别精确度,强化轻微病害识别能力;增强设备在强光、逆光等复杂环境下的稳定性;探索数据深度利用,融入文物病害预测初步思路,让这款 “巡诊助手” 更贴合文保一线需求。

评论

user-avatar