基于SAM的视频标注

在本文中,我们将演示基础模型的应用,例如 Meta 的 Segment Anything 和 YOLOv8,以自动检测、分类和绘制视频中感兴趣对象的蒙版。这是之前指南的后续:使用 Meta 的 Segment Anything 和 YOLOv8 自动分类掩码。在本指南中,我们将自动检测和分割视频中的对象。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包

视频有很多帧,标记起来很乏味。分割蒙版的标记更加耗时,因为它们在逐帧之间变化很小,每次都需要手动微调。借助基础模型,可以自动执行并显著加快标记过程,从而在更短的时间内标记更多视频数据。这使你可以将宝贵的时间集中在审查上,只需更正 AI 模型的输出即可。

我们将完成一个简单的语义分割任务:在滑板的人周围绘制蒙版。

下面是该过程的高级摘要,我们将在下面逐步完成该过程,并附有代码:

1) 加载 YOLOv8、SAM 和 Labelbox Python SDK

2) 对于视频的每一帧:

  • 运行对象检测器以生成具有指定类分类的边界框
  • 将边界框作为输入提供给 Meta 的 Segment Anything 模型,该模型将生成分割掩码
  • 以 Labelbox Python SDK 期望的格式准备掩码预测

3) 通过预测导入一次性将所有帧上传到 Labelbox

4)打开视频编辑器,像往常一样查看或修改预标签

你可以使用我们的 Colab 笔记本在你的视频上运行上述所有开箱即用的功能。只需加载你的视频,即可在几分钟内获得自动分割的蒙版,并在 Labelbox 中上课!

在本指南中,我们将使用以下视频:

1、加载 YOLOv8

YOLOv8 是一个最先进的对象检测器,它围绕常见对象生成边界框和类。它是 YOLO(You Only Look Once)系列模型的最新版本,拥有一些令人印象深刻的功能。YOLOv8 以其速度和准确性而闻名,使其成为广泛应用的宝贵工具。在这里,我们使用 YOLOv8 来自动检测和定位视频中的滑板人。

import ultralytics
ultralytics.checks()
from ultralytics import YOLO
model = YOLO(f'{HOME}/yolov8n.pt')# each class id is assigned a different color
colors = np.random.randint(0, 256, size=(len(model.names), 3))
print(model.names)# Specify which classes you care about. The rest of classes will be filtered out.
chosen_class_ids = [0] # 0 refers to person, as per model.names

2、加载 SAM

Meta 的 SAM 模型是一种最先进的计算机视觉模型,旨在将图像和视频准确地分割成不同的对象。使用先进的深度学习技术,Segment Anything 能够识别和分割图像中的对象,使其成为广泛应用的强大工具。SAM 模型能够根据提示生成分割掩码,包括边界框提示,我们将在下面的代码中使用这些提示。

如需了解 SAM 的编辑体验,请阅读我们的另一篇博文 Auto-Segment 2.0 powered by Meta's Segment Anything Model。

import torch
import matplotlib.pyplot as plt
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictorDEVICE = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
sam = sam_model_registry["vit_h"](checkpoint=CHECKPOINT_PATH).to(device=DEVICE)
mask_predictor = SamPredictor(sam)

3、加载 Labelbox 的 Python SDK

Labelbox 的 Python SDK 为你提供了创建本体、项目和数据集以及将蒙版上传到视频的简单方法。

import labelbox as lb
import labelbox.types as lb_types# Create a Labelbox API key for your account by following the instructions here:
# https://docs.labelbox.com/reference/create-api-key
# Then, fill it in here
API_KEY = ""
client = lb.Client(API_KEY)

4、逐帧运行 YOLOv8 和 SAM

在这里,我们在每一帧上运行模型并自动生成蒙版。

cap = cv2.VideoCapture(VIDEO_PATH)# This will contain the resulting mask predictions for upload to Labelbox
mask_frames = []frame_num = 1
while cap.isOpened():ret, frame = cap.read()if not ret:break# Run frame through YOLOv8 to get detectionsdetections = model.predict(frame, conf=0.7)# Run frame and detections through SAM to get maskstransformed_boxes = mask_predictor.transform.apply_boxes_torch(detections[0].boxes.xyxy, list(get_video_dimensions(cap)))mask_predictor.set_image(frame)masks, scores, logits = mask_predictor.predict_torch(boxes = transformed_boxes,multimask_output=False,point_coords=None,point_labels=None)# Combine mask predictions into a single mask, each with a different colorclass_ids = detections[0].boxes.cpu().clsmerged_with_colors = add_color_to_mask(masks[0][0], colors[int(class_ids[0])]).astype(np.uint8)for i in range(1, len(masks)):curr_mask_with_colors = add_color_to_mask(masks[i][0], colors[int(class_ids[i])])merged_with_colors = np.bitwise_or(merged_with_colors, curr_mask_with_colors)# Upload multi-colored combined mask to temp location# to get temp instance uriinstance_uri = get_instance_uri(client, global_key, merged_colored_mask)# Create MaskFrame object to be uploaded to Labelboxmask_frame = lb_types.MaskFrame(index=frame_num, instance_uri=instance_uri)mask_frames.append(mask_frame)frame_num += 1cap.release()

5、将预测的蒙版作为预标签上传到 Labelbox

预测的蒙版可以通过我们的 SDK 轻松无缝地集成到 Labelbox 中。

在视频数据上创建分割掩码可能既繁琐又耗时。利用 Labelbox 中基础模型的强大功能,你可以在几分钟内轻松生成带有分类的蒙版。现在,无需花费数小时标记视频数据,而是可以加快视频标记速度,不仅可以缩短上市时间,还可以降低开发模型的成本。


原文链接:基于SAM的视频标注 - BimAnt

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

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

相关文章

【RabbitMQ】快速入门及基本使用

一、引言 1、、消息队列 Ⅰ、什么是消息队列? 消息队列是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据…

PySimpleGUI:让spin支持循环

需求 自己用PySimpleGUI写了个小工具,但是发现它的spin不支持循环。 Tkinter本身的Spinbox有wrap这个开关可以觉得是否支持循环,但是没看到PySimpleGUI也支持这个特性。 代码实现 所谓spin的循环,是指当值变换到最大最小值时,可…

移动开发行业——鸿蒙OS NEXT开出繁花

1月18日,华为宣布HarmonyOS NEXT开发者预览版开放申请,根据官方注解,这个版本的鸿蒙系统有个更通俗易懂的名字——“星河版”,也被称为“纯血”鸿蒙。 根据官方解释,之所以取名星河版,寓意鸿蒙OS NEXT就像…

Screen 简介

目录 1. screen 简介2. screen 基本命令 1. screen 简介 screen 是一个在 Unix 和类 Unix 系统上的 终端复用 工具。它允许用户在单个终端窗口中运行多个终端会话,并提供了一些其他功能,如会话断开后的恢复和远程连接的分离。以下是 screen 的一些主要特…

【C语言】扫雷游戏完整代码实现

目录 1.game.h 2.game.c 3.progress.c 4.运行结果 1.game.h #define _CRT_SECURE_NO_WARNINGS#include <string.h> #include <stdio.h> #include <time.h> #include<stdlib.h>#define ROW 9 #define COL 9 #define ROWS 11 #define COLS 11 #defin…

SpringBoot 中配置处理

1、简介 本文介绍一些 springboot 配置管理相关的内容&#xff0c;如何自定义配置&#xff0c;导入配置&#xff0c;配置绑定和基于 profiles 的配置。 2、springboot 配置管理 2.1、自定义配置类 在 spring 中使用 Configuration 注解定义配置类&#xff0c;在 springboot 中…

进程线程知识

一 初识linux线程 1 线程由来 我们之前说创建一个进程&#xff0c;要创建进程控制块pcb&#xff0c;进程地址空间&#xff0c;页表&#xff0c;而且我之前的博客中都有意无意的说明这个pcb是描述进程的&#xff0c;是os用来管理进程的&#xff0c;而有了线程后&#xff0c;就要…

Python基础第八篇(Python异常处理,模块与包)

文章目录 一、了解异常二、捕获异常&#xff08;1&#xff09;.异常案例代码&#xff08;2&#xff09;.读出结果 三、异常的传递&#xff08;1&#xff09;.异常传递案例代码&#xff08;2&#xff09;.读出结果 四、Python模块&#xff08;1&#xff09;.模块的导入&#xff…

大模型+自动驾驶

论文&#xff1a;https://arxiv.org/pdf/2401.08045.pdf 大型基础模型的兴起&#xff0c;它们基于广泛的数据集进行训练&#xff0c;正在彻底改变人工智能领域的面貌。例如SAM、DALL-E2和GPT-4这样的模型通过提取复杂的模式&#xff0c;并在不同任务中有效地执行&#xff0c;从…

k8s使用ingress实现应用的灰度发布升级

v1是1.14.0版本nginx ,实操时候升级到v2是1.20.0版本nginx&#xff0c;来测试灰度发布实现过程 一、方案&#xff1a;使用ingress实现应用的灰度发布 1、服务端&#xff1a;正常版本v1&#xff0c;灰度升级版本v2 2、客户端&#xff1a;带有请求头versionv2标识的请求访问版…

【MySQL】一文总结MVCC多版本并发控制

目录 MVCC 介绍当前读和快照读当前读快照读 MVCC 原理解析隐式字段Undo Log版本链Read ViewRead View 可见性原则 RC 和 RR 下的 Read ViewRC 下的 Read ViewRR 下的 Read View小结RR 级别下能否防止幻读总结 MVCC 介绍 在当今高度并发的数据库环境中&#xff0c;有效的并发控…

超级管理员权限绕过windows登录windows命令

文章目录 一、设置超级管理员权限二、绕过windows登录界面三、windows命令 一、设置超级管理员权限 查看本机的用户列表&#xff1a;net user激活超级用户&#xff1a;net user administrator /active:yes为超级用户设置密码&#xff1a;net user administrator 123(password)…

Redis 高可用之主从复制

1、简介 在 Redis 中&#xff0c;主从复制就是多个节点进行数据同步&#xff0c;在这些节点中&#xff0c;有 Master 和 slave 两个角色&#xff0c;Master 以写为主&#xff0c;slave 以读为主&#xff0c;当 Master 数据变化的时候&#xff0c;会自动将新的数据同步到其他的 …

StableDiffusion新版汉化

新旧版不同&#xff0c;这里以新版为例&#xff0c;用的是带链接&#xff0c;可以更新的方法。 步骤&#xff1a; 1.找到这个位置&#xff0c;依次点击&#xff0c;注意选项。 2.点击加载&#xff0c;等待刷新。 ctrlF搜索 zh_CN Localization 右边点击install&#xff0c…

外包干了4个月,技术退步明显.......

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

GAMES101-Assignment8

一、总览 1.1 连接绳子的约束 在rope.cpp 中, 实现Rope 类的构造函数。这个构造函数应该可以创建一个 新的绳子(Rope) 对象&#xff0c;该对象从start 开始&#xff0c;end 结束&#xff0c;包含num_nodes 个节点。也就是如下图所示&#xff1a; 每个结点都有质量&#xff…

【论文阅读】Automated Runtime-Aware Scheduling for Multi-Tenant DNN Inference on GPU

该论文发布在 ICCAD’21 会议。该会议是EDA领域的顶级会议。 基本信息 AuthorHardwareProblemPerspectiveAlgorithm/StrategyImprovment/AchievementFuxun YuGPUResource under-utilization ContentionSW SchedulingOperator-level schedulingML-based scheduling auto-searc…

Rustdesk 中VP8 / VP9 / AV1 是什么?

环境&#xff1a; Rustdesk1.1.9 VP8 / VP9 / AV1 问题描述&#xff1a; VP8 / VP9 / AV1 是什么&#xff1f; 解决方案&#xff1a; 1.VP8、VP9和AV1是视频编解码器&#xff0c;用于压缩和解压缩视频数据。它们是由Google和Alliance for Open Media&#xff08;AOM&#…

011 变量

变量的定义 注意事项 作用域 类变量&#xff1a;定义在类中的变量&#xff0c;类的整个生命周期内可用实例变量&#xff1a;定义在类中的变量&#xff0c;类的实例可以使用局部变量&#xff1a;定义在方法中的变量&#xff0c;仅在方法内可以使用 class Dog{// 类变量static …

机器学习 | 深入理解并掌握核心概念

在如今数字化时代的浪潮下&#xff0c;机器学习已经成为人工智能领域的璀璨明星。它像一面魔镜&#xff0c;赋予计算机系统学习和改进的能力&#xff0c;让机器能够从海量数据中提取规律、预测未来&#xff0c;甚至做出智能决策。本 专栏 将带您踏上机器学习的奇妙之旅&#xf…