- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
本文以 AI for Beginners 课程第 12 课《Segmentation》的实验室任务(translations/bn/lessons/4-ComputerVision/12-Segmentation/lab/README.md)为核心,完整讲解"人体分割(Body Segmentation)"这一经典计算机视觉任务:从视频制作中的色键(chroma key)应用场景出发,使用公开数据集训练一个能把"人体轮廓"从照片中精确抠出的神经网络模型。读完本文,你将掌握人体分割任务的定义、数据集的下载与预处理流程、启动实验笔记本的完整步骤,并理解语义分割背后的编码器-解码器架构与损失函数原理,还能把知识延伸到骨骼检测与姿态检测等相邻任务。
实验背景:为什么视频制作需要人体分割
在视频制作中,例如天气预报节目,经常需要把摄像机拍摄到的人物图像"剪下来",再叠加到另一段背景画面上。传统做法是使用**色键(chroma key)**技术:让人站在纯色背景(通常是绿幕或蓝幕)前拍摄,后期再把单色背景替换掉。
色键方案的局限在于:它对拍摄环境、服装颜色、光照条件都有严格要求,一旦人物衣物或道具与背景色接近,抠图就会失效。因此,本实验室提出一个更通用的方案——直接训练一个神经网络模型来分割(cut out)人体剪影,让模型逐像素地判断"这个像素属于人还是属于背景",从而摆脱纯色背景的限制。
人体分割属于图像分割(Segmentation)任务,可以把它理解为像素级分类(pixel classification):对于图像中的每一个像素,模型都必须预测其类别(背景本身就是其中一个类别)。在 12-Segmentation 课程正文 中,还区分了两种主要的分割算法:
- 语义分割(Semantic segmentation):只给出像素类别,不区分同一类别中的不同个体;
- 实例分割(Instance segmentation):把同一类别再细分为不同实例(例如羊群中的每一只羊)。
实验目标与任务说明
本实验的核心任务非常明确:
训练一个神经网络模型,使其能够自动"切出"人体轮廓(human silhouette),即对输入的人物照片输出一张与输入同尺寸的掩码图(mask),掩码中人体区域的像素为前景、其余为背景。
仓库中该实验室的入口文件是 BodySegmentation.ipynb,它是 12-Segmentation/lab 目录 下的启动笔记本,包含数据集目录约定与图片/掩码可视化代码。
数据集:Segmentation Full Body MADS Dataset
实验室指定使用 Kaggle 上的Segmentation Full Body MADS Dataset(人体全身分割数据集)。使用流程如下:
- 从 Kaggle 手动下载该数据集;
- 解压到当前目录;
- 按笔记本中的约定把解压目录重命名为
segmentation_full_body_mads_dataset_1192_img。
在 BodySegmentation.ipynb 的开头,笔记本正是这样设定数据路径的:
dataset_path = 'segmentation_full_body_mads_dataset_1192_img' import os import matplotlib.pyplot as plt数据集内部采用两个并列子目录组织:
images/:原始人体照片;masks/:与照片一一对应的分割掩码图(文件名一一对应)。
数据加载与可视化:第一步实操
笔记本随后定义了读取"原图 + 掩码"对的辅助函数,并用matplotlib把一对样本并排显示出来,用于直观检查数据质量:
img_path = os.path.join(dataset_path,'images') mask_path = os.path.join(dataset_path,'masks') fnames = os.listdir(img_path) def load_image(img_name): img = plt.imread(os.path.join(img_path,img_name)) mask = plt.imread(os.path.join(mask_path,img_name)) return img,mask取第 5 个样本并并排绘制:
img, mask = load_image(fnames[5]) fig,ax = plt.subplots(1,2,figsize=(10,5)) ax[0].imshow(img) ax[1].imshow(mask) ax[0].axis('off') ax[1].axis('off')这段代码的意义在于:在训练模型之前,先确认images与masks的文件名能够一一对应,且掩码确实勾勒出了人体轮廓。后续搭建分割网络时,模型的学习目标就是"输入img、输出尽可能接近mask的预测图"。
分割模型的技术底座:编码器-解码器架构
本实验室的动手部分虽然以数据集与数据加载为起点,但完成训练还需要理解分割网络的通用结构。在 12-Segmentation 课程正文 中明确指出:几乎所有分割神经架构都具有相同的结构,并且与之前学过的自编码器(autoencoder)类似——区别在于,分割网络"解构"的目标不是重建原图,而是重建一张掩码图:
- 编码器(Encoder):从输入图像中提取特征;
- 解码器(Decoder):把特征转换成与输入同尺寸、通道数等于类别数的掩码图像。
课程配套的 Segmentation 架构示意图 展示了这一"先压缩特征、再放大回原尺寸"的完整流程。
损失函数:为什么分割不能用 MSE
分割任务与经典自编码器在损失函数选择上有本质差异。自编码器衡量两张图像的相似度可以用均方误差(MSE);但分割任务中,目标掩码的每个像素代表的是类别编号(沿第三维做 one-hot 编码),因此必须使用面向分类的损失函数——对所有像素求平均的交叉熵损失(cross-entropy loss)。当掩码是二值的(本实验室的人体分割正是如此:前景/背景两类),则应使用二元交叉熵损失(BCE,binary cross-entropy loss)。
仓库中 SemanticSegmentationPytorch.ipynb 给出了与上述理论完全一致的工程实现:
model = SegNet().to(device) optimizer = optim.Adam(model.parameters(), lr=lr, weight_decay=weight_decay) loss_fn = nn.BCEWithLogitsLoss()其中训练超参数也在笔记本中集中配置(可在本实验室中复用):
device = 'cuda:0' if torch.cuda.is_available() else 'cpu' train_size = 0.9 lr = 1e-3 weight_decay = 1e-6 batch_size = 32 epochs = 30两种典型网络:SegNet 与 U-Net
课程配套笔记本对两类分割架构做了完整实现,可作为本实验选型的参考:
SegNet是最简单的编码器-解码器结构:编码器使用带卷积、池化的标准 CNN 逐级提取特征,解码器使用包含卷积与上采样的反卷积 CNN 把特征恢复为掩码;多层网络的训练依赖**批归一化(batch normalization)**来保证稳定。
U-Net则引入了跳跃连接(skip connections):U-Net 通过在编码器与解码器之间逐层把编码阶段的特征与上采样后的特征做torch.cat拼接(对应实现位于 SemanticSegmentationPytorch.ipynb 的UNet.forward中,例如d0 = ... torch.cat((self.upsample0(b), cat3), dim=1)),让网络在重建时不会丢失原始输入在该层级的细节信息,从而显著提升分割的像素级精度。这也是 U-Net 在生物医学图像分割等需要精细边界的任务中被广泛采用的原因。U-Net 架构示意图 直观展示了"U"形的跳跃连接结构。
从源码结构看,SemanticSegmentationTF.ipynb 提供了同一套分割任务在 TensorFlow/Keras 下的对应实现(其超参数设置为train_size=0.8、lr=3e-4、batch_size=64、epochs=100),两套框架的实验可以互为对照。
如何运行本实验室
完成本实验的推荐步骤:
- 阅读 12-Segmentation 课程正文,掌握分割、编码器-解码器、U-Net 等概念;
- 从 Kaggle 手动下载 Segmentation Full Body MADS Dataset 并解压到当前目录;
- 打开 BodySegmentation.ipynb,运行其中的数据路径设定与可视化代码,确认原图与掩码的对应关系;
- 参照 SemanticSegmentationPytorch.ipynb(PyTorch 版)或 SemanticSegmentationTF.ipynb(TensorFlow 版)搭建一个二分类(前景/背景)分割网络,将数据集替换为人体全身分割数据集;
- 训练结束后,对测试图像输出预测掩码,并与人眼观察到的真实掩码对比,评估模型能否完整、平滑地勾勒出人体剪影。
需要说明的运行前提:BodySegmentation.ipynb 当前版本依赖matplotlib完成读图与可视化,并以"解压后目录与dataset_path一致"为前提;两套框架笔记本分别需要 PyTorch(含 torchvision、skimage)或 TensorFlow 环境。课程环境依赖可参考 binder/environment.yml 与 requirements.txt。
拓展学习:从人体分割到姿态检测
课程正文在"挑战(Challenge)"环节指出,人体分割只是处理人物图像的常见任务之一,与之相邻的重要任务还有骨骼检测(skeleton detection)和姿态检测(pose detection)。实验室文档同样提示读者可以研究 OpenPose 库,了解姿态检测类任务如何实现。这条延伸路径的意义在于:分割、骨骼、姿态三个任务共享同一类"逐像素/逐关键点预测"的建模思路,掌握分割之后,再迁移到人体关键点检测会非常自然。
小结
本实验室以"天气预报节目人像抠图"这一真实应用为切入点,带你完成一次端到端的人体分割实践:从 Kaggle 下载 Segmentation Full Body MADS Dataset、按images/与masks/的组织方式加载并可视化数据,再到以二值交叉熵为损失、以编码器-解码器(SegNet / U-Net)为骨架训练一个能够输出人体剪影掩码的神经网络。理解这些原理之后,你可以进一步尝试 U-Net 的跳跃连接改进、更换更强的编码器(如 ResNet 系列),或向骨骼检测、姿态检测等相邻方向延伸,把"像素级理解图像"的能力应用到更广阔的场景中。
- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
相关推荐
AI-For-Beginners 人体分割实验室:用神经网络模型从视频画面中抠出人体轮廓
AI For Beginners 人体分割实验室:用神经网络模型从视频画面中抠出人体轮廓 本篇文章聚焦微软 AI For Beginners 课程第 12 课"
教程人工智能机器学习深度学习AI for Beginners 人体分割实战:基于 Segmentation Full Body MADS 数据集训练神经网络抠像模型
AI for Beginners 人体分割实战:基于 Segmentation Full Body MADS 数据集训练神经网络抠像模型 人体分割(Human
教程人工智能机器学习深度学习AI-For-Beginners 人体分割实验指南:用语义分割网络从视频画面中抠出人体剪影
AI For Beginners 人体分割实验指南:用语义分割网络从视频画面中抠出人体剪影 人体语义分割(Human Body Segmentation)是 A
教程人工智能机器学习深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考