目标检测yolo格式与labelme标注互相转换及其可视化

这篇具有很好参考价值的文章主要介绍了目标检测yolo格式与labelme标注互相转换及其可视化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

          yolo目标检测数据采用矩形框进行标注,其标注格式为[cls_id xp yp wp hp],cls_id表示目标所属的类别序号。xp、yp表示目标中心点相对坐标,其中xp等于目标的绝对横坐标除以图像宽度,yp等于目标的绝对纵坐标除以图像高度。wp和hp表示目标的相对宽度和高度,其中wp等于目标的绝对宽度除以图像宽度,hp等于目标的绝对高度除以图像高度。每张图片的标注结果以txt文本文件存储,每一行[cls_id xp yp wp hp]表示一个目标。

cv_img=cv2.imdecode(np.fromfile(imagePath,dtype=np.uint8),flags=cv2.IMREAD_COLOR)

        labelme矩形目标的标注格式为[x1 y1 x2 y2],表示目标的左上和右下的绝对坐标。

1 yolo转labelme 

        yolo转labelme标注程序如下所示:

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 29 17:42:11 2022
@author: https://blog.csdn.net/suiyingy?type=blog
"""
import cv2
import os
import json
import shutil
import numpy as np
from pathlib import Path

id2cls = {0:'pig'}

def xyxy2labelme(labels, w, h, image_path, save_dir='res/'):
    save_dir = str(Path(save_dir)) + '/'
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    label_dict = {}
    label_dict['version'] = '5.0.1'
    label_dict['flags'] = {}
    label_dict['imageData'] = None
    label_dict['imagePath'] = image_path
    label_dict['imageHeight'] = h
    label_dict['imageWidth'] = w
    label_dict['shapes'] = []
    for l in labels:
        tmp = {}
        tmp['label'] = id2cls[int(l[0])]
        tmp['points'] =[[l[1], l[2]], [l[3], l[4]]]
        tmp['group_id']= None
        tmp['shape_type'] = 'rectangle'
        tmp['flags'] = {}
        label_dict['shapes'].append(tmp)    
    fn = save_dir+image_path.rsplit('.', 1)[0]+'.json'
    with open(fn, 'w') as f:
        json.dump(label_dict, f)

def yolo2labelme(yolo_image_dir, yolo_label_dir, save_dir='res/'):
    yolo_image_dir = str(Path(yolo_image_dir)) + '/'
    yolo_label_dir = str(Path(yolo_label_dir)) + '/'
    save_dir = str(Path(save_dir)) + '/'
    image_files = os.listdir(yolo_image_dir)
    for iimgf, imgf in enumerate(image_files):
        print(iimgf+1, '/', len(image_files), imgf)
        fn = imgf.rsplit('.', 1)[0]
        shutil.copy(yolo_image_dir + imgf, save_dir + imgf)
        image = cv2.imread(yolo_image_dir + imgf)
        h,w = image.shape[:2]
        if not os.path.exists(yolo_label_dir + fn + '.txt'):
            continue
        labels = np.loadtxt(yolo_label_dir + fn + '.txt').reshape(-1, 5)
        if len(labels) < 1:
            continue
        labels[:,1::2] = w * labels[:, 1::2]
        labels[:,2::2] = h * labels[:, 2::2]
        labels_xyxy = np.zeros(labels.shape)
        labels_xyxy[:, 1] = np.clip(labels[:, 1] - labels[:, 3]/2, 0, w)
        labels_xyxy[:, 2] = np.clip(labels[:, 2] - labels[:, 4]/2, 0, h)
        labels_xyxy[:, 3] = np.clip(labels[:, 1] + labels[:, 3]/2, 0, w)
        labels_xyxy[:, 4] = np.clip(labels[:, 2] + labels[:, 4]/2, 0, h)
        xyxy2labelme(labels_xyxy, w, h, imgf, save_dir)
    print('Completed!')

if __name__ == '__main__':
    yolo_image_dir = r'H:\Data\pigs\images\train'
    yolo_label_dir = r'H:\Data\pigs\labels\train'
    save_dir = r'res/'
    yolo2labelme(yolo_image_dir, yolo_label_dir, save_dir)

 2 labelme转yolo

        labelme转yolo标注程序如下所示:

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 29 17:42:11 2022
@author: https://blog.csdn.net/suiyingy?type=blog
"""
import cv2
import os
import json
import shutil
import numpy as np
from pathlib import Path
from glob import glob

id2cls = {0: 'pig'}
cls2id = {'pig': 0}

#支持中文路径
def cv_imread(filePath):
    cv_img=cv2.imdecode(np.fromfile(filePath,dtype=np.uint8),flags=cv2.IMREAD_COLOR)
    return cv_img

def labelme2yolo_single(label_file):
    anno= json.load(open(label_file, "r", encoding="utf-8"))
    shapes = anno['shapes']
    w0, h0 = anno['imageWidth'], anno['imageHeight']
    image_path = os.path.basename(anno['imagePath'])
    labels = []
    for s in shapes:
        pts = s['points']
        x1, y1 = pts[0]
        x2, y2 = pts[1]
        x = (x1 + x2) / 2 / w0 
        y = (y1 + y2) / 2 / h0
        w  = abs(x2 - x1) / w0
        h  = abs(y2 - y1) / h0
        cid = cls2id[s['label']]        
        labels.append([cid, x, y, w, h])
    return np.array(labels), image_path

def labelme2yolo(labelme_label_dir, save_dir='res/'):
    labelme_label_dir = str(Path(labelme_label_dir)) + '/'
    save_dir = str(Path(save_dir)) + '/'
    yolo_label_dir = save_dir + 'labels/'
    yolo_image_dir = save_dir + 'images/'
    if not os.path.exists(yolo_image_dir):
        os.makedirs(yolo_image_dir)
    if not os.path.exists(yolo_label_dir):
        os.makedirs(yolo_label_dir)

    json_files = glob(labelme_label_dir + '*.json')
    for ijf, jf in enumerate(json_files):
        print(ijf+1, '/', len(json_files), jf)
        filename = os.path.basename(jf).rsplit('.', 1)[0]
        labels, image_path = labelme2yolo_single(jf)
        if len(labels) > 0:
            np.savetxt(yolo_label_dir + filename + '.txt', labels)
            shutil.copy(labelme_label_dir + image_path, yolo_image_dir + image_path)
    print('Completed!')
    
if __name__ == '__main__':
    root_dir = r'D:\tmp\images'
    save_dir = r'res'
    labelme2yolo(root_dir, save_dir)

3 labelme标注可视化 

        labelme标注结果可视化程序如下所示:

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 29 17:42:11 2022
@author: https://blog.csdn.net/suiyingy?type=blog
"""
import cv2
import os
import json
import shutil
import numpy as np
from pathlib import Path
from glob import glob


id2cls = {0: 'pig'}
cls2id = {'pig': 0}
id2color = {0: (0, 255, 0)}

#支持中文路径
def cv_imread(filePath):
    cv_img=cv2.imdecode(np.fromfile(filePath,dtype=np.uint8),flags=cv2.IMREAD_COLOR)
    return cv_img

def get_labelme_info(label_file):
    anno= json.load(open(label_file, "r", encoding="utf-8"))
    shapes = anno['shapes']
    image_path = os.path.basename(anno['imagePath'])
    labels = []
    for s in shapes:
        pts = s['points']
        x1, y1 = pts[0]
        x2, y2 = pts[1]
        color = id2color[cls2id[s['label']]]
        labels.append([color, x1, y1, x2, y2])
    return labels, image_path

def vis_labelme(labelme_label_dir, save_dir='res/'):
    labelme_label_dir = str(Path(labelme_label_dir)) + '/'
    save_dir = str(Path(save_dir)) + '/'
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    json_files = glob(labelme_label_dir + '*.json')
    for ijf, jf in enumerate(json_files):
        print(ijf+1, '/', len(json_files), jf)
        filename = os.path.basename(jf).rsplit('.', 1)[0]
        labels, image_path = get_labelme_info(jf)
        image = cv_imread(labelme_label_dir + image_path)
        for label in labels:
            color = label[0]
            x1, y1, x2, y2 = label[1:]
            x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
            cv2.rectangle(image, (x1, y1), (x2, y2), color, 3)
        #显示图片
        # cv2.imshow(filename, image)
        # cv2.waitKey(0)
        #支持中文路径,保存图片
        cv2.imencode(os.path.splitext(image_path)[-1], image)[1].tofile(save_dir + image_path)
    print('Completed!')
    
if __name__ == '__main__':
    root_dir = r'D:\tmp\images'
    save_dir = r'res'
    vis_labelme(root_dir, save_dir)

4 yolo标注可视化

        yolo格式数据可视化程序如下所示:文章来源地址https://www.toymoban.com/news/detail-450612.html

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 29 17:42:11 2022
@author: https://blog.csdn.net/suiyingy?type=blog
"""
import cv2
import os
import numpy as np
from pathlib import Path

id2cls = {0: 'pig'}
cls2id = {'pig': 0}
id2color = {0: (0, 255, 0)}

#支持中文路径
def cv_imread(filePath):
    cv_img=cv2.imdecode(np.fromfile(filePath,dtype=np.uint8),flags=cv2.IMREAD_COLOR)
    return cv_img
    
def vis_yolo(yolo_image_dir, yolo_label_dir, save_dir='res/'):
    yolo_image_dir = str(Path(yolo_image_dir)) + '/'
    yolo_label_dir = str(Path(yolo_label_dir)) + '/'
    save_dir = str(Path(save_dir)) + '/'
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    image_files = os.listdir(yolo_image_dir)
    for iimgf, imgf in enumerate(image_files):
        print(iimgf+1, '/', len(image_files), imgf)
        fn = imgf.rsplit('.', 1)[0]
        image = cv_imread(yolo_image_dir + imgf)
        h,w = image.shape[:2]
        if not os.path.exists(yolo_label_dir + fn + '.txt'):
            continue
        labels = np.loadtxt(yolo_label_dir + fn + '.txt').reshape(-1, 5)
        if len(labels) > 0:
            labels[:,1::2] = w * labels[:, 1::2]
            labels[:,2::2] = h * labels[:, 2::2]
            labels_xyxy = np.zeros(labels.shape)
            labels_xyxy[:, 1] = np.clip(labels[:, 1] - labels[:, 3]/2, 0, w)
            labels_xyxy[:, 2] = np.clip(labels[:, 2] - labels[:, 4]/2, 0, h)
            labels_xyxy[:, 3] = np.clip(labels[:, 1] + labels[:, 3]/2, 0, w)
            labels_xyxy[:, 4] = np.clip(labels[:, 2] + labels[:, 4]/2, 0, h)
            for label in labels_xyxy:
                color = id2color[int(label[0])]
                x1, y1, x2, y2 = label[1:]
                x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
                cv2.rectangle(image, (x1, y1), (x2, y2), color, 3)
        cv2.imencode(os.path.splitext(imgf)[-1], image)[1].tofile(save_dir + imgf)
    print('Completed!')
        
if __name__ == '__main__':
    yolo_image_dir = r'H:\Data\pigs\images\train'
    yolo_label_dir = r'H:\Data\pigs\labels\train'
    save_dir = r'res1/'
    vis_yolo(yolo_image_dir, yolo_label_dir, save_dir)

到了这里,关于目标检测yolo格式与labelme标注互相转换及其可视化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • YOLO目标检测——VOC2007数据集+已标注VOC格式标签下载分享

    VOC2007数据集是一个经典的目标检测数据集,该数据集包含了20个常见的目标类别,涵盖了人、动物、交通工具等多个领域,共同11220图片。使用lableimg标注软件标注,标注框质量高,标签格式为VOC格式(即xml标签),可以直接用于YOLO系列的目标检测。 数据集点击下载 :YOLO目

    2024年02月09日
    浏览(47)
  • YOLO目标检测——棉花病虫害数据集+已标注txt格式标签下载分享

    实际项目应用 :棉花病虫害防治 数据集说明 :棉花病虫害检测数据集,真实场景的高质量图片数据,数据场景丰富 标签说明 :使用lableimg标注软件标注,标注框质量高,含voc(xml)、coco(json)和yolo(txt)三种格式标签,分别存放在不同文件夹下,可以直接用于YOLO系列的目标检测

    2024年02月09日
    浏览(46)
  • YOLO目标检测——口罩规范佩戴数据集+已标注xml和txt格式标签下载分享

    实际项目应用 :疫情防控、智能安检、公共场所监控场景下的大密度人群检测是否佩戴口罩 数据集说明 :人脸口罩规范佩戴数据集,真实场景的高质量图片数据,数据场景丰富,含有正确佩戴口罩、未正确佩戴口罩和没佩戴口罩图片 标签说明 :使用lableimg标注软件标注,标

    2024年02月09日
    浏览(57)
  • 数据格式转换(labelme、labelimg、yolo格式相互转换)

    👨‍💻 个人简介: 深度学习图像领域工作者 🎉 总结链接:              链接中主要是个人工作的总结,每个链接都是一些常用demo,代码直接复制运行即可。包括:                     📌 1.工作中常用深度学习脚本                     📌 2.to

    2023年04月23日
    浏览(49)
  • PaddleDetect图像目标检测模型训练之数据标注——使用labelme进行标注

    在做PaddleDetect图像检测模型训练时,需要对数据集进行人工标注,下面将已货车检测为例,使用labelme进行标注的详细过程记录一下,以防日后忘记。 本文中使用到的文件请到这里下载:https://download.csdn.net/download/loutengyuan/87616492 labelme是图形图像注释工具,它是用Python编写的

    2024年02月16日
    浏览(47)
  • 数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式

    labelImg是一个开源的图像标注工具,用于创建图像标注数据集。它提供了一个简单易用的界面,允许用户通过绘制边界框或者创建多边形来标注图像中的对象。它支持多种常见的标注格式,如Pascal VOC、YOLO和COCO等。 使用labelImg,用户可以加载图像文件夹,逐个标注图像中的对

    2024年02月10日
    浏览(54)
  • 从零开始的目标检测和关键点检测(一):用labelme标注数据集

    前言 :前段时间用到了mmlab的mmdetction和mmpose,因此以一个小的数据集复现了从数据集制作到模型训练和测试的全流程。希望对想入门mmlab框架的小伙伴有所帮助。主要想做目标检测和关键点检测,因此标注目标检测框和关键点。标注范式:注意关键点只能在一个目标检测框内

    2024年02月06日
    浏览(52)
  • labelme目标检测数据类型转换

    LabelMe是一个开源的在线图像标注工具,旨在帮助用户创建和标记图像数据集。它提供了一个用户友好的界面,让用户可以直观地在图像上绘制标记框、多边形、线条等,以标识和注释图像中的对象或区域。 GitHub:https://github.com/wkentaro/labelme 经过labelme标注工具对图像中的目标

    2024年02月04日
    浏览(45)
  • 将Yolo格式标注文件转换为VOC格式

    这篇文章主要参考博客Yolo标准数据集格式转Voc数据集中的代码,对原博客代码进行一定修改、添加注释,此外还在后面添加了我自己写的一段关于对转换后的标注文件进行整理的脚本代码。 Yolo标注的格式与VOC格式不同之处在于: (1)Yolo格式下的每张图片的所有包含的目标

    2024年02月11日
    浏览(44)
  • 开集目标检测-标签提示目标检测大模型(吊打YOLO系列-自动化检测标注)

    大多数现有的对象检测模型都经过训练来识别一组有限的预先确定的类别。将新类添加到可识别对象列表中需要收集和标记新数据,并从头开始重新训练模型,这是一个耗时且昂贵的过程。该大模型的目标是开发一个强大的系统来检测由人类语言输入指定的任意对象,而无需

    2024年01月23日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包