Pytorch 中像素分割“Assertion `t >= 0 && t < n_classes` failed error ” 解决方案

像素分割-模型训练报错:block: [0,0,0], thread: [832,0,0] Assertion t >= 0 && t < n_classes failed.

eval_net sub_cross_entropy = F.cross_entropy(pred.unsqueeze(dim=0), true_mask.unsqueeze(dim=0).squeeze(1)).item()

最近在训练图像4分类时,为了使标签可视化,分别用了不同的像素值[0, 74, 128, 145]对图像做了mask像素分割。
在模型训练时遇到如下两个bug:
1.RuntimeError: CUDA error: device-side assert triggered CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
2.[00:00<?, ?img/s]C:\actions-runner_work\pytorch\pytorch\builder\windows\pytorch\aten\src\ATen\native\cuda\NLLLoss2d.cu:103: block: [0,0,0], thread: [832,0,0] Assertion t >= 0 && t < n_classes failed.
查找问题:
1.,mask对照了我自己的label种类发现都是没有问题的!(除了标签外,不能有其他多余的像素值在图中)
2,将标签图mask中像素的值为[0, 74, 128, 145]的pix,转换pix为[0,1,2,3]
附上转换代码

 mask = cv2.imread(mask_path, 0)
        # 创建转换后对应的标签列表
        label_list = [0, 1, 2, 3]

        # 使用where函数进行转换
        mask2 = np.where(mask == 0, label_list[0],
                         np.where(mask == 74, label_list[1],
                                  np.where(mask == 28, label_list[2],
                                           np.where(mask == 145, label_list[3], mask))))

为何要这样编码:
在图像分割任务中,标签从0开始的连续值是一种常见的表示方式。这种表示方式的目的是方便计算机进行处理和存储。
具体来说,标签是用来标识图像中不同的分类或语义区域,例如一幅图像中可能包含人、车、树等不同的物体或者地面、天空等不同的区域。在这个问题中,我们需要为每个物体或区域分配一个唯一的标签。如果我们用不同的数字给每个物体或区域编码,那么这些数字应该是连续的,并从0开始,如0表示背景,1表示人,2表示车等。
这种编码方式的好处在于,可以用一个数组或矩阵来表示整张图像,矩阵的每个元素存储一个数字,表示对应像素的标签。例如,在语义分割任务中,我们可以使用一个尺寸与原图像相同的矩阵,每个元素存储一个数字,表示对应像素所属的物体或区域。这样的编码方式对计算和存储都非常方便。
另外,从0开始的连续值的编码方式还可以避免混淆和错误。如果我们用非连续的或重复的数字来编码,可能会使结果不可解释或者出现错误。对于计算机来说,使用连续值的编码方式也更加直观和易于处理。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 基于pytorch和Mask R-CNN实现的T恤属性识别python源码+项目说明.zip 1、该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果有一点儿基础,亦可在此代码基础上进行修改,以实现其他功能。 本项目基于pytorch版本的Mask R-CNN来做T恤的属性识别。 T恤数据集的构建 标注种类 总共12类,标注T恤图片的廓形(袖型、领型、下摆、间衣长区域) ``` "1": "T-Shirt", "2": "Curve_Hem", "3": "Elbow_Sleeve", "4": "Flat_Bottom", "5": "Long_Sleeve", "6": "Polo", "7": "Round_Collar", "8": "Short_Sleeve", "9": "Sleeveless", "10": "Square_Collar", "11": "Three-quarter_Sleeve", "12": "V_Collar", ``` 标注形式 用labelme标注,生成JSON文件,再用labelme官方GitHub仓库里的工具(见labelme2coco文件夹)转成coco数据集格式。 标记数量与训练集验证集 总计176张图片,其 train:143 val: 33 以8:2进行shuffle分割(见train_test_split.py文件分割方式),同要保证train与val里都包含12个类 图片大小:resize:800 * 1333, 训练 实验平台:windows11,3050ti(4GB显存),pytorch batch_size = 1;lr=0.0001;epochs=30;优化器adam 还采用了torch.optim.lr_scheduler.MultiStepLR来手动根据epoch调整参数 绘制loss与lr曲线如下: ![](assert\loss_lr.png) 评测 采用 PASCAL VOC 2012 competition 定义的 mAP 标准 利用pycocotools工具计算IOU=0.5时的map如下图: ![](assert\map.png) 各个种类的AP: ![](./assert/classes_map.png) 测试 随机从val数据集拿出两张图片进行推理,测试结果如下: ![](./assert/test_result.jpg) ![](./assert/test_result2.jpg) 实验分析 1.由各种种类AP可以发现,Curve_Hem是AP值是最低的。 分析原因,下摆有Flat_Bottom与Curve_Hem两类。观察图片数据发现,有些T恤下摆特征不明显,不好区分,以致标注时没有准确标注。模型预测这类分类能力下降。 2.由测试结果可以发现,图一两人的袖子重叠在一起,但只检测出一个人的袖子。图二的模特由于带了项链,虽然检测出来是圆领,但也产生了V领的误判。 展望 1.扩充数据集,构建数据量更大的数据集,同时细化分类,避免一些歧义类别。 2.针对遮挡,重叠问题,考虑解决。在查阅了大量文献,得出一个有效的解决方案:利用服装关键点信息辅助特征提取,即先进行T恤的关键点检测,准确检测出所有关键点,无论是遮挡还是重叠情况。**这也是我接下来的研究课题** 3.由本小数据集可以发现,由于衣服种类的多种多样,以及常见性,使得种类的数量产生了差异,即有数据不均衡的情况发生,在构造大数据集后可能也会不可避免的产生数据不均衡。这也是优化的一个点。 4.不多说,利用更sota的模型,提高基础性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值