☰
YOLOv8/YOLO11双模型训练与OpenCV部署混凝土裂缝检测实战
2026/10/20 13:42:21 网站建设 项目流程

做视觉缺陷检测这几年,我越来越觉得真正拉开差距的不是模型选得多新,而是数据、训练和部署三者之间有没有形成闭环。这篇文章要聊的,是一套基于YOLOv8和YOLO11双模型训练,把混凝土裂缝检测从数据集准备一路做到OpenCV推理落地的完整方案。核心思路不复杂:同一份裂缝数据集,分别用YOLOv8和YOLO11去训练,对比精度、速度、部署友好度之后,挑出最适合工程化的权重导出ONNX,再用OpenCV的DNN模块做实时推理。适合正在做小目标缺陷检测、或者想从YOLO入门到真正落地的朋友参考。

我在实际项目里反复验证过这套流程。混凝土裂缝这种目标很特殊,细长、低对比度、背景杂乱,和一般的目标检测场景差很远。很多人一上来就调参,结果模型在验证集上精度还行,一到现场就各种漏检。问题往往不出在模型,而是出在数据和部署之间的断层。这篇文章会把每个环节的取舍讲清楚,包括“为什么这么做”“不这么做会踩什么坑”。

1. 这套混凝土裂缝检测系统的任务拆解与技术选型

1.1 混凝土裂缝检测不是分类,而是一整套回归问题

先想清楚一个问题:现场要的到底是什么?如果只是判断“有没有裂缝”,用图像分类就能凑合。但实际巡检、养护、维修场景里,工程师要的是“裂缝在哪一段、大概多长、占多大区域、对应哪个构件”。这些需求决定了它必须是一个目标检测问题,甚至后续可能是实例分割问题,而不是分类问题。

目标检测本质上是一个“分类+回归”的组合任务:既要判断图像里有没有目标、目标属于哪一类,又要回归出目标的边界框坐标。对裂缝来说,回归边界框的难度比普通目标高不少。普通目标比如人、车、猫狗,形状相对紧凑,框进去的背景不多;裂缝是细长结构,一个矩形框往往把大量背景也框进去了,IoU计算容易被稀释。这也是为什么裂缝检测里,标注规范和训练输入分辨率的影响比其他场景更明显。

那为什么不用传统的边缘检测、阈值分割或者形态学方法?我试过。在干净的室内试块上,Canny配合形态学操作确实能提取出裂缝轮廓,但一到实际混凝土表面,问题就来了:光照不匀、模板缝、气泡孔洞、划痕、水渍,都会产生大量伪边缘。传统方法调参调到头,往往只是在一批特定图片上有效,换个光照条件马上崩。深度学习的价值在于,它把“什么样的图像特征算裂缝”这件事交给数据去学,泛化能力比手工特征好一个量级。

在做具体选型前,我习惯先列一个最小可用系统的链路,保证不跑偏。大体上是这几步:图像采集、预处理、目标检测推理、后处理过滤、结果输出与结构化存储。检测模型只是其中的一个环节,但它是决定系统精度的核心。

1.2 为什么YOLOv8和YOLO11要双线训练,而不是只选一个

现在目标检测开源模型非常多,但YOLO系列始终是工程落地的首选,原因很实在:训练生态统一、导出链路成熟、部署方案多。Ultralytics框架把训练、验证、导出、推理都封装成了命令行和Python接口,一套代码跑到底,这对减少项目交付周期非常关键。

具体到YOLOv8和YOLO11,它们不是简单的版本升级关系,而是结构上有明显差异的两代模型。YOLOv8用的是C2f结构的骨干网络,Anchor-Free的检测头,整个设计稳、成熟,社区踩坑经验多,网上能查到的部署案例也最丰富。YOLO11在骨干上换成了C3k2结构,部分层引入C2PSA注意力机制,对细长目标、小目标的特征提取更细腻,理论上在裂缝这种场景上是有优势的。

但“理论上”三个字是重点。我见过太多人只看榜单选模型,结果部署时发现算子不支持、显存超预算、推理延迟翻倍。所以我坚持双线训练:同一个数据集、同样的划分、近似的参数量级,YOLOv8和YOLO11各跑一遍。这么做的意义不仅仅是比较精度,更是给系统上一道保险——万一YOLO11在特定硬件上编译有问题,或者某个算子在OpenCV DNN里不支持,马上可以退回YOLOv8而不用重新训。

1.3 从采集到部署的系统链路设计

先说结论:实际落地时,检测模型只是中间环节,决定成败的是前后两端的工程细节。前端是数据采集和预处理,后端是推理结果的格式化和对接。很多项目模型精度很高,最后却用不起来,往往就死在前后端的粗糙上。

数据采集阶段要考虑拍摄设备、距离、角度、光照。现场常见的设备是手持工业相机、手机、无人机挂载相机,有时还有固定点位相机。采集时不要只拍裂缝特写,还要拍带背景的远景,因为实际巡检时模型要能在复杂背景下找小目标,只训练特写会让模型过度依赖“裂缝占满画面”的假设。

预处理阶段要注意分辨率统一和归一化方式。YOLO训练时一般会把图像缩放到640x640,如果原图很小或者裂缝只有几个像素,就需要上调输入分辨,比如1024甚至1280。分辨率不是越高越好,因为推理时间会随分辨率上升,但对于裂缝这种细节敏感目标,低分辨率的代价是漏检,高分辨率的代价是速度,这个权衡后面部署部分会细说。

推理结果输出阶段,建议直接结构化输出,而不是只画框。比如输出裂缝外接框的坐标、置信度、框内裂缝区域的像素占比、所在构件的关联信息。这样后续接数据看板、生成巡检报告、按区域统计裂缝密度都很方便。

2. 裂缝数据集准备:训练效果的天花板在这一步决定

2.1 现场采集、目标类别与样本数量的实操建议

数据采集是最花时间但最值得花时间的环节。我的经验是,样本数量没有绝对标准,但有一个原则:覆盖场景多样性远比数量重要。一套500张图片如果覆盖了不同光照、距离、构件类型、裂缝形态,效果往往比2000张只在同一面墙上拍出来的要好。

裂缝本身也有不同类型,比如细线状裂缝、网状裂缝、龟裂、贯穿缝、边角剥落伴随裂缝等。如果第一版系统目标只是“查出裂缝”,可以先用单类crack做,简化标注成本。如果现场需求明确区分“细微裂缝”和“明显裂缝”,那就要分两类分别采集和标注。但我不建议第一版就把类别分得太细,因为类别越多,边界样本的标注歧义就越大,训练时模型容易困惑。

数量上,我建议单类起步至少准备600到1000张有效标注图。这个量级配合预训练权重和数据增强,已经能训练出一个可用的模型。如果目标场景非常复杂、负样本干扰严重,再往上加。采集时务必保留原图分辨率,不要为了节省存储空间把所有图压到几百万像素,裂缝这种目标经不起过度压缩。用手机拍摄时也要注意对焦,很多手机默认的美化、HDR、锐化处理会让细小裂缝在图片里变得模糊甚至消失。

负样本一定要单独采集。所谓负样本,就是没有裂缝但看起来容易误判的混凝土表面,比如模板缝、施工冷缝、水渍、油漆划线、钢筋印记。训练时加入负样本能显著降低误检率。我一般会让负样本占比在10%到20%之间,不能太高,否则模型会变得过于保守,裂缝也漏检。

2.2 标注规范、YOLO格式转换与数据集划分

标注工具我常用LabelImg或者X-AnyLabeling,新一点的Roboflow也好用。重点不是哪个工具,而是标注规范。裂缝是细长目标,标注框要尽量贴合裂缝的主轴方向。对于一段延伸很长的裂缝,我不会用一个巨大的框把它整个包起来,而是沿裂缝分成多个小段分别标注。这样做有两方面考虑:一是训练时小框内的背景更少,模型更容易聚焦裂缝本身的纹理特征;二是推理时多段检测结果可以做长度统计,更符合工程需求。

标签格式上,YOLO系列使用txt文本格式,每行内容为:class_id center_x center_y width height。其中center_x、center_y、width、height都是相对于图片宽高的归一化数值。举个例子,一张宽度1600、高度1200的图上,一个边界框左上角在(240, 300)、宽320、高240,那么中心坐标为(400, 420),归一化后x=400/1600=0.25,y=420/1200=0.35,w=320/1600=0.2,h=240/1200=0.2,这一行就写成“0 0.25 0.35 0.2 0.2”。

标注完成后,数据集的划分要动点脑筋。一般用train/val/test三份,比例在70%/20%/10%左右。但划分不能随机分完就完事。如果数据来自连续拍摄的视频帧,同一段裂缝会在相邻帧里反复出现,随机划分会导致训练集和验证集高度相似,验证精度虚高。正确做法是按场景分组,比如同一面墙、同一次拍摄序列只进其中一份数据集,尽量模拟“模型没见过的场景”的难度。

转换和划分完成后,务必做可视化检查。我习惯把标注框画出来再抽查几十张,看有没有错标、漏标、框的大小区间是否合理。这一步虽然机械,但对训练质量影响极大。标注和图片的对应关系一旦错位,模型会在训练时收到互相矛盾的信号,精度怎么调都上不去。

2.3 数据增强和难样本处理:把环境差异灌进模型

裂缝数据集规模通常不大,数据增强不是“锦上添花”,而是“保命手段”。YOLO训练工具内置了Mosaic、MixUp、HSV变换、随机翻转等增强策略,但有些需要根据裂缝场景手动调整参数。

我常用的增强组合是:水平翻转必开,旋转控制在正负15度以内。旋转太大会让裂缝方向分布失真,严格来说,竖直裂缝和水平裂缝在实际结构中的受力意义不同,过度旋转会混淆模型对裂缝走向的认知。亮度对比度增强很重要,模拟现场光照变化。CLAHE局部直方图均衡有时也加上,能把暗部裂缝的对比度拉出来,但要注意不能做过头,否则训练出来的模型会对纹理过于敏感。

Mosaic增强我建议谨慎使用。Mosaic把四张图拼成一张再训练,能大幅提升模型对尺度变化的鲁棒性,对小目标检测很有效。但对裂缝来说,如果原图里的裂缝本身就细,Mosaic缩放后可能变成只有一两个像素的线,标注框变得极不准确,反而让模型学到错误信息。我的做法是Mosaic概率设置在0.3到0.5之间,不要用默认的1.0。YOLO的训练代码里,mosaic参数可以在超参数文件里调整。

训练过程中如果发现难样本,比如强光下的浅裂缝、阴影里的裂缝、裂缝和背景颜色相近的情况,优先考虑把这些样本在数据集中加权重复,而不是简单堆更多普通样本。数据增强的本质是把真实环境中的分布差异注入训练集,而不是毫无目的地生成变体。每加一种增强,我都建议做一次小规模对比实验,看验证集上的精度是升还是降,不要凭感觉堆叠。

3. YOLOv8与YOLO11双模型训练全流程

3.1 训练环境、数据集YAML与目录结构

环境准备不需要装很多东西。直接用Ultralytics框架就行,安装命令很简单,前提是有Python 3.8以上环境,建议有条件就用Python 3.10。GPU我建议显存至少8GB,入门级N卡就能跑,如果没有GPU,云端环境也能训练小规模数据集。

pip install ultralytics

这个框架会自动带上模型定义、训练器、导出器等成套工具,不需要额外安装单独的YOLO实现。训练时脚本会自动从官方下载预训练权重,第一次运行需要能访问外部网络。

数据集目录建议按标准结构组织:

datasets/crack/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── crack.yaml

images和labels底下的文件名必须一一对应,YOLO训练时会根据YAML配置路径自动找对应标注。注意labels目录里放的是txt标注文件,不是图片。文件名不带扩展名,但basename要与图像完全一致。

crack.yaml的内容按下面这样写:

path: C:/datasets/crack train: images/train val: images/val test: images/test nc: 1 names: 0: crack

有一个高频坑:Windows环境下,path的写法。建议写绝对路径,而且反斜杠要改成斜杠,或者写成“C:/datasets/crack”这种形式。我遇到过因为路径分隔符导致数据集加载失败的情况,卡了很久才发现是路径问题。

3.2 YOLOv8与YOLO11训练命令与关键参数调优

训练流程基本一致,区别只在模型名称。YOLOv8用yolov8s.pt、yolov8m.pt这样的权重名,YOLO11用yolo11s.pt、yolo11m.pt。训练命令格式如下:

训练YOLOv8:

yolo detect train data=datasets/crack/crack.yaml model=yolov8s.pt epochs=200 imgsz=640 batch=16 patience=50 project=run_v8 name=crack_s

训练YOLO11:

yolo detect train data=datasets/crack/crack.yaml model=yolo11s.pt epochs=200 imgsz=640 batch=16 patience=50 project=run_yolo11 name=crack_s

几条命令看着接近,实际差异会有体现。先解释几个关键参数。

imgsz是最关键的一个。裂缝是细节敏感目标,我建议从640起步,训一轮看看验证集表现,如果细裂缝漏检多、但速度还没问题,再调到1024重新训练。分辨率提升通常带来mAP的明显上升,代价是训练时间和推理时间的增长。显存不足时优先减batch而不是减imgsz,因为对裂缝检测来说,保持输入分辨率的意义更大。

epochs设置200左右比较合理。数据集不大的话,加上早停机制(patience=50),训练会在验证精度连续50轮不提升时自动停止,省时间且能防过拟合。

学习率相关参数保持默认通常就够。如果你自己调,lr0建议保持在0.01附近,过高容易梯度震荡。weight_decay默认即可,过大会让细裂缝的特征学不充分。

训练过程中,监控两类指标:train损失和val指标。损失持续下降说明模型在学习,val的mAP持续上升说明学到的东西在泛化。如果train损失下降但val精度停滞,很可能过拟合或数据泄露。

3.3 看训练日志、对比实验结果与模型选型

Ultralytics训练结束会在指定的project目录下输出weights/best.pt和weights/last.pt,best.pt是根据验证集精度选出的最优权重,部署首选它。

训练结束后,系统会输出一组指标,包括Precision、Recall、mAP50、mAP50-95。对裂缝场景,我的分析习惯是:先看Recall,也就是漏检率。漏检在缺陷检测里是最严重的错误,一条裂缝没查出来,可能导致后续结构风险评估出现偏差。Precision反映误检情况,误检可以靠后处理阈值或人工复核兜底,但漏检兜底的代价高得多。mAP50-95是综合指标,反映模型在不同IoU阈值下的稳定程度,这个指标在细长目标上普遍偏低,不用过度焦虑。

双模型对比实验建议控制变量:同一个数据集、同样的imgsz、同样的epochs和batch,只更换模型结构。最终选型不只看mAP,还要看推理速度、部署复杂度、硬件资源占用。

我自己跑下来,同类参数规模下,YOLOv8和YOLO11在裂缝数据集上的差距通常在几个点以内,YOLO11对极细裂缝的召回率略有优势,但YOLOv8的部署资料更多、踩坑案例更全。如果两者精度接近,我会选YOLOv8,因为OpenCV DNN、TensorRT这些部署链路上的坑已经被人填得差不多了;如果YOLO11在验证集上稳定高出一截,那就值得为它多花点部署调试时间。

4. 模型导出与基于OpenCV DNN的推理部署

4.1 为什么要导出ONNX,以及导出时的几个关键选择

训练完成后的best.pt是PyTorch格式权重,部署时不能直接拿去给OpenCV用。常规方案是先导出成ONNX格式,再用OpenCV的DNN模块加载。ONNX是一种中间表示格式,它的意义是把模型结构固化成计算图,不需要再依赖PyTorch的Python运行环境。

导出命令一行就够:

yolo export model=run_v8/crack_s/weights/best.pt format=onnx opset=12 dynamic=True

format=onnx指定导出格式,opset建议12或更高,太低的opset会缺少某些算子。dynamic=True表示输入尺寸可以是动态的,方便后续适配不同分辨率的图片。不过OpenCV DNN对动态输入的兼容性有时不如静态输入稳定,如果你的应用场景固定输入尺寸,建议导出成静态尺寸(不加dynamic)更省心。

导出完成会生成best.onnx文件。部署前先做一次推理验证,用Python的ONNX Runtime库跑一遍,确认输出结果和PyTorch结果基本一致。这一步能提前发现导出过程中算子丢失、精度下降的问题。

有一个顶顶重要的点必须讲清楚:YOLOv8和YOLO11的ONNX输出和YOLOv5不一样。YOLOv5的输出结构里有objectness置信度这一维,但YOLOv8和YOLO11是Anchor-Free设计,输出张量每一行的前4列是边界框坐标,从第5列开始直接就是各个类别的概率,没有单独的objectness。很多人用老代码改都不改,解析输出时多取了一个objectness,结果检测框全部错乱。

4.2 OpenCV DNN推理代码与后处理细节

OpenCV加载ONNX的代码非常简洁。以下是一个单类裂缝检测的完整推理示例,我加了详细的注释:

import cv2 import numpy as np # 1. 加载模型 net = cv2.dnn.readNetFromONNX("best.onnx") # 2. 读取图像并记录原始尺寸 img = cv2.imread("test.jpg") orig_h, orig_w = img.shape[:2] # 3. 构建blob,输入尺寸固定640x640,归一化到0~1 blob = cv2.dnn.blobFromImage(img, 1/255.0, (640, 640), swapRB=True, crop=False) net.setInput(blob) # 4. 前向推理,输出shape为(1, 5, 8400) detections = net.forward()[0] # 5. 转置为(8400, 5),方便按行解析 detections = detections.T boxes = [] scores = [] class_ids = [] for row in detections: xc, yc, w, h = row[:4] # 第5列开始是类别概率,单类时直接取值 score = row[4] if score < 0.25: continue # 坐标从640尺度映射回原图尺度 x1 = (xc - w / 2.0) * orig_w / 640.0 y1 = (yc - h / 2.0) * orig_h / 640.0 x2 = (xc + w / 2.0) * orig_w / 640.0 y2 = (yc + h / 2.0) * orig_h / 640.0 boxes.append([x1, y1, x2 - x1, y2 - y1]) scores.append(float(score)) class_ids.append(0) # 6. OpenCV内置NMS去重 indices = cv2.dnn.NMSBoxes(boxes, scores, score_threshold=0.25, nms_threshold=0.45) for i in indices: x, y, w, h = boxes[i] cv2.rectangle(img, (int(x), int(y)), (int(x + w), int(y + h)), (0, 0, 255), 2) cv2.imwrite("result.jpg", img)

这个代码有几个细节决定了它能不能跑通。blobFromImage里的scale是1/255.0,这一步把像素值从0到255归一化到0到1,和训练时的预处理保持一致。swapRB=True是因为OpenCV默认用BGR顺序读图,而模型训练时用的是RGB顺序。坐标映射时不能直接把网络输出坐标当原图坐标用,必须按比例缩放回原图尺寸。

NMSBoxes的输入里boxes是[x, y, w, h]格式,不是[x1, y1, x2, y2],这一点和很多目标检测教程里的习惯不一样,写错的话画框位置会整体偏移。输出indices是保留的框索引,注意不是检测框本身。

我在实际部署中会遇到一个问题:如果同时检测多种缺陷,代码里取类别概率就不能直接row[4],而应该argmax(row[4:])再取置信度。单类检测时row[4]就是唯一类别的概率,直接比较阈值即可。

4.3 工程化部署:性能优化、阈值策略与结果输出

模型跑通只是第一步,真正产品化还要处理几个工程问题。

性能方面,CPU推理时,640x640输入在主流桌面处理器上大概能跑到50到150毫秒一帧,取决于具体硬件。如果帧率要求高,优先考虑缩小输入尺寸、使用FP16半精度导出、或者改用TensorRT加速。边缘盒子设备上,我建议先量化到FP16测一版延迟,通常比FP32快30%以上,精度损失很小。TensorRT加速更适合批量部署的场景,但调起来工作量不小,项目周期短的话先别碰。

阈值策略必须结合场景调。把score_threshold从默认的0.25降到0.15会召回更多裂缝,也会带来更多误检。缺陷检测的现场价值排序是“漏检严重于误检”,所以我倾向于阈值偏低,宁可多输出几个框让工程师人工复核,也不要漏掉真裂缝。

后处理除了画框,我还会做三件事:一是把检测到的目标区域裁剪保存,方便留档;二是统计每个框的长宽比,过滤掉过短或者异常的噪声框;三是对同一面墙的多帧检测结果做合并,避免重复计数。这些细节看着不起眼,但在真实巡检项目里,直接决定报告数据能不能用。

5. 从数据到部署的常见问题与避坑实录

5.1 数据端的典型坑与排查方法

裂缝数据集最大的坑是“看着很真,实际没用”。我见过新的标注团队为了凑量,把一张图上同一条裂缝反复切、反复标,最后训练集里90%的框都来自同一条裂缝。这样的数据集训练出来的模型换一个现场必崩。排查方法很简单:可视化标注框,统计每张图的标注框数量、框的面积分布、框中心点的空间分布。如果大量框集中在图片中心或几个固定区域,说明数据多样性不足。

另一个高频坑是图像压缩。现场采集的照片如果经过即时通讯工具发送、或者被软件自动压缩到几百KB,细小裂缝的纹理细节基本就丢了。用这种图做训练集,模型看到的是模糊的裂缝;用这种图做测试集,检测精度断崖式下跌。我的原则是:训练集、验证集、测试集都只用原始采集文件,不做任何有损压缩。如果存储空间有限,宁可减少图片数量,也不压缩单张分辨率。

负样本的问题也容易出问题。加入负样本后,如果模型误检率反而上升,先检查负样本是不是“太难”了——比如包含大量看起来像裂缝的非目标纹理,模型为了降低这些负样本的损失,会变得过度保守,连真裂缝都不敢报。负样本的比例和难度要平衡,理想状态是负样本包含容易混淆、但肉眼能确认不是裂缝的图。

5.2 训练端的典型坑与排查方法

训练不收敛是最常见的问题。典型表现是损失函数一直震荡或者不下降。我的排查顺序是:先确认学习率没有设得太高,lr0大于0.01很容易出问题;再确认数据标注格式没有错,加载一下训练样本,把标注框可视化看看标签和图像是否对齐;最后确认预训练权重有没有正常加载,有没有出现“Downloading weight”之类的中断提示。

显存不足是另一个容易遇到的障碍。如果训练时报CUDA out of memory,优先降batch到8甚至4。注意,batch太小会导致BatchNorm统计不稳定,模型训练曲线会很抖。解决思路是:尽量保持batch在8以上;如果实在不行,可以把imgsz降到512,模型换成更轻的n或s版本,而不是一味压缩batch。

过拟合的判断和处理也有讲究。裂缝数据集几百张时,训练到100轮以后验证集精度可能不再上升,但训练损失还在下降。此时先确认早停参数有没有生效,如果已经停了,说明这是模型能力的自然上限。不要再盲目堆训练轮数,回归数据和增强才是正事。我试过最有用的手段是加大旋转和亮度扰动、把Mosaic概率调高一点、或者加入更多不同场景的数据。

还有一个容易被忽略的问题:验证集划分错误导致“作弊”。之前说过连续帧数据泄露,这里再强调一次,如果训练过程显示验证集精度极高、但现场表现极差,十有八九是划分时没有按场景隔离。重新划分数据集,保证同一物理部位只出现在一个数据集里。

5.3 部署端的典型坑与排查方法

部署环节的坑集中在OpenCV版本差异、ONNX算子和输入预处理三块。

OpenCV对ONNX的支持一直在更新,老版本算子覆盖不全很容易报错。报错信息里出现“Unknown layer”之类的内容时,先别怀疑模型,升级OpenCV版本到4.8以上通常能解决大部分算子问题。另一个选择是重新导出模型换个opset看看。

输入预处理的坑主要是归一化和通道顺序。YOLOv8和YOLO11训练时归一化到0到1,blobFromImage里scale设成了1/255.0就没问题;有人习惯用0.00392,效果一样但要注意别两个都乘了。通道顺序方面,模型训练是RGB,OpenCV读取是BGR,swapRB这个参数忘了设True,出来的检测效果会变得很奇怪,颜色特征全乱套。

NMS参数也值得调一调。nms_threshold默认0.45在裂缝场景下,可能把一条连续裂缝的多个相邻检测框合并成一个,导致长度被低估;也可能在密集裂缝区域保留过多重叠框。我的做法是先在几组典型图上可视化NMS前后的结果,nms_threshold在0.35到0.6之间试几个值,选一个在“避免重框”和“保留真实长裂缝”之间平衡的参数。

最后说一个很多人踩过的坑:OpenCV DNN推理时输入尺寸和训练尺寸不一致。训练用了640x640,推理时直接喂原图或者缩放成其他尺寸,输出坐标的缩放映射就会算错。必须保持推理输入尺寸与训练一致,或者代码里按真实缩放比例计算映射。在动态输入模型里尤其要注意,每一张图的缩放比例都可能不同,不能写死一个固定值。

最后再说一点个人体会。双模型训练最值得的不是找到“最强模型”,而是让系统多一条可选的退路。数据、结构、部署环境一变,曾经的“最强”可能立刻变成“最折腾”。我在项目里从YOLOv8切到YOLO11再切回来好几次,每一次切换都因为提前做了完整对比实验而省了大量返工时间。裂缝检测这件事,越做到后面越发现,模型只占三分之一的功夫,数据准备三分,部署调试三分,剩下一分是心态。能把这几个环节都走通,换什么数据集、换什么模型结构,你都有底气。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询