当前位置:网站首页>可視化yolov5格式數據集(labelme json文件)
可視化yolov5格式數據集(labelme json文件)
2022-07-03 01:53:00 【athrunsunny】
在自己的項目中,常常會遇到數據集少的情况,但是網上有些標注好的數據,或多或少和自己的項目的標注要求有差別,又不想重新標注,只想微調一下,但是yolov5的原生格式修改起來不直觀,這時候可以將yolov5格式的數據轉成labelme的json格式,這樣就方便對數據的標注進行微調,同時也不用花大心思去標注大數據,减少人工成本。
# -*- coding: utf-8 -*-
"""
Time: 2021.10.26
Author: Athrunsunny
Version: V 0.1
File: yolotolabelme.py
Describe: Functions in this file is change the dataset format to labelme json file
"""
import base64
import io
import os
import numpy as np
import json
from glob import glob
import cv2
import shutil
import yaml
from tqdm import tqdm
import PIL.Image
ROOT_DIR = os.getcwd()
VERSION = '4.5.7' # 根據labelme的版本來修改
def img_arr_to_b64(img_arr):
img_pil = PIL.Image.fromarray(img_arr)
f = io.BytesIO()
img_pil.save(f, format="PNG")
img_bin = f.getvalue()
if hasattr(base64, "encodebytes"):
img_b64 = base64.encodebytes(img_bin)
else:
img_b64 = base64.encodestring(img_bin)
return img_b64
def process_point(points, cls):
info = list()
for point in points:
shape_info = dict()
shape_info['label'] = cls[int(point[0])]
if point is None:
shape_info['points'] = [[], []]
else:
shape_info['points'] = [[point[1], point[2]],
[point[3], point[4]]]
shape_info['group_id'] = None
shape_info['shape_type'] = 'rectangle'
shape_info['flags'] = dict()
info.append(shape_info)
return info
def create_json(img, imagePath, filename, info):
data = dict()
data['version'] = VERSION
data['flags'] = dict()
data['shapes'] = info
data['imagePath'] = imagePath
height, width = img.shape[:2]
data['imageData'] = img_arr_to_b64(img).decode('utf-8')
data['imageHeight'] = height
data['imageWidth'] = width
jsondata = json.dumps(data, indent=4, separators=(',', ': '))
f = open(filename, 'w')
f.write(jsondata)
f.close()
def read_txt(path):
assert os.path.exists(path)
with open(path, mode='r', encoding="utf-8") as f:
content = f.readlines()
content = np.array(content)
res = []
for index, item in enumerate(content):
string = item.split(' ')
res.append(list(map(np.float64, string)))
return np.array(res)
def load_dataset_info(path=ROOT_DIR):
yamlpath = glob(path + "\\*.yaml")[0]
with open(yamlpath, "r", encoding="utf-8") as f:
data = yaml.load(f, Loader=yaml.FullLoader)
return data
def reconvert_list(size, box):
dw = 1. / (size[0])
dh = 1. / (size[1])
x = box[0] / dw
w = box[2] / dw
y = box[1] / dh
h = box[3] / dh
x1 = ((x + 1) * 2 - w) / 2.
y1 = ((y + 1) * 2 - h) / 2.
x2 = ((x + 1) * 2 + w) / 2.
y2 = ((y + 1) * 2 + h) / 2.
return x1, y1, x2, y2
def reconvert_np(size, box):
dw = 1. / (size[0])
dh = 1. / (size[1])
x = box[:, :1] / dw
w = box[:, 2:3] / dw
y = box[:, 1:2] / dh
h = box[:, 3:4] / dh
box[:, :1] = ((x + 1) * 2 - w) / 2.
box[:, 2:3] = ((x + 1) * 2 + w) / 2.
box[:, 1:2] = ((y + 1) * 2 - h) / 2.
box[:, 3:4] = ((y + 1) * 2 + h) / 2.
return box
def txt2json(proctype, cls, path=ROOT_DIR):
process_image_path = os.path.join(path, proctype, 'images')
process_label_path = os.path.join(path, proctype, 'labels')
externs = ['png', 'jpg', 'JPEG', 'BMP', 'bmp']
imgfiles = list()
for extern in externs:
imgfiles.extend(glob(process_image_path + "\\*." + extern))
createfile = os.path.join(ROOT_DIR, 'createjson', proctype)
if not os.path.exists(createfile):
os.makedirs(createfile)
for image_path in tqdm(imgfiles):
frame = cv2.imread(image_path)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
height, width = frame.shape[:2]
size = (width, height)
imgfilename = image_path.replace("\\", "/").split("/")[-1]
imgname = '.'.join(imgfilename.split('.')[:-1])
jsonpath = os.path.join(createfile, imgname + '.json')
txtpath = os.path.join(process_label_path, imgname + '.txt')
label_and_point = read_txt(txtpath)
label_and_point[:, 1:] = reconvert_np(size, label_and_point[:, 1:])
info = process_point(label_and_point, cls)
create_json(frame, imgname, jsonpath, info)
shutil.copy(image_path, createfile)
def yolotolabelme(path=ROOT_DIR):
pathtype = list()
if 'train' in os.listdir(path):
pathtype.append('train')
if 'valid' in os.listdir(path):
pathtype.append('valid')
if 'test' in os.listdir(path):
pathtype.append('test')
cls = load_dataset_info()['names']
for file_type in pathtype:
print("Processing image type {} \n".format(file_type))
txt2json(file_type, cls)
if __name__ == "__main__":
yolotolabelme()
將以上代碼命名為yolotolabelme.py並存放在數據集的根目錄下

在運行程序前先將上面代碼中import的幾個庫安裝一下,之後運行

運行之後會在該路徑下生成createjson文件夾

轉換的數據會根據train或valid生成在createjson文件夾下,之後可通過labelme打開

由於我的test數據集是空的,所以轉換後也是空的,使用labelme打開該train路徑下的文件可以可以看到對應的標注

边栏推荐
- 网络安全-漏洞与木马
- word插入公式/endnote
- [leetcode] 797 and 1189 (basis of graph theory)
- What are the differences between software testers with a monthly salary of 7K and 25K? Leaders look up to you when they master it
- Redis:Redis的简单使用
- [camera topic] complete analysis of camera dtsi
- Network security - password cracking
- VIM 9.0 is officially released! The execution speed of the new script can be increased by up to 100 times
- DDL basic operation
- Common English Vocabulary
猜你喜欢
![[shutter] animation animation (animatedbuilder animation use process | create animation controller | create animation | create components for animation | associate animation with components | animatio](/img/32/fa1263d9a2e5f77b0434fce1912cb2.gif)
[shutter] animation animation (animatedbuilder animation use process | create animation controller | create animation | create components for animation | associate animation with components | animatio

Installation and use of serial port packet capturing / cutting tool

CF1617B Madoka and the Elegant Gift、CF1654C Alice and the Cake、 CF1696C Fishingprince Plays With Arr

In the face of difficult SQL requirements, HQL is not afraid

A 30-year-old software tester, who has been unemployed for 4 months, is confused and doesn't know what to do?

Some functions of applet development

In 2022, 95% of the three most common misunderstandings in software testing were recruited. Are you that 5%?

Button button adaptive size of wechat applet
![[fluent] hero animation (hero animation use process | create hero animation core components | create source page | create destination page | page Jump)](/img/68/65b8c0530cfdc92ba4f583b0162544.gif)
[fluent] hero animation (hero animation use process | create hero animation core components | create source page | create destination page | page Jump)

Redis:Redis的简单使用
随机推荐
简易分析fgui依赖关系工具
【数据挖掘】任务4:20Newsgroups聚类
网络安全-中间人攻击
小程序开发的部分功能
【Camera专题】Camera dtsi 完全解析
【Camera专题】HAL层-addChannel和startChannel简析
[error record] an error is reported in the fluent interface (no mediaquery widget ancestor found. | scaffold widgets require a mediaquery)
自定义组件、使用npm包、全局数据共享、分包
网络安全-木马
Summary of interval knowledge
Network security - Trojan horse
Network security - man in the middle attack
Network security - scanning and password explosion 2
技术大佬准备就绪,话题C位由你决定
View of MySQL
Network security OpenVAS
[shutter] animation animation (animatedbuilder animation use process | create animation controller | create animation | create components for animation | associate animation with components | animatio
Scheme and practice of cold and hot separation of massive data
网络安全-DNS欺骗与钓鱼网站
Niuniu's ball guessing game (dynamic planning + prefix influence)