外墙裂缝检测这件事,行业内一直有个尴尬的痛点:靠人眼仰着头看、拉网格线拿笔描,效率低不说,还容易漏。无人机和云台普及之后,影像数据是不缺了,但一栋楼拍回来几百上千张照片,靠人工一张张放大查看,费眼费时,而且同一个裂缝换个角度换个光线,判读结果就可能不一样。所以把检测环节交给模型来做,几乎成了建筑检测这个方向的必选项。
这篇文章要说的,就是一套基于YOLOv8的外墙裂缝检测识别系统,带中英文双语界面,可以切换语言使用,适配不同场景下的操作习惯。文末附完整源码和效果演示,适合做建筑检测项目落地验证、毕业设计,或者企业内部的快速原型验证。内容会拆开来讲:模型为什么选YOLOv8、数据集怎么折腾、训练参数怎么调、界面怎么做中英文切换,以及实际跑项目时最容易踩的坑和排查思路,尽量做到看完就能上手复现。
1. 项目整体拆解:从问题到方案
建筑外墙检测看起来是个垂直小场景,但拆开以后,涉及的环节一点都不少。先想清楚要解决什么问题,再决定模型和系统长什么样,这个顺序不能乱。
1.1 外墙裂缝检测为什么非AI不可
传统检测方式主要依赖人工目视检查或使用桥检车靠近观察。人工检查的问题是主观性强,不同检测员的判断标准不一致,同一条裂缝,有人觉得是微裂缝不用管,有人觉得已经涉及结构安全需要上报。加上高层建筑外立面作业本身有安全风险,长时间仰头观察颈部压力也大,巡检质量会随着工作时间递减。另外,检测结果可追溯性差,现场画标记、随手记文字,回头写报告要重新整理。
用目标检测模型替代人工初筛,重点解决两个问题。一是效率,模型对一张1920x1080的图片做推理,在没有高端显卡的情况下也能控制在几百毫秒级别,一栋楼的照片几分钟就能扫完,人工复核只需要看模型标记出来的候选区域。二是统一标准,模型只要训练充分,对裂缝的判读标准是固定的,不会因为疲劳、光线、角度产生太大偏差。
那为什么是目标检测,而不是图像分类或者语义分割?分类只能告诉你有还是没有裂缝,没法告诉你在哪,这对现场复核没有任何帮助。语义分割能把边界刻画得很细,但标注成本和推理开销都更高,对于外墙检测这个场景,工程上关心的主要是裂缝出现在哪一层的哪一块墙面上,一个旋转框或者直线框已经足够定位,检测框加类别置信度是性价比最高的输出形式。
选YOLOv8,还有一个很实际的理由是生态成熟。训练脚本、导出脚本、推理接口都封装好了,自定义数据集只需要按目录放好,改一个配置文件就能跑起来,不需要从零写训练逻辑。对建筑行业切入AI场景的团队来说,用一个成熟框架把检测能力跑通,远比从底摸模型结构重要。
1.2 YOLOv8各版本怎么选
YOLOv8根据网络深度和宽度分为n、s、m、l、x几个版本,越往后参数量越大,精度上限更高,但对硬件要求也更高。做外墙裂缝检测,我的建议是优先考虑YOLOv8s和YOLOv8m。
很多人一上来就选最大的x版本,理由是精度最好。但裂缝检测这个场景,背景相对单一,主要是混凝土墙面、砖墙、涂料层这些比较规整的纹理,加上裂缝本身有比较明显的视觉特征,并不需要超大模型去拟合极其复杂的语义。中等级别的模型配合好数据增强,效果已经足够。而模型越小,推理越快,这对后期做无人机批量巡检非常关键,因为巡检照片数量大,单张推理时间直接决定整个项目的处理时长。
我带过的实际测试中,YOLOv8s在自己标注的裂缝数据集上,mAP50能达到0.88左右,mAP50-95在0.55到0.6之间,对于检测框精度要求不高的外墙场景完全能用。如果发现漏检多,再升级到m版本,一般能再涨两三个点的mAP,推理时间也只增加不到一倍。
1.3 中英文双版的现实价值
做中英文双语界面,并不是为了“看起来高级”,而是这类系统实际使用人群本就是多元的。我自己接触过的项目里,就有检测公司买设备软件时明确要求界面必须是英文的,因为终端客户里有外资机构的监理方,也有海外项目的驻场工程师。中文操作界面对于国内一线检测员更友好,英文界面则方便外籍技术负责人在线审查结果,避免交付文档来回翻译造成理解偏差。
从技术实现上看,中英文切换并不复杂。核心思路是把所有界面文本抽出来,放到两个字符串映射表里,语言切换时重新加载映射并刷新控件文本。难的不是代码,而是规范地管理文本资源,避免硬编码。如果一开始就把“开始检测”“导出报告”这些字符串直接写在界面布局文件里,后面想加英文就得满项目找,特别容易漏。所以这个双版,做起来其实是一个工程习惯问题。
2. 数据集构建与预处理:决定模型上限的关键
目标检测圈有句话叫“算法决定下限,数据决定上限”,放在裂缝检测里尤其成立。YOLOv8本身是个很成熟的框架,同样的参数跑不同的数据,结果天差地别。外墙裂缝检测没有现成的大规模公开数据集可以直接拿来用,自己整理和标注数据是绕不开的一步。
2.1 数据来源:公开数据打底,自采数据调优
数据集建设建议采用分层策略,不要指望一步到位。第一层是公开的裂缝检测数据集,网上有不少研究机构放出的建筑裂缝图像,涵盖混凝土裂缝、沥青路面裂缝等,虽然拍摄环境可能和真实外墙场景有差异,但作为预训练基础是够用的。第二层是自己采集的真实外墙照片,这一步非常关键,因为外墙裂缝有自己的特殊性:远距离拍摄时裂缝很细,可能只占几个像素;墙面有水管、空调外机、窗户边框等干扰物;不同材质墙面的裂缝视觉差异很大。
有条件的团队,建议用无人机绕建筑物拍摄,高度分几层,角度分为正视和斜视。没条件的话,用长焦镜头在地面拍摄也行,关键是模拟实际使用时的成像条件。我自己整理数据时,自采照片占比大概在40%,公开数据集占60%,训练出来的模型在自采的真实场景上表现明显比纯公开数据集训练好得多。
注意:公开数据集的图像尺寸差异很大,有些是几百像素的小图,有些是几千万像素的大图。直接混在一起训练,模型可能对小图过拟合,对大图却表现不佳。建议统一处理成YOLOv8默认的640x640输入,并保留原始标注的相对坐标。
2.2 标注规范与工具选择
标注裂缝框的规范直接决定模型学的是什么。团队内必须统一标准:裂缝长度小于多少像素不标?多条细小裂缝是分开框还是合并框?裂缝被遮挡一半要不要标?这些问题如果没有规定,每个人按自己理解去标,模型的预测结果就会飘忽不定。
我的建议是四条标准。第一,最小标注尺寸设为20x20像素,小于这个尺寸的裂缝模糊到人眼都难分辨,标了反而是噪声。第二,一条连续裂缝用一个大框覆盖,不要断成多段标注,除非中间有明显的墙面间隔。第三,多条平行细裂缝间距小于50像素时合并为一个框,标注为“裂缝群”。第四,遮挡超过50%的裂缝不标,因为模型无法从可见部分可信地推断完整形态。
标注工具方面,X-AnyLabeling 是比较好用的选择,支持YOLO格式直接导出,也提供了自动标注辅助功能,可以先用预训练的YOLOv8模型对图片预测一轮,人工再对错误的框进行修正,效率能提升不少。批量标注时,按墙面材质分文件夹管理,混凝土墙、红砖墙、涂料墙分开存,方便后续分析模型在哪种墙面上表现差。
标注完成后,需要按YOLO格式整理数据集目录,标准结构如下:
dataset/ images/ train/ val/ labels/ train/ val/ data.yamldata.yaml 文件内容大致是:
path: dataset/ train: images/train val: images/val names: 0: crack图片与标注文件必须同名,一个.jpg对应一个.txt。训练集和验证集按8:2划分,划分时要保证同一个建筑的图片只出现在训练集或只出现在验证集,避免数据泄漏导致验证指标虚高。
2.3 数据增强策略与类别平衡
裂缝检测有一个天然问题:正样本(裂缝)相对整幅图占比太小,如果做全图随机裁剪增强,很容易裁到大片没有裂缝的墙面,反而稀释了学习信号。所以增强策略要克制。
YOLOv8自带的增强参数已经比较完善,我实际用下来推荐以下配置:翻转(fliplr=0.5)要不要开,看裂缝是否具有方向对称性。外墙裂缝大多是不规则走向,开水平翻转问题不大。色彩增强方面,hsv_h、hsv_s、hsv_v 三个参数分别设置为0.015、0.7、0.4,模拟不同天气、不同时间点的光照变化。mosaic增强保留默认的1.0,它能把四张图拼在一起训练,增加背景多样性,对裂缝这种小目标是有帮助的。
有一种增强不建议加:随机旋转角度设太大。因为裂缝本身就是细长的线条,如果旋转90度,横裂缝变成竖裂缝,物理意义发生了改变。裂缝检测模型应该保持对裂缝方向的基本敏感性,所以degrees参数我固定在10以内,只做小幅度的角度扰动。
如果数据集中裂缝样本特别少,比如只有几百张,一个很实用的技巧是使用Cutout增强,随机遮挡一部分图像区域,迫使模型学习裂缝的局部特征而不是靠整体场景猜测。不过Cutout的填充比例不能太大,我一般控制在图像面积的0.3以下,否则前景裂缝可能完全被遮掉,导致训练不稳定。
数据类别不平衡在这个项目里不算严重,因为外墙裂缝检测通常就是单类别任务,只检测裂缝,不需要区分裂缝类型或者严重程度。如果后续要扩展,比如区分横向裂缝、纵向裂缝、网状裂缝,那就要注意每个类别的样本量尽量接近,低于500张的类别很难训练出稳定的识别效果。
3. 模型训练与优化:从原理到参数
数据集准备好之后,进入模型训练阶段。这里不只是跑个脚本等结果,训完之后怎么看指标、怎么排查问题,才是真正拉开差距的地方。
3.1 环境配置与项目结构
环境方面,PyTorch + CUDA 是标配,YOLOv8对PyTorch 2.0以上的版本支持很好。显卡只是个人本地验证的话,一张普通水平的显卡就够训练s版本了,batch size设16,显存占用在6-8GB左右。如果没有独立显卡,用CPU训练也可以跑通,但速度慢几十倍,一个300张图片的数据集可能要训大半天,不太建议。
项目结构建议按模块划分:
yolov8_crack/ train.py detect.py ui/ main_window.py i18n.py models/ best.pt dataset/ requirements.txt README.md训练脚本其实很简洁,YOLOv8提供了命令行方式直接启动训练:
yolo detect train data=dataset/data.yaml model=yolov8s.pt epochs=200 imgsz=640 batch=16 device=0这里 model=yolov8s.pt 的含义是加载COCO预训练权重作为初始化权重,而不是随机初始化。这种做法叫迁移学习,在目标检测领域是被验证过非常有效的策略。COCO数据集里的物体虽然和裂缝完全不一样,但模型在COCO上已经学会了通用的边缘、纹理、形状特征,这些底层特征对裂缝识别依然有用。迁移学习能让模型收敛更快,训练初期损失下降曲线明显平滑,也更容易达到较高的mAP。
3.2 训练参数设置与理由
训练参数看似可以全用默认值,但有几个还是建议手动调。
epochs 设多少,取决于数据集规模。对于一千张图片左右的小数据集,200个epoch完全够用;如果图片数量达到几千张,100-150个epoch就足够。epochs不是越大越好,训练后期模型容易过拟合,在验证集上的mAP会停滞或者下跌。
imgsz 参数统一用640。这个尺寸是YOLOv8的默认分辨率,检测速度和精度比较均衡。如果你采集的图片中裂缝特别细小,经过resize到640后可能模糊,可以考虑把imgsz提到960或1280来训练和推理。但要注意,输入尺寸每提升一个级别,推理耗时增加约三到四倍,对于批量图片处理场景要在精度和速度之间做权衡。我实际项目里,如果重点处理远距离拍摄的无人机照片,imgsz=960 的效果会明显好于640,而单张推理速度仍在可接受范围内。
batch size 选择要从显存出发。如果训练时报“CUDA out of memory”,优先把batch size减半而不是换小模型。batch size减半后学习率最好也同步调整,虽然YOLOv8自带的超参数在batch比较小时也能正常工作,但稳定起见建议把cos_lr的周期拉长,并配合早停机制。
训练过程中,保存策略建议多存几个节点。YOLOv8默认只保存best.pt和last.pt,但best是根据验证集mAP选出来的,在实际测试环境和训练数据分布有差异时,可能一个mAP略低但泛化能力更好的节点反而更适合部署。我习惯设置每隔50个epoch保存一次模型,用不同节点分别跑一遍真实场景图片,再决定用哪个做最终推理。这个习惯让我避免过一次交付风险,当时best.pt在验证集上表现很好,但在客户现场光线偏暗的照片上漏检严重,反而是50轮的中间节点表现更稳。
3.3 效果评估:不止看mAP
模型训练完,打印出来的mAP50和mAP50-95是业内通用的指标,但这两个数字对项目交付来说远远不够。mAP50指的是IoU阈值0.5时的平均精度,它反映的是“大概框住就算对”的能力;mAP50-95是不同IoU阈值下精度的平均值,对框的定位精度要求更高。裂缝检测这种场景,框稍微偏移一点并不影响使用,所以更看重mAP50。如果mAP50在0.85以上,模型基本具备可用性。
但在实际落地阶段,更重要的评估方式是拿一批标注好的真实场景图片,不要参与训练,跑一次完整推理,然后人工检查三件事。第一,漏检的裂缝是什么形态?如果全都集中在阴影区域或者特别细的裂缝,说明模型对低对比度目标不敏感,需要补充这类样本。第二,误检的目标有什么特征?如果空调外机边缘、水管接头经常被框出来,说明模型学到了“线条状物=裂缝”的错误关联,需要考虑在数据增强中增加线条状干扰物的负样本。第三,检测框的稳定性怎么样?同一面墙在不同角度、不同距离下拍出来的照片,检测结果是否一致?如果时有时无,模型可靠性就不够。
另外,PR曲线也是值得看的。YOLOv8训练完会在跑批量推理时同时在验证集上计算PR曲线并输出到 runs/detect 目录。通过PR曲线能看出模型在哪个置信度阈值下性价比最高。默认的置信度阈值是0.25,如果你的场景对误检容忍度低,比如自动生成检测报告,那就把置信度提高到0.4或0.5,误检显著下降而召回率下降不多;如果场景是人工复核,低置信度检测结果也有人看,那可以降到0.15,尽量减少漏检。
提示:不要只盯着mAP一个数字决定模型好坏。mAP提高两个点,在实际项目里不如漏检一次带来的问题严重。对裂缝检测这种安全相关场景,建议优先保证召回率,即在可接受的误检率下尽可能多地找出裂缝,人工复核的成本远低于现场漏检的成本。
4. 系统界面与中英文双语言实现
模型训练完,只是完成了第一步。用户真正操作的是系统界面,不是Python命令行。一个好用、能切换中英文的图形界面,才让这套系统具备了交付价值。
4.1 UI框架选型:PySide6还是 Gradio
UI框架的选择取决于使用场景。如果系统是部署给内部检测人员使用的,用PySide6这类桌面GUI框架更合适,界面响应速度快,文件拖拽交互自然,不依赖浏览器,部署简单。如果系统只是演示用途,或者需要远程访问,Gradio这种Web界面框架更省事,因为它自带了一套现代风格的组件,不需要自己写布局代码。
我个人在项目交付中倾向于PySide6,原因是外墙检测系统操作路径比较固定:加载图片,点击检测,查看结果,导出报告。这套流程用桌面端框架控制起来更顺手,而且可以不依赖Web服务常驻后台,资源占用更小。
界面布局方面,核心区域要展示三个部分:原图画面、检测结果画面、结果统计列表。检测结果画面在原图上叠加检测框和置信度,用不同颜色区分不同置信度区间;结果统计列表以表格形式展示每一处检测框的坐标、宽高、置信度,方便人工复核时逐条查看。
4.2 中英文切换实现方案
语言切换的核心在于统一管理字符串资源。具体步骤是创建一个翻译映射文件,把界面上所有可能出现的文本都收集起来,中英文各一列。
TRANSLATIONS = { "window_title": {"zh": "外墙裂缝检测识别系统", "en": "Exterior Wall Crack Detection System"}, "btn_detect": {"zh": "开始检测", "en": "Start Detection"}, "btn_load": {"zh": "加载图片", "en": "Load Image"}, "btn_export": {"zh": "导出报告", "en": "Export Report"}, "label_confidence": {"zh": "置信度", "en": "Confidence"}, "tab_result": {"zh": "检测结果", "en": "Detection Result"}, }在界面初始化时,所有控件都不直接使用中文字符串,而是通过一个语言管理类来获取当前语言下的文案:
class I18nManager: def __init__(self): self.current_lang = "zh" def set_lang(self, lang): self.current_lang = lang def tr(self, key): return TRANSLATIONS[key][self.current_lang]切换语言时,遍历界面上的所有控件,根据控件对应的key重新设置文案。实际写代码时,可以给每个控件保存一个属性标记它的翻译键值:
def apply_language(self): for widget, key in self.trans_keys: widget.setText(self.i18n.tr(key))这个方案最核心的注意点是:绝对不要在UI代码里硬编码任何用户可见的字符串。即使是提示框、错误信息、文件选择器标题、右键菜单,都要走翻译映射。我见过不少做了一半的项目,主界面全切换成英文了,结果点击“导出报告”按钮后弹出来的提示框还是中文,就是因为提示框是临时创建的,没有走统一接口。这种细节直接影响交付观感。
除了界面文本,导出的检测报告也要考虑语言版本。报告模板最好做成中英文两套,或者用占位符替换的方式生成双语报告。实际项目中,不少客户要求报告标题、表头、结论段落都是英文,因为报告要归档到海外项目的工程文件里。
4.3 推理流程与结果可视化
系统运行时,推理模块和界面模块应该是解耦的。界面负责交互和展示,推理模块负责加载模型、执行检测、返回结果。用线程把推理放到后台执行,避免界面卡顿。
推理代码核心逻辑如下:
from ultralytics import YOLO model = YOLO("models/best.pt") def detect_cracks(image_path, conf_thres=0.25): results = model.predict(source=image_path, conf=conf_thres, imgsz=640) detections = [] for r in results: boxes = r.boxes.xyxy.cpu().numpy() confs = r.boxes.conf.cpu().numpy() for box, conf in zip(boxes, confs): detections.append({ "bbox": [float(x) for x in box], "confidence": float(conf) }) return detections推理得到的结果,需要在界面上绘制检测框。常规做法是直接用OpenCV的画框函数,注意中文标签显示问题是很多初学者会踩的坑,OpenCV的putText不支持中文,如果要在检测框上方显示“裂缝”两个汉字,会直接显示成乱码。绕开这个问题的办法是用PIL先在画布上绘制中文文字,再转换为OpenCV格式,或者直接显示英文标签Crack,中英文切换只影响界面控件而不影响画面叠加的文字。
建议在画面叠加文字时使用英文标签,好处是避免字体文件依赖和乱码风险,也符合检测行业画面上常用简短专业标签的习惯。
结果可视化还可以做二级筛选。当图片中有多处检测结果时,按置信度从高到低排序,在结果列表中高亮显示置信度在0.5以上的裂缝。这个功能很符合实际使用习惯,因为外墙检测人员精力有限,优先关注置信度高的区域能提高复核效率。我做的系统里加了按严重程度分级的逻辑,置信度高于0.6的判定为高优先复核区域,0.25到0.6的判定为普通检查区域,低于0.25的不展示给用户。这个阈值可以根据项目需求在设置面板里调整。
导出报告功能,用OpenCV把标注后的图片保存,再用Python的reportlab或者docx库生成Word格式的检测记录。导出内容应包括:原始图片路径、检测时间、检测总数、高危区域截图、置信度列表。Word格式比PDF更受欢迎,因为检测人员通常需要把结果粘贴到项目周报或巡检记录文件里。
5. 常见问题与排查心得实录
模型开发和系统搭建过程中,问题基本集中在漏检、误检、性能三个方向。这里把实操中遇到的典型问题和排查思路整理成速查表,方便大家按图索骥。
5.1 漏检严重:模型“看不见”裂缝
现象是裂缝明明很清楚,模型没有任何反应,或者只在个别图片上能检测出来。
先排查输入图像分辨率。如果原始图片是几千万像素的无人机航拍图,直接进模型会被压缩到640,裂缝宽度原本有十几个像素,压缩后只剩两三个像素,人眼勉强能看见,模型基本无法提取有效特征。解决方案是使用GPU推理时提高imgsz到960或1280,或者先用切片工具把大图切成若干小图,每块小图独立推理,再通过坐标映射拼回原图。
再排查置信度阈值。默认阈值0.25有时候确实会过滤掉一部分真实检测结果,尤其当裂缝形态不典型时模型给出的置信度会偏低。建议在调试阶段把置信度阈值调到0.1,看看模型是不是其实“看到了”只是分数不够,如果确实是这个问题,就要考虑补充更多类似形态的数据做二次训练,而不是简单调低阈值了事。
排查数据分布。模型对训练集中不常见的形态学不好。如果你的数据集里全是近距离拍摄的裂缝特写,实际场景中远距离拍摄的裂缝模型自然表现差。此时需要采集更多目标距离下的图片加入训练集。
5.2 误检太多:模型“乱框”非裂缝物体
误检的典型表现是外墙排水管、窗框边缘、装修线条、电线等直线状物体被框成裂缝,还有墙面霉斑、喷涂颗粒物在光照下呈线状排列被误检。
处理误检问题,首先要分析误检对象的特征。如果都是直线结构,那就要在数据增强里引入更多“硬负样本”——也就是不含裂缝但包含管道、窗框、线条装饰的图片,让模型学会区分“直线”和“裂缝”。YOLOv8的数据集不需要单独建负样本文件夹,直接把这类图片放到训练集里,对应标签文件为空即可。模型会从这些无目标图片中学习背景模式,减少因为场景相似而触发误检的问题。
另一个有效做法是后处理过滤。在检测结果输出阶段,根据裂缝的几何特征做一次规则过滤。外墙裂缝通常是非规整曲线,而窗框边缘和水管是笔直线条。可以用框内的轮廓拟合直线,计算拟合误差,如果目标区域内所有边缘几乎能拟合成一条直线,说明它更可能是人造线条而不是裂缝。当然,这个规则不是万能的,因为有些细微裂缝在低分辨率下看起来也接近直线,所以需要不断调整规则阈值,并在实际验证集上评估过滤带来的误检下降和召回损失。
误检问题不要指望一次训练就能解决干净,做工程要接受误检率存在的现实,用界面交互来兜底:给用户提供手工移除检测框的功能,复核人员怀疑某个框是误检,点一下就能删除,这样可以保证最终报告不会包含离谱的误检结果。
5.3 训练与推理性能瓶颈
训练速度慢:数据集图片数量达到几千张时,IO读取往往成为瓶颈。建议把图片转换为内存映射格式或使用LMDB缓存,或者直接将数据放到SSD上,避免机械硬盘随机读取小图片的长时间延迟。同时可以设置cache=True参数,YOLOv8会把图像缓存到内存中,能大幅缩短数据加载时间。
推理速度慢:如果不是嵌入式设备或边缘设备,先检查是否启用了GPU推理,YOLO默认device=0就是GPU。CPU推理状态下,同样的模型推理速度慢十倍以上。如果确认是GPU推理但速度仍不满意,可以做两个优化:一是导出为TensorRT格式模型,二是开启半精度推理(fp16)。YOLOv8支持直接导出engine格式,在支持TensorRT的显卡上能获得明显加速。我的实测中,用同样的图片和模型,PyTorch格式推理一张约120ms,TensorRT引擎格式降到约30ms,差距非常明显。
部署时显存不足:如果同时需要加载多个模型做不同任务(比如一个裂缝检测、一个外墙污渍分类),显存可能不够。此时不需要同时常驻两个模型,可以设计成任务流水线方式:先加载裂缝模型完成推理,释放显存,再加载污渍模型。虽然切换模型有加载延迟,但总比直接爆显存好。
6. 部署与交付现场的经验补遗
系统开发完成到交付现场使用,中间还有一段不太被关注的距离。这里补上几个深水区经验,算是我自己踩过坑后的复盘。
模型文件的环境适配问题。best.pt是在训练环境导出的,训练环境的CUDA版本和PyTorch版本与部署机不一致时,加载模型可能报错。最稳妥的做法是在部署机上直接用同版本PyTorch重新推理验证一遍,或者打包时带上完整的运行环境。用PyInstaller打包PySide6程序时,记得要把ultralytics包和数据文件一起打进去,并且验证打出来的exe在没装Python系统的电脑上能不能跑通。我在一次现场演示前,打包好的exe在演示机上报缺少ultralytics配置文件的错误,排查了一个小时才发现是打包时遗漏了包内数据文件。
摄像头实时检测的需求。外墙检测场景里有不少用户希望用无人机图传或工地摄像头实时检测,而不是拍完照片再处理。这时候推理速度要求更高,需要保证视频流处理达到实时帧率。解决方案是模型换为YOLOv8n或裁剪通道数的轻量版本,配合TensorRT加速,同时降低输入分辨率。但实时检测的实际效果受限于摄像头画面质量,如果摄像头分辨率低、焦距不够,远处的裂缝根本无法在画面中形成足够的像素信息。在交付前要给客户明确说明这个技术边界,否则现场验收时容易产生纠纷。
中文英文双版的部署细节。不同语言环境下,界面字体渲染差异明显,英文界面下字体宽度变化较大,中文文本可能截断。布局设计时要预留足够控件尺寸,或者启用自动伸缩。此外,如果客户要求英文界面下导出的报告日期格式也要符合英文习惯,比如“2024-03-15”与“March 15, 2024”的切换。这类格式问题一开始不显眼,但在正式验收时特别容易被扣分,最好在系统里做一套统一的时间格式化接口,跟随当前语言自动切换。
我把这套系统在某办公楼的墙面试点中跑过一轮,三百多张无人机照片,从推理到人工复核,整体流程控制在半小时内,而以前纯人工看图需要大半天。裂缝框出来的位置,现场复核时用望远镜就能快速对应上,效率提升确实立竿见影。这套系统的源码和演示效果我做了整理,部署过程中需要注意的模型路径、环境配置和界面字体问题在README里也做了标注。如果你正在做类似的外墙检测项目,或者准备往建筑视觉检测方向走,这套代码可以作为起点,换数据集、调参数、改界面,都比从零开始省太多力气。有一点别忘了,裂缝检测只是外立面体检的第一步,后续如果想把空鼓、渗水、外保温层脱落等问题都纳入识别范围,这套框架的扩展路径是相通的——数据扩充、模型微调、界面加标签,剩下的交给时间去积累。