原文出处:Semantic Segmentation 原作者:Microsoft · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与微软所有。
前面学过目标检测:用预测出的边界框(bounding box)来定位图像里的物体。有些任务光有边界框不够,需要更精确的物体定位,这个任务叫分割(segmentation)。
课前测验
分割可以看成像素分类:对图像的每个像素都要预测它的类别,"背景"也算一类。主流的分割算法有两种:
- 语义分割(semantic segmentation):只给出像素的类别,不区分同一类里的不同物体
- 实例分割(instance segmentation):把类别进一步拆成一个个实例
同样是羊群,实例分割会把每只羊当成不同的物体,语义分割则把所有羊归成一类。原文此处有一张图,画的是这两种分割结果放在一起的对比(图来自这篇博客)。
做分割的神经网络架构有好几种,整体结构却是一样的。它有点像前面学过的自编码器(autoencoder),区别在于:自编码器重建的是原始图像,这里要重建的是一张掩码(mask)。所以分割网络分成两部分:
- 编码器(encoder)从输入图像里提取特征
- 解码器(decoder)把这些特征变换成掩码图像,尺寸与原图相同,通道数等于类别数
原文此处有一张图,画的是分割网络这种"编码器进、解码器出"的结构(图来自这篇论文)。
分割用的损失函数要单独说。经典自编码器要衡量两张图像的相似度,直接上均方误差(MSE)就行。分割不一样:目标掩码图像里的每个像素表示的是类别编号(沿第三维做 one-hot 编码),所以得用分类任务专属的损失函数,即对所有像素取平均的交叉熵损失(cross-entropy loss)。掩码若是二值的,就用二值交叉熵损失(binary cross-entropy loss,BCE)。
One-hot 编码是把类别标签写成一个长度等于类别数的向量(vector)的方法,细节可以看这篇文章。
医学影像里的分割
这节课我们来看分割的实际应用:训练网络在医学图像中识别人类的色素痣(也就是常说的痣)。图像来源是皮肤镜影像的 PH² 数据库。这个数据集有 200 张图,分三类:典型痣、非典型痣和黑色素瘤。每张图都带一张勾出痣轮廓的掩码。
这套技术特别适合这类医学影像。你还能想到哪些现实中的应用?
原文此处有一张图,展示的是数据库里痣的照片与对应掩码的样子(图来自 PH² 数据库)。
我们要训练一个模型,把任意一颗痣从背景里分割出来。
练习:语义分割
打开下面的 notebook,了解更多语义分割架构,动手操作,看它们跑起来的效果:
课后测验
小结
分割是很强的图像分类技术:越过边界框,做到像素级的分类。医学影像是它的应用场景之一。
挑战
人体分割只是人像图像里一个常见任务,另外还有骨骼检测和姿态检测。可以试试 OpenPose 这个库,看看姿态检测怎么用。
复习与自学
这篇维基百科文章对分割的各种应用有个概览。实例分割和全景分割(panoptic segmentation)是这个领域的两个子方向,值得自己再找材料了解。
作业
这次实验要求你用 Kaggle 上的 Segmentation Full Body MADS 数据集尝试人体分割。