基于yolo-world与mobile_sam实现类似lang-segment-anything

lang-segment-anything基于segment-anything 和 GroundingDINO 实现基于语言分割出任意对象,但是segment-anything 模型与GroundingDINO 都是运算量比较大的模型。而mobile_sam号称是sam的同等性能替代品,而yolo-world同样是号称比GroundingDINO 更快更准,故而博主尝试基于ultralytics项目,使用yolo-world与mobile_sam的组合实现类似lang-segment-anything的功能。

1、背景说明

1.1 mobile_sam

MobileSAM本质就是对SAM中ViT模型的知识蒸馏,使用了原来SAM中的mask解码器。其采用解耦蒸馏的方式,使得image encoder变得十分小,同时也保持了相同的性能。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.2 yolo-world

YOLO-World,这是一种创新的方法,通过视觉语言建模和在大型数据集上的预训练,将YOLO与开集检测能力相结合。具体来说,作者提出了一种新的可重参化的视觉语言路径聚合网络(RepVL-PAN)和区域文本对比损失,以促进视觉和语言信息之间的交互。作者的方法在以零样本方式检测广泛范围的物体时表现出色,且效率高。

在具有挑战性的LVIS数据集上,YOLO-World在V100上实现了35.4 AP和52.0 FPS,在准确性和速度上都超过了许多最先进的方法。此外,经过微调的YOLO-World在包括目标检测和开集实例分割在内的几个下游任务上取得了显著性能。
在这里插入图片描述
根据yolo-wolrd的论文数据,其比GroundingDINO 要强很多。
在这里插入图片描述

2、实现与使用

安装依赖项

pip install ultralytics
pip install gradio 
pip install lightning 

2.1 实现代码

以下代码支持多种任务组合,基于task type可以指定是否使用mobile_sam对目标检测结果进行细化分割;基于第二个参数,设置text可以指定检测类型,设置all则检测所有目标。

以下代码涉及到一个目录 assets,该目录源自项目 https://github.com/luca-medeiros/lang-segment-anything/tree/main 中的资源
在这里插入图片描述
运行以下代码,会自动打开浏览器,具体内容如2.2中图所示。

import os
import warnings
from ultralytics import YOLO,SAM
import gradio as gr
import lightning as L
import numpy as np
from lightning.app.components.serve import ServeGradio
from PIL import Image

warnings.filterwarnings("ignore")

sam_model = SAM("mobile_sam.pt")
model_det_all = YOLO('yolov8s-world.pt')  # or choose yolov8m/l-world.pt
class LitGradio(ServeGradio):

    inputs = [
        gr.Dropdown(choices=['seg','det'], label="task type", value="text"),
        gr.Dropdown(choices=['text','all'], label="检测所有(all)?或根据text检测(text)", value="text"),
        gr.Slider(0, 1, value=0.25, label="Text threshold"),
        gr.Image(type="filepath", label='Image'),
        gr.Textbox(lines=1, label="Text Prompt"),
    ]
    outputs = [gr.outputs.Image(type="pil", label="Output Image")]

    examples = [
        [
            'seg',
            'text',
            0.25,
            os.path.join(os.path.dirname(__file__), "assets", "fruits.jpg"),
            "kiwi",
        ],
        [
            'seg',
            'text',
            0.25,
            os.path.join(os.path.dirname(__file__), "assets", "car.jpeg"),
            "car",
        ],
        [
            'seg',
            'text',
            0.25,
            os.path.join(os.path.dirname(__file__), "assets", "food.jpg"),
            "food",
        ],
    ]

    def __init__(self,):
        super().__init__()
        self.ready = False

    def predict(self, task_type, text_promt, box_threshold, image_path, text_prompt):
        print("Predicting... ",  box_threshold, image_path, text_prompt,text_prompt.split(";"))
        pimg=Image.open(image_path)
        img=np.array(pimg)
        
        if text_promt=='text':
            self.model.set_classes(text_prompt.split(";"))
            results = self.model.predict(img,conf=box_threshold)
            print("det by text prompt!")
        else:
            results = model_det_all.predict(img,conf=box_threshold)
            print("det all!")
        result=results[0]

        # Show det results
        #image=result.plot()
        #image = Image.fromarray(np.uint8(image))#.convert("RGB")

        #--segment
        if len(result.boxes)>0:
            if task_type=='seg':
                boxes = result.boxes.xyxy 
                sam_results = sam_model(result.orig_img, bboxes=boxes, device='cuda')
                image=sam_results[0].plot()
                image = Image.fromarray(np.uint8(image))
                print("seg detect boxes!")
                return image
            else:
                image=result.plot()
                image = Image.fromarray(np.uint8(image))
                print("show detect boxes!")
                return image
        else:
            return pimg

    def build_model(self, model_type="yolov8s-world.pt"):
        
        model = YOLO(model_type) 
        self.ready = True
        return model
    
lg=LitGradio()
import os
os.environ["LIGHTNING_DETECTED_DEBUGGER"] = "1"
app = L.LightningApp(lg)

2.2 使用效果

使用效果如下所示,个人觉得是不如lang-segment-anything,这应该是yolo-world性能不足所导致的。
在这里插入图片描述
可以看出,yolo-world检测的目标数很少,车灯、车轮都没有检测出
在这里插入图片描述
虽然效果略差,但是速度有显著提升。或许更换更强的yolo-world模型,或许可以检测出更多目标。
在这里插入图片描述

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

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

相关文章

那如何解决信创设配问题呢?怎么成为信创产品?

信创也好、国产化也好都是国家部署的重点工作,所有涉及到的相关行业和部门都必须坚持执行和并且要执行好的重点任务,这一点无容置疑。在信息化层面,随着我国基础水平(芯片、OS、DB、中间件)的提升,信创工作…

vscode c++环境配置

1.基础软件安装 安装Visual Studio Code. 安装C拓展。点击在vscode界面最左侧的Extensions图标(打开快捷键:ctrlshiftX),搜索“C/C”,点击进行安装。 确保已安装gcc. 一般ubuntu系统会预装gcc.在终端窗口中输入如下…

KingSCADA|如何实现文本显示设备的实时通讯状态?

哈喽,你好啊,我是雷工! 在SCADA项目中,有些要求在界面上实时显示SCADA系统与设备的实时通讯状态,来及时了解PLC或其他设备与SCADA系统的通讯状态是否正常,以及简单的通讯异常分析,在KingSCADA中该如何实现通讯状态的文本显示呢? 接下来用简单的样例介绍KingSCADA如何实…

整数的反转

给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。 public class _01数字反转 {public static void main(String[] args) {Scanner input n…

IDEA的Scala环境搭建

目录 前言 Scala的概述 Scala环境的搭建 一、配置Windows的JAVA环境 二、配置Windows的Scala环境 编写一个Scala程序 前言 学习Scala最好先掌握Java基础及高级部分知识,文章正文中会提到Scala与Java的联系,简单来讲Scala好比是Java的加强版&#x…

基于 YAML 接口自动化测试框架设计

在设计自动化测试框架的时候,我们会经常将测试数据保存在外部的文件(如Excel、YAML、CSV),或者数据库中,实现脚本与数据解耦,方便后期维护。目前非常多的自动化测试框架采用通过Excel或者YAML文件直接编写测…

LeetCode:2642. 设计可以求最短路径的图类(SPFA Java)

目录 2642. 设计可以求最短路径的图类 题目描述: 实现代码与解析: SPFA 原理思路: 2642. 设计可以求最短路径的图类 题目描述: 给你一个有 n 个节点的 有向带权 图,节点编号为 0 到 n - 1 。图中的初始边用数组 e…

20240320-1-梯度下降

梯度下降法面试题 1. 机器学习中为什么需要梯度下降 梯度下降的作用: 梯度下降是迭代法的一种,可以用于求解最小二乘问题。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。…

一文读懂:什么是工单系统?市面上有哪些好用的工单系统?

什么是工单管理系统?工单系统如何帮助企业解决管理问题?市面上有哪些好用的工单管理系统?不同工单管理系统适用于什么企业?工单管理系统如何定价? 5000字长文,我写了整整一天!梳理了大家对工单…

操作系统:初识文件

目录 1.初识文件 2.文件操作 2.1.文件操作接口 2.2.文件描述符fd 3.缓冲区 3.1.简要介绍 3.2.重定向 3.2.1.输出重定向 3.2.2.追加重定向 3.2.3.输入重定向 3.2.4.调用接口实现重定向 3.2.5.文件重定向的作用 3.3.用户缓冲区与内核缓冲区 3.4.缓冲区和重定向 我…

适合新手小白的wordpress详细安装教程

1、下载程序 到wordpress官方网站下载wordpress程序,官方下载地址:Download | WordPress.org China 简体中文。 下载最新版的wordpress程序 https://cn.wordpress.org/latest-zh_CN.zip 2、上传程序 上传程序前先确认主机是否符合安装的环境要求&…

小白必看从零开始学习,制作产品册技巧

作为初学者,我们往往缺乏相关经验和技巧,难以打造出令人眼前一亮的产品册。不过,别担心!小编将为你揭示从零开始学习制作产品册的秘诀,让你轻松掌握技巧,成为产品册制作高手! 一、明确目标&…

学成在线项目学习

技术栈 学成在线服务端基于Spring Boot构建,采用Spring Cloud微服务框架。 持久层:MySQL、MongoDB、Redis、ElasticSearch 数据访问层:使用Spring Data JPA 、Mybatis、Spring Data Mongodb等 业务层:Spring IOC、Aop事务控制、S…

外包干了5年,技术退步明显.......

先说一下自己的情况,大专生,18年通过校招进入杭州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

LVGL线条和画布功能

线条部件 线条部件由多个点连接而成,它可用于修饰界面或者展示数据。 要注意这里的描述,线条是由多个点连接而成的。 线条部件只有一个组成部分:主体 LV_PART_MAIN 线条是由多个点连接而成的对象,用户可以使用 lv_point_t 类型的…

Day35 ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

● 860.柠檬水找零 class Solution:def lemonadeChange(self, bills: List[int]) -> bool:fiveten0for bill in bills:if bill5:five1elif bill10:five-1ten1elif bill20 and ten!0:five-1ten-1else:five-3if five<0:return Falsereturn True ● 406.根据身高重建队列 cl…

SpringBoot3的RabbitMQ消息服务

目录 预备工作和配置 1.发送消息 实现类 控制层 效果 2.收消息 3.异步读取 效果 4.Work queues --工作队列模式 创建队列text2 实体类 效果 5.Subscribe--发布订阅模式 效果 6.Routing--路由模式 效果 7.Topics--通配符模式 效果 异步处理、应用解耦、流量削…

javascript基础练习题之渔夫捕鱼

一、题目要求&#xff1a;根据用户输入的年、月、日判断是打鱼还是晒网。代码中使用了isLeapYear函数来判断输入的年份是否为闰年&#xff0c;getDays函数来计算输入日期是一年中的第几天&#xff0c;然后根据计算结果来确定是打鱼还是晒网。最后代码通过弹窗提示用户是打鱼还是…

Kimi和ChatGPT做古诗词阅读理解,谁更胜一筹?

前几天发过一篇Kimi整理会议的体验教程&#xff0c;没想到大家很感兴趣&#xff0c;这次再来拿Kimi做古诗词阅读理解看看&#xff0c;同时也对比下ChatGPT的效果。 ChatGPT是几乎家喻户晓的AI大模型&#xff0c;Kimi和它对比有哪些异同点呢&#xff1f; 首先它们都是基于对话…

黑群晖Docker安装aria2-pro

前言 最近买了星际蜗牛C款当Nas&#xff0c;来满足我的存储需求&#xff0c;在之前我写过一篇docker安装aria2-pro的文章&#xff0c;既然买了nas那当然也要安装一个aria2-pro做下载器 1.安装 Container Manager 套件 可以在套件中心搜索docker找到 2.下载aria2-pro镜像 打…