自定义分割数据集中的png格式图片的模式转换(P -> L)以及其他问题解决
0. 问题背景
使用labelme对自己的工业数据集进行了标注,得到原图和标注的json文件,如下图所示:
因为自己前期用的是图片+mask的数据集格式进行训练,所以也想接着用这种格式,那么接下来就要进行图像转换,我用的labelme2coco进行格式转换得到了png格式的mask图,如下:
然后就出现了各种各样的问题,接下来彻底梳理一下这种格式的问题,防止再次造轮子。
1. 格式检查
labelme2coco转换出来的原图仍然是png格式,且模式检查发现是RGB格式,如下:
然而 :转换出来的mask图却是这种格式:
可以看到,虽然mask图显示出了彩色,但是其像素点的像素值只有0.1.2,也就是每一个像素点的像素值就是该点的类别标签。另外需要注意的是,mask的模式为P模式,也就是调色板模式。祖这点需要特别注意!!! 这样的格式与VOC数据集的图像格式是相同的,可以用VOC的读取方法进行读取。
2. cv2读取
目前用cv2.imread()函数是无法正确读取P模式的png图像的,因此如果想用cv2读取的话,要将P模式转换成L模式,这里的第一个坑也就出现了。
如果在直接读取图像之后添加convert('L')转换的话,可以看到原来的像素值(标签值)就会改变,这样就与原来的像素值就是标签值冲突了,于是我们需要进一步调整,而不是直接convert().
转换成L模式后,cv2就可以直接读取了, 读取后是一个只有尺寸而没有通道数的格式,因为L模式本身就是单通道。
原图像的话,因为是RGB模式,可以直接用cv2读取。
3. 重新调整
通过以上分析,我们可以看出如果用cv2读取P模式的图像时会发生错误,那么我们用另一种方法修改图像格式。
需要注意的是,转L模式要保证标签值不变。既然直接转会发生变化,那么就复制一个再转换。大体思路就是,创建一个L的蒙版,然后把mask的像素值全部复制进去即可。
label_ori = Image.open(label_path + "/" + masklist)p = label_ori.getpalette()label_ori = label_ori.resize((256, 256), Image.NEAREST)temp = max(label_ori.size)mask = Image.new('L', (temp, temp), 0) # 创建蒙板mask.putpalette(p) # 获取调色板mask.paste(label_ori, (0, 0)) # 创建一个L模式的副本label_ori = np.array(mask)mask = Image.fromarray(label_ori, 'L') # L模式mask.save(save_label_path + "/" + str(i) + ".png") # 保存
这样就可以得到一张L模式的png图像,但是这样的话,mask图像就变成了全黑的图像,没有了颜色映射,就像这样:
接下来,我们再检查一下图像的格式
可以看出来,像素值仍然保存了最初的标签值,但模式变成了L模式,这样可以就直接用cv2读取了。
4. 使用PIL读取
P模式的png图片,可以使用PIL直接读取,有点类似于VOC格式的读取方式,这里就不进一步说明了。大家有更好的方式可以评论在下方,共同学习。
其他问题解决:
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.
1. 解决:
这个错误的原因有很多,会有标签错误等等,可以百度一下,在这里我说明一下自己的错误供大家参考查阅。
我这里的错去是因为直接用cv2处理了P模式的图像,以至于后来的Tensor无法正确获取,从而在进行 下列操作:
output.data.cpu().detach().numpy()
时会出现以上报错 。在调试时也会发现,对该数据进行监控,就会提示无法正确获取Tensor,因此就会报错。
2. 错误
SELF.WAS_KILLED.IS_SET()并报错RUNTIMEERROR: DATALOADER WORKER IS KILLED BY SIGNAL
这个出现原因我也不太明确,不过把num_works设置为0确实解决了这个问题:
https://www.freesion.com/article/7292534749/https://www.freesion.com/article/7292534749/
3. cv2读取png图像
https://www.csdn.net/tags/MtTaEgzsMTE2NjMtYmxvZwO0O0OO0O0O.htmlhttps://www.csdn.net/tags/MtTaEgzsMTE2NjMtYmxvZwO0O0OO0O0O.html但是这样不能读取P模式的png图片,其他模式是可以的
其他读取方法可以参照这个https://blog.csdn.net/weixin_43794311/article/details/105208731https://blog.csdn.net/weixin_43794311/article/details/105208731
4. labelme2coco
https://github.com/fcakyon/labelme2cocohttps://github.com/fcakyon/labelme2coco
5. Image 与 numpy相互转换
https://blog.csdn.net/m0_46653437/article/details/112253562?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-112253562-blog-122157558.t5_layer_eslanding_A_4&spm=1001.2101.3001.4242.1&utm_relevant_index=3https://blog.csdn.net/m0_46653437/article/details/112253562?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-112253562-blog-122157558.t5_layer_eslanding_A_4&spm=1001.2101.3001.4242.1&utm_relevant_index=3
6. transform数据增强
神经网络数据增强transforms的相关操作(持续更新)_燃烧吧哥们的博客-CSDN博客_transforms 数据增强transforms的相关操作(Pytorch)一、图像的相关变化1、格式转换(1)transforms.ToTensor()(2)transforms.ToPILImage()1、图像大小(1)一、图像的相关变化1、格式转换(1)transforms.ToTensor()可将PIL格式、数组格式转换为tensor格式img_path = "E:\expression_recognition\\2.jpg"img = Image.open(img_path) # #数组类型PIL类型都可a1https://blog.csdn.net/hjkdh/article/details/123439969https://blog.csdn.net/qq_41375318/article/details/102984221?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-102984221-blog-124452966.topnsimilarv1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-102984221-blog-124452966.topnsimilarv1&utm_relevant_index=1https://blog.csdn.net/qq_41375318/article/details/102984221?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-102984221-blog-124452966.topnsimilarv1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-102984221-blog-124452966.topnsimilarv1&utm_relevant_index=1
7. import torch 出现段错误,核心已转存
这个错误原因也有很多,在github上说是重新把anconda的环境变量重新更新一遍就可以了,但是对我来说,并没有发挥作用。一次偶然机会,我重新装了一下系统的显卡驱动,就好了。希望对大家有所启发。安装方法:
https://blog.csdn.net/a319506345/article/details/125004586https://blog.csdn.net/a319506345/article/details/125004586
8. RuntimeError: "softmax" not implemented for Long
这个错误的原因是在进行交叉熵损失函数时,输入的input因该时torch.float64,而输入的Target则应该是long型,这个时候只需要转换一下就可以了。
y.to(args.device).squeeze().long()
https://blog.csdn.net/suyunzzz/article/details/105478701https://blog.csdn.net/suyunzzz/article/details/105478701
9. 改变Tensor尺寸
https://blog.csdn.net/qq_43581151/article/details/97271131?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_linkhttps://blog.csdn.net/qq_43581151/article/details/97271131?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_link
10. AttributeError:module 'distutils' has no attribute 'version'
https://zhuanlan.zhihu.com/p/489042988https://zhuanlan.zhihu.com/p/489042988
11. pytorch的whl下载网址
https://download.pytorch.org/whl/torch_stable.htmlhttps://download.pytorch.org/whl/torch_stable.html以上就是近期遇到的难题,有大有小,欢迎大家交流共同学习!!!
自定义分割数据集中的png格式图片的模式转换(P -> L)以及其他问题解决相关推荐
- anywebp jpg png 转换webp格式图片 免费在线转换
最近很多网站也开始支持webp格式的图片了,webp格式的图片简单说来,比目前常用的JPG同体积下更清晰,同清晰度下,体积更小. 最近也在找怎么才能将JPG PNG等文件转换为webp格式,今天终于找 ...
- html中如何将图片3d转换,jpg格式图片如何可以转换成3DMax格式?
回答: 图片的格式分为很多种,但在我们生活中最常用的图片格式还是以JPG为主.那么怎样把照片变成JPG格式?接下来详细为大家介绍转化方法: 方法一:美图秀秀修改格式: 1.打开图片.2.然后点保存,在 ...
- HWDB1.1数据集 | 手写汉字数据集 |.gnt 转换 .png格式图片| 【❤️有效转换❤️】
❤️[专栏:数据集整理]❤️ 之[有效拒绝假数据]
- 【快速.png转.jpg】批量转换png格式图片为jpg图片
使用背景: 当我们需要jpg目标格式的图片时,但只有png的图片源,此时我们只需要利用下面代码对目标文件夹中的png格式图片进行批量转换即可,快速有效,不易报错! 转换代码: from PIL imp ...
- MATLAB编程:简易读取分割存储 tif 格式图片
MATLAB编程:简易读取分割存储 tif 格式图片 前言 一.介绍 二.MATLAB实现 三.总结 前言 本博主使用的MATLAB版本是2020b,这个版本可以使用许多有趣的扩展APP,本节将会 ...
- 语义分割数据标注、格式转换
1. 数据准备 1.1 labelme标注数据 labelme标注完之后会生成json格式标注文件,与图像在同一文件夹下面,如图 1.2 labelme标注格式转换(json转voc格式) label ...
- springmvc 自定义view支持json和jsonp格式数据返回
1.如果controlloer上用@ResponseBody注解,则用<mvc:message-converter>里面配置的json解析器进行解析 <mvc:annotation- ...
- 【数字图像处理】一.MFC详解显示BMP格式图片
本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解 ...
- Android与HEIF格式图片适配方法
本文字数:1490字 预计阅读时间:8分钟 一. 什么是HEIF图片 HEIF (High Efficiency Image File Format)是由动态图像专家组(MPEG)在2013年推出的新 ...
最新文章
- UA OPTI570 量子力学 公式与结论总结1 角动量基础
- 【代码】synchronized是可重入锁并且多个sync代码块顺序执行
- 28-高级特性之作用域(2)
- html抽奖源码_开源FPGA开发板OpenICE 介绍及抽奖
- Python机器学习:线型回归法01简单线型回归法
- LOL(英雄联盟)提示不支持虚拟机登录,解决方法
- Nginx配置优化解读
- 通过BigInteger真正实现无限大的十进制转N(任意整数)进制
- 用python编写仓库管理系统_花了一天做的一个简单的仓库管理系统
- IAR中路由器、协调器、终端的配置区别
- 【笔记】下单但未支付的订单倒计时自动取消逻辑实现
- 地税局工资管理系统(论文+设计)新
- Java实践(五)仿照用户列表查询写查自己的库
- 环形电流计算公式_环形电流的磁场分布 怎么计算
- 实用技能一:防抖与节流
- 特征值和奇异值(svd)
- 2004-6-6 0:03:43 死得其所
- xshell个人免费版下载使用
- 手机号注册过,被遗忘的网站有哪些?
- iOS 屏蔽系统更新描述文件更新!快把烦人的系统更新提示关掉!
热门文章
- 计算机编程之母美国漂亮,美国登月幕后功臣曾被誉为“穿裙子的 computer”
- DSLR Deep Stacked Laplacian Restorer for Low-Light Image Enhancement复现
- laya发布vivo小游戏远程资源笔记
- Meterprete端口转发
- Java 多线程同时执行
- Lootcode 201~220
- python语言流程控制语句的格式while循环_Python流程控制-while循环-for循环
- JavaScript前后移动数组元素
- sklearn——数据降维
- DvaJS的model属性