conda create --name=labelme python=3.5 #考虑兼容性,这里我们选择Python3
activate labelme
conda install pyqt
pip install labelme
labelme的打开:终端直接输入labelme,就可以打开软件了,进行标定了
OpenDir 和 Change Output Dir,可以自动保存
对所有图像标定后,输出放在json_data文件夹下
打开labelme的
D:\Anaconda3\envs\labelme\Lib\site-packages\labelme\cli
实现批量转换,需修改这处代码。
count = os.listdir(json_file)
for i in range(0, len(count)):
path = os.path.join(json_file, count[i])
if args.out is None:
out_dir = osp.basename(json_file+'/'+count[i]).replace('.', '_')
out_dir = osp.join(osp.dirname(json_file+'/'+count[i]), out_dir)
else:
out_dir = args.out
if not osp.exists(out_dir):
os.mkdir(out_dir)
if os.path.isfile(path):
data = json.load(open(path))
批量转换时,注意不需要全部替换下面代码,此处只是根据labelme批量转换的一个例子。一般labelme会有版本限制,全部替换会出错。
import argparse
import base64
import json
import os
import os.path as osp
import imgviz
import PIL.Image
from labelme.logger import logger
from labelme import utils
def main():
logger.warning('This script is aimed to demonstrate how to convert the'
'JSON file to a single image dataset, and not to handle'
'multiple JSON files to generate a real-use dataset.')
parser = argparse.ArgumentParser()
parser.add_argument('json_file')
parser.add_argument('-o', '--out', default=None)
args = parser.parse_args()
json_file = args.json_file
count = os.listdir(json_file)
for i in range(0, len(count)):
path = os.path.join(json_file, count[i])
filename = os.path.splitext(count[i])[0]
if args.out is None:
out_dir = osp.basename(json_file+'/').replace('.', '_')
out_dir = osp.join(osp.dirname(json_file+'/'), out_dir)
else:
out_dir = args.out
if not osp.exists(out_dir):
os.mkdir(out_dir)
if os.path.isfile(path):
data = json.load(open(path))
imageData = data.get('imageData')
if not imageData:
imagePath = os.path.join(os.path.dirname(json_file), data['imagePath'])
with open(imagePath, 'rb') as f:
imageData = f.read()
imageData = base64.b64encode(imageData).decode('utf-8')
img = utils.img_b64_to_arr(imageData)
label_name_to_value = {'_background_': 0}
for shape in sorted(data['shapes'], key=lambda x: x['label']):
label_name = shape['label']
if label_name in label_name_to_value:
label_value = label_name_to_value[label_name]
else:
label_value = len(label_name_to_value)
label_name_to_value[label_name] = label_value
lbl, _ = utils.shapes_to_label(
img.shape, data['shapes'], label_name_to_value
)
label_names = [None] * (max(label_name_to_value.values()) + 1)
for name, value in label_name_to_value.items():
label_names[value] = name
lbl_viz = imgviz.label2rgb(
label=lbl, img=imgviz.asgray(img), label_names=label_names, loc='rb'
)
if not osp.exists(out_dir+'img'):
os.mkdir(out_dir+'img')
if not osp.exists(out_dir + 'label'):
os.mkdir(out_dir + 'label')
if not osp.exists(out_dir + 'label_viz'):
os.mkdir(out_dir + 'label_viz')
if not osp.exists(out_dir + 'label_names'):
os.mkdir(out_dir + 'label_names')
PIL.Image.fromarray(img).save(osp.join(out_dir+'img', filename+'.png'))
utils.lblsave(osp.join(out_dir+'label', filename+'.png'), lbl)
PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir+'label_viz', filename+'.png'))
with open(osp.join(out_dir+'label_names', filename+'.txt'), 'w') as f:
for lbl_name in label_names:
f.write(lbl_name + '\n')
logger.info('Saved to: {}'.format(out_dir))
if __name__ == '__main__':
main()
找到labelme_json_to_dataset.exe可执行文件位置
D:\Anaconda3\envs\labelme\Scripts
以管理员身份,进入DOS环境,命令行进入改文件夹下
执行命令:labelme_json_to_dataset.exe D:\Pycharm\deeplab\data\json_data
后面是json文件保存的路径