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

news2024/11/25 14:58:59

文章目录

  • 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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

各种数据获取stream流的方式

1.单列集合&#xff08;直接调用&#xff09; ArrayList<Integer> list new ArrayList<>();list.stream(); 2.双列集合 HashMap<String, Integer> map new HashMap<>();map.put("aaa",111);map.put("bbb",222);map.put("c…

101_Linux文件挂载系统相关

一、文件系统简介 传统的磁盘与文件系统应用中,一个分区就只能够被格式化成为一个文件系统,所以我们可以说一个文件系统就是一个硬盘分区。 随着新技术的出现如LMM与软件磁盘阵列software raid),这些技术可以将一个分区格式化为多个文件系统(例如LWM),也能够将多个分区合成一…

[图解]分层架构是DDD提出的吗

1 00:00:00,040 --> 00:00:02,640 今天我们来说一下分层架构 2 00:00:04,310 --> 00:00:06,730 我经常看到一些文章 3 00:00:06,740 --> 00:00:10,390 或者是在开发团队里面看到 4 00:00:10,400 --> 00:00:12,940 有开发人员说&#xff0c;分层架构 5 00:00:12…

centos7下fastdfs分布式部署

需要先在159及120服务器上安装fastdfs服务 可参考&#xff1a;centos7部署FastDFS服务_centos fastdfs 增加到服务中-CSDN博客 1、整体架构&#xff0c;使用3个服务器节点&#xff0c;其中两台为跟踪器节点及存储节点&#xff0c;一台服务器搭建nginx做统一入口进行负载均衡 …

机器学习算法应用——朴素贝叶斯分类器

朴素贝叶斯分类器 朴素贝叶斯分类器&#xff08;Naive Bayes Classifier&#xff09;是一种基于贝叶斯定理和特征条件独立假设的分类方法。它适用于分类任务&#xff0c;特别是文本分类、垃圾邮件识别等领域。 原理 朴素贝叶斯分类器基于以下两个主要假设&#xff1a; 特征条…

【Python】selenium爬虫常见用法和配置,以及常见错误和解决方法

欢迎来到《小5讲堂》 这是《Python》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言无执行文件代码报错信息错误路径手动下载自动下载 选项配置Ch…

CubeMX重写配置生成代码后注释出现乱码的解决方式

1.搜索环境变量 2.就是这里&#xff0c;每个版本Windows可能不太一样 3.新建 4.系统变量下面新建 变量&#xff1a;JAVA_TOOL_OPTIONS 值&#xff1a;-Dfile.encodingUTF-8 如果还不行&#xff0c;那我也没辙&#xff0c;哈哈。

python自动化生成ppt

使用Python和python-pptx创建PPT 在这篇博客中&#xff0c;我们将探讨如何使用Python库python-pptx来创建一个简单的PowerPoint演示文稿&#xff08;PPT&#xff09;。这个库允许我们以编程方式创建幻灯片、添加文本、图片、表格和自定义形状。 安装python-pptx 首先&#x…

springboot -多数据源管理方案

多数据源的配置有多种方式 方式一 、依赖dataSource的配置 1.建立多数据源配置 spring:# 数据源配置datasource:pdm:driver-class-name: oracle.jdbc.driver.OracleDriverjdbc-url: jdbc:oracle:thin:10.216.xxx.xxx:3000:orclusername: cfpdmpassword: capecapp:driver-cla…

kali卸载openjdk并安装 jdk1.8

一、卸载自带的openjdk 1.1、kali自带的 java 是 openjdk&#xff0c;如果需要开发安卓或者其他应用程序&#xff0c;则需要将 openjdk 换成 jdk1.8。 1.2、查看kali自带的openjdk版本 ┌──(root㉿kali)-[~] └─# java -version openjdk version "17.0.10" 2024…

Wireshark下载安装和使用教程

Wireshark下载安装和使用教程 Wireshark&#xff08;前身 Ethereal&#xff09;是一个网络包分析工具。该工具主要是用来捕获网络数据包&#xff0c;并自动解析数据包&#xff0c;为用户显示数据包的详细信息&#xff0c;供用户对数据包进行分析。 它可以运行在 Windows 和 L…

淘宝扭蛋机小程序:扭动未来,乐享购物新纪元

一、引言 在数字化浪潮中&#xff0c;淘宝始终走在创新的前沿&#xff0c;不断探索与尝试新的购物方式。今天&#xff0c;我们骄傲地推出淘宝扭蛋机小程序&#xff0c;以全新的视角和体验&#xff0c;让您在购物的同时感受到无尽的乐趣与惊喜。 二、探索未知的购物乐趣 淘宝…

清华团队开发首个AI医院小镇模拟系统;阿里云发布通义千问 2.5:超越GPT-4能力;Mistral AI估值飙升至60亿美元

&#x1f989; AI新闻 &#x1f680; 清华团队开发首个AI医院小镇模拟系统 摘要&#xff1a;来自清华的研究团队最近开发出了一种创新的模拟系统&#xff0c;名为"Agent Hospital"&#xff0c;该系统能够完全模拟医患看病的全流程&#xff0c;其中包括分诊、挂号、…

机器视觉任务中语义分割方法的进化历史

机器视觉任务中语义分割方法的进化历史 一、基于传统方法的图像分割二、基于卷积神经网络的图像分割三、基于Attention机制的图像分割四、语义分割模型的挑战与改进 在图像处理领域&#xff0c;传统图像分割技术扮演着重要角色。 一、基于传统方法的图像分割 这些方法包括大津…

【每日八股】淘天一面

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 rocketmq的消息重复发送问题&#xff1f;如何保证幂等&#xff1f; 如何保证幂等性&#xff1a; 消息 Key 设置&#xff1a;不建议…

基于.NET WinForms 数据CURD功能的实现

使用开发工具 VS 2022 C#&#xff0c;数据库MS SQL SERVER 2019 &#xff0c;基于NET WinForms&#xff0c;实现数据记录的创建(Create)、更新(Update)、读取(Read)和删除(Delete)等功能。主要控件包括&#xff1a;DataGridView&#xff0c;SqlDataApater &#xff0c; DataTab…

JSP ssm 智能水表管理myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP ssm 智能水表管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

生成指定范围的随机整数

private static final Random RANDOM new Random();// 生成指定范围的随机整数public static int generateRandomInt(int min, int max) {return RANDOM.nextInt(max - min 1) min;}public static void main(String[] args) {Integer count 5;Integer randomInt generateR…

缓存菜品操作

一&#xff1a;问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 二&#xff1a;实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; 每个分…

【UnityRPG游戏制作】Unity_RPG项目_玩法相关※

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…