数据标注的可视化——labelme、labelimg

数据标注后,为了方便检查标注情况,我们可以将标注结果显示在图片上层。
例如下图为labelme标注后(json文件)的可视化情况。
在这里插入图片描述

json数据可视化代码

labelme标注后生成的json文件

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# !H:\Anaconda3\envs\new_labelme\python.exe
import argparse
import json
import os
import os.path as osp
import base64
import warnings

import PIL.Image
import yaml

from labelme import utils

import cv2
import numpy as np
from skimage import img_as_ubyte


# from sys import argv

def main():
    warnings.warn("This script is aimed to demonstrate how to convert the\n"
                  "JSON file to a single image dataset, and not to handle\n"
                  "multiple JSON files to generate a real-use dataset.")

    json_file = "E:\\PycharmProjects\\Project\matpool\\data processing\\visual\\Annotations\\"

    # freedom
    list_path = os.listdir(json_file)
    print('freedom =', json_file)
    print(len(list_path))
    for i in range(0, len(list_path)):
        path = os.path.join(json_file, list_path[i])
        if os.path.isfile(path):

            data = json.load(open(path))
            img = utils.img_b64_to_arr(data['imageData'])
            lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])

            captions = ['%s' % (name) for l, name in enumerate(lbl_names)]
            # captions = ['%s' % (name) for name in enumerate(lbl_names)]

            lbl_viz = utils.draw_label(lbl, img, captions)
            # out_dir = osp.basename(path).replace('.', '_')
            out_dir = osp.basename(path).split('.json')[0]
            save_file_name = out_dir
            # out_dir = osp.join(osp.dirname(path), out_dir)

            if not osp.exists(json_file + 'mask'):
                os.mkdir(json_file + 'mask')
            maskdir = json_file + 'mask'

            if not osp.exists(json_file + 'mask_viz'):
                os.mkdir(json_file + 'mask_viz')
            maskvizdir = json_file + 'mask_viz'

            out_dir1 = maskdir
            # if not osp.exists(out_dir1):
            #     os.mkdir(out_dir1)

            # PIL.Image.fromarray(img).save(out_dir1 + '\\' + save_file_name + '_img.png')
            PIL.Image.fromarray(lbl).save(out_dir1 + '/' + save_file_name + '.png')

            PIL.Image.fromarray(lbl_viz).save(maskvizdir + '/' + save_file_name +
                                              '_label_viz.png')

            # if not osp.exists(json_file + '\\' + 'mask_png'):
            #     os.mkdir(json_file + '\\' + 'mask_png')
            # mask_save2png_path = json_file + '\\' + 'mask_png'
            ################################
            # mask_pic = cv2.imread(out_dir1+'\\'+save_file_name+'_label.png',)
            # print('pic1_deep:',mask_pic.dtype)

            # mask_dst = img_as_ubyte(lbl)  # mask_pic
            # print('pic2_deep:', mask_dst.dtype)
            # cv2.imwrite(mask_save2png_path + '\\' + save_file_name + '_label.png', mask_dst)
            ##################################

            with open(osp.join(out_dir1, 'label_names.txt'), 'w') as f:
                for lbl_name in lbl_names:
                    f.write(lbl_name + '\n')

            warnings.warn('info.yaml is being replaced by label_names.txt')
            info = dict(label_names=lbl_names)
            with open(osp.join(out_dir1, 'info.yaml'), 'w') as f:
                yaml.safe_dump(info, f, default_flow_style=False)

            print('Saved to: %s' % out_dir1)


if __name__ == '__main__':
    # base64path = argv[1]
    main()

xml数据可视化代码

labelimg标注后生成的xml文件

import xml.etree.ElementTree as ET  # 读取xml。
import os
from PIL import Image, ImageDraw, ImageFont
from tqdm import tqdm
import time

def parse_rec(filename):
    tree = ET.parse(filename)  # 解析读取xml函数
    objects = []
    img_dir = []
    for xml_name in tree.findall('filename'):
        img_path = os.path.join(pic_path, xml_name.text)
        img_dir.append(img_path)
    for obj in tree.findall('object'):
        obj_struct = {}
        obj_struct['name'] = obj.find('name').text
        obj_struct['pose'] = obj.find('pose').text
        obj_struct['truncated'] = int(obj.find('truncated').text)
        obj_struct['difficult'] = int(obj.find('difficult').text)
        bbox = obj.find('bndbox')
        obj_struct['bbox'] = [int(bbox.find('xmin').text),
                              int(bbox.find('ymin').text),
                              int(bbox.find('xmax').text),
                              int(bbox.find('ymax').text)]
        objects.append(obj_struct)

    return objects, img_dir


# 可视化
def visualise_gt(objects, img_dir, img_name):
    for id, img_path in enumerate(img_dir):
        img = Image.open(img_path)
        draw = ImageDraw.Draw(img)
        for a in objects:
            xmin = int(a['bbox'][0])
            ymin = int(a['bbox'][1])
            xmax = int(a['bbox'][2])
            ymax = int(a['bbox'][3])
            label = a['name']
            draw.rectangle((xmin, ymin, xmax, ymax), fill=None, outline=(255, 0, 0))
            draw.text((xmin - 10, ymin - 20), label, fill=(255, 0, 0), font=font)  # 利用ImageDraw的内置函数,在图片上写入文字
        # img.show()
        img.save(img_name)

if __name__ == '__main__':

    fontPath = "C:\Windows\Fonts\consola.ttf"  # 字体路径
    root = 'E:\\PycharmProjects\\Project\\matpool\\data processing\\visual'
    ann_path = os.path.join(root, 'Annotations')  # xml文件所在路径
    pic_path = os.path.join(root, 'JPEGImages')  # 样本图片路径
    save_path = os.path.join(root, 'Visual')     # 保存路径
    font = ImageFont.truetype(fontPath, 20)

    for filename in tqdm(os.listdir(ann_path)):
        xml_path = os.path.join(ann_path, filename)
        object, img_dir = parse_rec(xml_path)
        jpegname = 'Visual/'+filename[:-4]+'.jpg'
        visualise_gt(object, img_dir,jpegname)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值