基于SAM的视频标注

news2024/10/6 16:19:24

在本文中,我们将演示基础模型的应用,例如 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, SamPredictor

DEVICE = 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 detections
  detections = model.predict(frame, conf=0.7)
 
  # Run frame and detections through SAM to get masks
  transformed_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 color
  class_ids = detections[0].boxes.cpu().cls
  merged_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 uri
  instance_uri = get_instance_uri(client, global_key, merged_colored_mask)

  # Create MaskFrame object to be uploaded to Labelbox
  mask_frame = lb_types.MaskFrame(index=frame_num, instance_uri=instance_uri)
  mask_frames.append(mask_frame)

  frame_num += 1

cap.release()

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

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

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


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

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

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

相关文章

MPU6050传感器—姿态检测

本节主要介绍以下内容: 姿态检测的基本概念 姿态传感器的工作原理及参数 MPU6050传感器介绍 实验:获取MPU6050原始数据 实验:移植官方DMP例程 一、姿态检测基本概念 1.1 姿态 在飞行器中,飞机姿态是非常重要的参数&#x…

SpringBoot打包成Docker镜像

SpringBoot打包成Docker镜像 1、第一种方式 1.1 编写一个springboot项目并且打包成jar包 package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;RestContr…

Python基础之数据库操作

一、安装第三方库PyMySQL 1、在PyCharm中通过 【File】-【setting】-【Python Interpreter】搜索 PyMySQL进行安装 2、通过PyCharm中的 Terminal 命令行 输入: pip install PyMySQL 注:通过pip安装,可能会提示需要更新pip,这时可执行&#…

【趣味游戏-08】20240123点兵点将点到谁就是谁(列表倒置reverse)

背景需求: 上个月,看到大4班一个孩子在玩“点兵点将点到谁就是谁”的小游戏,他在桌上摆放两排奥特曼卡片,然后点着数“点兵点将点到谁就是谁”,第10次点击的卡片,拿起来与同伴的卡片进行交换。他是从第一排…

怎么把一个已经压缩好的大容量的压缩包,分卷后发给别人

环境: Win10 专业版 7Z 360压缩 问题描述: 怎么把一个已经压缩好的大压缩包,分卷 解决方案: 使用压缩软件:许多常用的压缩软件,如WinRAR、7-Zip等,都支持将大的压缩包分卷压缩。您可以使…

归一化是是什么意思,为什么要归一化

归一化 归一化是指将数据转换为标准尺度或相对比例的过程。在数据处理中,归一化的目标是使数据具有统一的尺度,以便更好地适应模型的训练和提高模型性能。归一化通常是通过线性变换将数据映射到一个特定的范围或分布。 为什么要进行归一化? …

7.12、中间人攻击(ARP欺骗)

一、ARP协议原理 地址解析协议(Address Resolution Protocol,ARP),负责把目的主机的IP 地址解析成目的MAC地址,地址解析的目标就是发现逻辑地址与物理地址的映射关系。网络中的计算机、交换机、路由器等都会定期维护自己的ARP缓存表。 为什么…

智谱AI官网再升级,GLM-4,智能体,AI作图长文档全部搞定

创建智能体 智能体体验中心 可以看到智谱AI也推出了自己的智能体,并且官方内置了丰富多样的智能体供大家免费体验。 GLM-4 原生支持自动联网、图片生成、数据分析等复杂任务,现开放体验中,快来开启更多精彩。写一篇《繁花》的影评&#xf…

Linux的例行性工作(计划任务)

目录 一、单一执行的例行性任务--at(一 次性) 1、安装 2、启动服务 3、at命令详解 1)格式 2)参数 3)时间格式 4、实例 二、循环执行的例行性任务-- crontab(周期性) 1、crontd服务 2…

嵌入式未来发展的一些建议

嵌入式工程师分布在各行各业上面,这其中包括了消费电子、工业电子、汽车电子和军用电子等。 从功能上面看,嵌入式本身包括了51、STM32、MCU、SOC、SOCbaseband等很多形式。 从开发的结构上看,有些同学专注于底层,比如boot&#xf…

【GitHub项目推荐--一个简单的绘图应用程序(Rust + GTK4)】【转载】

一个用 Rust 和 GTK4 编写的简单的绘图应用程序来创建手写笔记。 Rnote 旨在成为一个简单但实用的笔记应用程序,用于手绘或注释图片或文档。它最终能够导入/导出各种媒体文件格式。而且输出的作品是基于矢量的,这使其在编辑和更改内容时非常灵活。 地址…

Anaconda + Tensorflow 安装及跑通例子 - 2024年1月20日

前言 我尝试了Tensorflow官网的方式进行安装,但是报错了。至于原因,我猜测和网络情况有关。于是尝试通过百度和B站,去看其他人的安装方式。总结下来,直接用Anaconda来安装最为方便。网络上也有不少用 Anaconda 的,但是…

Linux:FTP vs SSH

一,FTP FTP是一种文件下载协议,相比SSH,其安全性较低,在文件传输时并未做加密处理。登录FTP服务器的方法有2种:一种是FTP图形客户端(可以用于windows电脑连接linux系统);另一种是使…

【设计模式】阿里终面:你觉得这个例子是策略模式吗?

什么是策略模式? 策略模式,举几个贴近生活的例子:当我们出行的时候,不同的出行方式就是不同的策略,例如走路、开车、骑自行车、坐飞机、坐邮轮等等,每一种出行方式都代表着不同的费用和时间;当…

E - Souvenir(图论典型例题)

思路&#xff1a;对于有很多询问的题&#xff0c;一般都是先初始化。我们求出每个点到其他点的最短路径以及相同路径下最大的价值和即可。 代码&#xff1a; #include <bits/stdc.h> #define pb push_back #define a first #define b second using namespace std; type…

模型之气体的行为

气体的行为 “探索气体动理论&#xff1a;分子运动与温度的统计关系” 气体动理论由丹尼尔•伯努利在1738年提出&#xff0c;后来又由麦克斯韦、玻尔兹曼等人在19世纪后半叶推进。根据这种理论&#xff0c;气体是由运动着的分子组成的&#xff0c;气体的许多性质——如温度和…

C++大学教程(第九版)6.38汉诺塔问题

文章目录 题目代码运行截图 题目 (汉诺塔问题)在这一章中大家了解了既可以用递归方法又可以用迭代方法很容易实现的函数。不过&#xff0c;在这道练习题中&#xff0c;我们提出的问题若用递归来解决&#xff0c;则尽显递归之优雅:若用迭代来实现&#xff0c;恐怕没那么容易。 …

Shell脚本的编程规范和变量类型

一. 了解编程 1.程序编程风格 面向过程语言 开发的时候 需要一步一步执行 问题规模小&#xff0c;可以步骤化&#xff0c;按部就班处理 以指令为中心&#xff0c;数据服务于指令 C&#xff0c;shell 面向对象语言 开发的时候 将任务当成一个整体 将编程看成是一个…

云原生全栈监控解决方案(全面详解)

【作者】JasonXu 前言 当前全球企业云化、数字化进程持续加速&#xff0c;容器、微服务等云原生技术在软件架构中快速渗透&#xff0c;IT 架构云化、复杂化持续驱动性能监控市场。企业云化、数字化持续转型&#xff0c;以及为了考虑系统的弹性、效率&#xff0c;企业软件开发中…

《小学生作文辅导》期刊投稿邮箱

《小学生作文辅导》是国家新闻出版总署批准的正规教育类期刊&#xff0c;适用于全国各小学语文老师事业单位及个人&#xff0c;具有原创性的学术理论、工作实践、科研成果和科研课题及相关领域等人员评高级职称时的论文发表&#xff08;单位有特殊要求除外&#xff09;。 栏目…