前言

因为photoshop功能的强大,以及工具的方便,虽然其不是专门的语义分割标注工具,但是仍然可以用其工具进行有效的标注,本文是在吸取经验教训的基础上写的,希望能够帮到所有用这个方法标注的人。
本文的主要内容:photoshop 2020的使用和注意事项、批量转换标签的方法(快速像素替换)
另外可以使用的软件:Pixel Annotation Tool 可以使用涂抹标注,但是这里为了可以多掌握一项技能就用PS了,主要是功能很多,对以后的学习以及工作都有好处,虽然麻烦点,但是掌握的东西多点,是个比较万金油的工具。

一、注意事项

注意这个很重要,否则所有的标签全部报废,所以写在前面,谨记前人走过的弯路才能不让自己过于抓狂,首先将软件调成以下设置

1.套索的设置

python xlwt 16进制颜色索引_opencv


首先找到工具栏里的套索,设置羽化0 不勾选消除锯齿,否则会出现过度色,后面可以用套索进行多边形标注。套索和矩形选框工具是不会产生过度色的。

2.油漆桶的设置

python xlwt 16进制颜色索引_python_02


找到油漆桶设置成这个样式,否则会出现过渡色

3.快速选择工具(请谨慎得使用)

除魔棒以外的其他工具会出现过渡色,但是我会在接下来的过程中告诉你如何规避它,尽量避免两个颜色相交,如果遇上边界相交的地方最好使用套索工具

4.图层必须用白色作为底色,用黑色的话颜色会污染,随后不要在图片里选用白色标注了,注意白色为背景色,在之后的图片转换再换成黑色

5.使用图层进行做标签记得最后保存的时候透明要调成不透明100

二、Photoshop制作标签图片

方法简述:首先打开软件,然后打开图片,建立色板,建立图层,创建画板,选择区域,使用油漆桶进行喷漆,标注完成后输出图片

1.色板建立

python xlwt 16进制颜色索引_opencv_03


选择自己要进行标注的颜色将其放在一个文件夹里

2.图层和画板的建立

python xlwt 16进制颜色索引_python_04


python xlwt 16进制颜色索引_数据挖掘_05


将标签图层至于顶端,然后使用套索和油漆桶将图层变为全白,并设置一定的透明度,不要让图层影响图片

  1. 选择区域以及标注
    这里使用快速选择工具选择轮廓,并用油漆桶(G)进行标注


    注意!!!!!!如果两个颜色边界有重叠,请使用套索工具防止过渡色的产生,不然会产生杂色影响边界
    4.输出标签为png

三、转换成语义分割的标签

1.标注做好了,那么如何将图片转换为只有1、2、3等数值的标签呢?首先我们得制作一个纯色的color_map,将自己标注的颜色都存进去,如下:

python xlwt 16进制颜色索引_算法_06


黑色得放进去,注意图片一定得是纯色没有过渡色的,用套索工具加油漆桶即可完成

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.astype(np.uint8)#存储
        print(fileLocation)
#-------------------------------------------------
代码使用范例
path=r'F:\BaiduNetdiskDownload\U_net_dataset\colormap.png'#颜色表存放路径
path1=r'F:\BaiduNetdiskDownload\U_net_dataset'#标签存放路径
changeImgLabel(path1,cmap=path)

四、总结

希望大家能够吸取经验,少走弯路,祝大家数据集制作顺利,如有不足之处,请大家在下面留言