1、安装labelme
#创建虚拟环境并安装labelme
conda create --name=labelme python=2.7(这一步python=*选择自己的Python版本)
#提前确定好要安装的版本,不然后后续变动时,相当于要重新安装一遍
activate labelme
conda install pyqt
#安装时可能pip版本不够,需要换源后更新
pip install labelme
2、使用labelme进行标注
activate labelme
labelme
3、将jupyter notebook 在虚拟环境中激活
conda activate labelme
conda install ipykernel
python -m ipykernel install --name labelme
#如果打卡notebook后,内核无法启动,可尝试查看ipykernel版本
pip list
#然后更新
pip install --upgrade ipykernel
4、安装需要的库
#cv2
pip3 install opencv-python
5、运行代码进行转换
import json
import numpy as np
import cv2
import os
#通过labelme得到的json文件,获得其中的点位信息与原图长宽绘制mask
#适用于多标签场合,不过需要提前修改对应标签名称
def json2mask(json_path):
with open(json_path, "r") as f:
data = f.read()
data = json.loads(data)
img_x = data['imageHeight']
img_y = data['imageWidth']
shapes = data['shapes']
img = np.zeros((img_x,img_y,1)) #白色背景
for x in shapes:
#print(x['label'])
if x['label']=='':
data = x['points']
data = np.array(data, dtype=np.int32)
color = 128
cv2.fillPoly(img, # 原图画板
[data], # 多边形的点
color=color)
if x['label']=='':
data = x['points']
data = np.array(data, dtype=np.int32)
color = 254
cv2.fillPoly(img, # 原图画板
[data], # 多边形的点
color=color)
return img
#单文件测试
# json_path = '/data/huangxy/workspace/data/outlooking/json/0601_2.json'
# img = json2mask(json_path)
# cv2.imwrite('/data/huangxy/workspace/result/z.png', img)
#多文件夹
json_dir = '/data/huangxy/workspace/data/outlooking/json'
save_dir = '/data/huangxy/workspace/data/outlooking/label'
files = os.listdir(json_dir)
os.makedirs(save_dir, exist_ok=True)
num = 1
for file in files :
name = file[0:-5]
json_path = json_dir + '/' + name + '.json'
img = json2mask(json_path)
save_path = save_dir + '/' + name + '.png'
cv2.imwrite(save_path, img)
print(num,'/',len(files),':',name)
num += 1
6、将label覆盖到原图上,并将非标记位置变为黑色。
import cv2
img = 'img.png'
label = 'label.png'
img_png = cv2.imread(img)
label_png = cv2.imread(label)
#单通道标签注释掉下面两行
label_png[:,:,0]=label_png[:,:,2]
label_png[:,:,1]=label_png[:,:,2]
img_png[label_png == 0] = 0
#img_png[label_png != 0] = img_png
#cv2.imshow('img',label_png)
cv2.imshow('img',img_png)
cv2.waitKey(0)
cv2.destroyAllWindows()
#cv2.imwrite('1.png', img_png)
7、绘制轮廓线
import json
import numpy as np
import cv2
import os
def json2maskline(img_path,json_path):
with open(json_path, "r") as f:
data = f.read()
data = json.loads(data)
shapes = data['shapes']
img = cv2.imread(img_path)
for x in shapes:
#print(x['label'])
if x['label']=='外观':
data = x['points']
data = np.array(data, dtype=np.int32)
color = [0,0,255]
cv2.polylines(img, # 原图画板
[data], # 多边形的点
True,
color=color,
thickness=10)
if x['label']=='背景':
data = x['points']
data = np.array(data, dtype=np.int32)
color = [255,0,0]
cv2.polylines(img, # 原图画板
[data], # 多边形的点
True,
color=color,
thickness=10)
return img
#单文件测试
# img_path = ''
# json_path = ''
# img = json2maskline(img_path,json_path)
# cv2.imwrite('/data/huangxy/workspace/result/test.png', img)
#文件夹
json_dir = '/data/huangxy/workspace/data/outlooking/json'
img_dir = '/data/huangxy/workspace/data/outlooking/image'
save_dir = '/data/huangxy/workspace/data/outlooking/line'
files = os.listdir(json_dir)
os.makedirs(save_dir, exist_ok=True)
num = 1
for file in files[:100] :
name = file[0:-5]
json_path = json_dir + '/' + name + '.json'
img_path = img_dir + '/' + name + '.jpg'
img = json2maskline(img_path,json_path)
save_path = save_dir + '/' + name + '.png'
cv2.imwrite(save_path, img)
print(num,'/',len(files),':',name)
num += 1