语义分割标签即像素值的巨坑,transforms.ToTensor()的错误使用

问题:最近使用NEU-Seg数据集来验证模型的有效性,计算iou出现nan值?

前提:NEU-Seg数据集的样本图片时 .jpg 格式,使用cv2直接读取即可, mask图是全黑的,如下图所示:

 官方说是用labelme标注的,像素值就是像素的类别(坑也在这!)通过一下代码来检查数据格式:

import numpy as np
from PIL import Image
img = Image.open("E:/All-Project/Other-File/Datset/00001.png") #图像所在位置
img1 = np.array(img)
a=np.unique(img1) # 查看图片内的像素值
print(a)
print(img.mode) # 查看图片模式

运行后输出如下:

可以看到像素值(标签)有0.1,0背景,1是缺陷,可是图片模式是L,也就是灰度图,可是VOC数据集应该是P模式才对,但是L可以直接用cv2读取,更方便了。后来就出现问题, 读取图片转成张量的时候,经过了transforms.ToTensor()处理, 直接训练网络,损失照常掉, 可是! 计算IOU全部变成nan了。计算求代码:

intersection = np.logical_and(img_mask, img_pred)
        union = np.logical_or(img_mask, img_pred)
        iou_score = np.sum(intersection) / np.sum(union)

nan了,我接受不了这个现实啊!我检查了我的模型代码,混淆矩阵代码都木有毛病啊!

 经过我两周的debug终于发现了些端倪:

1.用cv2读取全黑的mask图,标签显示正常,[0, 1, 2, 3](neu数据集三类缺陷加背景)正常

2.获取的mask是narry格式,要转成张量 ,照常用了transforms.ToTensor()处理, 标签值变了!1变成了0.0017,这是啥玩意!问题就在这,接下来是解决办法:

0.transforms.ToTensor()这个函数首先会将数据归到[0, 1]区间内,可是标签就是像素值并不需要这么处理

办法:

用 torch.from_numpy(mask).type(torch.FloatTensor) 处理一下,标签值不变!!!!

就这一句就解决了,我花了两周,哭死

致谢:

感谢东北大学宋克臣老师的无私奉献,将数据集公开,网址:

http://faculty.neu.edu.cn/songkechen/zh_CN/zhym/263269/list/index.htm

宋老师的论文值得我学习! 向老师致敬!

声明:如使用老师数据集发表论文,应按照网站要求进行引用老师文章!(我现在只在验证阶段,如有不妥,请指正!)

  • 13
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值