ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Keras-FCN 损失函数与评估指标详解:softmax 交叉熵与 mIoU 计算原理

Keras-FCN 损失函数与评估指标详解:softmax 交叉熵与 mIoU 计算原理 Keras-FCN 损失函数与评估指标详解softmax 交叉熵与 mIoU 计算原理【免费下载链接】Keras-FCNKeras-tensorflow implementation of Fully Convolutional Networks for Semantic SegmentationUnfinished项目地址: https://gitcode.com/gh_mirrors/ker/Keras-FCNKeras-FCN 是基于 Keras 和 TensorFlow 的 FCN 语义分割开源实现让模型对图像做逐像素分类。对新手来说最难啃的往往是它的损失函数与评估指标为什么用自定义的 softmax 交叉熵mIoU 又是怎么算出来的本文结合 utils/loss_function.py 与 evaluate.py 源码用大白话讲清这两个核心概念让你从会跑通进阶到看得懂。FCN 语义分割输出解析为什么需要自定义损失函数在图像分类里网络最后输出一个向量接上 softmax 就完事但语义分割要求每个像素都有一个类别预测输出是一张分数图尺寸为 (H, W, C)C 是类别数。Keras-FCN 在 models.py 中定义模型时最后一层是Conv2D(classes, 1x1)只输出线性 logits没有内置 softmax。这是刻意设计把激活层留给损失函数训练时就能使用数值更稳定的 log-softmax 形式。于是项目自定义了两套损失函数按数据集切换使用。softmax 交叉熵损失函数原理稀疏标签与忽略像素技巧PASCAL VOC 数据集下默认损失函数是 softmax_sparse_crossentropy_ignoring_last_label。这个名字很长拆开看其实就三点① 稀疏标签SparseVOC 的标注图里每个像素存的是类别索引0~20 的整数不是 one-hot 向量所以要在损失函数里手动 one-hot 化。这样能省下大量内存这也是稀疏二字的由来。② 忽略像素Ignoring Last LabelVOC 标注中物体边界、模糊区域等像素的标签是 255代表不参与训练。数据生成器 SegDataGenerator.py 会先把 255 替换成类别数 21损失函数里再做 22 维 one-hot然后丢掉最后一维。于是这些 ignore 像素的真值变成全零向量交叉熵恒为 0对 loss 零贡献——忽略就这样被巧妙实现。③ 数值稳定性代码用tf.nn.log_softmax先算对数概率再做-sum(y_true * log_softmax)。相比先算 softmax 再取 log的写法它避免了指数运算的溢出问题训练更稳定。一句话总结VOC 单标签场景下用 softmax 交叉熵 忽略最后一类是最稳妥的组合。COCO 多标签分割二元交叉熵损失函数的适用场景如果换成 MS COCO 数据集情况就不同了。COCO 里一个像素可能同时属于杯子和桌子等多个类别属于多标签问题softmax 那种所有类别概率和为 1的假设不再成立。此时 train.py 会切换到 binary_crossentropy_with_logits每个类别独立计算二元交叉熵并通过from_logitsTrue告诉 Keras 输入是未经 sigmoid 的 logits避免sigmoid 后又算一遍交叉熵的精度损失。这也是为什么 models.py 的 COCO 分支需要把输出展平为(H*W*C,)的原因。mIoU 计算原理混淆矩阵与 mean Intersection over Union 详解训练完怎么评估模型好坏分类任务看准确率分割任务则看mIoUmean Intersection over Union平均交并比这是语义分割最权威的评估指标。它的计算原理分三步统计混淆矩阵把预测结果和真值逐像素比对conf_m[真实类别][预测类别]累加计数遇到标签 255 的 ignore 像素直接跳过。算每个类别的 IoU对类别 iIoU 交集像素数 ÷ 并集像素数。在 evaluate.py 里用矩阵运算高效实现I diag(conf_m)U 列求和 行求和 - I再相除。对所有类别取平均meanIoU mean(IOU)得到最终分数。核心代码只有三行I np.diag(conf_m) U np.sum(conf_m, axis0) np.sum(conf_m, axis1) - I IOU I / U meanIOU np.mean(IOU)为什么 IoU 比像素准确率更可信因为它同时惩罚漏检该分割的没分割和误检不该分割的乱分割在类别严重不均衡时也不会失真。README 显示项目里表现最好的 AtrousFCN_Resnet50_16s 在增强版 PASCAL VOC2012 上达到 mIoU 0.661、像素准确率约 0.9正是靠这套指标评估出来的。训练阶段监控指标sparse_accuracy_ignoring_last_label 准确率mIoU 计算成本高不适合每个 batch 都算一次所以训练时监控的是 sparse_accuracy_ignoring_last_label同样做 one-hot 后丢掉最后一维只统计非 ignore 像素中预测类别 真实类别的比例。它在语义上和损失函数完全对齐让你实时判断模型有没有在学。顺便提醒一句 utils/metrics.py 里有一段被注释掉的 mIoU 实现作者明确标注 This IOU implementation is wrong!!!——因为它按 batch 平均、并集统计也不严谨结果会失真。所以评估指标请务必使用 evaluate.py 里基于全量混淆矩阵的版本不要在训练回调里乱用魔改 IoU。train.py 配置方法损失函数与评估指标如何接线实战中你只需在 train.py 的 main 函数里按数据集切换VOC2012 / VOC2012_BERKELEYloss_fn softmax_sparse_crossentropy_ignoring_last_labelmetrics [sparse_accuracy_ignoring_last_label]ignore_label 255COCOloss_fn binary_crossentropy_with_logitsmetrics [binary_accuracy]ignore_label None两者通过model.compile(loss..., optimizerSGD(momentum0.9), metrics...)接入模型。训练完成后运行 evaluate.py它会自动调用 inference 生成预测图再输出各类别 IoU 与 meanIoU 报告一目了然。总结理解原理才能调好模型损失函数决定模型学什么VOC 用 softmax 交叉熵忽略 255 像素COCO 用二元交叉熵多标签。评估指标决定模型好不好训练过程看准确率最终成绩看 mIoU。两者在忽略最后一类的设计上完全对齐这是 Keras-FCN 代码里最精妙的一笔。看懂 utils/loss_function.py 和 utils/metrics.py 这两个文件你就掌握了 FCN 语义分割训练闭环的核心。建议动手跑一次 train.py、再配一次 evaluate.py理论与实践结合理解会更深刻【免费下载链接】Keras-FCNKeras-tensorflow implementation of Fully Convolutional Networks for Semantic SegmentationUnfinished项目地址: https://gitcode.com/gh_mirrors/ker/Keras-FCN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表