对一些现有的数据集进行反推,生成labelme标注的格式。生成的效果如下图:

使用了 RSOD部分数据,将VOC数据集反推为labelme的标注数据。

代码如下:

import sys
import os.path as osp
import io
from labelme.logger import logger
from labelme import PY2
from labelme import QT4
import PIL.Image
import base64
from labelme import utils
import os
import cv2
import xml.etree.ElementTree as ET
 
module_path = os.path.abspath(os.path.join('..'))
if module_path not in sys.path:
    sys.path.append(module_path)
import json
from PIL import Image
 
Image.MAX_IMAGE_PIXELS = None
imageroot = 'RSOD/'
listDir = ['aircraft', 'oiltank']//数据的类别
 
def load_image_file(filename):
    try:
        image_pil = PIL.Image.open(filename)
    except IOError:
        logger.error('Failed opening image file: {}'.format(filename))
        return
 
    # apply orientation to image according to exif
    image_pil = utils.apply_exif_orientation(image_pil)
 
    with io.BytesIO() as f:
        ext = osp.splitext(filename)[1].lower()
        if PY2 and QT4:
            format = 'PNG'
        elif ext in ['.jpg', '.jpeg']:
            format = 'JPEG'
        else:
            format = 'PNG'
        image_pil.save(f, format=format)
        f.seek(0)
        return f.read()
 
 
def dict_json(flags, imageData, shapes, imagePath, fillColor=None, lineColor=None, imageHeight=100, imageWidth=100):
    '''
    :param imageData: str
    :param shapes: list
    :param imagePath: str
    :param fillColor: list
    :param lineColor: list
    :return: dict
    '''
    return {"version": "3.16.4", "flags": flags, "shapes": shapes, 'lineColor': lineColor, "fillColor": fillColor,
            'imagePath': imagePath.split('/')[-1], "imageData": imageData, 'imageHeight': imageHeight,
            'imageWidth': imageWidth}
 
 
data = json.load(open('1.json'))
for subPath in listDir:
    xmlpathName = imageroot + subPath + '/Annotation/xml'
    imagepath = imageroot + subPath + '/JPEGImages'
    resultFile = os.listdir(xmlpathName)
    for file in resultFile:
        print(file)
        imagePH = imagepath + '/' + file.split('.')[0] + '.jpg'
        print(imagePH)
        tree = ET.parse(xmlpathName + '/' + file)
        image = cv2.imread(imagePH)
        shapes = data["shapes"]
        version = data["version"]
        flags = data["flags"]
        lineColor = data["lineColor"]
        fillColor = data['fillColor']
        newshapes = []
        for elem in tree.iter():
            if 'object' in elem.tag:
                name = ''
                xminNode = 0
                yminNode = 0
                xmaxNode = 0
                ymaxNode = 0
                for attr in list(elem):
                    if 'name' in attr.tag:
                        name = attr.text
                    if 'bndbox' in attr.tag:
                        for dim in list(attr):
                            if 'xmin' in dim.tag:
                                xminNode = int(round(float(dim.text)))
                            if 'ymin' in dim.tag:
                                yminNode = int(round(float(dim.text)))
                            if 'xmax' in dim.tag:
                                xmaxNode = int(round(float(dim.text)))
                            if 'ymax' in dim.tag:
                                ymaxNode = int(round(float(dim.text)))
                line_color = None
                fill_color = None
                newPoints = [[float(xminNode), float(yminNode)], [float(xmaxNode), float(ymaxNode)]]
                shape_type = 'rectangle'
                flags = flags
                newshapes.append(
                    {"label": name, "line_color": line_color, "fill_color": fill_color, "points": newPoints,
                     "shape_type": shape_type, "flags": flags})
        imageData_90 = load_image_file(imagePH)
        imageData_90 = base64.b64encode(imageData_90).decode('utf-8')
        imageHeight = image.shape[0]
        imageWidth = image.shape[1]
        data_90 = dict_json(flags, imageData_90, newshapes, imagePH, fillColor, lineColor, imageHeight, imageWidth)
        json_file = imagePH[:-4] + '.json'
        json.dump(data_90, open(json_file, 'w'))


转载自:https://wanghao.blog.csdn.net/article/details/105738682