视频目标语义分割自动标注——从图像轮廓提取到转成json标签文件

news2025/1/12 19:06:23

前言

语义分割数据标注是为训练语义分割模型准备数据的过程。语义分割是计算机视觉领域的任务,其中需要为图像中的每个像素分配一个类别标签,以区分不同的对象或区域。标注数据时,通常需要为每个对象或区域分配一个唯一的标签,并创建与图像像素相对应的分割掩码。掩码是二进制图像,其中像素值指示每个像素属于哪个类别。例如,对于背景、人、车辆等类别,分别创建不同的掩码。

手动标注工具:
图像标注软件:您可以使用专门的图像标注工具,如LabelImg、Labelbox、VGG Image Annotator (VIA)、CVAT等,来手动绘制区域并分配标签。
绘图工具:也可以使用一般绘图工具,如Adobe Photoshop或GIMP,手动绘制区域并创建掩码。

半自动标注工具:
GrabCut算法:这是一种基于交互式图像分割的方法,可以帮助快速生成分割掩码。
超像素分割工具:使用工具如SLIC或QuickShift可以生成超像素,然后手动分配标签给不同的超像素区域。

深度学习自动标注:
分割模型辅助标注:可以使用预训练的语义分割模型,如Mask R-CNN、U-Net等,来辅助标注。这些模型可以自动提供初始分割结果,然后可以进行必要的微调。

图像语义分割数据标注是一项费时费力的工作,特别是对视频中的目标进行语义分割标注时,要对视频进行拆帧之后对每一帧的里面所需要的目标进行标注,是一项繁琐又费时费力的工作。但随着Segment Anything与​Segment-and-Track Anything算法的出现,让分割标注任务不在那么麻烦,​Segment-and-Track Anything可以对视频里面的目标进行追踪之后,再分割,然后我们可以借助​Segment-and-Track Anything分割出来的mask自动生成标签文件。

一、​Segment-and-Track Anything目标追踪与目标分割

1.算法简介

Meta AI的SAM)模型展现了强大的图像分割能力,但在处理视频数据方面存在一些挑战。Segment-and-Track Anything是由SAM模型扩展而来,使其能够支持视频数据的分割和跟踪。这一创新使SAM不仅能够分割图像中的对象,还能够跟踪它们随时间的变化。这一功能的应用潜力广泛,涵盖了各种时空场景,包括但不限于街景、增强现实、细胞图像分析、动画制作和航拍视频。

在SAM-Track项目中,SAM模型在单卡上实现了强大的目标分割和跟踪能力。它具备处理大规模数据的潜力,能够同时追踪超过200个物体,为用户提供了卓越的视频编辑能力。
在这里插入图片描述

2.算法应用部署

算法应用与部署可以看我之前的博客 :​Segment-and-Track Anything——通用智能视频分割、目标追踪、编辑算法解读与源码部署

3.运动目标追踪与分割

首先对视频第一帧进行目标分割,然后使用Segment-and-Track Anything进行整个视频的目标追踪与分割。
在这里插入图片描述
分割之后的结果如下:
在这里插入图片描述

二、生成标签

1.语义分割标签格式

要生成语义分割的标签,要了解语义分割的json文件的格式,这里使用labelme标注json文件进行举例,标注的标签文件如下:

{
  "version": "0.2.4",
  "flags": {},
  "shapes": [
    {
      "label": "mat",
      "text": "",
      "points": [
        [
          234.0,
          248.0
        ],
        [
          229.0,
          246.0
        ],
        [
          207.0,
          247.0
        ]
      ],
      "group_id": null,
      "shape_type": "polygon",
      "flags": {}
    },
    {
      "label": "mat",
      "text": "",
      "points": [
        [
          237.0,
          245.0
        ],
        [
          236.0,
          249.0
        ],
        [
          237.0,
          250.0
        ],
        [
          237.0,
          260.0
        ],
        [
          239.0,
          268.0
        ]
      ],
      "group_id": null,
      "shape_type": "polygon",
      "flags": {}
    }
  ],
  "imagePath": "b (14).jpg",
  "imageData": null,
  "imageHeight": 518,
  "imageWidth": 500
}

2.轮廓提取与多边形拟合

要对轮廓进行提取,提取轮廓之后,要进行多边形拟合

def approx_PolyDP(cv_src):
    cv_gray = cv2.cvtColor(cv_src, cv2.COLOR_BGR2GRAY)
    cv_ret, cv_binary = cv2.threshold(cv_gray, 0, 255, cv2.THRESH_BINARY)
    contours, hierarchy = cv2.findContours(cv_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    approxs = []
    for contour in contours:
        # 对轮廓进行多边形拟合
        # epsilon = 0.04 * cv2.arcLength(contour, True)
        approx = cv2.approxPolyDP(contour, 1, True)
        approxs.append(approx)

    return approxs

在这里插入图片描述

3.生成标签文件

多边形拟合之后,创建json文件

def create_node(label_name,points):
    shape = {
        "label": label_name,
        "text": "",
        "points":
           points
        ,
        "group_id": None,
        "shape_type": "polygon",
        "flags": {}
    }

    return shape

def create_json(img_name,img_w,img_h):
    name, _ = os.path.splitext(img_name)
    data = {
        "version": "0.2.4",
        "flags": {},
        "shapes": [
        ],
        "imagePath": img_name,
        "imageData": None,
        "imageHeight":img_h,
        "imageWidth": img_w
    }

    json_name = name + ".json"

    with open(json_name, "w") as json_file:
        json.dump(data, json_file, indent=4)

def add_shape(json_name,node):
    with open(json_name, "r") as json_file:
        data = json.load(json_file)

    data["shapes"].append(node)

    # 保存更新后的JSON数据
    with open(json_name, "w") as json_file:
        json.dump(data, json_file, indent=4)

def contour_to_json(img_name):
    cv_src = cv2.imread(img_name)
    approxs= approx_PolyDP(cv_src)
    height, width = cv_src.shape[:2]

    points_all = []
    if len(approxs) >= 1:
        for approx in approxs:
            points = []
            for i in range(len(approx)):
                points.append([int(approx[i][0][0]), int(approx[i][0][1])])
        #         j = i + 1
        #         if j == len(approx):
        #              j = 0
        #         cv2.line(cv_src, (approx[i][0][0], approx[i][0][1]),
        #                   (approx[j][0][0], approx[j][0][1]), (255, 0, 0), 1)
        #     points_all.append(points)
        #
        # cv2.namedWindow("src",0)
        # cv2.imshow("src",cv_src);
        # cv2.waitKey()

        create_json(img_name,width,height)

        nodes = []

        for p in points_all:
            node = create_node("foot",p)
            nodes.append(node)

        name, _ = os.path.splitext(img_name)
        json_name = name + ".json"
        # add_shape(json_name,nodes[0])
        for n in nodes:
            add_shape(json_name,n)

4.验证标签文件

使用标注工具,如labelme打开,效果如下,代表测试可以:
在这里插入图片描述

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

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

相关文章

STM32 HAL库高级定时器输入捕获脉宽测量

STM32 HAL库高级定时器输入捕获脉宽测量 📌相关篇《STM32 HAL库定时器输入捕获SlaveMode脉宽测量》 ✨相比于上面所使用的高级定时器输入捕获从模式来测量PWM信号,实现方法更为复杂一下,但是还是将实现的方法记录下来。 📌本篇实现…

OpenCV16-图像连通域分析

OpenCV16-图像连通域分析 1.图像连通域分析2.connectedComponents3.connectedComponentsWithStatus 1.图像连通域分析 连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域。连通域分析是指在图像中寻找彼此互相独立的连通域并将其标记出来。 4邻域与8邻域的概念&am…

TatukGIS Developer Kernel使用教程:如何为FMX创建第一个应用程序

概述:TatukGIS Developer Kernel(DK)是一个用于开发自定义地理信息系统(GIS)应用程序以及解决方案的综合性软件开发工具包(SDK)。本篇文章主要介绍用DK11为FMX创建一个应用程序,现在…

solidworks 2024新功能之--保存为低版本 硕迪科技

大家期盼已久的SOLIDWORKS保存低版本文件功能来了,从SOLIDWORKS 2024 开始,您可以将在最新版本的SOLIDWORKS 中创建的SOLIDWORKS零件、装配体和工程图另存为SOLIDWORKS 早期版本的全功能文档(完成的特征树与相关参数)。 将文件另…

Spring Boot项目中使用 TrueLicense 生成和验证License

1、Linux 在客户linux上新建layman目录,导入license.sh文件, [rootlocalhost layman]# mkdir -p /laymanlicense.sh文件内容: #!/bin/bash # 1.获取要监控的本地服务器IP地址 IPifconfig | grep inet | grep -vE inet6|127.0.0.1 | awk {p…

Kubernetes简略架构

kubectl kubectl是Kubernetes的命令行工具。它的全称为Kubernetes Command Line Tool,是用于管理Kubernetes集群的工具。它可以用来创建、更新、删除资源对象、查看日志等操作 Node: Kubernetes 通过将容器放入在节点(Node)上运行的Pod 中…

5、使用 pgAdmin4 图形化创建和管理 PostgreSQL 数据库

通过上几篇文章我们讲解了如何安装 PostgreSQL 数据库软件和 pgAdmin4 图形化管理工具。 今天我们继续学习如何通过 pgAdmin4 管理工具图形化创建和管理 PostgreSQL 数据库。 一、PostgreSQL的基本工作方式 在学习如何使用PostgreSQL创建数据库之前,我们需要了解一…

C++学习: 文件I/O

作者: 苏丙榅 原文链接: https://subingwen.cn/c/file/ 文章目录 1. 文件概述1.1 什么是文件I/O1.2 磁盘文件分类 2. 文件的打开和关闭2.1 文件指针2.2 打开文件 2.3 关闭文件3. 文件的读写3.1 按照字符读写文件3.1.1 写文件3.1.2 读文件3.1.3 EOF 3.2 按照行读写文件3.2.1 写文…

华为交换机S5700系列产品命名规则

华为交换机的全系列产品命名规则如下: S系列:代表固定端口交换机。例如,S5720系列、S6720系列。CE系列:代表企业级交换机。例如,CE5800系列、CE6800系列。CloudEngine系列:代表华为云引擎交换机&#xff0c…

数据库系列之MySQL中Join语句优化问题

最近使用MySQL 8.0.25版本时候遇到一个SQL问题,两张表做等值Join操作执行很慢,当对Join连接字段添加索引优化后,执行效率反而变得更差,其中的原因值得分析。因此本文介绍下MySQL中常见的Join算法,并对比使用不同Join算…

【MATLAB源码-第47期】基于matlab的GMSK调制解调仿真,输出误码率曲线,采用相干解调。

操作环境: MATLAB 2022a 1、算法描述 GMSK(高斯最小移相键控)是数字调制技术的一种。下面是关于GMSK调制解调、应用场景以及其优缺点的详细描述: 1. 调制解调: - 调制:GMSK是一种连续相位调制技术&am…

03【彻底掌握Git的底层对象】

上一篇:02【Git的基本使用-快速上手Git】 下一篇:04【彻底掌握Git的底层对象】 目录:【Git系列教程-目录大纲】 文章目录 三、Git底层对象3.1 Blob对象3.1.1 Blob对象简介3.1.2 Blob对象的使用1)写入数据2)读取数据3…

Excel大量表格选择,快速定位表格

excel有大量表格,快速定位表格方法。 在这个区域电机鼠标右键 出现表格选择。(此处方便查看15个表格),如果超过15个表格可以选择其他工资表。 选择其他工作表会弹出列表框如下图 特此记录 anlog 2023年10月12日

红队专题-从零开始VC++远程控制软件RAT-C/S-[4]客户端与服务端连接

红队专题 招募六边形战士队员服务端编写新建工程server函数创建主线程类获取配置信息command 命令startsocket 开始监听win32 类库/头文件 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 服务端编写 新建工程 server函数 // FackExec_…

Windows10用Navicat 定时备份报错80070057

直接按照网上的教程配置定时任务发现报错,提示参数非法之类的,80070057。 搜索加自己测试发现是用户权限问题。 设置任务计划的时候,我用了用户组,选了administors,在勾选上run with hightest privileges。 查找用户…

JVM第七讲:JVM 基础 - Java 内存模型详解

JVM 基础 - Java 内存模型详解 本文是JVM第七讲,JVM 基础 - Java 内存模型详解。主要转载自 Info 上深入理解Java内存模型, 作者程晓明。这篇文章对JMM讲的很清楚了,大致分三部分:1、重排序与顺序一致性;2、三个同步原语&#xff…

数据结构复盘——第二章:线性表

文章目录 第一部分:顺序表1、顺序表的定义2、顺序表的操作3、顺序表的优缺点第一部分习题第二部分:单链表1、单链表的定义2、单链表的结点知识3、单链表的操作4、单链表的优缺点第二部分习题第三部分:双链表1、双链表的结构2、双链表的操作第三部分习题第四部分:静态链表1、…

使用 Tkinter Canvas 小部件添加放大镜功能?

一、说明 据我所知,内置的 Tkinter Canvas 类比例不会自动缩放图像。如果您无法使用自定义小部件,则可以缩放原始图像并在调用缩放函数时将其替换在画布上。 二、实现图像放大镜技术细节 我如何将放大和缩小添加到以下脚本中,我想将其绑定到…

OpenCV 笔记(1):图像的读取、显示、创建

Part11. 数字图像的含义 OpenCV 中的图像,其实指的是数字图像。在介绍图像这个概念之前,先介绍几个基础的概念: 像素(Pixel)是图像的基本单元或者基本元素,亦或者是图像最小的单位。图像中的像素点包含不同的像素值。对于灰白图像…

Flume 整合 Kafka

1.背景 先说一下,为什么要使用 Flume Kafka? 以实时流处理项目为例,由于采集的数据量可能存在峰值和峰谷,假设是一个电商项目,那么峰值通常出现在秒杀时,这时如果直接将 Flume 聚合后的数据输入到 Storm 等…