当前位置: 首页 > news >正文

Label-Studio ML利用yolov8模型实现自动标注

引言

Label Studio ML 后端是一个 SDK,用于包装您的机器学习代码并将其转换为 Web 服务器。Web 服务器可以连接到正在运行的 Label Studio 实例,以自动执行标记任务。我们提供了一个示例模型库,您可以在自己的工作流程中使用这些模型,也可以根据需要进行扩展和自定义。

如果您想改为编写自己的模型,请参阅编写自己的 ML 后端。

1、创建后端服务

地址:GitHub - HumanSignal/label-studio-ml-backend: Configs and boilerplates for Label Studio's Machine Learning backend

终端导航至本地仓库目录 :

#用清华的源会快一点
pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple
#创建自己的后端服务
label-studio-ml create Stopsign_ml_backend

1.1、环境变量设置

增加环境变量:LABEL_STUDIO_URL,LABEL_STUDIO_API_KEY

LABEL_STUDIO_URL: LS的IP端口号,如:127.0.0.1:8080

LABEL_STUDIO_API_KEY:LS中个人账户的秘钥

1.2、修改model.py文件

实现predict函数,对于目标检测模型:

from typing import List, Dict, Optional
from label_studio_ml.model import LabelStudioMLBase
from label_studio_ml.response import ModelResponse
from label_studio_ml.utils import get_single_tag_keys, get_local_path
import requests, os
from ultralytics import YOLO
from PIL import Image
from io import BytesIOLS_URL = os.environ['LABEL_STUDIO_URL']
LS_API_TOKEN = os.environ['LABEL_STUDIO_API_KEY']class YOLOv8Model(LabelStudioMLBase):"""Custom ML Backend model"""def setup(self):"""Configure any parameters of your model here"""self.set("model_version", "0.0.1")self.from_name, self.to_name, self.value, self.classes = get_single_tag_keys(self.parsed_label_config, 'RectangleLabels', 'Image')self.model = YOLO("D:\\Label-stutio-ml-backend\\Stopsign_ml_backend\\best.pt")self.labels = self.model.namesdef predict(self, tasks: List[Dict], context: Optional[Dict] = None, **kwargs) -> ModelResponse:task = tasks[0]# header = {#     "Authorization": "Token " + LS_API_TOKEN}# image = Image.open(BytesIO(requests.get(#     LS_URL + task['data']['image'], headers=header).content))url = tasks[0]['data']['image']print(f'url is: {url}')image_path = self.get_local_path(url=url,ls_host=LS_URL,task_id=tasks[0]['id'])print(f'image_path: {image_path}')image = Image.open(image_path)original_width, original_height = image.sizepredictions = []score = 0i = 0results = self.model.predict(image,conf=0.5)for result in results:for i, prediction in enumerate(result.boxes):xyxy = prediction.xyxy[0].tolist()predictions.append({"id": str(i),"from_name": self.from_name,"to_name": self.to_name,"type": "rectanglelabels","score": prediction.conf.item(),"original_width": original_width,"original_height": original_height,"image_rotation": 0,"value": {"rotation": 0,"x": xyxy[0] / original_width * 100, "y": xyxy[1] / original_height * 100,"width": (xyxy[2] - xyxy[0]) / original_width * 100,"height": (xyxy[3] - xyxy[1]) / original_height * 100,"rectanglelabels": [self.labels[int(prediction.cls.item())]]}})score += prediction.conf.item()print(f"Prediction Score is {score:.3f}.")    final_prediction = [{"result": predictions,"score": score / (i + 1),"model_version": "v8n"}]return ModelResponse(predictions=final_prediction)def fit(self, event, data, **kwargs):"""This method is called each time an annotation is created or updatedYou can run your logic here to update the model and persist it to the cacheIt is not recommended to perform long-running operations here, as it will block the main threadInstead, consider running a separate process or a thread (like RQ worker) to perform the training:param event: event type can be ('ANNOTATION_CREATED', 'ANNOTATION_UPDATED', 'START_TRAINING'):param data: the payload received from the event (check [Webhook event reference](https://labelstud.io/guide/webhook_reference.html))"""# use cache to retrieve the data from the previous fit() runsold_data = self.get('my_data')old_model_version = self.get('model_version')print(f'Old data: {old_data}')print(f'Old model version: {old_model_version}')# store new data to the cacheself.set('my_data', 'my_new_data_value')self.set('model_version', 'my_new_model_version')print(f'New data: {self.get("my_data")}')print(f'New model version: {self.get("model_version")}')print('fit() completed successfully.')

1.3、启动服务

label-studio-ml start Stopsign_ml_backend -p 9091

2、LS前端配置

在项目设置页面设置模型,打开交互预标注

 在标注页面打开新的图片,出现缓冲条表示在向后台请求预测数据

预测成功如下图所示,会多出一个标注,如果没有则是请求数据错误,请检查后端服务配置

 

这里用的是一个yoloV8-OBB模型,带方向的矩形框,它的Model.py参考这里

 https://download.csdn.net/download/weixin_42253874/89820948

相关文章:

Label-Studio ML利用yolov8模型实现自动标注

引言 Label Studio ML 后端是一个 SDK,用于包装您的机器学习代码并将其转换为 Web 服务器。Web 服务器可以连接到正在运行的 Label Studio 实例,以自动执行标记任务。我们提供了一个示例模型库,您可以在自己的工作流程中使用这些模型&#x…...

【PostgreSQL】实战篇——用户管理、角色和权限控制的高级用法及技巧

数据库中用户管理、角色和权限控制不仅仅是基础的安全措施,更是实现复杂应用需求和优化数据库性能的重要手段。 通过深入理解这些概念,数据库管理员可以更有效地管理用户访问、确保数据安全,并优化系统性能。以下是对这些概念的详细介绍以及…...

Leetcode: 0011-0020题速览

Leetcode: 0011-0020题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解 遵从开源协议为知识共享 版权归属-相同方式…...

Hive数仓操作(七)

一、 Hive动态分区表 1. 动态分区与静态分区的区别 分区定义: 静态分区:在插入数据时,需要手动指定分区字段的值。动态分区:分区字段的值是根据数据中的某个字段自动生成的,用户只需指定分区字段的类型。 数据加载方…...

Redis进阶篇 - 缓存穿透、缓存击穿、缓存雪崩问题及其解决方案

文章目录 1 文章概述2 缓存穿透2.1 什么是缓存穿透?2.2 缓存穿透的解决方法2.2.1 做好参数校验2.2.2 缓存无效Key2.2.3 使用布隆过滤器2.2.4 接口限流 3 缓存击穿3.1 什么是缓存击穿?3.2 缓存击穿的解决方法3.2.1 调整热点数据过期时间3.2.2 热点数据预热…...

一天认识一个硬件之电源

无论是台式机还是笔记本,都离不开电源,台式机和笔记本电脑的电源都承担着将交流电转换为直流电,并为电脑内部各个部件提供稳定电力供应的重要任务。今天就来分享一下台式机和笔记本的电源区别 设计和功率 台式机电源:设计为内置…...

关于BSV区块链覆盖网络的常见问题解答(上篇)

​​发表时间:2024年9月20日 在BSV区块链上的覆盖网络服务为寻求可扩展、安全、高效交易处理解决方案的开发者和企业家开辟了新的视野。 作为开创性的曼达拉升级的一部分,覆盖网络服务提供了一个强大的框架,用于管理特定类型的交易和数据访问…...

VUE 开发——Node.js学习(一)

一、认识Node.js Node.js是一个跨平台JavaScript运行环境,使开发者可以搭建服务器端的JavaScript应用程序 使用Node.js编写服务器端程序——编写数据接口、前端工程化; Node.js环境没有BOM和DOM; Node.js安装:下载node-v16.19…...

角膜移植难题现,传统方式缺陷显,创新水凝胶破局

大家好!今天来了解一篇天然聚合物衍生光固化生物粘附水凝胶研究——《Natural polymer-derived photocurable bioadhesive hydrogels for sutureless keratoplasty》发表于《Bioactive Materials》。本文介绍了一种用于无缝合角膜移植术的天然聚合物衍生光固化生物粘…...

探索Spring Boot:实现“衣依”服装电商平台

1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…...

使用 cron 来设置定时任务

使用 cron 来设置定时任务,以便定期运行这个脚本。 在 Linux 系统中设置定时任务的步骤: 1. 编辑 cron 任务 打开终端并输入以下命令以编辑 crontab 文件: crontab -e2. 设置每天 8 点运行脚本 在 crontab 文件的最后,添加以下…...

C# Blazor Server 调用海康H5Player播放摄像头画面

目标 调用海康综合安防平台api,通过摄像头的cameraIndexCode调用【获取监控点预览取流URLv2】api,得到websocket 的url,然后在blazor server中使用htplayer.js播放摄像头实时画面。 步骤 根据摄像头名字,调用【查询监控点列表v2…...

CSS实现服务卡片

CSS实现服务卡片 效果展示 CSS 知识点 回顾整体CSS知识点灵活运用CSS知识点 页面整体布局 <div class"container"><div class"card"><div class"box"><div class"icon"><ion-icon name"color-pal…...

问:如何判断系统环境是大端/小端存储?

大端存储&#xff08;Big Endian&#xff09;和小端存储&#xff08;Little Endian&#xff09;是两种不同的字节序&#xff08;即字节顺序&#xff09;规则&#xff0c;用于在计算机中存储和表示多字节数据类型&#xff08;例如整数&#xff09;。 概念解释 大端存储&#x…...

使用NumPy进行线性代数的快速指南

介绍 NumPy 是 Python 中用于数值计算的基础包。它提供了处理数组和矩阵的高效操作&#xff0c;这对于数据分析和科学计算至关重要。在本指南中&#xff0c;我们将探讨 NumPy 中可用的一些基本线性代数操作&#xff0c;展示如何通过运算符重载和内置函数执行这些操作。 元素级…...

uni-app之旅-day02-分类页面

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言创建cate分支4.1 渲染分类页面的基本结构4.2 获取分类数据4.3 动态渲染左侧的一级分类列表4.4 动态渲染右侧的二级分类列表4.5 动态渲染右侧的三级分类列表4.6 …...

鸿蒙harmonyos next flutter通信之BasicMessageChannel获取app版本号

本文将通过BasicMessageChannel获取app版本号&#xff0c;以此来演练BasicMessageChannel用法。 建立channel flutter代码&#xff1a; //建立通道 BasicMessageChannel basicMessageChannel BasicMessageChannel("com.xmg.basicMessageChannel",StringCodec());…...

【文件增量备份系统】MySQL百万量级数据量分页查询性能优化

&#x1f3af; 导读&#xff1a;本文针对大数据量下的分页查询性能问题进行了深入探讨与优化&#xff0c;最初查询耗时长达12秒&#xff0c;通过避免全表计数及利用缓存保存总数的方式显著提升了浅分页查询速度。面对深分页时依然存在的延迟&#xff0c;采用先查询倒数第N条记录…...

音视频入门基础:FLV专题(12)——FFmpeg源码中,解析DOUBLE类型的ScriptDataValue的实现

一、引言 从《音视频入门基础&#xff1a;FLV专题&#xff08;9&#xff09;——Script Tag简介》中可以知道&#xff0c;根据《video_file_format_spec_v10_1.pdf》第80到81页&#xff0c;SCRIPTDATAVALUE类型由一个8位&#xff08;1字节&#xff09;的Type和一个ScriptDataV…...

【AI知识点】分层可导航小世界网络算法 HNSW(Hierarchical Navigable Small World)

HNSW&#xff08;Hierarchical Navigable Small World&#xff09;分层可导航小世界网络算法 是一种高效的近似最近邻搜索&#xff08;Approximate Nearest Neighbor Search, ANN&#xff09; 算法&#xff0c;特别适用于大规模、高维数据集的相似性检索。HNSW 基于小世界网络&…...

Steam创意工坊下载难题终结者:WorkshopDL让你的模组下载从未如此简单

Steam创意工坊下载难题终结者&#xff1a;WorkshopDL让你的模组下载从未如此简单 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为想玩Steam创意工坊的模组却没有Steam账号…...

SMAPI深度解析:星露谷物语模组生态系统的技术架构与实现原理

SMAPI深度解析&#xff1a;星露谷物语模组生态系统的技术架构与实现原理 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI SMAPI&#xff08;Stardew Valley Modding API&#xff09;作为星露谷物语模…...

终极指南:使用Python脚本突破百度网盘限速壁垒

终极指南&#xff1a;使用Python脚本突破百度网盘限速壁垒 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在云存储服务日益普及的今天&#xff0c;百度网盘凭借其庞大的用户基…...

E-Hentai Downloader:三步解决漫画批量下载与打包难题的实用指南

E-Hentai Downloader&#xff1a;三步解决漫画批量下载与打包难题的实用指南 【免费下载链接】E-Hentai-Downloader Download E-Hentai archive as zip file 项目地址: https://gitcode.com/gh_mirrors/eh/E-Hentai-Downloader 还在为手动保存上百张漫画图片而烦恼吗&am…...

零基础学 Web 安全 20256最全系统入门攻略

“未知攻&#xff0c;焉知防”——真正的安全始于理解攻击者的思维 在日益数字化的世界中&#xff0c;Web安全工程师已成为企业防护体系的“数字盾牌”。本文将提供一条清晰的进阶路径&#xff0c;助你在2025年的网络安全领域脱颖而出。 一、认知篇&#xff1a;理解安全本质 …...

稀疏记忆微调:在Transformer权重中编码任务专属结构化记忆

1. 这不是又一篇“加个正则就叫持续学习”的水文——我们来拆解这篇真正动了底层参数结构的稀疏记忆微调如果你最近刷过arxiv或者NeurIPS、ICLR的预印本列表&#xff0c;大概率见过标题里带“Continual Learning”“Sparse”“Memory”这几个词组合出现的论文。但说实话&#x…...

Go语言整洁架构:分层设计

Go语言整洁架构&#xff1a;分层设计 1. 分层结构 internal/domain/ # 领域实体usecase/ # 用例adapter/ # 适配器handler/ # HTTP处理2. 总结 整洁架构强调业务逻辑的独立性和依赖方向的正确性。...

OpenHTMLtoPDF终极指南:三步实现专业PDF文档生成

OpenHTMLtoPDF终极指南&#xff1a;三步实现专业PDF文档生成 【免费下载链接】openhtmltopdf An HTML to PDF library for the JVM. Based on Flying Saucer and Apache PDF-BOX 2. With SVG image support. Now also with accessible PDF support (WCAG, Section 508, PDF/UA)…...

5分钟搞定AI 3D建模!TripoSR:图片秒变专业3D模型的终极方案

5分钟搞定AI 3D建模&#xff01;TripoSR&#xff1a;图片秒变专业3D模型的终极方案 【免费下载链接】TripoSR TripoSR: Fast 3D Object Reconstruction from a Single Image 项目地址: https://gitcode.com/GitHub_Trending/tr/TripoSR 还在为复杂的3D建模软件头疼吗&am…...

STM32矩阵按键详解——4×4行列扫描与非阻塞消抖(硬件总结六)

前言 独立按键虽然简单&#xff0c;但当产品需要十几个按键时&#xff0c;每个按键独占一个GPIO的接法就变得很不经济。矩阵按键通过“行列”的交叉结构&#xff0c;仅用NM个GPIO即可驱动NM个按键。以最常见的44矩阵为例&#xff0c;16个按键仅需8个GPIO&#xff0c;引脚利用率…...