训练语义分割模型的理解一、 核心概念什么是语义分割简单来说图像分类是给整张图片打一个标签比如“这是一只猫”而语义分割是给图片中的每一个像素点打标签比如“这个像素属于猫那个像素属于背景”。这就决定了网络的输出必须是一张和原图大小一致的“特征图”。二、 单类别二分类分割非黑即白场景只提取一种目标比如你的“Unet分割肝脏”。类别只有两个肝脏前景标签为1和非肝脏背景标签为0。1. 网络的输入 (Input)格式RGB彩图或灰度图。维度Batch_size * 3 * H * W3代表RGB三个通道H和W是高和宽。2. 网络的输出 (Output/Logits)格式单通道的特征图。维度Batch_size * 1 * H * W。含义输出的数值是实数可正可负代表每个像素是前景的“倾向程度”。3. 真实标签 (Ground Truth / Label)格式单通道灰度图只包含0和1。维度Batch_size * 1 * H * W。4. 损失函数 (Loss)最优解nn.BCEWithLogitsLoss()为什么不用nn.BCELossBCEWithLogitsLoss内部自动包含了Sigmoid激活层不仅代码更简洁而且在计算梯度时底层做了优化能有效防止数值溢出也就是防止Loss变成NaN。因此网络最后一层千万不要再加Sigmoid了三、 多类别多分类分割五颜六色的世界场景同时提取多个目标比如自动驾驶中的“道路、车辆、行人、天空”。假设一共有NNN个类别。1. 网络的输入 (Input)维度Batch_size * 3 * H * W。2. 网络的输出 (Output/Logits)格式多通道的特征图。维度Batch_size * N * H * W注意输出的通道数等于类别数NNN。含义你可以把它理解为NNN张单通道图叠在一起第iii张图代表了图片中每个像素属于第iii类的“得分”。3. 真实标签 (Ground Truth / Label)格式单通道的索引图。维度Batch_size * H * W**注意这里没有通道维度了**或者通道为1。含义图上的像素值不再是0到255而是0,1,2,...,N−10, 1, 2, ..., N-10,1,2,...,N−1这样的类别索引比如0代表背景1代表车2代表树。4. 损失函数 (Loss)最优解nn.CrossEntropyLoss()小白最容易踩坑的点PyTorch的交叉熵损失函数非常智能它不需要你手动把标签转换成One-hot编码格式。你直接把Batch_size∗H∗WBatch\_size * H * WBatch_size∗H∗W的标签丢给它它内部会自动帮你和Batch_size∗N∗H∗WBatch\_size * N * H * WBatch_size∗N∗H∗W的输出进行对齐计算。此外它内部已经自带了Softmax运算所以网络最后一层千万不要加Softmax**。四、 评价指标与 mIoU 计算训练完模型怎么知道它到底厉不厉害我们不看Loss而是看评价指标。在说明指标前先了解四个基本概念基于二分类说明TP (True Positive)预测是正类实际也是正类预测对了。TN (True Negative)预测是负类实际也是负类预测对了。FP (False Positive)预测是正类实际是负类假报警比如把背景识别成了肝脏。FN (False Negative)预测是负类实际是正类漏报了比如真正的肝脏没识别出来。1. PA (Pixel Accuracy像素准确率)含义预测正确的像素占总像素的比例。公式PATPTNTPTNFPFNPA \frac{TP TN}{TP TN FP FN}PATPTNFPFNTPTN缺点如果背景占了图片的99%网络只要无脑预测全都是背景PA也能高达99%但这模型是个废物。所以PA在医学图像或目标很小的场景下不靠谱。2. IoU (Intersection over Union交并比)含义预测出的区域和真实区域的重合程度。它是评价分割模型最核心的黄金指标。公式IoUTPTPFPFNIoU \frac{TP}{TP FP FN}IoUTPFPFNTP即交集面积 / 并集面积直观理解IoU越接近1说明你预测的形状和真实的形状贴合得越完美。3. mIoU (Mean IoU平均交并比)含义多分类时分别计算每一个类别的 IoU然后把所有类别的 IoU 加起来求平均值。计算流程计算“背景”的 IoU。计算“车”的 IoU。计算“树”的 IoU。mIoU(IoU背景IoU车IoU树)/3mIoU (IoU_{背景} IoU_{车} IoU_{树}) / 3mIoU(IoU背景IoU车IoU树)/3五、 如何进行预测出图 (Inference Post-processing)模型输出了一堆杂乱无章的张量我怎么把它变成人类能看懂的彩色图片对于二分类单类别的预测流程取概率模型输出维度1 * H * W对其使用torch.sigmoid()将其变为0∼10 \sim 10∼1之间的概率图。卡阈值 (Threshold)设定一个阈值通常是0.5。预测图 (概率图 0.5)大于0.5的像素变成1小于等于的变成0。转图片把这全是0和1的矩阵乘以255就变成了一张标准的黑白二值图像255是纯白0是纯黑保存即可。对于多分类的预测流程取最大索引 (Argmax)模型输出维度N * H * W例如4分类就是4 * H * W。使用torch.argmax(dim1)。这一步非常神奇它会像一根针一样穿过这NNN个通道看哪个通道在同一个像素点上的得分最高就把那个通道的索引值0,1,2,...0, 1, 2, ...0,1,2,...留下来。经过argmax后维度变成了1 * H * W里面的数值都是类别的索引不再是得分或概率了。调色板映射 (Color Palette/伪彩色)你现在得到了一张由0,1,2...0, 1, 2...0,1,2...组成的矩阵。这时候你需要定义一个“调色板字典”。比如{0: [0,0,0], 1: [255,0,0], 2: [0,255,0]}0画黑色1画红色2画绿色。通过代码遍历这个矩阵把对应的索引替换成 RGB 的三通道颜色值最终生成一张彩色的分割图用于展示。
训练语义分割模型的理解
训练语义分割模型的理解一、 核心概念什么是语义分割简单来说图像分类是给整张图片打一个标签比如“这是一只猫”而语义分割是给图片中的每一个像素点打标签比如“这个像素属于猫那个像素属于背景”。这就决定了网络的输出必须是一张和原图大小一致的“特征图”。二、 单类别二分类分割非黑即白场景只提取一种目标比如你的“Unet分割肝脏”。类别只有两个肝脏前景标签为1和非肝脏背景标签为0。1. 网络的输入 (Input)格式RGB彩图或灰度图。维度Batch_size * 3 * H * W3代表RGB三个通道H和W是高和宽。2. 网络的输出 (Output/Logits)格式单通道的特征图。维度Batch_size * 1 * H * W。含义输出的数值是实数可正可负代表每个像素是前景的“倾向程度”。3. 真实标签 (Ground Truth / Label)格式单通道灰度图只包含0和1。维度Batch_size * 1 * H * W。4. 损失函数 (Loss)最优解nn.BCEWithLogitsLoss()为什么不用nn.BCELossBCEWithLogitsLoss内部自动包含了Sigmoid激活层不仅代码更简洁而且在计算梯度时底层做了优化能有效防止数值溢出也就是防止Loss变成NaN。因此网络最后一层千万不要再加Sigmoid了三、 多类别多分类分割五颜六色的世界场景同时提取多个目标比如自动驾驶中的“道路、车辆、行人、天空”。假设一共有NNN个类别。1. 网络的输入 (Input)维度Batch_size * 3 * H * W。2. 网络的输出 (Output/Logits)格式多通道的特征图。维度Batch_size * N * H * W注意输出的通道数等于类别数NNN。含义你可以把它理解为NNN张单通道图叠在一起第iii张图代表了图片中每个像素属于第iii类的“得分”。3. 真实标签 (Ground Truth / Label)格式单通道的索引图。维度Batch_size * H * W**注意这里没有通道维度了**或者通道为1。含义图上的像素值不再是0到255而是0,1,2,...,N−10, 1, 2, ..., N-10,1,2,...,N−1这样的类别索引比如0代表背景1代表车2代表树。4. 损失函数 (Loss)最优解nn.CrossEntropyLoss()小白最容易踩坑的点PyTorch的交叉熵损失函数非常智能它不需要你手动把标签转换成One-hot编码格式。你直接把Batch_size∗H∗WBatch\_size * H * WBatch_size∗H∗W的标签丢给它它内部会自动帮你和Batch_size∗N∗H∗WBatch\_size * N * H * WBatch_size∗N∗H∗W的输出进行对齐计算。此外它内部已经自带了Softmax运算所以网络最后一层千万不要加Softmax**。四、 评价指标与 mIoU 计算训练完模型怎么知道它到底厉不厉害我们不看Loss而是看评价指标。在说明指标前先了解四个基本概念基于二分类说明TP (True Positive)预测是正类实际也是正类预测对了。TN (True Negative)预测是负类实际也是负类预测对了。FP (False Positive)预测是正类实际是负类假报警比如把背景识别成了肝脏。FN (False Negative)预测是负类实际是正类漏报了比如真正的肝脏没识别出来。1. PA (Pixel Accuracy像素准确率)含义预测正确的像素占总像素的比例。公式PATPTNTPTNFPFNPA \frac{TP TN}{TP TN FP FN}PATPTNFPFNTPTN缺点如果背景占了图片的99%网络只要无脑预测全都是背景PA也能高达99%但这模型是个废物。所以PA在医学图像或目标很小的场景下不靠谱。2. IoU (Intersection over Union交并比)含义预测出的区域和真实区域的重合程度。它是评价分割模型最核心的黄金指标。公式IoUTPTPFPFNIoU \frac{TP}{TP FP FN}IoUTPFPFNTP即交集面积 / 并集面积直观理解IoU越接近1说明你预测的形状和真实的形状贴合得越完美。3. mIoU (Mean IoU平均交并比)含义多分类时分别计算每一个类别的 IoU然后把所有类别的 IoU 加起来求平均值。计算流程计算“背景”的 IoU。计算“车”的 IoU。计算“树”的 IoU。mIoU(IoU背景IoU车IoU树)/3mIoU (IoU_{背景} IoU_{车} IoU_{树}) / 3mIoU(IoU背景IoU车IoU树)/3五、 如何进行预测出图 (Inference Post-processing)模型输出了一堆杂乱无章的张量我怎么把它变成人类能看懂的彩色图片对于二分类单类别的预测流程取概率模型输出维度1 * H * W对其使用torch.sigmoid()将其变为0∼10 \sim 10∼1之间的概率图。卡阈值 (Threshold)设定一个阈值通常是0.5。预测图 (概率图 0.5)大于0.5的像素变成1小于等于的变成0。转图片把这全是0和1的矩阵乘以255就变成了一张标准的黑白二值图像255是纯白0是纯黑保存即可。对于多分类的预测流程取最大索引 (Argmax)模型输出维度N * H * W例如4分类就是4 * H * W。使用torch.argmax(dim1)。这一步非常神奇它会像一根针一样穿过这NNN个通道看哪个通道在同一个像素点上的得分最高就把那个通道的索引值0,1,2,...0, 1, 2, ...0,1,2,...留下来。经过argmax后维度变成了1 * H * W里面的数值都是类别的索引不再是得分或概率了。调色板映射 (Color Palette/伪彩色)你现在得到了一张由0,1,2...0, 1, 2...0,1,2...组成的矩阵。这时候你需要定义一个“调色板字典”。比如{0: [0,0,0], 1: [255,0,0], 2: [0,255,0]}0画黑色1画红色2画绿色。通过代码遍历这个矩阵把对应的索引替换成 RGB 的三通道颜色值最终生成一张彩色的分割图用于展示。