
教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本文以微软 AI-For-Beginners 课程体系当前仓库lessons/4-ComputerVision/12-Segmentation的「图像分割」一课为骨架系统讲解分割任务的定义、语义分割与实例分割的区别、编码器-解码器网络结构、分割专用的损失函数并基于 PH² 皮肤镜图像数据集完整复现 SegNet 与 U-Net 在 PyTorch 与 TensorFlow 两种框架下的训练与评估流程。读完本文你将掌握图像分割从理论到实战的完整链路并能独立用开源课程附带的 Notebook 跑通「痣区域分割」与「人体轮廓分割」两类典型任务。从目标检测到像素级分割在图像任务中目标检测通过预测边界框bounding box来定位物体但对于某些任务我们需要的不仅是边界框而是更精确的物体定位——这就是分割Segmentation。分割可以看作像素级分类pixel classification对于图像中的每一个像素我们都必须预测其类别其中「背景」本身也是一个类别。按照输出粒度分割算法主要分为两类语义分割Semantic segmentation只告诉每个像素的类别不区分同一类别的不同物体实例实例分割Instance segmentation在给出类别的同时把同类物体划分为不同的实例。例如对于一群羊实例分割把每只羊当作独立对象语义分割则把所有羊视为同一个类别。二者的差异可用课程示意图直观呈现图片引自公开博客文章 Image Classification vs. Semantic Segmentation vs. Instance Segmentation。分割网络的统一骨架编码器 解码器虽然分割的神经网络架构有多种但它们的整体结构是统一的。从某种意义上说这与本课程此前学过的自编码器很相似——区别在于自编码器的目标是重构原始图像而分割网络的目标是输出一张掩码图mask。因此一个分割网络包含两个核心部分编码器Encoder从输入图像中提取特征解码器Decoder将这些特征转换为掩码图像其尺寸与原图一致通道数对应类别数量。架构图引自 2020 年论文《Image Segmentation Using Deep Learning: A Survey》arXiv:2001.05566。分割专用的损失函数交叉熵与二元交叉熵分割任务对损失函数有专门要求。使用经典自编码器时我们测量两张图像之间的相似度通常用均方误差MSE即可。但在分割任务中目标掩码图的每个像素代表的是类别编号在第三维上做 one-hot 编码因此必须使用适用于分类任务的损失函数——交叉熵损失cross-entropy loss并对所有像素取平均。当掩码是二值的例如本课的痣/背景二分类时使用的是二元交叉熵损失BCEBinary Cross-Entropy loss。知识卡片one-hot 编码是把一个类别标签编码成长度等于类别总数的向量。例如有 3 个类别时类别 2 可编码为[0,1,0]。这一设计在课程附带的两个 Notebook 中得到直接印证PyTorch 版SemanticSegmentationPytorch.ipynb使用nn.BCEWithLogitsLoss()TensorFlow 版SemanticSegmentationTF.ipynb使用losses.BinaryCrossentropy(from_logitsTrue)。两个框架都显式声明from_logits即模型最后一层直接输出未经 sigmoid 的 logits由损失函数内部完成 sigmoid 与交叉熵的数值稳定计算。实战场景PH² 皮肤镜数据集上的痣分割本课选择了一个非常契合分割特点的医学影像场景训练网络识别医学图像中的人类痣nevus俗称「痦子」。数据来源是PH² 皮肤镜图像数据库该数据集包含200 张皮肤镜图像分为三类典型痣、非典型痣和黑色素瘤。所有图像都附带一张勾勒病灶轮廓的掩码。课程的目标是训练模型把任意一颗痣从背景中分割出来。图片来自 PH² 数据库。数据加载与预处理在 SemanticSegmentationPytorch.ipynb 中数据加载逻辑如下!wget https://www.dropbox.com/s/k88qukc20ljnbuo/PH2Dataset.rar !unrar x -Y PH2Dataset.rar解压依赖unrar工具Linux 下可用sudo apt-get install unrar安装Windows 下可下载命令行版本。随后定义load_dataset(train_part, rootPH2Dataset)函数遍历PH2 Dataset images目录从*_Dermoscopic_Image子目录读取原始图像从*_lesion子目录读取掩码将所有图像与掩码统一缩放为256×256其中掩码通过resize(..., anti_aliasingFalse) 0.5二值化并unsqueeze(1)增加通道维最后按比例随机划分训练集与测试集。PyTorch 版训练超参数device cuda:0 if torch.cuda.is_available() else cpu train_size 0.9 # 90% 数据用于训练 lr 1e-3 # Adam 学习率 weight_decay 1e-6 # 权重衰减 batch_size 32 epochs 30TensorFlow 版SemanticSegmentationTF.ipynb则使用了不同的超参数组合train_size 0.8、lr 3e-4、weight_decay 8e-9、batch_size 64、epochs 100。两套配置说明训练分割模型时学习率、数据划分比例、批大小与迭代轮数都是需要根据框架和资源灵活调整的超参数。架构一SegNet —— 最朴素的编码器-解码器SegNet是最简单的编码器-解码器架构Badrinarayanan, Kendall Cipolla, 2015arXiv:1511.00561。编码器使用带卷积与池化的标准 CNN解码器使用包含卷积与上采样的反卷积式 CNN并依赖**批归一化Batch Normalization**保证多层网络稳定训练。图源自 SegNet 论文《SegNet: A deep convolutional encoder-decoder architecture for image segmentation》。PyTorch 版 SegNet 的核心结构节选自 Notebookclass SegNet(nn.Module): def __init__(self): super().__init__() # 编码端3→16→32→64→128 通道每级 Conv2d(3,3) ReLU BatchNorm MaxPool2d(2,2) self.enc_conv0 nn.Conv2d(in_channels3, out_channels16, kernel_size(3,3), padding1) ... # 瓶颈128→256 通道的 1×1 卷积 self.bottleneck_conv nn.Conv2d(in_channels128, out_channels256, kernel_size(3,3), padding1) # 解码端UpsamplingBilinear2d(2) Conv2d通道 256→128→64→32→1 ... self.sigmoid nn.Sigmoid() def forward(self, x): e0 self.pool0(self.bn0(self.act0(self.enc_conv0(x)))) ... b self.bottleneck_conv(e3) d0 self.dec_bn0(self.dec_act0(self.dec_conv0(self.upsample0(b)))) ... d3 self.sigmoid(self.dec_conv3(self.upsample3(d2))) return d3TensorFlow 版 SegNet 使用keras.Conv2D、keras.BatchNormalization、keras.MaxPool2D与keras.UpSampling2D(interpolationbilinear)一一对应实现相同结构最后以Conv2D(1, kernel_size1)输出单通道 logits。架构二U-Net —— 用跳跃连接保住空间细节SegNet 结构自然但并非最精确。原因是对原始图像先做金字塔式 CNN 压缩会降低特征的空间精度重建图像时无法精确还原像素位置。于是有了在编码器与解码器卷积层之间建立**跳跃连接skip connections**的思路——这一在语义分割中非常经典的架构就是U-NetRonneberger, Fischer Brox, 2015arXiv:1505.04597。每一层的跳跃连接帮助网络保留该层原始输入的特征信息不因逐级池化而丢失。图源自 U-Net 论文《U-Net: Convolutional networks for biomedical image segmentation》。值得注意的是U-Net 正是为生物医学图像分割而设计与本课医学影像场景高度契合。课程中的 U-Net 使用较为简单的 CNN 编码器实际应用中 U-Net 也可以使用更复杂的编码器如 ResNet-50做特征提取。PyTorch 版实现的核心是解码时沿通道维拼接torch.cat上采样结果与对应层的编码特征d0 self.dec_bn0(self.dec_act0(self.dec_conv0(torch.cat((self.upsample0(b), cat3), dim1)))) d1 self.dec_bn1(self.dec_act1(self.dec_conv1(torch.cat((self.upsample1(d0), cat2), dim1)))) d2 self.dec_bn2(self.dec_act2(self.dec_conv2(torch.cat((self.upsample2(d1), cat1), dim1)))) d3 self.sigmoid(self.dec_conv3(torch.cat((self.upsample3(d2), cat0), dim1)))注意编码器各层通道数为 16/32/64/128拼接后解码器输入通道为 384/192/96/48即上采样特征与同尺度编码特征之和因此 U-Net 相比 SegNet 增加了信息通路。TensorFlow 版用keras.Concatenate(axis3)完成同样的拼接逻辑。训练循环PyTorch 版训练循环为常规流程optim.Adam(model.parameters(), lrlr, weight_decayweight_decay)nn.BCEWithLogitsLoss()每个 epoch 内先model.train()遍历训练集optimizer.zero_grad()→loss.backward()→optimizer.step()再model.eval()配合torch.no_grad()计算测试损失并借助tqdm输出 train/test loss。TensorFlow 版则直接使用model.compile(lossloss_fn, optimizeroptimizer)与model.fit(..., validation_data...)。评估与可视化训练完成后课程用「目标掩码 vs 预测掩码」并排绘图的方式直观评估效果将测试图像送入模型输出经 0.5阈值二值化后与真实掩码对比plotn函数。此外分割任务也有更正式的评估指标其中最容易理解的是像素准确率pixel accuracy——分类正确的像素所占百分比。实战延伸人体轮廓分割实验室本课还配套一个实战实验室lab/README.md人体分割Human Body Segmentation。在视频制作例如天气预报中常需要把摄像头拍摄的人像抠出来叠加到其他画面上传统做法是**色键chroma key**技术——人在纯色背景前拍摄后再移除背景。本实验室改为训练神经网络模型直接抠出人体剪影。实验使用 Kaggle 上的 Segmentation Full Body MADS Dataset 开始实验。人体的分割/检测还有其他重要方向例如骨骼检测skeleton detection与姿态检测pose detection可借助 OpenPose 等开源库进一步探索。总结分割是图像分类领域中非常强大的技术它将任务从边界框推进到像素级分类分割网络以「编码器提取特征 解码器输出同尺寸类别掩码」为统一骨架配合适用于分类的交叉熵损失二分类场景使用 BCE完成训练。本课通过 PH² 皮肤镜数据集上的痣分割实战完整演示了 SegNet 与 U-Net 两种架构在 PyTorch 与 TensorFlow 双框架下的实现、训练与评估流程并在实验室中扩展到人体轮廓分割。除医学影像外分割在自动驾驶、遥感图像、视频抠像等领域同样有广泛的应用空间。进一步学习阅读完整课程讲义12-Segmentation/README.md动手运行两个 NotebookSemanticSegmentationPytorch.ipynb 与 SemanticSegmentationTF.ipynb完成人体分割实验lab/README.md参考本课程计算机视觉主线中的前序知识目标检测、自编码器以及课程总览 README.md赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI for Beginners 图像分割全解析从像素分类到医学影像分割的 SegNet 与 U-Net 实战AI for Beginners 图像分割全解析从像素分类到医学影像分割的 SegNet 与 U Net 实战 本指南基于 AI For Beginners教程人工智能机器学习深度学习AI-For-Beginners 语义分割实战指南从像素级分类到医学图像分割SegNet 与 U-Net 完整实现AI For Beginners 语义分割实战指南从像素级分类到医学图像分割SegNet 与 U Net 完整实现 本篇技术指南基于 AI For Beg教程人工智能机器学习深度学习AI-For-Beginners 图像分割实战指南从像素级分类到医学影像病变分割AI For Beginners 图像分割实战指南从像素级分类到医学影像病变分割 图像分割Segmentation是计算机视觉中比目标检测更进一步的任务教程人工智能机器学习深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考