语义分割数据集(多分类)制作

1:使用labelme标注工具

直接在命令行安装或者在anaconda下面新建虚拟环境安装(避免污染环境,不用的时候可以直接delete该环境)
直接命令行(base)安装

pip install labelme
labelme

创建虚拟环境安装,python版本选择3.6.x,打开Anaconda Prompt

conda create -n labelme python=3.6
conda activate labelme
pip install labelme
labelme

当前自动安装的版本为labelme-4.5.6
标注信息图如下


woman.png

plane.png

computer.png

train.png

2:使用提供的脚本json_to_dataset.py把json转换为png形式,对于多分类的数据标注,需要在下面路径找到json_to_dataset.py修改:

虚拟环境下的路径为
C:\Anaconda3\envs\labelme\Lib\site-packages\labelme\cli
cmd命令行(base)的路径为
C:\Anaconda3\Lib\site-packages\labelme\cli


需要修改的地方.png

运行脚本执行转换json操作,以下代码名为labelme_json_to_png.py

# -*- coding: utf-8 -*- 

import os

json_folder = r"C:\Users\eadhaw\Desktop\0120test"
#  获取文件夹内的文件名
FileNameList = os.listdir(json_folder)
for i in range(len(FileNameList)):
    #  判断当前文件是否为json文件
    if(os.path.splitext(FileNameList[i])[1] == ".json"):
        json_file = json_folder + "\\" + FileNameList[i]
        #  将该json文件转为png
        os.system("labelme_json_to_dataset " + json_file)

运行脚本.png

生成文件夹.png

验证类别对应.png

类别1红色的rgb值.png

类别2绿色的rgb值.png

类别3黄色的rgb值.png

类别4蓝色的rgb值.png

也可以用以下代码,查看类别对应的rgb颜色表

import imgviz
cm = imgviz.label_colormap()
print(f'len= {len(cm)}')
print(cm)
[[  0   0   0]
 [128   0   0]
 [  0 128   0]
 [128 128   0]
 [  0   0 128]
 [128   0 128]
 [  0 128 128]
 [128 128 128]
 [ 64   0   0]
 [192   0   0]
 [ 64 128   0]
 [192 128   0]
 [ 64   0 128]
 [192   0 128]
 [ 64 128 128]
 [192 128 128]
 [  0  64   0]
 [128  64   0]
 [  0 192   0]
 [128 192   0]
 [  0  64 128]
 [128  64 128]
 [  0 192 128]
 [128 192 128]
 [ 64  64   0]
 [192  64   0]
 [ 64 192   0]
 [192 192   0]
 [ 64  64 128]
 [192  64 128]
 [ 64 192 128]
 [192 192 128]
 [  0   0  64]
 [128   0  64]
 [  0 128  64]
 [128 128  64]
 [  0   0 192]
 [128   0 192]
 [  0 128 192]
 [128 128 192]
 [ 64   0  64]
 [192   0  64]
 [ 64 128  64]
 [192 128  64]
 [ 64   0 192]
 [192   0 192]
 [ 64 128 192]
 [192 128 192]
 [  0  64  64]
 [128  64  64]
 [  0 192  64]
 [128 192  64]
 [  0  64 192]
 [128  64 192]
 [  0 192 192]
 [128 192 192]
 [ 64  64  64]
 [192  64  64]
 [ 64 192  64]
 [192 192  64]
 [ 64  64 192]
 [192  64 192]
 [ 64 192 192]
 [192 192 192]
 [ 32   0   0]
 [160   0   0]
 [ 32 128   0]
 [160 128   0]
 [ 32   0 128]
 [160   0 128]
 [ 32 128 128]
 [160 128 128]
 [ 96   0   0]
 [224   0   0]
 [ 96 128   0]
 [224 128   0]
 [ 96   0 128]
 [224   0 128]
 [ 96 128 128]
 [224 128 128]
 [ 32  64   0]
 [160  64   0]
 [ 32 192   0]
 [160 192   0]
 [ 32  64 128]
 [160  64 128]
 [ 32 192 128]
 [160 192 128]
 [ 96  64   0]
 [224  64   0]
 [ 96 192   0]
 [224 192   0]
 [ 96  64 128]
 [224  64 128]
 [ 96 192 128]
 [224 192 128]
 [ 32   0  64]
 [160   0  64]
 [ 32 128  64]
 [160 128  64]
 [ 32   0 192]
 [160   0 192]
 [ 32 128 192]
 [160 128 192]
 [ 96   0  64]
 [224   0  64]
 [ 96 128  64]
 [224 128  64]
 [ 96   0 192]
 [224   0 192]
 [ 96 128 192]
 [224 128 192]
 [ 32  64  64]
 [160  64  64]
 [ 32 192  64]
 [160 192  64]
 [ 32  64 192]
 [160  64 192]
 [ 32 192 192]
 [160 192 192]
 [ 96  64  64]
 [224  64  64]
 [ 96 192  64]
 [224 192  64]
 [ 96  64 192]
 [224  64 192]
 [ 96 192 192]
 [224 192 192]
 [  0  32   0]
 [128  32   0]
 [  0 160   0]
 [128 160   0]
 [  0  32 128]
 [128  32 128]
 [  0 160 128]
 [128 160 128]
 [ 64  32   0]
 [192  32   0]
 [ 64 160   0]
 [192 160   0]
 [ 64  32 128]
 [192  32 128]
 [ 64 160 128]
 [192 160 128]
 [  0  96   0]
 [128  96   0]
 [  0 224   0]
 [128 224   0]
 [  0  96 128]
 [128  96 128]
 [  0 224 128]
 [128 224 128]
 [ 64  96   0]
 [192  96   0]
 [ 64 224   0]
 [192 224   0]
 [ 64  96 128]
 [192  96 128]
 [ 64 224 128]
 [192 224 128]
 [  0  32  64]
 [128  32  64]
 [  0 160  64]
 [128 160  64]
 [  0  32 192]
 [128  32 192]
 [  0 160 192]
 [128 160 192]
 [ 64  32  64]
 [192  32  64]
 [ 64 160  64]
 [192 160  64]
 [ 64  32 192]
 [192  32 192]
 [ 64 160 192]
 [192 160 192]
 [  0  96  64]
 [128  96  64]
 [  0 224  64]
 [128 224  64]
 [  0  96 192]
 [128  96 192]
 [  0 224 192]
 [128 224 192]
 [ 64  96  64]
 [192  96  64]
 [ 64 224  64]
 [192 224  64]
 [ 64  96 192]
 [192  96 192]
 [ 64 224 192]
 [192 224 192]
 [ 32  32   0]
 [160  32   0]
 [ 32 160   0]
 [160 160   0]
 [ 32  32 128]
 [160  32 128]
 [ 32 160 128]
 [160 160 128]
 [ 96  32   0]
 [224  32   0]
 [ 96 160   0]
 [224 160   0]
 [ 96  32 128]
 [224  32 128]
 [ 96 160 128]
 [224 160 128]
 [ 32  96   0]
 [160  96   0]
 [ 32 224   0]
 [160 224   0]
 [ 32  96 128]
 [160  96 128]
 [ 32 224 128]
 [160 224 128]
 [ 96  96   0]
 [224  96   0]
 [ 96 224   0]
 [224 224   0]
 [ 96  96 128]
 [224  96 128]
 [ 96 224 128]
 [224 224 128]
 [ 32  32  64]
 [160  32  64]
 [ 32 160  64]
 [160 160  64]
 [ 32  32 192]
 [160  32 192]
 [ 32 160 192]
 [160 160 192]
 [ 96  32  64]
 [224  32  64]
 [ 96 160  64]
 [224 160  64]
 [ 96  32 192]
 [224  32 192]
 [ 96 160 192]
 [224 160 192]
 [ 32  96  64]
 [160  96  64]
 [ 32 224  64]
 [160 224  64]
 [ 32  96 192]
 [160  96 192]
 [ 32 224 192]
 [160 224 192]
 [ 96  96  64]
 [224  96  64]
 [ 96 224  64]
 [224 224  64]
 [ 96  96 192]
 [224  96 192]
 [ 96 224 192]
 [224 224 192]]

3:把数据整理为images,segmentations对应的文件夹

整理文件夹.png

脚本如下:spilit_labelme_dataset.py

# -*- coding: utf-8 -*-
import os
import numpy as np
import json
import shutil

def find_dir_path(path, keyword_name, dir_list):
    files = os.listdir(path)
    for file_name in files:
        file_path = os.path.join(path, file_name)
        if os.path.isdir(file_path) and keyword_name not in file_path:
            find_dir_path(file_path, keyword_name, dir_list)
        elif os.path.isdir(file_path) and keyword_name in file_path:
            dir_list.append(file_path)
            

all_result_path = []
src_path = r'C:\Users\eadhaw\Desktop\0120test'
label_save_path = r'C:\Users\eadhaw\Desktop\0120test\segmentations'
image_save_path = r'C:\Users\eadhaw\Desktop\0120test\images'
find_dir_path(src_path, '_json', all_result_path)              # 找出所有带着关键词(_json)的所有目标文件夹
#print(all_result_path)   


for dir_path in all_result_path:
    # print(dir_path)
    file_name = dir_path.split('\\')[-1]
    key_word = file_name[:-5]
    # print(key_word)
    label_file = dir_path + "\\" + "label.png"
    new_label_save_path = label_save_path + "\\" + key_word + ".png"      # 复制生成的label.png到新的文件夹segmentations
    #print(new_label_save_path)
    shutil.copyfile(label_file, new_label_save_path)

    img_dir = os.path.dirname(dir_path)                         # 复制原图到新的文件夹images
    img_file = img_dir + "\\" + key_word + ".jpg"
    new_img_save_path = image_save_path + "\\" + key_word + ".jpg"
    shutil.copyfile(img_file, new_img_save_path)

4: 把png转换为label图([128,0,0]对应类别1,其他依次类推)

代码如下:

# -*- coding: utf-8 -*-
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
import skimage.io as io
import skimage
print("skimage:", skimage.__version__)    #  '0.14.2'

color2index = {
    (0,0,0) : 0,
    (128,0,0) : 1,
    (0,128,0) : 2,
    (128,128,0) : 3,
    (0,0,128) : 4,
}
def rgb2mask(img):

    assert len(img.shape) == 3
    height, width, ch = img.shape
    assert ch == 3

    W = np.power(256, [[0],[1],[2]])

    img_id = img.dot(W).squeeze(-1) 
    values = np.unique(img_id)
    mask = np.zeros(img_id.shape)

    for i, c in enumerate(values):
        try:
            mask[img_id==c] = color2index[tuple(img[img_id==c][0])] 
        except:
            pass
    return mask

path = "C:/Users/eadhaw/Desktop/0120test/segmentations/"
new_path = "C:/Users/eadhaw/Desktop/0120test/labels/"
files = os.listdir(path)

for filename in files:
    f_path = path + filename
    print(f_path)
    img = io.imread(f_path)
    print(img.shape)
    #判断一下读取的图像是否为三通道格式,rgba则要转换
    if img.shape[2] == 4:
        img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)
    mask = rgb2mask(img)
    mask = mask.astype(np.uint8)
    print(mask.shape)
    f_new_path = new_path + filename
    io.imsave(f_new_path,mask)

labels结果图.png

至此数据集的制作完成。

PS:bmp,png,jpg的相互转换

path = "C:/Users/eadhaw/Desktop/0120test/images/"
new_path = "C:/Users/eadhaw/Desktop/0120test/png/"
files = os.listdir(path)
#files.sort()

for filename in files:
    f_path = path + filename
    print(f_path)
    img = cv2.imread(f_path)
    print(img.shape)
    
    newname=filename.split(".")[0]+".png"  # 此处可更换想要转换的类型
    print(newname)
    f_new_path = new_path + newname
    cv2.imwrite(f_new_path,img)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容