当前位置:网站首页>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

边栏推荐
- [camera topic] turn a drive to light up the camera
- How to refresh the opening amount of Oracle ERP
- Virtual list
- A simple tool for analyzing fgui dependencies
- 网络安全-漏洞与木马
- [data mining] task 5: k-means/dbscan clustering: double square
- The technology boss is ready, and the topic of position C is up to you
- DML Foundation
- [shutter] animation animation (animatedwidget animation use process | create animation controller | create animation | create animatedwidget animation component | animation operation)
- 云原生题目整理(待更新)
猜你喜欢

A simple tool for analyzing fgui dependencies
![[Appendix 6 Application of reflection] Application of reflection: dynamic agent](/img/e7/0ee42902b178b13e9a41385267e7b6.jpg)
[Appendix 6 Application of reflection] Application of reflection: dynamic agent
![[camera topic] turn a drive to light up the camera](/img/d3/7aabaa5c75813abc4a43820b4c3706.png)
[camera topic] turn a drive to light up the camera

【数据挖掘】任务2:医学数据库MIMIC-III数据处理

STM32 - switch of relay control lamp

Introduction to flask tutorial

深度(穿透)选择器 ::v-deep/deep/及 > > >

"Jetpack - livedata parsing"

STM32 - GPIO input / output mode
![[shutter] animation animation (basic process of shutter animation | create animation controller | create animation | set value listener | set state listener | use animation values in layout | animatio](/img/70/54eb9359ac91aa43383b240eb036b7.gif)
[shutter] animation animation (basic process of shutter animation | create animation controller | create animation | set value listener | set state listener | use animation values in layout | animatio
随机推荐
疫情当头,作为Leader如何进行团队的管理?| 社区征文
[data mining] task 3: decision tree classification
ByteDance data Lake integration practice based on Hudi
[AUTOSAR cantp] -2.11-uds diagnostic response frame data segment data padding data filling and data optimization data optimization (Theory + configuration)
Introduction to flask tutorial
【Camera专题】手把手撸一份驱动 到 点亮Camera
"Jetpack - livedata parsing"
[camera topic] complete analysis of camera dtsi
查询商品案例-页面渲染数据
Learn BeanShell before you dare to say you know JMeter
[error record] an error is reported in the fluent interface (no mediaquery widget ancestor found. | scaffold widgets require a mediaquery)
Network security - phishing
Three core issues of concurrent programming - "deep understanding of high concurrent programming"
STM32 - introduction of external interrupts exti and NVIC
Cloud native topic sorting (to be updated)
[understanding of opportunity -36]: Guiguzi - flying clamp chapter - prevention against killing and bait
Telecom Customer Churn Prediction challenge
Qtablewidget lazy load remaining memory, no card!
Sweet talk generator, regular greeting email machine... Open source programmers pay too much for this Valentine's day
Answers to ten questions about automated testing software testers must see