遥感道路二值分割数据集实战:从分块训练到后处理全流程
简介图像分割数据集聚焦大分辨率遥感影像中的道路提取任务采用背景与道路两类像素级标注。整包包含约6000张带标签图像划分为训练集约4300张与测试集约1800张两个目录内均设images图片与masks标签文件夹并提供classes.txt说明类别。压缩包共2000个文件以png图像为主1998个另有1个txt与1个py可视化脚本包体大小359.11MB目录结构一目了然适合直接输入到UNet、SwinUNet等分割网络训练。py脚本会随机抽取一张影像同时输出原始图、GT掩膜以及GT叠加在原图上的效果图可用于快速检查标注质量、观察道路轮廓与模型预测的对照。面向遥感图像分割入门与进阶学习者已有104人学习是开展道路提取实验和算法验证的实用数据集。1. 遥感道路二值分割数据集6000张图到底能不能训练出可用的道路提取模型拿到“图像分割数据集大分辨率下的遥感位置道路图像分割数据集2值分割约6000张数据和标签”第一反应别急着找模型。先把任务看清楚这是一份遥感影像的道路提取数据每个像素只分两类——道路和非道路也就是典型的二值分割。6000张图和对应标签规模在大分辨率遥感分割里算中等偏上够训练一个能用的分割网络前提是处理方式正确。很多人在这种数据集上翻车不是模型不够强而是把大图直接缩小塞进网络把二值标签当成普通灰度图最后道路断裂、边界糊成一团。这篇笔记按数据核验、分块、训练、踩坑、后处理的顺序把整个流程拆开讲。适合刚接触遥感分割的算法工程师也适合想判断这份数据值不值得投入时间的团队。2. 数据集内部结构标签不是一张黑图二值分割也有边界标准2.1 图像与标签的配对组织方式拿到这类数据集先不要假设它的目录结构是统一的。常见做法有两种一种是 images 和 masks 两个文件夹文件名一一对应比如image_0001.png对应label_0001.png另一种是只有原图标签是单独导出的 GeoJSON 或 shapefile 矢量文件需要自己栅格化成 mask。第二种更麻烦因为坐标对齐、投影转换、栅格化分辨率都要自己处理。我建议第一步先把所有图像和标签统一成同尺寸、同格式的 PNG再做配对校验。做配对校验时最容易翻车的点是图像是 3 通道 RGB标签可能是单通道灰度也可能是 3 通道的彩色 PNG人眼看到的黑色和白色读进数组却是三维的。如果是后者需要先做mask[:, :, 0]取单通道否则后续计算二值交叉熵会直接报维度错误。另一个隐蔽问题是标签里的道路像素是 0背景是 255和常见的 0/1 约定相反。这类不一致不会影响训练收敛但会影响你打印可视化和计算 IoU 时的阈值判断。import os import cv2 import numpy as np img_dir data/road/images mask_dir data/road/labels for name in os.listdir(img_dir): img_path os.path.join(img_dir, name) mask_path os.path.join(mask_dir, name) if not os.path.exists(mask_path): print(f[MISSING] {name} 标签不存在) continue img cv2.imread(img_path) mask cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) if img.shape[:2] ! mask.shape[:2]: print(f[SIZE MISMATCH] {name}: img{img.shape}, mask{mask.shape}) continue unique np.unique(mask) if len(unique) 2: print(f[MULTI-CLASS] {name}: 标签不是二值包含 {unique}) else: print(f[OK] {name}, img{img.shape}, mask_values{unique})这段代码做的事情很直接遍历图像目录找同名标签检查尺寸是否一致检查标签像素值是不是只有两类。逻辑上要注意的是cv2.imread对中文路径支持不好如果数据目录带中文建议先用cv2.imdecode读。参数层面有两个关键点第一IMREAD_GRAYSCALE强制把彩色标签压成单通道避免通道数不一致第二打印unique时看到[0, 255]不要慌后面归一化到[0, 1]就行真正要警惕的是出现[0, 1, 255]这类多值说明某张标签里混入了其他类别。2.2 标签里“道路”的标准从车行道到人行道的判定差别二值分割的难点不在“二值”而在“道路”的定义。同一景影像上有的标注把机动车道、非机动车道、人行道全部算作道路有的只标车行道有的连小区内部路都标进去了。这直接影响模型的泛化边界。你在训练前一定要抽 20 到 30 张图把原图和 mask 叠在一起用肉眼确认标注标准。我见过最典型的情况训练集里道路都是主干道验证集里出现大量狭窄巷道模型 IoU 直接掉 10 个点不是过拟合是标注标准不一致。还有一个容易被忽略的点标注边界偏移。遥感影像分辨率高的时候道路边缘在像素级上是模糊的标注员手动勾边难免偏 1 到 2 个像素。这种偏移对 mIoU 这类指标影响有限但对细道路的连续性影响很大。可以用膨胀测试快速验证标签边界质量把 mask 膨胀几个像素再和原 mask 计算 IoU如果 IoU 超过 0.95说明边界膨胀后几乎没变化标签本身就很粗如果只有 0.85说明边界细节相对丰富。import cv2 import numpy as np def boundary_check(mask_path, kernel_size5): mask cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) mask (mask 0).astype(np.uint8) kernel cv2.getStructuringElement(cv2.MORPH_RECT, (kernel_size, kernel_size)) dilated cv2.dilate(mask, kernel, iterations1) intersection np.logical_and(dilated 1, mask 1).sum() union np.logical_or(dilated 1, mask 1).sum() return intersection / union # 用法示例对抽样标签计算边界扩张后的 IoU iou boundary_check(data/road/labels/image_0001.png, kernel_size5) print(f膨胀 5x5 后 IoU {iou:.3f})这段代码的核心是cv2.dilate对二值 mask 做形态学膨胀然后计算膨胀前后 mask 的 IoU。kernel_size控制膨胀范围一般从 5 试到 15逐步加大看 IoU 变化曲线。如果 IoU 本身接近 0.9 以上说明标签边缘预留了较大缓冲区如果加一点膨胀 IoU 就明显下降说明标签贴合影像边缘精度较高。这个测试的价值在于它决定了你在训练时能不能放心用强数据增强。标签边界粗的数据翻转、缩放都不太容易出错标签边界精细的过度增强反而会把道路宽度学歪。2.3 用 40 行代码核验数据完整性尺寸、通道、道路占比一次查完训练前做一次全量数据体检是值得的6000 张图用脚本跑一遍只需几分钟能避免训练到一半才发现有坏图。体检项目包括四项图像标签尺寸是否一致、图像是否有损坏、标签是否严格二值、道路像素占比是否合理。道路占比是个硬指标遥感道路数据集的典型占比在 2% 到 15% 之间如果某张图的道路占比超过 20%要么是大片密集路网要么标签里混入了非道路内容如果低于 0.5%这张图很可能是背景主导的难样本。import os import cv2 import numpy as np img_dir data/road/images mask_dir data/road/labels report [] for name in sorted(os.listdir(img_dir)): img_path os.path.join(img_dir, name) mask_path os.path.join(mask_dir, name.replace(.jpg, .png)) if not os.path.exists(mask_path): report.append((name, missing_mask)) continue img cv2.imread(img_path) if img is None: report.append((name, broken_image)) continue mask cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) if mask is None: report.append((name, broken_mask)) continue if img.shape[:2] ! mask.shape[:2]: report.append((name, size_mismatch)) continue road_ratio (mask 0).mean() if road_ratio 0.005 or road_ratio 0.20: report.append((name, extreme_ratio, round(road_ratio, 4))) for item in report[:20]: print(item) print(ftotal issues: {len(report)}, checked: {len(os.listdir(img_dir))})逻辑说明mask 0把标签统一成布尔二值再求均值得到道路像素占比。这个脚本没有做多线程6000 张图全量跑大约需要 3 到 5 分钟。参数方面extreme_ratio的上下限可以根据标签标准调整如果数据集包含郊区影像道路占比普遍偏低下限可以放宽到 0.002。这个体检报告建议保存成 CSV在划分训练验证集时排除掉明显有问题的样本尤其是size_mismatch和broken_mask这两类它们会在训练时直接导致崩溃。3. 大分辨率影像不能直接进网络分块裁剪、重叠拼接与坐标恢复3.1 为什么要把原图裁开显存只是表面原因6000 张大分辨率遥感图单张尺寸常见 4000x4000 甚至更大。直接送进 U-Net 这类编码器-解码器结构先不说显存够不够下采样链会把特征图缩到很小一次下采样道路细线就消失了。所以必须采用滑窗裁剪把大图切成若干个 patch训练和推理都基于 patch 进行。切块的尺寸、重叠率、坐标记录方式共同决定了模型输出能否拼回完整语义图。显存问题确实存在但不是核心矛盾。核心矛盾是感受野和分辨率的权衡patch 太小道路的走向和连通信息被截断模型只能看到局部线段patch 太大batch 数量受限训练速度下降同时对显存的压力成倍增加。常见做法是 patch 边长取 512 或 1024配合 128 到 256 像素的重叠区域。这样做的好处有两个一是重叠区域给推理拼接留了缓冲二是训练时每张图能裁出大量 patch相当于扩充了样本数量。3.2 带坐标的滑窗裁剪脚本训练、验证、推理共用同一份元数据裁剪不是简单把图切开关键是要把每个 patch 在原图中的坐标记录下来。训练时按顺序读 patch推理时按坐标把预测结果拼回大图。如果裁剪和拼接两套坐标不统一后面拼接接缝错位是必然的。最好的做法是一开始就把坐标信息写入一个 CSV训练、验证、推理全部依赖这个 CSV 操作。import cv2 import numpy as np import pandas as pd def slide_crop(image_path, mask_path, save_dir, patch_size512, overlap128): img cv2.imread(image_path) mask cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) h, w img.shape[:2] stride patch_size - overlap records [] for y in range(0, h - patch_size 1, stride): for x in range(0, w - patch_size 1, stride): img_patch img[y:y patch_size, x:x patch_size] mask_patch mask[y:y patch_size, x:x patch_size] patch_name f{image_path.stem}_y{y}_x{x} cv2.imwrite(f{save_dir}/images/{patch_name}.png, img_patch) cv2.imwrite(f{save_dir}/labels/{patch_name}.png, mask_patch) records.append({patch: patch_name, y: y, x: x, h: h, w: w}) return pd.DataFrame(records) # 执行裁剪并保存坐标 CSV df slide_crop( image_pathdata/raw/image_0001.png, mask_pathdata/raw/label_0001.png, save_dirdata/patches, patch_size512, overlap128 ) df.to_csv(data/patches/coords.csv, indexFalse)逻辑说明裁剪窗口遍历是从左上角开始步长stride patch_size - overlap保证了相邻 patch 之间有 overlap 像素的重叠区域。records里记录了每个 patch 的左上角坐标(y, x)和原始大图尺寸(h, w)推理拼接时靠这两组数据把 patch 放回原位。代码里用image_path.stem生成 patch 文件名避免与同名目录混淆。参数层面patch_size 512、overlap 128 是多数情况下的稳妥起点如果道路特别宽或目标是大尺度连通结构建议把 patch 提到 1024overlap 提到 256代价是单张图裁剪出的 patch 数量减少。3.3 推理时把 patch 拼回大图重叠区梯度融合与去接缝分块推理之后拼图直接按照坐标把预测结果贴回去会在重叠区域出现明显的接缝——通常是两条平行的伪影线。原因是模型在 patch 边界处的预测置信度偏低重叠区的预测结果和相邻 patch 不一致。解决办法是重叠区不取单一预测值而是做加权融合越靠近 patch 中心权重越大。import numpy as np def reconstruct(pred_patches, coords, image_size, overlap128): h, w image_size accumulator np.zeros((h, w), dtypenp.float32) weight_map np.zeros((h, w), dtypenp.float32) patch_size pred_patches[0].shape[0] for pred, (y, x) in zip(pred_patches, coords): # 构建三角权重左右/上下边缘低中心高 w_row np.minimum(np.arange(patch_size), patch_size - 1 - np.arange(patch_size)) w_col np.minimum(np.arange(patch_size), patch_size - 1 - np.arange(patch_size)) w_2d np.minimum(w_row[:, None], w_col[None, :]).astype(np.float32) 1.0 accumulator[y:y patch_size, x:x patch_size] pred * w_2d weight_map[y:y patch_size, x:x patch_size] w_2d final accumulator / np.maximum(weight_map, 1e-6) return (final 0.5).astype(np.uint8)说明w_2d是一个从边缘向中心渐变的二维权重矩阵。边缘处权重接近 1中心处权重接近 patch_size/2这样拼接时重叠区域的预测值按权重混合避免某一边的预测结果“硬切换”。accumulator和weight_map分别累计加权预测值和权重总和最终做除法得到归一化结果。最后用 0.5阈值转回二值 mask阈值大小可调如果希望提取结果更保守、减少假阳性可以提高到 0.6 或 0.7。这个拼接结果和有没有重叠区、重叠区大不大有直接关系overlap 小于 64 时拼缝几乎无法完全消除。3.4 分块带来的上下文丢失用多尺度推理或更大感受野缓解分块裁剪把大图的全局信息切碎了这是所有基于 patch 的分割方法都要付出的代价。道路这种长条形目标单张 512 patch 里往往只有几段短线段模型很难判断它应该向左连通还是向右延伸。缓解措施有两个方向一是在训练时用更大的输入尺寸比如 1024让模型在单次前向中看到更长的道路走向二是在推理时做多尺度分别用 512 和 1024 的patch 预测把两个尺度的预测结果叠加再取平均。多尺度推理会增加一倍以上的推理耗时但效果明显尤其是在道路密集区域能减少断线。SegFormer 这类基于 Transformer 的分割模型对 patch 大小更敏感因为它有全局注意力机制patch 切得越小注意力能覆盖的范围就越有限。所以如果用 SegFormer 做遥感道路分割建议 patch 至少取 1024序列长度会变得很大显存占用也会随之上升训练时要把 batch size 相应调小。4. 训练与评估把 6000 张数据变成一条可用的道路提取模型4.1 模型选择U-Net、DeepLabV3Plus、SegFormer 怎么选道路分割是经典的二值分割任务可选模型很多但结合 6000 张的规模和遥感影像特点常用的就是三条路线。第一类是 U-Net 及其变体结构轻、显存占用小从零开始训练也能收敛适合快速验证数据质量。第二类是 DeepLabV3Plus空洞卷积带来更大的感受野对道路这种长条形目标有一定优势建议加载 ResNet 预训练权重。第三类是 SegFormer近年在遥感分割上很常用Transformer 编码器对全局上下文的建模能力强但数据需求量也更大6000 张规模下务必加载预训练权重否则很容易欠拟合。模型预训练依赖显存占用道路分割效果适用阶段U-Net (ResNet-34)低低约 6GB中上细线易断快速验证DeepLabV3Plus (ResNet-50)中中约 8GB好边界干净正式训练SegFormer-B2高高约 12GB好连通性佳追求精度6000 张数据量不算大但也不是特别小。如果是从零训练 U-Net大概需要 80 到 100 个 epoch 才能看到一个稳定可用的结果加载预训练编码器后30 到 50 个 epoch 就能达到相近水平。建议先跑一个 8 到 10 个 epoch 的短实验看验证集 mIoU 是否随训练稳定上升。如果完全不涨大概率是数据配错或标签问题这种情况排查数据比调模型参数更优先。4.2 损失函数与超参为什么交叉熵在道路分割上常常不够道路像素在整张图中占比通常在 5% 以下普通交叉熵损失会让模型倾向于把大多数像素预测为背景因为这样做损失就已经很小了。解决方法是把 Dice 损失和交叉熵加权组合。Dice 损失直接优化区域重叠度对正负样本不敏感交叉熵保留像素级梯度让训练初期更容易收敛。import torch import torch.nn as nn import torch.nn.functional as F class DiceCE(nn.Module): def __init__(self, dice_weight0.5, ce_weight0.5): super().__init__() self.dice_weight dice_weight self.ce_weight ce_weight def forward(self, logits, targets): probs torch.sigmoid(logits) # Dice 损失 smooth 1.0 intersection (probs * targets).sum() dice (2.0 * intersection smooth) / (probs.sum() targets.sum() smooth) dice_loss 1.0 - dice # 二值交叉熵 ce_loss F.binary_cross_entropy(probs, targets) return self.dice_weight * dice_loss self.ce_weight * ce_loss逻辑说明probs是 sigmoid 输出的概率图targets是 0/1 二值标签。Dice 损失计算的是预测概率和标签的重叠率范围在 0 到 1 之间越接近 0 说明预测越准。smooth防止除零。实际训练中dice_weight可以设到 0.7ce_weight设 0.3对道路这种正样本占比低的任务更友好。如果发现训练早期损失波动很大先把两个权重设成 0.5 对半稳定后再调整。训练超参方面patch_size 512 时一个常见配置是 batch_size 8、初始学习率 3e-4、优化器 AdamW、训练 60 个 epoch。学习率用 warmup 加余弦衰减warmup 步数 500 到 1000 步避免初始阶段 loss 震荡。数据增强要克制随机水平翻转、垂直翻转、随机亮度对比度、高斯噪声可以用随机旋转建议只做 90 度的倍数任意角度旋转会破坏道路的线性结构随机裁剪不建议超过原本 patch 的 20%因为裁剪后道路拓扑信息进一步丢失。4.3 指标计算mIoU、F1、Recall用哪两个指标决定模型是否可用分类任务看 accuracy 就够了分割任务不行。道路分割里背景占比太高一个全预测背景的模型 accuracy 也能超过 90%但没有任何实际价值。判断模型是否可用核心看两个指标IoU 和 Recall。IoU 反映预测区域和真实标签的重叠程度Recall 反映真实道路有多少被找回来。重点关注 IoU 和 Recall 的组合IoU 高但 Recall 低说明预测的区域很精准但漏检严重道路断线多IoU 中上且 Recall 也高才是可用的提取模型。import numpy as np def segmentation_metrics(pred, target): pred (pred 0.5).astype(np.uint8) target (target 0).astype(np.uint8) intersection np.logical_and(pred 1, target 1).sum() union np.logical_or(pred 1, target 1).sum() iou intersection / max(union, 1) tp intersection fp np.logical_and(pred 1, target 0).sum() fn np.logical_and(pred 0, target 1).sum() precision tp / max(tp fp, 1) recall tp / max(tp fn, 1) f1 2 * precision * recall / max(precision recall, 1e-6) return {iou: iou, precision: precision, recall: recall, f1: f1}这段代码逻辑直接交集、并集、假阳、假阴全部用布尔运算统计没有黑匣子。评价模型时建议按整张大图计算指标而不是按 patch 平均。按 patch 平均会高估性能因为很多 patch 道路占比为 0模型预测全背景也能得到很高的 patch 级 IoU。正确的做法是先拼接整景预测图再和整景标签计算指标。一般来说IoU 到 0.55 以上、Recall 到 0.6 以上模型输出的道路拓扑基本连通可以作为初版结果IoU 低于 0.45 时不要急着调模型先回头看标签和分块参数是不是有问题。5. 避坑遥感道路二值分割数据集使用中的 5 个高频翻车点5.1 标签错位loss 在降预测的道路却不在正确位置上现象训练 loss 曲线正常下降验证 mIoU 也不低但可视化预测结果时发现模型提取的道路位置和影像道路明显对不上歪了一块。原因图像与标签存在像素级偏移通常来自出图时的坐标基准不一致或者图像做了配准、裁剪但标签没有同步变换。这类错误在缩略图上看不出来放大到 patch 级别才明显。解决在分块之前抽 5 张图把原图转成灰度后与 mask 做边缘叠加肉眼检查道路边缘和 mask 边缘是否对齐。如果整体偏移固定可以用np.roll或cv2.warpAffine对齐如果偏移随空间变化说明坐标系出了问题需要重新检查地图投影和裁剪范围。5.2 标签是彩色 PNG训练时直接报维度错误现象数据加载时报expected 1 channel, got 3或者 loss 出现 NaN。原因标签存储为 RGB 彩图黑色背景和白色道路是视觉上的但读进来是三个通道。常见的 PNG 标注导出工具会默认保存成彩色索引图也有的保存成带透明通道的 RGBA。解决统一读取时用cv2.imread(path, cv2.IMREAD_GRAYSCALE)强制转单通道。不要在数据加载器里做mask[:, :, 0]这种临时处理因为不同文件的通道顺序可能不一致。最好在数据预处理阶段就把所有标签统一重存为 8 位单通道 PNG。5.3 道路只有 1 到 3 个像素宽U-Net 下采样后直接消失现象主干道提取正常但巷道、小路、匝道等细道路在预测结果中完全断裂或消失。原因连续五次下采样后1 到 3 像素宽的道路在特征图上只占不到 1 个像素编码器直接把它当噪声滤掉了。这不是损失函数能解决的是网络结构本身的限制。解决一是把输入 patch 尺寸提高保留更多原始分辨率信息二是在损失函数中对细道路像素加权计算每个像素到最近背景的距离距离越近权重越大三是数据预处理时对标签中的细道路做适度膨胀让网络先学会“粗道路”再逐步恢复细节。最后一个方法虽然降低精度但能保证拓扑连通性很多实际工程里连通性优先于像素精度。5.4 随机划分训练集导致同景影像泄漏现象训练 mIoU 很高验证 mIoU 也很高但换一组城市或换一个时间段测试效果暴跌。原因6000 张图往往来自有限数量的原始影像切块后同一张原始影像的多个 patch 被同时分到训练集和验证集。模型相当于提前“见过”验证集的一部分内容评价指标虚高。解决按原始影像的 ID 分组划分数据集而不是按 patch 文件随机分。也就是说同一张大图裁剪出的所有 patch 必须全部进训练集或全部进验证集。做法是在坐标 CSV 中加入source_id字段划分时按source_id做 group split。5.5 推理拼接后出现规则网格状伪影现象拼接完成的大图上有一圈一圈的矩形边界尤其在道路密集区域特别明显像是给预测结果盖了一层网格。原因patch 边缘的预测结果和中心区域不一致重叠区域融合权重使用不当或者推理时没有使用重叠区直接硬贴。网格状伪影本质上是模型对边界上下文感知不足。解决推理时必须使用带重叠的滑窗拼接时用三角权重融合。重叠区不要低于 64 像素推荐 128 到 256。另外可以尝试推理时做左右翻转TTA把两次预测结果平均后再拼接能进一步压掉边界差异。6. 进阶技巧不动网络结构把道路提取结果“修”出来的三个后处理训练好的模型输出往往不是最终可交付结果。模型预测的 mask 里通常有三个常见毛病碎块噪声、道路边缘锯齿、短线断裂。这三个问题都不需要重新训练靠后处理就能修掉大半。先做形态学开运算去掉碎块噪声。开运算是先腐蚀再膨胀能把面积很小的独立预测块消掉同时保留道路主干。核的大小一般取 5x5 到 7x7核太大会把细道路也腐蚀掉需要针对验证集调一次。然后是去小连通域用连通域分析把所有预测区域标记出来面积小于阈值的区域直接置为背景。阈值怎么定按 patch 尺寸估算512 patch 上面积小于 100 像素的区域基本都是误检可以安全删掉。最后是道路断线连接。直接做闭运算先膨胀再腐蚀能拉近断口但对断口距离较大的情况效果有限。更可靠的方法是把道路 mask 做骨架化检测断点然后用最短路径把相邻断点连接起来。这一步在工程上稍微复杂但效果很直观。import cv2 import numpy as np def postprocess(mask, min_area100, kernel_size5): # 消除小块噪声 kernel cv2.getStructuringElement(cv2.MORPH_RECT, (kernel_size, kernel_size)) opened cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) # 删除小连通域 num_labels, labels, stats, _ cv2.connectedComponentsWithStats(opened, connectivity8) cleaned np.zeros_like(opened) for i in range(1, num_labels): if stats[i, cv2.CC_STAT_AREA] min_area: cleaned[labels i] 1 # 闭运算连接短断口 closed cv2.morphologyEx(cleaned, cv2.MORPH_CLOSE, kernel, iterations2) return closed后处理参数需要针对验证集调一遍核心是 min_area 和 kernel_size 的配合。我的习惯是先跑 5 组参数组合统计后处理前后的 IoU 和连通域数量变化选 IoU 不降且碎块数量明显减少的那组。这里有个细节容易忽略后处理是把双刃剑开运算和去小连通域会把一些真实但细小的道路也删掉闭运算会把原本分离的两条平行道路黏在一起。所以后处理完一定要抽样做视觉确认不能只看 IoU 数字。我的教训很直接第一次用这种道路数据集时我把整张大图直接 resize 到 512 塞进网络训练出来的结果惨不忍睹断线多到没法看。后来老老实实分 patch、记坐标、拼接融合、后处理四件套走完才稳定下来。这个流程不复杂但每一步都省不得。数据决定上限分块和拼接方式决定下限模型只是在中间承上启下。希望这些踩坑记录对你有用。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →