当前位置:网站首页>Visualisation de l'ensemble de données au format yolov5 (fichier labelme json)
Visualisation de l'ensemble de données au format yolov5 (fichier labelme json)
2022-07-03 01:53:00 【Athrunsunny】
Dans son propre projet,Il arrive souvent qu'il y ait peu d'ensembles de données,Mais il y a des données bien marquées sur Internet,Plus ou moins différent des exigences d'étiquetage de votre projet,Et je ne veux pas re - étiqueter,Je veux juste le peaufiner.,Maisyolov5Le format natif de n'est pas intuitif,C'est le moment deyolov5Données formatées converties enlabelmeDejsonFormat,Cela facilite le réglage fin des dimensions des données,En même temps, il n'y a pas besoin de beaucoup d'attention pour étiqueter les mégadonnées,Réduire les coûts de main - d'oeuvre.
# -*- 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' # Selonlabelme Pour modifier
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()
Nommez le code ci - dessus comme suit:yolotolabelme.py Et stocké dans le Répertoire racine de l'ensemble de données
Mettez le code ci - dessus avant d'exécuter le programme import Quelques bibliothèques de ,Plus tard.
Après l'exécution, il est généré sous ce chemin createjsonDossiers
Les données converties seront basées sur trainOuvalidProduit àcreatejsonSous le dossier,Par la suitelabelmeOuvre.
A cause de montest L'ensemble de données est vide , Donc C'est aussi vide après la conversion ,UtiliserlabelmeOuvre ça.train Les fichiers sous le chemin peuvent voir les dimensions correspondantes
边栏推荐
- ByteDance data Lake integration practice based on Hudi
- Comment le chef de file gère - t - il l'équipe en cas d'épidémie? Contributions communautaires
- Query product cases - page rendering data
- [camera topic] turn a drive to light up the camera
- Custom components, using NPM packages, global data sharing, subcontracting
- [data mining] task 5: k-means/dbscan clustering: double square
- View of MySQL
- 网络安全-密码破解
- Common English Vocabulary
- Cloud native topic sorting (to be updated)
猜你喜欢
[Appendix 6 Application of reflection] Application of reflection: dynamic agent
Niuniu's ball guessing game (dynamic planning + prefix influence)
Introduction to kotlin collaboration
Introduction to flask tutorial
Analysis, use and extension of open source API gateway apisex
[shutter] animation animation (animatedbuilder animation use process | create animation controller | create animation | create components for animation | associate animation with components | animatio
Smart management of Green Cities: Digital twin underground integrated pipe gallery platform
Performance test | script template sorting, tool sorting and result analysis
Learn BeanShell before you dare to say you know JMeter
Scheme and practice of cold and hot separation of massive data
随机推荐
Network security - dynamic routing protocol rip
网络安全-病毒
[data mining] task 4:20newsgroups clustering
Network security - man in the middle attack
Network security - password cracking
Storage basic operation
网络安全-DNS欺骗与钓鱼网站
Main features of transport layer TCP and TCP connection
树形结构数据的处理
A simple tool for analyzing fgui dependencies
2022 spring "golden three silver four" job hopping prerequisites: Software Test interview questions (with answers)
The testing process that software testers should know
Analysis, use and extension of open source API gateway apisex
PS remove watermark details
网络安全-openvas
Internal connection query and external connection
[camera topic] turn a drive to light up the camera
Network security - talking about security threats
[camera topic] complete analysis of camera dtsi
DQL basic operation