逆向将物体检测数据集生成labelme标注的数据
【摘要】
对一些现有的数据集进行反推,生成labelme标注的格式。生成的效果如下图:
使用了 RSOD部分数据,将VOC数据集反推为labelme的标注数据。
代码如下:
import sysimport os.path as ospimport iofrom labelme.logger import loggerfrom labe...
对一些现有的数据集进行反推,生成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'))
文章来源: wanghao.blog.csdn.net,作者:AI浩,版权归原作者所有,如需转载,请联系作者。
原文链接:wanghao.blog.csdn.net/article/details/105738682
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)