news 2026/10/10 20:57:01

LR-ASPP + MobileNet v3:道路图像语义分割的轻量化实战与PyTorch实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LR-ASPP + MobileNet v3:道路图像语义分割的轻量化实战与PyTorch实现

简介:面向道路场景图像语义分割任务,这份资源提供了一套基于轻量级分割网络与迁移学习的实战工程。利用预训练权重微调,在道路分割数据集上仅训练10个轮次,验证集平均交并比即达到0.98,效果显著,适合希望快速落地轻量级分割模型、掌握迁移学习流程的计算机视觉学习者。压缩包约99.62MB,内含2000个文件,其中1829张PNG掩码标注图、157张JPG原始道路图像,另有7个Python脚本、5个文本说明及2个训练好的模型权重文件,可直接复现实验或进行二次开发。目前已有259人学习下载。资源按图像样本、脚本、权重等分类组织,便于按需取用;脚本覆盖数据加载、训练验证与指标输出等关键环节,配合权重文件可快速加载模型进行道路分割推理,也可作为课程设计或毕业设计的参考基线。

1. 道路图像语义分割的算力困局:LR-ASPP(MobileNet v3)是什么、解决什么问题

在车载前视、路网巡检这类道路图像语义分割任务里,算力往往比精度更先到顶:一套 DeepLab v3 加 ResNet101 的组合在 1080Ti 上勉强跑 8 FPS,真放到 Jetson 这类边缘设备上,单帧推理经常比相机曝光还慢,这也是很多语义分割算法实验室指标漂亮、上车就翻车的原因。LR-ASPP(MobileNet v3)就是冲着这个矛盾去的——骨干换成 MobileNet v3,分割头从标准 ASPP 精简成轻量的 LR-ASPP(Lite Reduced Atrous Spatial Pyramid Pooling),在保留多尺度感受野的同时只留下最必要的几个分支,让一张 512×1024 的道路图像在边缘设备上也能逼近实时。这篇文章从结构取舍讲到训练参数,再给你一条可以照着复现的 PyTorch 路径,适合正在做分割模型选型或想把现有模型做轻的工程师。

2. LR-ASPP 的轻量化逻辑:从标准 ASPP 到 MobileNet v3 骨干的取舍

2.1 标准 ASPP 的四个分支哪里贵,LR-ASPP 改了什么

标准 ASPP 是 DeepLab v3 的核心分割头,它的思路是同一层特征并行走四条路:一个 1×1 卷积,三个不同空洞率(常见 6、12、18)的 3×3 空洞卷积,再加一个全局平均池化分支。每个分支单独抓一个尺度,最后拼接起来过 1×1 卷积。问题很清楚:四个 3×3 空洞卷积在 512×1024 的高分辨率特征图上做,计算量不小;而且全局池化分支会先把特征压成 1×1 再上采样回来,中间还带一次额外卷积,参数冗余。

LR-ASPP 的改法我拆成三刀。第一刀,把三个空洞卷积分支砍成两个,空洞率常用组合是 6 和 12,因为骨干输出步长设成 8 之后,高层特征分辨率比 DeepLab v3 默认的 16 大一倍,不需要太大的空洞率去补感受野。第二刀,全局池化分支保留但瘦身,不再单独走一个完整 1×1 卷积,而是和高层入口用一个更窄的投影,这层从千通道直接压到几十通道,计算量小一个数量级。第三刀,低层特征单独拉一条短连接进来,这条在 2.3 节展开讲。

这样改完,分割头部分的参数量大约只有标准 ASPP 的三分之一到一半。速度上,在 Jetson 级别的设备上,单帧耗时能省出十几毫秒,这对视频流任务非常关键。换来的精度损失通常在 1 到 3 个 mIoU 点之间,对道路场景里的大目标(路面、建筑、绿化带)几乎感知不到差异,主要掉分在细小栏杆、电线这类边缘目标上。

2.2 MobileNet v3 作骨干:Large 还是 Small、输出步长怎么设

MobileNet v3 相比 v2 的关键改动是两处:一是引入了 SE(Squeeze-and-Excitation)注意力模块,二是把激活函数换成了 hard-swish。SE 模块加得比较克制,不是每个 block 都加,而是在后面几个瓶颈层集中用,这样计算量增长很小,但分割时对道路、车辆这些中高层语义的通道权重更敏感,mIoU 通常能比同尺寸的 v2 高 1 到 2 个点。

做道路分割我一般直接用 Large 版本,不用 Small。Small 虽然快,但最后阶段输出通道太窄,分割头拿到的语义信息不够,道路与路边空地的区分容易出现锯齿。Large 在 1080Ti 上做 512×1024 输入,纯骨干推理大概 20 毫秒左右,放到 Jetson Orin 级别也能接受,属于精度和速度都还站得住的选择。

骨干结构上有一个必须调的地方:输出步长(output stride)。MobileNet v3 原始分类网络的最终下采样是 32 倍,这直接拿来做分割,8 倍下采样后的小目标细节全没了。常见做法是把最后两个下采样 stage 的空洞卷积打开,保持特征分辨率在输入的 1/8,这就是 OS=8。对应到 torchvision 的 v3 large 实现,需要把 features 网络最后几个 bneck 里的 stride=2 改成 stride=1,并把后续卷积的 dilation 相应设成 2。这条路不复杂,但是容易漏,我自己的习惯是改完专门打印一遍每个 stage 的输出尺寸,确认下采样倍率符合预期再进训练,这个习惯帮我避过几次“看起来在跑、实际分辨率不对”的坑。

2.3 低层特征融合:为什么道路边缘需要它

道路图像语义分割和其他场景有个显著不同:道路边界、路缘石、车道线这些目标非常依赖高频边缘信息。高层特征经过八次下采样,语义清晰但边缘模糊,单独靠高层特征做分割,路面和路缘石往往糊成一团。这也是很多语义分割模型在 Cityscapes 上看起来不错、换到园区内部道路就翻车的原因之一。

LR-ASPP 里补了一条低层特征的短连接。通常取 MobileNet v3 Large 中下采样倍率达到 8 的那个 stage 输出,通道数大概是 24 或者 40,分辨率和高层特征一致,不需要额外上采样。这条低层特征先过一个 1×1 卷积压缩到几十个通道,然后在分割头内部与高层融合分支拼接。我自己复现的时候,低层通道压到 32 个就够,再宽速度损失大于精度收益。

低层特征的作用在夜间或逆光场景尤其明显。白天光照均匀,高层语义还能猜出边界,到了黄昏或树影遮挡路段,高层语义错误率上升,低层边缘信息就成了救命的先验。这也是为什么 LR-ASPP 用最低的参数量换回了接近标准 ASPP 的效果——它不是简单砍分支,而是把节省的算力转移到了更关键的信息通路上。

3. 道路图像数据集与预处理:从街景到遥感路网,先解决类别不平衡

3.1 两类主流道路数据的组织方式与标签处理

道路图像语义分割的数据主要有两类来源。一类是车载相机拍的前视街景,代表是 Cityscapes,包含路面、建筑、行人、车辆等 30 个标注类别,但公开评估只用其中 19 类,剩余类别在评估时直接忽略;另一类是遥感图像语义分割场景下的卫星或无人机正射影像,比如 DeepGlobe Road Extraction,任务是二分类,只分“道路”和“非道路”,标签是二值 PNG。

两类数据在代码里的组织方式差别不大,都是图像加同尺寸的标签图,但预处理完全不是一个套路。街景数据分辨率高,常见是 1024×2048,显存吃不消,必须随机裁剪或缩放;遥感道路影像通常是几百到一千像素的方块,道路占比很低,需要额外处理样本不平衡。我建议手头不管哪类数据,先统一做成数据类返回 pair:输入图像张量加上标签张量,标签里要约定好 ignore_index,把不需要参与训练的像素统一设成 255,这样在损失函数里一行代码就能排除掉。Cityscapes 里的灰色未知类、遥感标签里的背景类,在实现上建议都走 ignore_index 机制,而不是把它们当作一个额外类别去训练,否则 mIoU 会被明显拉低。

3.2 归一化、随机裁剪与增强参数表

训练前处理是影响收敛速度最直接的一环。归一化我用 ImageNet 的标准统计量,均值 0.485、0.456、0.406,方差 0.229、0.224、0.225,这个不在 ImageNet 上训练的 MobileNet v3 也适用,因为骨干预训练权重就是按这个统计量来的。后面接入自己的数据集,可以直接沿用,不需要重新统计均值方差,省一步是一步。

增强参数这块,我常年用一套组合,对不同分辨率的数据都还算稳,整理成表你直接抄:

增强项参数设置说明
随机水平翻转p=0.5街景和遥感都适用,方向无关
随机缩放0.5~2.0,长边对齐缩放后接随机裁剪,相当于多尺度训练
随机裁剪512×512 或 768×768显存小的用 512,mIoU 略低但稳定
色彩抖动亮度 ±0.3,对比度 ±0.3,饱和 ±0.3应对光照变化,遥感图可以不开
高斯模糊p=0.1,核半径 1~3模拟雨天或镜头失焦,最后加

随机裁剪尺寸要在读数据时动态决定,最省事的办法是先在外部把图像 resize 到长边 1024,再在数据类里做随机裁剪。遥感影像可以直接裁 512×512 的块,重叠率设 50% 可以防止道路跨块断裂。

3.3 类别权重计算:道路占比大但别让它吃掉 loss

道路分割最典型的坑是类别不平衡。街景数据里路面像素占了一半,行人和摩托车加起来不到百分之一;遥感路网数据更极端,道路像素经常只有百分之几。如果直接拿原始交叉熵去训练,loss 被路面主导,模型会倾向把所有像素都判成路面,mIoU 看起来不低,但一看道路边界全是锯齿。

常见做法是算类别权重后加权交叉熵。权重我一般用 median frequency balance,公式是每个类别的权重等于所有类别像素频率的中位数除以该类像素频率。这样路面权重小于 1,行人、摩托车权重拉高十几倍。实现上可以先扫一遍训练集统计每个类别的像素频数,存成 numpy 数组,再在损失函数里按权重结算:

import numpy as np import torch import torch.nn as nn import torch.nn.functional as F def build_class_weight(pixel_counts, ignore_index=255): counts = np.array(pixel_counts, dtype=np.float64) freq = counts / counts.sum() median = np.median(freq[freq > 0]) weights = median / freq weights[freq == 0] = 0.0 return torch.from_numpy(weights).float() class WeightedCrossEntropy(nn.Module): def __init__(self, weight, ignore_index=255): super().__init__() self.weight = weight self.ignore_index = ignore_index def forward(self, logits, labels): return F.cross_entropy( logits, labels, weight=self.weight.to(logits.device), ignore_index=self.ignore_index, )

build_class_weight 里的 median_frequency 逻辑是关键,class_weight 直接传给交叉熵的 weight 参数。如果训练中发现某些小类别始终不激活,可以手动把它的权重再乘个 1.5 到 2 倍,但这种人工修正不要超过三个类别,否则会扰动整体收敛节奏。顺带一提,遥感图像语义分割里道路占比极低时,我会把损失函数换成加权交叉熵加 Dice loss 的混合形式,Dice loss 对前景占比不敏感,这个组合在 DeepGlobe 上效果比单独用任何一种都稳。

4. 把 LR-ASPP 跑起来:PyTorch 实现与完整训练参数

4.1 LR-ASPP 模块的 PyTorch 实现

分割头是整个复现的核心部分,我先给出一个简洁可跑的 LR-ASPP 实现。这里的高层特征输入来自 MobileNet v3 Large 的最后输出,低层特征来自下采样 8 倍的那个 stage,具体索引需要结合你使用的 torchvision 版本打印 features 信息后确认,我用注释标出。

import torch import torch.nn as nn import torch.nn.functional as F class LRASPP(nn.Module): """Lite Reduced Atrous Spatial Pyramid Pooling 分割头""" def __init__(self, low_in=24, high_in=1280, out_ch=128, rates=(6, 12)): super().__init__() # 低层特征投影:通道从 low_in 压到 32 self.low_proj = nn.Conv2d(low_in, 32, 1, bias=False) # 高层特征入口投影 self.high_proj = nn.Conv2d(high_in, out_ch, 1, bias=False) # 全局上下文分支:GAP 后只做一次 1x1 卷积 self.gap_proj = nn.Conv2d(high_in, 32, 1, bias=False) # 两个空洞卷积分支,rate 默认 6 和 12 self.br1 = nn.Conv2d( high_in, 32, 3, padding=rates[0], dilation=rates[0], bias=False ) self.br2 = nn.Conv2d( high_in, 32, 3, padding=rates[1], dilation=rates[1], bias=False ) # 拼接融合:低层32 + 高层out_ch + 全局32 + 两个分支各32 fuse_in = 32 + out_ch + 32 * 3 self.fuse = nn.Conv2d(fuse_in, out_ch, 1, bias=False) def forward(self, low_feat, high_feat): n, c, h, w = high_feat.shape # 全局池化分支,双线性上采样回高分辨率 gap = self.gap_proj(F.adaptive_avg_pool2d(high_feat, 1)) gap = F.interpolate(gap, (h, w), mode="bilinear", align_corners=False) # 两个不同空洞率的分支直接作用在高层特征上 b1 = self.br1(high_feat) b2 = self.br2(high_feat) # 低层特征上采样到与高层同分辨率再投影 low = F.interpolate(low_feat, (h, w), mode="bilinear", align_corners=False) low = self.low_proj(low) high = self.high_proj(high_feat) feats = torch.cat([low, high, gap, b1, b2], dim=1) return self.fuse(feats)

这个实现里 low_proj 的输入形状是假设 low_feat 已经和 high_feat 具备相同分辨率,如果实际骨干中低层特征是高层的一半,需要先做一次上采样,代码里已经用 interpolate 处理了这种情况。rate 参数需要注意:输出步长为 8 时用 (6, 12) 比较稳妥,如果你把骨干改成 OS=16,空洞率要放大到 (12, 24) 才能保持感受野覆盖,这一点在第 5 章的避坑清单里还会单独说。

4.2 训练脚本与十个关键参数说明

完整模型封装我习惯把 MobileNet v3 的 features 直接切片拿过来,这样不用改动 torchvision 的源码,只是要注意打印确认每个 stage 的输出通道。具体封装和训练脚本如下:

import torchvision from torchvision.models import mobilenet_v3_large class MobileNetV3LRASPP(nn.Module): def __init__(self, n_classes=19, low_idx=3, high_idx=-1): super().__init__() mb = mobilenet_v3_large(pretrained=True) self.features = mb.features # 打印 features 每个 stage 的通道数,确认 low_idx 对应的输出 for i, f in enumerate(self.features): if hasattr(f, "out_channels"): print(i, f.out_channels) self.low_idx = low_idx self.high_idx = high_idx if high_idx > 0 else len(self.features) low_in = self.features[low_idx].out_channels high_in = self.features[self.high_idx - 1].out_channels self.head = LRASPP(low_in=low_in, high_in=high_in, out_ch=128) self.classifier = nn.Conv2d(128, n_classes, 1) def forward(self, x): low_feat = self.features[:self.low_idx + 1](x) high_feat = self.features[self.low_idx + 1:](low_feat) out = self.head(low_feat, high_feat) out = self.classifier(out) out = F.interpolate( out, x.shape[-2:], mode="bilinear", align_corners=False ) return out

编码器部分的核心是两个索引:low_idx 取的是输出步长为 8 的 stage,high_idx 直接取 features 的最后一层。打开 pretrained=True 时 torchvision 会自动下载权重,如果网络受限,也可以手动下载后通过 load_state_dict 加载,这部分在第 5 章踩坑清单里细讲。分类器用 1×1 卷积避免引入额外参数量,最后双线性上采样到输入分辨率。

训练阶段我用的是对标原论文习惯的参数组合,但在实际落地时做了两处微调。初始学习率从常见的 0.01 降到 0.007,因为 MobileNet v3 配合分割头时大学习率容易在前 5 个 epoch 就把 BN 统计量打崩;学习率调度用多项式衰减,公式为 lr × (1 - epoch/total_epochs) 的 0.9 次方,而不是 StepLR,经验是这种逐步下降的方式在分割任务里收敛更平滑。优化器用 SGD,momentum 0.9,weight decay 1e-4。Batch size 在 512×512 输入下,单张 12GB 显存可以开到 8,batch size 低于 4 时建议开同步 BN,否则类间差异会明显增大。

整个训练配置我整理成一个字典方便统一调整:

train_cfg = { "img_size": 512, "batch_size": 8, "lr": 0.007, "epochs": 120, "momentum": 0.9, "weight_decay": 1e-4, "power": 0.9, "num_workers": 4, }

其中 power 是多项式衰减的指数,0.9 是主流的经验值;epochs 设在 120 是因为分割任务比分类收敛慢,前 30 个 epoch 基本是在稳定骨干的 BN 统计量,真正涨点从 40 轮以后才开始。如果你用遥感道路二分类,epochs 可以减到 80,因为二分类任务简单,收敛路径短。

4.3 训练到多少轮开始收敛:Loss 曲线怎么判读

判断训练状态最靠谱的做法是看每个 epoch 的验证 mIoU 而不是训练 loss。我见过不少人在训练 loss 降到很低后觉得完事大吉,结果验证集 mIoU 只有 60 出头,原因是过拟合到了训练集的色彩分布上。训练 loss 曲线在 30 到 40 轮会进入平台期,但验证 mIoU 通常还会缓慢爬升到第 80 轮左右,这个阶段不要急着调学习率,保持多项式衰减的节奏让它自己走。

如果前 10 个 epoch 训练 loss 几乎不降,先排查学习率和 BN 设置,而不是加数据。常规做法是先冻结骨干前 10 个 epoch,只训练分割头和分类器,待 loss 稳定下探后解冻骨干微调。解冻后学习率减半,这样能避免骨干刚解冻时梯度突增把之前学到的特征冲掉。

5. LR-ASPP 实战避坑清单:5 个高频翻车点与解决办法

5.1 显存不够,训练直接死在第一步

现象是代码一跑就报 CUDA out of memory,连第一个 step 都没走完。原因是 1024×2048 的 Cityscapes 原图直接喂了进去,512×1024 的高分辨率特征再乘以 batch size,显存直接爆掉。解决方法是先把图像长边 resize 到 1024 再随机裁剪到 512×512。

5.2 空洞率与输出步长不匹配,远处目标全糊

有次我把骨干输出步长从 8 改回 16 想省显存,但忘记同步调整空洞率。现象是道路尽头的小车和行人完全识别不到,近处的大目标反而正常。原因是输出步长变大后,高层特征分辨率减半,原本 rate=6 的空洞卷积感受野相对变小,覆盖不到远距离大目标。解决方法是步长 8 用 (6, 12),步长 16 时改用 (12, 24)。

5.3 mIoU 算高了的假象:评估口径问题

第一版训练我直接在验证集上算 mIoU,指标接近 80,但现场测试差得远。检查后发现,Cityscapes 的 19 类评估是排除 ignore 像素的,而我没有设置 ignore_index,把灰色未知区域当成了一类参与计算。解决方法是评估时 labels 的 255 像素要单独置零不参与混淆矩阵累计,并且只统计 19 个有效类别。

5.4 道路与路缘石粘合,后处理救不回来

现象是分割结果图里路面和路缘石中间有一条模糊带,形态学开运算处理了半天还是糊。原因是低层特征分支的 32 通道压缩太狠,边缘信息丢了一部分。解决方法是把 low_proj 的输出通道从 32 提到 48,同时减小低层特征上采样时的 align_corners 对齐误差,实测 mIoU 涨了 0.6 个点,速度几乎没变。

5.5 加载 MobileNet v3 预训练权重时通道对不上

用 load_state_dict 加载 torchvision 权重时,提示 unexpected key 或者 missing key,这是最常遇到的加载问题。原因是预训练权重里包含最后的分类器,和分割头的前缀不一致。解决方法是只取 features 部分过滤加载,代码示例如下:

state = torch.load("mobilenet_v3_large.pth", map_location="cpu") filtered = { k: v for k, v in state.items() if k.startswith("features.") } model.features.load_state_dict(filtered, strict=True)

这条是纯的 dict key 过滤,不要用 strict=False 直接全量加载,否则分类头通道不一致的 warning 会伴随整个训练周期。

6. 从训练到上线的验证技巧:mIoU 口径、推理速度与量化取舍

验证时别只盯着 mIoU 一个数,要看逐类别的 IoU。道路相关类别里,aerial 或路面 IoU 通常 85 以上,行人和骑行者 IoU 可能只有 50,这组数据才是改进方向的依据。统计 mIoU 时要严格只算 19 类有效类别,忽略 ignore_index,前后口径统一才可比较。

上线前的推理加速,我一般先做一次 ONNX 导出,再做 TensorRT 或 ONNX Runtime 加速。导出时有一个关键坑:F.interpolate 在 ONNX 默认导出会变成 opset 版本相关的 Resize 算子,align_corners 参数不一致会导致输出发生轻微偏移,分割结果出现一排锯齿。解决方法是固定使用 align_corners=False,并在导出时明确 opset_version=11。示例代码:

dummy = torch.randn(1, 3, 512, 512) torch.onnx.export( model, dummy, "lraspp.onnx", opset_version=11, input_names=["image"], output_names=["logits"], dynamic_axes={"image": {0: "batch"}, "logits": {0: "batch"}}, )

量化是把模型压到边缘设备的关键一步。MobileNet v3 里的 hard-swish 激活和部分 SE 模块在 INT8 量化下容易掉点,这是它的老毛病。如果你想走 INT8,优先量化卷积层、保留激活层为浮点,或用 TensorRT 的 QAT 重新训练几万步,不要直接拿 PTQ 静态量化,否则 mIoU 掉 5 个点以上并不奇怪。我自己的习惯是边缘设备如果支持 FP16,就优先用 FP16,速度和显存都省,精度几乎无损;INT8 留给那些对功耗特别敏感的场景。

分割模型量化前的最后一个验证动作,是把训练时的预处理管线完整复刻到推理代码里,归一化均值方差、双线性插值方式、输入尺寸,一个都不能差,否则训练 78 的 mIoU,到线上变成 60 几,问题不在模型,在推理管线。我现在的做法是每次训练完先保存一个推理配置 JSON,包含预处理参数和模型输入尺寸,跟权重文件放一起,上线时直接读配置,不在推理代码里手写第二遍。这套组合让我踩坑的次数明显少了很多,希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 20:53:38

Linux文本处理三剑客:grep、sed与awk实战解析

Linux 文本处理工具,这三个词组合在一起,可能第一反应是“这有什么好讲的,不就是 grep、sed、awk 嘛”。但如果你真在服务器上排查过 800MB 的日志文件,被满屏的报错刷到眼花,或者需要从一段接口返回里精确抠出某个字段…

作者头像 李华
网站建设 2026/10/10 20:53:09

中外儿童背诵内容对比:中国娃吟诗作对,外国娃背什么?

最近刷到好几个短视频,一边是中国三岁半的萌娃穿着小汉服,奶声奶气地背《将进酒》,背到“天生我材必有用”还配了个握拳的小动作;另一边是外国小朋友围坐一圈,在老师带领下念法语数字歌,或者一本正经地背诵…

作者头像 李华
网站建设 2026/10/10 20:52:22

微信小程序校园社交开发实战:云开发+SpringBoot混合架构与避坑指南

简介:这份PDF文档是2021年中国高校计算机大赛微信小程序应用开发赛中南赛区二等奖作品“约在南华校园”的完整说明资料,面向参赛学生、小程序开发者及对校园兴趣社交产品感兴趣的学习者。文档围绕一款服务华中地区高校学生的轻量级社交平台展开&#xff…

作者头像 李华
网站建设 2026/10/10 20:48:29

按钮禁用时 hover 效果还在?用 is-disabled 彻底消除的完整方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/10 20:46:43

Kettle 5.x从安装到ETL作业编排:数据同步避坑实践指南

简介:这是一份面向数据集成工程师、ETL初学者及相关技术人员的Kettle实用手册,聚焦Spoon组件与Kettle 5.x版本操作,涵盖安装、资源库配置、自动登录、转换与作业定义、工具栏及选项设置等核心模块,并配有案例说明,帮助…

作者头像 李华
网站建设 2026/10/10 20:43:38

基于yolo11的血液细胞检测实战:BCCD数据集从训练到部署

简介:面向医学影像分析与目标检测开发者的YOLO11血液细胞图像检测资源包,聚焦血涂片中的血小板、红细胞与白细胞识别,辅助血液疾病诊断。包内整合三百六十四张已标注的血液细胞图像,提供文本标签与可扩展标记语言标签两套格式&…

作者头像 李华