在复现一个深度学习框架时,遇到了我自己标注的标签图和作者的标签图不一致问题导致模型学习的交叉熵损失迅速降为0,这里的原因是作者代码中的label图使用的是8位单通道的灰度图,我标注完之后生成的是24为的RGB图像,因此这里需要修改label图的类型
错误原因(大家可看可不看,这里仅供自己后续看,转换代码在后边)
作者的图,原图黑色,经过线性拉伸变为这样的图(在envi里查看的)
我的图
打开一张进行拉伸,此处以为和作者的图是一个类型的,就放入模型开始训练自己的数据集
开始训练,训练过程中交叉熵损失(loss_ce)很快降为0(其实在200多次迭代就有0.000的结果)
Loss_ce代表交叉熵损失,测量模型的预测概率与目标标签的真实分布之间的差异,查了一下说模型训练良好,模型已经学会了以非常高的置信度对训练数据进行准确分类。表明该模型有效地捕获了训练数据中的模式和关系。”(由于新手小白,还以为模型训练的很好,此处很智障)
随后进行测试:结果test预测图为全黑,black是背景的结果,可以看出只检测出背景,1类别的精确度和召回率为空或为0
问题
模型对我的训练标签没有正确读相应的0和1标签,模型识别的只是一张黑色的图,因此模型什么也不用学,所以交叉熵损失很快降为0。问题出在训练标签上。
于是从标签开始找问题所在
作者的标签,用python读如作者的label图,是这样的
而我的图是这样的
在这里可以看到它的详细信息,mode=“L”代表作者用的是灰度图,而我的是RGB,位深度和通道数以及标签名都不一样,所以都需要修改。(不懂位深度的可以自己去查,显示的色彩会不一样)
24位深转换成8位图像
根据需要只需要改成自己的路径即可
#将24位的图像转换成8位的图像
import os
from PIL import Image
def convert_image(input_path, output_path):
"""Converts a 24-bit RGB image to an 8-bit grayscale image."""
image = Image.open(input_path)
grayscale_image = image.convert('L')
grayscale_image.save(output_path)
input_dir = r'your input path'
output_dir = r'your output path'
for filename in os.listdir(input_dir):
if filename.endswith('.jpg') or filename.endswith('.png'):
input_path = os.path.join(input_dir, filename)
output_filename = os.path.splitext(filename)[0] + '.png' # Replace extension with '.png' for grayscale
output_path = os.path.join(output_dir, output_filename)
convert_image(input_path, output_path)
转换成功!