【深度学习Labelme】使用Segment Anything Model (SAM)快速打标,labelme多边形转yolo txt框看看对不对

文章目录

  • windows安装环境
  • 打开labelme
  • 自动保存勾选上,保存图片数据不要勾选
  • 选SAM精准模型,然后打开图片路径,然后点击创建AI多边形:
  • 鼠标点击确认物体控制点,确认完成后,双击鼠标完成选取,并给上标签。
  • 这样就有对应json了:
  • json转为yolotxt
  • 验证对不对看图

windows安装环境


# py310
# torch>=1.7
# torchvision>=0.8
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
pip install  appdirs
pip install  opencv-python-headless
pip install git+https://github.com/facebookresearch/segment-anything.git

pip install  labelme

打开labelme

在这里插入图片描述

自动保存勾选上,保存图片数据不要勾选

在这里插入图片描述

或者修改C:\Users\Administrator.labelmerc的默认配置为:

auto_save: true
display_label_popup: true
store_data: false
keep_prev: false
keep_prev_scale: false
keep_prev_brightness: false
keep_prev_contrast: false
logger_level: info

选SAM精准模型,然后打开图片路径,然后点击创建AI多边形:

在这里插入图片描述

鼠标点击确认物体控制点,确认完成后,双击鼠标完成选取,并给上标签。

在这里插入图片描述

这样就有对应json了:

在这里插入图片描述

json转为yolotxt

执行这个代码,输入是json文件夹路径、yolo txt保存路径,输出就是将json转为yolotxt:

import os
import json


def convert_to_yolo(json_path, dst_path, label_dict):
    # 打开JSON文件
    with open(json_path, 'r') as f:
        data = json.load(f)

    # 获取图片的宽度和高度
    img_width = data['imageWidth']
    img_height = data['imageHeight']

    # 打开目标txt文件
    dst_file_path = os.path.join(dst_path, os.path.splitext(os.path.basename(json_path))[0] + '.txt')
    with open(dst_file_path, 'w') as dst_file:
        # 遍历多边形标记
        for shape in data['shapes']:
            label = shape['label']

            # 如果标签是新的,为其分配一个新的yolo标签数字
            if label not in label_dict:
                label_dict[label] = len(label_dict)

            # 获取yolo标签数字
            yolo_label = label_dict[label]

            # 获取多边形的点坐标
            points = shape['points']

            # 断言是多边形"shape_type": "polygon",
            assert shape['shape_type'] == 'polygon'

            # 计算多边形的矩形包裹框
            x_min = min(point[0] for point in points)
            y_min = min(point[1] for point in points)
            x_max = max(point[0] for point in points)
            y_max = max(point[1] for point in points)

            # 计算矩形中心点的归一化坐标
            x_center = (x_min + x_max) / (2 * img_width)
            y_center = (y_min + y_max) / (2 * img_height)
            width = (x_max - x_min) / img_width
            height = (y_max - y_min) / img_height

            # round 6
            x_center = round(x_center, 6)
            y_center = round(y_center, 6)
            width = round(width, 6)
            height = round(height, 6)

            # 将数据写入到txt文件中
            dst_file.write(f"{yolo_label} {x_center} {y_center} {width} {height}\n")


def convert_folder_to_yolo(src_folder, dst_folder):
    # 如果想自己自定义标签数字,可以修改为label_dict= {'person': 0, 'car': 1, ...} 这种形式
    label_dict = {}
    # 遍历文件夹中的所有文件
    for filename in os.listdir(src_folder):
        if filename.endswith('.json'):
            json_path = os.path.join(src_folder, filename)
            convert_to_yolo(json_path, dst_folder, label_dict)
    print("Label与YOLO标签数字的字典:")
    print(label_dict)


# 用法示例
# json 路径
src_folder = r'C:\Users\Administrator\Pictures\car'
# yolo txt文件保存路径
dst_folder = r'C:\Users\Administrator\Pictures\car'
convert_folder_to_yolo(src_folder, dst_folder)

验证对不对看图

输入图片文件夹和yolotxt文件夹,看看yolotxt对不对:

import os

import cv2


def draw_boxes(image_path, yolo_txt_path):
    # 读取图像
    image = cv2.imread(image_path)
    if image is None:
        print(f"Error: Unable to read image from {image_path}")
        return

    # 打开YOLO格式的txt文件
    with open(yolo_txt_path, 'r') as file:
        lines = file.readlines()

    # 遍历每行数据
    for line in lines:
        # 解析每行数据
        parts = line.strip().split(' ')
        yolo_label = int(parts[0])
        x_center, y_center, width, height = map(float, parts[1:])

        # 计算矩形左上角和右下角的坐标
        x_min = int((x_center - width / 2) * image.shape[1])
        y_min = int((y_center - height / 2) * image.shape[0])
        x_max = int((x_center + width / 2) * image.shape[1])
        y_max = int((y_center + height / 2) * image.shape[0])

        # 获取标签
        label = str(yolo_label)

        # 绘制矩形框和标签
        cv2.rectangle(image, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)
        cv2.putText(image, label, (x_min, y_min - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

    # 显示图像
    cv2.imshow("Image", image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


# 用法示例
image_path = r'C:\Users\Administrator\Pictures\car'
# yolo txt文件保存路径
yolo_txt_path = r'C:\Users\Administrator\Pictures\car'

images_files = [f for f in os.listdir(image_path) if f.lower().endswith(('.jpg', '.png', '.jpeg'))]
images_files = [os.path.join(image_path, f) for f in images_files]
for img_path in images_files:
    yolo_txt_path = os.path.splitext(img_path)[0] + '.txt'
    draw_boxes(img_path, yolo_txt_path)

很对:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/613077.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django 静态文件管理与部署指南

title: Django 静态文件管理与部署指南 date: 2024/5/10 17:38:36 updated: 2024/5/10 17:38:36 categories: 后端开发 tags: WebOptCDN加速DjangoCompressWebpackStaticDeployCICD-ToolsSecStatic 第一章:介绍 Django 静态文件的概念和重要性 在 Web 开发中&a…

解读计数器算法:原理、Java实现与优劣分析

计数器算法的介绍 计数器算法的基本原理是通过一个计数器来记录事件的发生次数。每当一个特定的事件发生时,计数器的值就会增加一。当需要检查这个事件发生的次数时,只需要查看计数器的当前值即可。这种方法简单直观,易于理解和实现。 想象…

Docker + Django跨域解决方案

什么是Django Django 是一个开源的高级 Python Web 框架,它鼓励快速开发并遵循可重用和可维护的实践。Django 是在 MTV(模型-模板-视图)模式的基础上设计的,这个模式类似于但不同于 MVC(模型-视图-控制器)模…

雷森托尔环保科技有限公司见证2024杭州数字供应链装备展潮流

参展企业介绍 青岛雷森托尔环保科技有限公司创建于2018年,位于山东青岛,现注册资本3000万。公司主营生产模压木托盘、化工木托盘、大型设备木包装、出口木托盘、酒柜木酒架等,公司拥有技术人员6人,均为包装设计专业毕业&#xff0…

智慧公厕管理系统的四层架构:感知层、传输层、平台层和应用层

智慧公厕管理系统是一种利用先进技术实现智能化管理和优化厕所体验的创新解决方案。该系统采用复杂的架构,涵盖了多个应用子系统,致力于提高公厕的卫生状况、资源利用效率、安全性以及用户体验。本文将以智慧公厕源头实力厂家广州中期科技有限公司&#…

element el-date-picker组件 输入输出格式为时间戳

<!-- 时间戳 --><el-date-pickerv-model"time"value-format"timestamp"type"date"placeholder"选择日期"/>// 把 value-format"timestamp" 加入 就可以实现时间戳格式

【数学】泰勒公式

目录 引言 一、泰勒公式 1.泰勒公式及推导 &#xff08;1&#xff09;推导 &#xff08;2&#xff09;公式 2.泰勒中值定理 &#xff08;1&#xff09;定理1&#xff08;佩亚诺余项&#xff09; &#xff08;2&#xff09;定理2&#xff08;拉格朗日余项&#xff09; …

前端动画requestAnimationFrame

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画&#xff0c;并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数&#xff0c;该回调函数会在浏览器下一次重绘之前执行。 备注&#xff1a; 若你想在浏览器下次重绘…

GRU模块:nn.GRU层

摘要&#xff1a; 如果需要深入理解GRU的话&#xff0c;内部实现的详细代码和计算公式就比较重要&#xff0c;中间的一些过程及中间变量的意义需要详细关注。只有这样&#xff0c;才能准备把握这个模块的内涵和意义&#xff0c;设计初衷和使用方式等等。所以&#xff0c;仔细研…

实现流程化办公,可了解一下可视化报表开源

当前&#xff0c;实现流程化办公早已成为众多中小企业的发展目标和趋势。可以借助什么样的软件平台实现这一目标&#xff1f;低代码技术平台拥有可视化操作界面、够灵活、易维护等优势特点&#xff0c;在助力企业实现流程化办公、数字化转型方面具有重要的应用价值和推动作用。…

Selenium定位方法汇总及举例

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

arp icmp 等报文格式

ARP报文格式 ARP是一个独立的三层协议&#xff0c;所以ARP报文在向数据链路层传输时不需要经过IP协议的封装&#xff0c;而是直接生成自己的报文&#xff0c;其中包括ARP报头&#xff0c;到数据链路层后再由对应的数据链路层协议&#xff08;如以太网协议&#xff09;进行封装…

2022 年全国职业院校技能大赛高职组云计算赛项试卷(容器云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

C#上位机1ms级高精度定时任务

precisiontimer 安装扩展包 添加引用 完整代码 using PrecisionTiming;using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; us…

Android虚拟机机制

目录 一、Android 虚拟机 dalvik/art&#xff08;6版本后&#xff09;二、Android dex、odex、oat、vdex、art区别 一、Android 虚拟机 dalvik/art&#xff08;6版本后&#xff09; 每个应用都在其自己的进程中运行&#xff0c;都有自己的虚拟机实例。ART通过执行DEX文件可在设…

C——单链表

一.前言 我们在前面已经了解了链表中的双向链表&#xff0c;而我们在介绍链表分类的时候就说过常用的链表只有两种——双向带头循环链表和单向不带头不循环链表。下来我来介绍另一种常用的链表——单向不带头不循环链表也叫做单链表。不清楚链表分类的以及不了解双向链表的可以…

react18【系列实用教程】JSX (2024最新版)

为什么要用 JSX&#xff1f; JSX 给 HTML 赋予了 JS 的编程能力 JSX 的本质 JSX 是 JavaScript 的语法扩展&#xff0c;浏览器本身不能识别&#xff0c;需要通过解析工具&#xff08;如babel&#xff09;解析之后才能在浏览器中运行。 bable 官网可以查看解析过程 JSX 的语法 …

杭州打的样,适合全国推广

房地产 昨天&#xff0c;杭州和西安全面解除房地产限购。 在房价跌跌不休的今天&#xff0c;这两大城市取消限购其实并不意外。 尤其是杭州&#xff0c;土地财政依赖全国第一&#xff0c;绷不住很正常。 近十年&#xff0c;杭州依靠于亚运会、G20 和阿里巴巴&#xff0c;涨得飞…

将机械手与CodeSys中的运动学模型绑定

文章目录 1.背景介绍2.选定运动学模型3.机械手各尺寸的对应4.总结4.1.选择正确的运动学模型4.2.注意各个关节旋转的正方向。4.3.编码器零点与机械零点的偏移修正。 1.背景介绍 最近搞到了一台工业机械手&#xff0c;虽然这个机械手有自己的控制程序&#xff0c;但是我们还是想…

Java入门基础学习笔记1——初识java

1、为什么学习java&#xff1f; 几乎统治了服务端的开发&#xff1b;几乎所有的互联网企业都使用&#xff1b;100%国内大中型企业都用&#xff1b;全球100亿的设备运行java。开发岗位薪资高。 Java的流行度很高&#xff0c;商用占有率很高。 可移植性。 2、Java的背景知识 …