运行MMSegmentation遇到“RuntimeError: CUDA error: an illegal memory access was encountered”

文章讲述了在使用MMSegmentation训练时遇到的RuntimeError,问题与数据量和mask像素值中的异常值有关。作者发现当mask像素值超出预期范围(0和1)时,模型会误识别更多类别。通过设置阈值处理异常值,问题得以解决。
摘要由CSDN通过智能技术生成

问题描述:

        在使用MMSegmentation训练自己的数据集时, 遇到了一个奇怪的RuntimeError。之所以说“奇怪”,是因为这个问题“时有时无”——同样的运行环境、同样的配置文件、同样的代码,运行部分少量(100张)数据时,代码不报错;将数据量增加至上千上万时,出现该RuntimeError,如下图所示:

分析原因:

        考虑到程序运行的环境、配置文件、训练代码等都是一样的,数据类型也一致,只是数据量不同时出现该Error, 故,推测问题出现在数据部分。打开“任务管理器”,查看程序运行时,显存和内存的变化。程序运行一会儿,内存暴涨,一度以为程序是将所有的数据一次性加载到内存中。数据量少时,一次性加载到内存中不会报错,当数据量大时,内存暴涨,然后报错。基于这种猜想,又随机地选择了几批数据,发现同样数据量时,有时报错,有时不报错。故得出结论,真正地原因不在于此。

        再次仔细检查数据,发现mask的像素值存在“异常值”——我进行的是二分类,按理说mask的值非0即1,但事实上却存在0和1之外的值。分析原因在于,原始的mask是黑白图,背景像素是0,目标像素是255,但是图像尺寸并不完全一致,在进行resize后,mask的像素值出现了0和255之外的值。而在对像素进行处理时,采用了将像素值为255的像素设为1的处理方式,而未对0和255之外的“异常值”进行处理,故而模型会“认为”类别不止0和1两类,而是0、1……254,共255类。

解决办法:

        检查mask的像素值是否存在类别之外的值,如果存在的话,分析存在的原因,并给出解决办法。例如,以我遇到的为例,只需要设置一个阈值,令小于阈值的像素为0,大于阈值的像素为1即可。这样处理后,数据量增至3w多也没再报错~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值