尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

深度学习道路裂缝检测实战:从数据集构建到U-Net分割与裂缝量化

发布时间:2026/9/26 2:32:09

资讯中心
01
ARTICLE

深度学习道路裂缝检测实战:从数据集构建到U-Net分割与裂缝量化

深度学习道路裂缝检测实战:从数据集构建到U-Net分割与裂缝量化
简介面向深度学习与图像分割任务的道路裂缝数据集适合目标检测、语义分割等模型的训练、评估与算法验证。资源包共20751个文件以20250张jpg原始道路裂缝图像作为主体另含250个labelme生成的json标注文件、250张由json批量转换得到的png掩膜图像及1个txt说明文件整体压缩包约133.81MB。其中250套已标注图像包含json标注与对应mask可直接用于分割模型训练json可用labelme重新打开便于按需修改或继续增加标注。目前已有6980人学习或下载。未标注的jpg原图覆盖多种路面、光照与裂缝形态可结合作者主页提供的批量转换Python程序自行生成更多掩膜适合深度学习入门者或道路病害检测方向的研究者使用。1. 深度学习做道路裂缝检测这个标题到底在解决什么问题一条路面裂缝只有几个像素宽藏在沥青的纹理、光照阴影和轮胎印记中间传统边缘检测一做就碎成几十段看似“检测出来”了实际上没法用。最早入行时我用Canny边缘检测做过一轮误检率高得离谱——路边接缝、新旧沥青交界、甚至水渍都能被当成裂缝。后来换成深度学习的图像分割才把这件事从“勉强能做”变成“能上路的工程质量”。本文要讲的不是模型理论而是一条从数据集到训练、再到后处理的完整落地路径——你拿到的是一批道路裂缝图片该选什么模型、怎么把像素块连成完整裂缝、怎么从分割结果算裂缝宽度以及哪些坑是用钱和时间买回来的。这套方案适合三类人做公路养护自动巡检的工程师、给路面评估系统做算法支撑的开发人员以及把裂缝分割当深度学习入门项目的学生。核心任务只有一句话——对每张路面图像做像素级分类裂缝像素标1背景像素标0然后把模型输出的概率图画成连续、可量测的裂缝轮廓。2. 道路裂缝数据集怎么选公开源与自制标注的完整路径2.1 三个公开道路裂缝数据集对比CrackForest、Crack500与DeepCrack起步阶段最好直接用公开数据集做通流程等模型能收敛、评估指标稳定了再根据实际路面情况自制数据集。常见的公开裂缝分割数据集有三个各自的特点和坑位差别很大。CrackForest是最早的公开道路裂缝数据集之一大约一百多张带标注的街拍路面图。图像分辨率统一裂缝类型覆盖横向、纵向和网状裂缝。但它的问题是样本量太小只够跑通代码和验证训练流程直接拿去训练部署级模型泛化能力很差。Crack500是学术圈用得更频繁的数据集来自校园和城市道路的路面采集原始图像通过裁剪产生约500张左右的标注图。每张图的裁切区域和分辨率不尽相同训练前需要统一尺寸或做随机裁剪。它在复杂背景上的标注比较丰富但背景与裂缝的比例严重不均衡正样本像素占比往往只有百分之几训练时容易让模型偷懒全预测成背景。DeepCrack的特别之处在于它标注的是裂缝边缘而非裂缝区域——它的标注是裂缝的边界线如果拿来做区域分割模型输出会是一条细线段而不是完整的裂缝区域。下载之后第一件事是打开标注看一眼确认标注语义是否与你的目标一致。数据集标注类型样本量级适合场景主要坑CrackForest裂缝区域百余张流程验证、调试样本少泛化有限Crack500裂缝区域五百张量级训练主数据集正负样本不均衡DeepCrack裂缝边缘五百张量级边缘检测类项目标注语义是边界不是面2.2 自制数据集的关键步骤采集、清洗与标注工具实际部署时公开数据集和你所在城市路面的沥青类型、病害程度、拍摄设备大概率对不上。常见做法是带一台工业相机或高像素手机以俯视角度在匀速行驶或步行状态下采集路面视频再从视频中抽帧保存为图像。抽帧之后的清洗是容易被忽视的一步。光照过曝、运动模糊、对焦失准的帧会极大拉低标注效率。我一般的筛选标准是裂缝尖端和细窄裂缝处的灰度对比还能被肉眼辨认就保留如果连肉眼都分不清裂缝是真实开裂还是污渍这张图直接丢弃。清洗后还要剔除大量完全没有裂缝的负样本——虽然负样本对训练也有价值但比例过高会拖慢收敛速度。标注工具用Labelme就足够。逐点勾画裂缝区域是一个枯燥但决定上限的环节不同标注人员的认知差异会导致同一张图产生截然不同的标注结果。防止这种偏差的做法是标注开始时先锁定一个判断标准比如“灰黑色连续断裂带算裂缝独立颗粒坑洞不算”让参与标注的人都按同一标准执行。标注完成后务必做交叉抽查抽几个人的同一张图对比一致性。2.3 数据增强的参数怎么设才不翻车裂缝图像增强和普通目标检测不太一样。路面有固定的物理方向横缝和纵缝在病害评估时含义不同随机旋转90度会直接打乱这种语义。我在实践中会把随机旋转限制在正负15度以内只做小幅的角度扰动来模拟拍摄时的倾斜。几何增强建议用以下配置# 基于Albumentations的裂缝分割增强配置 import albumentations as A transform A.Compose([ A.RandomRotate90(p0), # 先关掉90度旋转保留横纵缝语义 A.Rotate(limit15, p0.6), # 小角度随机旋转模拟手持不水平 A.HorizontalFlip(p0.5), # 水平翻转因为路面左右对称可以用 A.RandomBrightnessContrast( brightness_limit0.15, contrast_limit0.1, p0.5 ), # 光照增强模拟阴天/晴天切换 A.GaussNoise(var_limit(5.0, 20.0), p0.3), # 模拟传感器噪声 ])参数说明RandomRotate90在裂缝任务里默认关闭更多是基于语义考虑——横裂缝和纵裂缝在养护规范里判定等级完全不同Rotate(limit15)只做小幅角度扰动RandomBrightnessContrast是必需项因为真实巡检场景中光影变化远比标注图像复杂。如果测试集来自夜晚或强阴影场景还要额外加RandomGamma。翻车点在于增强过度。有人为了让模型更鲁棒叠加过多模糊、遮挡和色彩抖动结果训练集和测试集分布差距太大模型在原始图像上反而退化。增强的目的是扩大化同一个分布不是创造一个全新分布。3. 用U-Net做裂缝分割模型选型理由与最小可跑代码3.1 为什么裂缝分割首选U-Net而不是DeepLabV3或SegNet裂缝分割本质上是二值语义分割输入一张RGB路面图输出一张与输入同尺寸的概率图。U-Net至今仍是小样本细分割场景下最稳妥的基线模型。它的U型结构分两条路径左边编码器逐层下采样提取高层语义右边解码器逐层上采样恢复空间分辨率中间用跳连接把编码器的每层特征直接拼到解码器的对应层。跳连接对裂缝分割至关重要。裂缝是典型的“大尺度背景、小尺度目标”——整张图里裂缝像素占比很低但每个裂缝像素的位置信息却非常精确。没有跳连接的模型在多次下采样后会丢失细微裂缝的边界细节输出结果往往粗一大圈。U-Net的跳连接让浅层的高分辨率特征直接参与最终预测裂缝轮廓能保留得更窄、更贴合原始走向。DeepLabV3的空洞卷积理论上能增大感受野但感受野过大对裂缝这种长条目标反而有害——裂缝的上下文是路面纹理不是更远处的树或建筑。在裂缝数据集上DeepLabV3相比U-Net的mIoU提升极为有限但训练时间和显存占用却高不少。如果你的目标不是刷榜单U-Net是对的起点。BP神经网络或卷积神经网络做裂缝分类是另一条路线——先判断“图里有没有裂缝”再滑动窗口定位。这种方案在工程上早就被分割模型取代了因为分类结果没法精确到像素无法计算裂缝宽度和长度而后两项指标才是养护决策真正依赖的数据。3.2 最小训练脚本从数据加载到损失函数以下脚本去掉了花哨组件保留一个能跑通的最小闭环——U-Net模型、BCE-Dice混合损失、AdamW优化器、基础训练循环。import torch import torch.nn as nn from torch.utils.data import Dataset, DataLoader from torchvision import transforms from PIL import Image import numpy as np class CrackDataset(Dataset): 读取图像与对应的裂缝标注mask def __init__(self, img_dir, mask_dir, image_size(512, 512)): self.img_paths sorted(glob.glob(f{img_dir}/*.jpg)) self.mask_paths sorted(glob.glob(f{mask_dir}/*.png)) self.image_size image_size def __len__(self): return len(self.img_paths) def __getitem__(self, idx): image Image.open(self.img_paths[idx]).convert(RGB) mask Image.open(self.mask_paths[idx]).convert(L) image image.resize(self.image_size) mask mask.resize(self.image_size, resampleImage.NEAREST) image np.array(image).astype(np.float32) / 255.0 mask np.array(mask).astype(np.float32) / 255.0 mask (mask 0.5).astype(np.float32) # 二值化标注 image torch.from_numpy(image).permute(2, 0, 1) mask torch.from_numpy(mask).unsqueeze(0) return image, mask class BCEDiceLoss(nn.Module): BCE与Dice的加权组合缓解正负样本极端不均衡 def __init__(self, dice_weight0.5): super().__init__() self.dice_weight dice_weight self.bce nn.BCEWithLogitsLoss() def forward(self, logits, targets): probs torch.sigmoid(logits) bce_loss self.bce(logits, targets) smooth 1e-6 intersection (probs * targets).sum(dim(2, 3)) dice_loss 1 - (2.0 * intersection smooth) / ( probs.sum(dim(2, 3)) targets.sum(dim(2, 3)) smooth ) return bce_loss self.dice_weight * dice_loss.mean()逻辑说明数据集类在每次迭代时读取一对图像和mask统一缩放到512乘512mask在缩放时用Image.NEAREST保持二值语义不做灰度插值。BCEDiceLoss是裂缝分割的标配——BCE单独作用在严重不均衡的数据上容易被大面积背景主导Dice损失直接优化像素重叠率两者结合后训练初期收敛更快。训练循环的组装配置如下from torchvision.models.segmentation import deeplabv3_resnet50 # 备选方案 def train_unet(model, train_loader, val_loader, epochs50): optimizer torch.optim.AdamW(model.parameters(), lr1e-4, weight_decay1e-5) scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_maxepochs) criterion BCEDiceLoss(dice_weight0.7) for epoch in range(epochs): model.train() train_loss 0.0 for images, masks in train_loader: images, masks images.cuda(), masks.cuda() logits model(images)[out] if isinstance(model, nn.Module) and out in model(images).keys() else model(images) loss criterion(logits, masks) optimizer.zero_grad() loss.backward() optimizer.step() train_loss loss.item() scheduler.step() val_loss evaluate(model, val_loader, criterion) print(fEpoch {epoch1}/{epochs}, train_loss{train_loss/len(train_loader):.4f}, val_loss{val_loss:.4f})参数说明AdamW搭配weight_decay1e-5是为了防止训练后期权重过大在裂缝这种正样本极少的任务中过拟合往往表现为把所有像素都预测为背景CosineAnnealingLR让人工调整学习率的次数降为0前期大步长跳出局部最优后期小步长精细收敛。如果你用的是deeplabv3_resnet50这类返回字典的模型注意输出取[out]键如果你换成纯nn.Sequential编码器解码器结构直接取模型输出即可——上面的代码对两种分支做了兼容处理。3.3 训练参数怎么设batch size、学习率与迭代次数裂缝分割的显存压力出在输入尺寸上。512乘512的输入、batch size为8时U-Net在24GB显存卡上勉强能跑16GB卡建议batch size降到4同时把输入缩到448。如果你用Crack500做训练原始图像分辨率较高需要先随机裁剪到固定尺寸再进网络。学习率的经验值AdamW家族1e-4起步配合CosineAnnealing下降到1e-6左右。如果训练初期loss不降先检查数据加载是否有问题前向输出的logits是否全为相近值再考虑调学习率。迭代次数从50个epoch左右开始观察裂缝分割不像是大数据集训练动辄上百个epoch50个epoch足够看到模型从“全背景”进化到“能连出裂缝轮廓”。早期停止策略建议只看验证集Dice连续10个epoch不涨就停。如果条件允许把U-Net编码器换成预训练的ResNet34收敛速度会有明显提升但前几个epoch的loss波动也更大。对于纯入门的人从头训练一个小U-Net是最省心的方案——你不需要加载预训练权重也就少了一个“模型加载出错”“权重通道不匹配”的排查环节。4. 裂缝分割的评估与后处理从mIoU到裂缝宽度计算4.1 评估指标选哪个mIoU、Dice还是PA裂缝分割的任务中Pixel AccuracyPA是一个没什么价值的指标。因为裂缝像素占比极低模型把所有像素预测成背景PA也能达到95%以上但显然没有任何工程意义。mIoU是更可靠的主指标。裂缝作为前景类别它的IoU计算方式为预测为裂缝且真实为裂缝的像素数除以预测为裂缝与真实为裂缝的并集像素数。在裂缝极细的情况下预测偏移一个像素就可能导致IoU下降很多这让mIoU能公平反映“预测位置是否精准贴合真实裂缝”。Dice与mIoU高度相关但在正样本极度稀疏时Dice数值看起来更乐观。常见的折中方案是采用Dice作为训练损失用mIoU作为模型选型的评估指标。逐类别的IoU读数比只看平均值更有诊断价值如果背景IoU接近100%而前景IoU只有30%说明模型在背景上过拟合需要加强数据增强或调整正负样本权重。4.2 后处理的三个必做步骤连通域过滤、形态学开运算、骨架提取模型输出的概率图是0到1之间的浮点张量第一步是要二值化。固定阈值0.5是最常见的做法但在裂缝分割里建议结合Otsu算法动态取thr尤其当光照不匀导致概率图整体偏高或偏低时。import cv2 import numpy as np from skimage import morphology def postprocess(prob_map, min_area50): prob_map: shape (H, W)取值[0,1]的模型输出 min_area: 小于该面积的连通域直接剔除 返回二值裂缝mask以及骨架线图像 # 1. 动态阈值二值化 prob_uint8 (prob_map * 255).astype(np.uint8) thr, binary cv2.threshold( prob_uint8, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU ) # 2. 形态学开运算去除离散噪声点同时断开细碎连接 kernel cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) cleaned cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations1) # 3. 连通域过滤删除面积过小的误检块 num_labels, labels, stats, _ cv2.connectedComponentsWithStats(cleaned, connectivity8) filtered np.zeros_like(cleaned) for label_id in range(1, num_labels): if stats[label_id, cv2.CC_STAT_AREA] min_area: filtered[labels label_id] 255 # 4. 骨架提取得到单像素宽的裂缝中心线 skeleton morphology.skeletonize(filtered 0) return filtered, skeleton.astype(np.uint8) * 255逻辑说明cv2.threshold中的THRESH_OTSU会自动选择阈值把概率图分成前景和背景两类适用于裂缝面积占比未知的新场景morphologyEx即开运算先腐蚀后膨胀能去掉单独的几个噪声像素同时把裂缝边缘的毛刺磨平connectedComponentsWithStats做连通域标记面积小于min_area的对象大概率是沥青纹理误检直接删除最后用morphology.skeletonize提取骨架这是后续计算裂缝长度和宽度的基础。参数调整的注意点min_area不是固定值它取决于输入图像的分辨率。512乘512输入下取50到100比较合适2048乘2048的高分辨率图上应该取200以上。骨架提取在裂缝交叉处的处理往往不太理想分叉点会产生伪分支后续要根据实际路面情况进行修剪。4.3 裂缝最大宽度与平均宽度的计算方法有了骨架线之后裂缝宽度可以通过距离变换来测量。距离变换给每个前景像素赋值“到最近背景像素的距离”这个距离乘以2就是该处裂缝的局部宽度。def compute_crack_width(skeleton, crack_region): skeleton: 单像素宽骨架线 crack_region: 过滤后的裂缝二值图 返回最大宽度/平均宽度像素单位 dist cv2.distanceTransform( crack_region, cv2.DIST_L2, 5 ) skeleton_pixels skeleton 0 if skeleton_pixels.sum() 0: return 0.0, 0.0 width_at_skeleton dist[skeleton_pixels] * 2.0 max_width float(width_at_skeleton.max()) mean_width float(width_at_skeleton.mean()) return max_width, mean_width逻辑说明distanceTransform对裂缝区域二值图做欧几里得距离变换每个前景像素的值代表它离最近背景边缘的像素距离。骨架线上的点恰好位于裂缝中心该点的距离值约等于裂缝在该处的半宽乘2得到全宽。DIST_L2指定欧几里得距离度量5是掩模尺寸数值越大计算越精确但耗时略增。宽度数值需要按实际物理尺寸换算。如果拍摄时相机距路面1.2米画面覆盖宽度为2米、图像分辨率为3000像素那么每个像素约为0.67毫米像素宽度乘上这个系数就得到毫米级裂缝宽度。这个换算参数需要在外业标定时实测不同相机和架设高度差异很大。5. 裂缝分割避坑指南5个用钱买回来的经验5.1 训练loss降到0.02但预测结果全黑现象训练损失和验证损失都收敛得很漂亮但把模型拿去预测新图像输出的概率图几乎全为0偶发几个噪点。原因正负样本严重不均衡时模型学到的最优策略是什么都预测为背景。BCE损失里背景像素贡献占压倒性多数即使Dice权重拉高了前景的惩罚整体梯度仍被背景主导。这不是U-Net结构问题是数据分布和损失函数共同造成的。解决先确认训练集里裂缝像素占比如果低于5%把损失函数的dice_weight从0.5调到0.8甚至0.9或者改用Tversky Loss它的alpha和beta参数可以分别控制假阴性和假阳性的惩罚权重。另一个立竿见影的操作是把批量内的负样本图换成包含更多裂缝的图。如果训练集里无裂缝图和无裂缝背景占比过高优先筛选剔除而不是依赖损失函数硬扛。5.2 裂缝断成一段一段的连通性很差现象预测出的裂缝区域零零碎碎真实裂缝明明是一条连续的长裂缝模型输出却被切成了七八段。原因雨水、阴影和路面颗粒会中断裂缝的灰度连续性模型在模糊过渡段的预测置信度下降二值化时这些段落到阈值以下形成断裂。骨架提取和后续宽度测量在断裂处会得到错误值。解决先在训练阶段评估你是“宽度优先”还是“连通性优先”。如果是测量需求可以在后处理时做形态学闭运算——先膨胀再腐蚀把间隔小于几个像素的断点桥接起来。cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel, iterations2)是常见做法。更强的替代方案是用连通域的骨架线做线段拟合把端点距离小于给定阈值的断裂段连接。闭运算的风险是过度桥接会把两条平行裂缝误连成一条所以iterations参数要保守设置。5.3 白天训练的模型在傍晚或阴影路面直接翻车现象验证集mIoU达到70以上但投入阴天或树影遮挡的路面时分割效果明显下降裂缝被阴影吞掉误检率上升。原因训练样本集中在晴天光照条件阴影区域被标注为背景模型的泛化能力不足以应对光照突变。裂缝和阴影在灰度特征上有重叠模型在未见过的光照分布下把阴影当成裂缝或把裂缝当成阴影。解决这是一种典型的域迁移问题。优先方案是采集傍晚和阴天路面图像补充训练集这是性价比最高的做法。其次用RandomGamma和RandomBrightnessContrast增强模拟不同光照也可以把图像从RGB转到灰度图再作为额外通道输入减小对颜色的依赖。如果工程周期紧可先对输入图像做CLAHE对比度增强再送入模型它能把裂缝和背景的灰度差拉大部分抵消光照影响。5.4 数据标注量很大但模型提升不明显现象标注了几千张图加了更多人力和时间模型的mIoU提升却只有一两个点投入产出不成比例。原因标注质量的分布不均衡——哈少数难样本占了大部分标注差异。常见的错误是让多个标注员同时标但每个人的判断标准不一致同一张图的标注结果在裂缝边界上差出好几个像素。模型被不一致的标注弄糊涂了学到的边界是“平均”结果反而不如少量一致的标注。解决标注规范前置比增加标注量更重要。先制定五条以内的准则宽度小于2个像素是否忽略、不规则坑洞是否算裂缝、车辆阴影下的黑色带是否标注等。每次标注前随机抽5%的图做标注一致性测试多人对同一张图标注结果的Dice低于0.85说明规范执行出了问题。对标注后的mask做轻微腐蚀或膨胀统一瘦边也能减小标注者之间的系统偏差。5.5 显存不够batch size降到2还是爆显存现象512输入配合batch size 2都跑不起来报CUDA out of memory。原因很多人忘了U-Net的显存消耗集中在中间特征图上。每层编码器保留特征用于跳连接解码器上采样后特征图数量逐层增多中间层的特征张量比输入图像大许多倍。和医学图像分割类似——训练阶段的显存峰值往往在中间层而不是输入层。解决优先用梯度累积模拟更大的batch size每两步更新一次梯度相当于batch size翻倍但显存不增加。代码如下# 梯度累积示例真实batch2累积步数4等效batch8 accum_steps 4 optimizer.zero_grad() for i, (images, masks) in enumerate(train_loader): images, masks images.cuda(), masks.cuda() logits model(images) loss criterion(logits, masks) / accum_steps # 先将loss平均化 loss.backward() if (i 1) % accum_steps 0: optimizer.step() optimizer.zero_grad()逻辑说明criterion计算出的loss不会除以累积步数的话梯度会累积到等效batch size的倍数学习率效果也会同步放大最终难以收敛。除以accum_steps能在每次反向传播时把梯度归一化等效于标准batch size下的梯度量。代码说明if (i 1) % accum_steps 0控制更新频率batch size 2乘4等于等效batch 8。注意BatchNorm层在这种模式下表现略差因为每个batch的统计量仍基于2张图计算如果模型是用预训练BatchNorm权重的建议改成累积4步内统计量不变的模式或者直接换用GroupNorm。实际工程中用GroupNorm替换BatchNorm再多花30%的显存但梯度和收敛稳定性好不少。如果梯度累积还不够把输入尺寸从512降到384通常能释放约40%的显存。代价是裂缝细节变粗——对细窄裂缝来说小输入尺寸会直接吞掉裂缝宽度信息训练和推理都要保持同一输入尺寸。输入尺寸不一致是隐形的部署事故来源训练用512、推理用1024模型输出的裂缝边界会整体偏移。6. 从分割结果到裂缝长度统计一个可落地的度量技巧前面做的后处理和骨架提取最终要落在养护报表上——宽度有了长度怎么算。骨架提取后统计连通域中骨架像素的数量再乘以像素物理尺寸即可得到裂缝长度。但直接数像素并不准确45度方向和水平方向的对角线走线被离散成阶梯状像素同样物理长度的裂缝像素数不同。我的做法是先把骨架线做折线化用cv2.HoughLinesP把每一段骨架像素拟合成线段再对线段长度求和。这个方法能有效消除斜向裂缝的像素阶梯误差。def compute_crack_length(skeleton_img, pixel_size_mm0.67): skeleton_img: (H, W) 二值骨架图 pixel_size_mm: 每个像素对应的物理尺寸毫米 返回裂缝总长度毫米 lines cv2.HoughLinesP( skeleton_img, rho1, thetanp.pi / 180, threshold15, minLineLength20, maxLineGap5, ) if lines is None: return 0.0 total_length 0.0 for line in lines: x1, y1, x2, y2 line[0] length np.hypot(x2 - x1, y2 - y1) total_length length return total_length * pixel_size_mm逻辑说明HoughLinesP是概率霍夫变换它从骨架像素中搜索直线段而不是把所有像素串接起来天然忽略掉小的弯曲和分叉。minLineLength20过滤过短的线段噪声maxLineGap5允许断裂处至多5个像素的间隔被桥接。总长度乘上每个像素对应的毫米系数就得到整条裂缝的物理长度。这个技巧的实际工程价值比想象中大。实际做道路巡检时常碰到长达几米的纵向裂缝断成几十段每段的宽度差别也很大。宽度平均值、最大宽度、总长度三个数字组合配合裂缝走向角度就能完整描述一条裂缝的病害特征——这远不是一张简单的标注图能说明的。如果裂缝的宽度分布不均匀还可以按宽度区间对骨架分段统计长度占比然后生成类似“该路段裂缝总长12.8米其中宽度大于1毫米的占62%最大宽度3.4毫米”这样的结构化报表。最后一个习惯是所有调参都记下来记参数名、改了什么、验证集指标变化。裂缝分割的每一个epoch都在和灰度分布的不确定性打交道不记录你调过什么一个月后面对复现失败的模型会无从下手。模型选型可以换更好的网络数据标注可以补更多图但无记录的调参会让你反复跌倒在同一处。希望我这些踩过的坑能帮你省下几周的返工时间祝你的裂缝分割项目顺利落地。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。