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

news2024/12/25 14:52:07

引言

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 BytesIO

LS_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.names

    def 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.size
        

        predictions = []
        score = 0
        i = 0

        results = 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 updated
        You can run your logic here to update the model and persist it to the cache
        It is not recommended to perform long-running operations here, as it will block the main thread
        Instead, 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() runs
        old_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 cache
        self.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

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

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

相关文章

[Cocoa]_[初级]_[绘制文本如何设置断行方式]

场景 在开发Cocoa程序时,表格NSTableView是经常使用的控件。其基于View Base的视图单元格模式就是使用NSCell或其子类来控制每个单元格的呈现。当一个单元格里的文字过多时,需要截断超出宽度的文字,怎么实现? 说明 Cocoa下的文本…

演讲干货整理:泛能网能碳产业智能平台基于 TDengine 的升级之路

在 7 月 26 日的 TDengine 用户大会上,新奥数能 / 物联和数据技术召集人袁文科进行了题为《基于新一代时序数据库 TDengine 助力泛能网能碳产业智能平台底座升级》的主题演讲。他从泛能网能碳产业智能平台的业务及架构痛点出发,详细分享了在数据库选型、…

【多线程奇妙屋】能把进程和线程讲的这么透彻的,没有20年功夫还真不行【0基础也能看懂】

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

OpenGL ES 顶点缓冲区和布局(3)

OpenGL ES 顶点缓冲区和布局(3) 简述 顶点缓冲区的本质就是一段GPU上的显存,我们通过绑定顶点缓冲区的方式来将数据从CPU传到GPU。 我们之前在绘制三角形的例子中,我们往顶点缓冲区只传入了坐标,但是其实顶点是可以包含很多数据的&#xff…

指定PDF或图片多个识别区域,识别区域文字,并导出到Excel文件中

常见场景 用户有大量图片/PDF文件,期望能将图片/PDF中的多个区域中的文字批量识别出来,并导入到Excel文件中。期望工具可以批量处理、离线识别(保证数据安全性)。手工操作麻烦。具体场景:用户有工程现场照片&#xff…

xgboost cross validation

在R中使用xgboost 假设X为训练数据,y为label,为0或者1.用xgboost建立分类模型代码如下 调用caret包中的createFolds方法,进行10倍交叉验证 最后画出AUC曲线 library(xgboost) library(caret) library(caTools) library(pROC)set.seed(123) …

【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第十一章 Linux 帮助手册讲解

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…

3DGS中Densification梯度累计策略的改进——绝对梯度策略(Gaussian Opacity Fields)

在学习 StreetGS 代码中发现了其中的 Densification 策略与原 3DGS 不太一样,其是使用的 Gaussian Opacity Fields 中的一个的策略 我们先来回忆一下 3DGS 中一个比较重要 contribution:自适应密度控制 1 自适应密度控制 其具体步骤如下: …

概率论——随机分布

离散型——二项分布 X ~ B(n , p) 例题: 例题二: 离散型——泊松分布 例题 注意:记住题二的结论!!! 连续性——均匀分布 例题:求解概率密度(具体方法见随机…

请问PMP英文报名被审查该怎么通过?

审核抽查是随机进行的(一般概率约为30%),并非所有人都会接受资料抽查。如果您报考了机构,他们会协助您解决这个问题。 一、资料审查: 如果被PMI选中进行审查,这是正常情况,不必惊慌。如果你参…

要洞察数字化本质,才能形成破局之道...

在深入探索数字化转型的突破路径之前,首要之务是构筑对数字化及其转型过程的深刻而准确的认知体系。唯有透彻理解数字化的内在本质,精准把握数字化转型的演变规律,方能引领数字化转型的航向,确保数字化工具与策略得以高效、精准地…

(一)万字详解G1垃圾收集器 —G1的设计目标是什么?G1的分区是什么?卡表的作用和工作原理?如何解决漏标问题?

一、G1垃圾收集器简介 G1 GC(Garbage-First Garbage Collector)是一款先进的垃圾收集器,通过 -XX:UseG1GC 参数启用。它首次亮相于JDK 6u14版本,并在JDK 7u4中正式发布。对于熟悉JVM的开发者而言,G1已是一个广为人知的…

测试卡(1)灰卡

#灵感# 灰卡为什么是18%?文章分为三部分,前部分,解释灰卡的定义,后部分是 市场买的18%灰卡的说明书,其中穿插了网络上搜到的灰卡使用案例。 目录 18% 中性灰卡应用说明 1) 曝光水平 例子:用灰…

ppt模板如何制作?建议试试这4招

在追求效率和简洁的现代办公环境中,简约风格的PPT模板因其清晰、直观的特点而备受青睐。制作一个简约的PPT模板不仅能提升演示的专业感,还能帮助观众快速抓住重点。 今天,我来告诉大家:ppt模板简约怎么制作?让你能够利…

Kubernetes 节点何时处于就绪状态?

在 Kubernetes 中,节点(Node)是一个工作负载的基本单元,容器被部署和运行在这些节点上。每个 Kubernetes 节点在加入集群后都需要经过一定的健康检查和状态评估,才能被集群标记为“就绪”状态。这一过程的关键是节点的…

Linux相关概念和重要知识点(9)(父进程、子进程、进程状态)

1.父进程、子进程 (1)父进程 CLI本质上是一款命令行界面的软件,是用户调用接口层面的程序(上层,可以和系统调用接口做沟通),CLI和GUI是同级别的。用户的操作都是建立在CLI和GUI之上的。 但是…

奔三理工男适合转行做AI算法工程师吗?

奔三男生转行可以做什么? 干了几年开发程序员却面临降薪优化? 说实话,如果学历一般技术一般, 无法与时俱进的话,会容易面临尴尬情况…… 就业这件事,选对赛道方向至关重要!! 这…

profinet转ethercat连接伺服在工业现场的配置案例

在工业通信领域,Profinet 转 EtherCAT 网关的应用为实现不同工业网络之间的通信提供了有效的解决方案。以下是一个关于 Profinet 转 EtherCAT 网关链接伺服配置的案例。 首先,我们需要准备好相关的硬件设备,包括 Profinet 转 EtherCAT 网关、…

Docker Desktop 安装Centos 7.9 使用yum install不可用问题

安装centos镜像并run之后,使用yum install 命令安装出现如下错误,可使用此命令替换mirror。 报错信息: Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archaarch64&repoos&infracontainer error was…

2024第八届御网杯信息安全网络大赛线上WP详解(misc+cryoto)(详解-思路-脚本)

芜湖~ 首届御网杯线上和ISCC分开进行 但还是用的ISCC的页面差评 嘻嘻 又是玄乎的一天 以下是我自己的一些思路和解析 有什么问题或者建议随时都可以联系我 目录 附件 # Misc ##Notice ##编码转换 Brainfuck编码 jsfuck编码 Ook! 编码 ##bluetooth 导出压缩包 第一…