对一些现有的数据集进行反推,生成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'))