因为photoshop功能的强大,以及工具的方便,虽然其不是专门的语义分割标注工具,但是仍然可以用其工具进行有效的标注,本文是在吸取经验教训的基础上写的,希望能够帮到所有用这个方法标注的人。
本文的主要内容:photoshop 2020的使用和注意事项、批量转换标签的方法(快速像素替换)
另外可以使用的软件:Pixel Annotation Tool 可以使用涂抹标注,但是这里为了可以多掌握一项技能就用PS了,主要是功能很多,对以后的学习以及工作都有好处,虽然麻烦点,但是掌握的东西多点,是个比较万金油的工具。
注意这个很重要,否则所有的标签全部报废,所以写在前面,谨记前人走过的弯路才能不让自己过于抓狂,首先将软件调成以下设置
1.套索的设置
首先找到工具栏里的套索,设置羽化0 不勾选消除锯齿,否则会出现过度色,后面可以用套索进行多边形标注。套索和矩形选框工具是不会产生过度色的。
2.油漆桶的设置
找到油漆桶设置成这个样式,否则会出现过渡色
3.快速选择工具(请谨慎得使用)
除魔棒以外的其他工具会出现过渡色,但是我会在接下来的过程中告诉你如何规避它,尽量避免两个颜色相交,如果遇上边界相交的地方最好使用套索工具
4.图层必须用白色作为底色,用黑色的话颜色会污染,随后不要在图片里选用白色标注了,注意白色为背景色,在之后的图片转换再换成黑色
5.使用图层进行做标签记得最后保存的时候透明要调成不透明100
方法简述:首先打开软件,然后打开图片,建立色板,建立图层,创建画板,选择区域,使用油漆桶进行喷漆,标注完成后输出图片
1.色板建立
选择自己要进行标注的颜色将其放在一个文件夹里
2.图层和画板的建立
将标签图层至于顶端,然后使用套索和油漆桶将图层变为全白,并设置一定的透明度,不要让图层影响图片
1.标注做好了,那么如何将图片转换为只有1、2、3等数值的标签呢?首先我们得制作一个纯色的color_map,将自己标注的颜色都存进去,如下:
黑色得放进去,注意图片一定得是纯色没有过渡色的,用套索工具加油漆桶即可完成
2.对图片的颜色进行编码
为了使每个颜色对应一维向量里的特定值,我们必须对颜色立方体进行编码,将三维降为二维,可以将BGR颜色视为256进制的三位数转换为十进制表示的数字
下列是代码:
def matColorCode(mat):#颜色编码函数 牺牲内存
b = (mat[:, :, 0]).astype(np.uint32) # 读取蓝通道 转成32位防止溢出
g = (mat[:, :, 1]).astype(np.uint32) # 读取绿通道
r = (mat[:, :, 2]).astype(np.uint32) # 读取红通道
return b * 256 * 256 + g * 256 + r
3.将colormap转为二维矩阵,并去掉重复的数字,就是颜色表了:
import cv2
import numpy as np
def matColorCode(mat):#颜色编码函数 牺牲内存
b = (mat[:, :, 0]).astype(np.uint32) # 读取蓝通道 转成32位防止溢出
g = (mat[:, :, 1]).astype(np.uint32) # 读取绿通道
r = (mat[:, :, 2]).astype(np.uint32) # 读取红通道
return b * 256 * 256 + g * 256 + r
cmap=cv2.imread(cmap,-1)
cmap = matColorCode(cmap)
cmap=np.unique(cmap)#去重
print('cmap',cmap)#输出颜色表里的数字
4.读取png格式图片批量转换成标签
import glob
images = glob.glob(path + '/*.png')#标签为PNG格式 读取这些东西就行了
images.sort()
for fileLocation in images:#filelocation为图片的绝对路径
img=cv2.imread(fileLocation,-1)
if img.max()>20:#防止误操作
img = matColorCode(img)#接上面的函数
number = 0#从零开始
for i in cmap:
img = np.where(img == i, number, img)#依次替换像素
number += 1
img = np.where(img > number, 0, img)
cv2.imwrite(fileLocation,img)#
print(fileLocation)#输出路径查看哪些图片处理完了
5.完整批量标签转换代码
path为标签路径 cmap为colormap的绝对路径
import cv2
import numpy as np
import glob
def changeImgLabel(path,cmap):
def matColorCode(mat):#颜色编码函数 牺牲内存
b = (mat[:, :, 0]).astype(np.uint32) # 读取蓝通道 转成32位防止溢出
g = (mat[:, :, 1]).astype(np.uint32) # 读取绿通道
r = (mat[:, :, 2]).astype(np.uint32) # 读取红通道
return b * 256 * 256 + g * 256 + r#编码
cmap=cv2.imread(cmap,-1)
cmap = matColorCode(cmap)
cmap=np.unique(cmap.astype(np.uint64))
print('cmap',cmap)
images = glob.glob(path + '/*.png')#标签为PNG格式 读取这些东西就行了
images.sort()
for fileLocation in images:
img=cv2.imread(fileLocation,-1)
if img.max()>20:#防止误操作
img = matColorCode(img)#接上面的函数
number = 0
for i in cmap:
img = np.where(img == i, number, img)
number += 1
img = np.where(img > number, 0, img)
cv2.imwrite(fileLocation,img)#存储
print(fileLocation)
#-------------------------------------------------
代码使用范例
path=r'F:\BaiduNetdiskDownload\U_net_dataset\colormap.png'#颜色表存放路径
path1=r'F:\BaiduNetdiskDownload\U_net_dataset'#标签存放路径
changeImgLabel(path,cmap=path)
四、总结
希望大家能够吸取经验,少走弯路,祝大家数据集制作顺利,如有不足之处,请大家在下面留言