数字人解决方案——解决ER-NeRF/RAD-NeRF人像分割的问题

一、训练数据人像分割

训练ER-NeRF或者RAD-NeRF时,在数据处理时,其中有一步是要把人像分割出来,而且人像要分成三块,人的头部,人的有脖子,人的身体部分,效果如下:
在这里插入图片描述
从上面的分割的结果,可以到,算法最终要的结果是头部用蓝色表示,脖子用绿色表示,身体部用红色表示,背景部分用白色表示,但很多时候,分割的效果并不是都这么理想,会出现各种各样问题,比如下面的分割效果,它会把身体一部分当成背景颜色:
在这里插入图片描述
这样的分割效果,如果用到训练里面去,就会影响训练的效果,解决的办法是,可以去优化源码里面自带的bisnet网络,但操作起来有些麻烦。我自己试着重构代码,但效果还是不理想。后来看到Segment-and-Track Anything这个项目,就想到跳出当前的框架,直接用Segment-and-Track Anything来解决这个问题。

二、Segment-and-Track Anything

1. 算法简介

“Segment-and-Track Anything” 是由浙江大学 ReLER 实验室开发的一款多功能视频分割和目标跟踪模型,它深度整合了 SAM(Segment Anything Model)和视频分割技术,使其能够高效地跟踪视频中的目标,并支持多种交互方式(如点、画笔和文字输入)。

在这个基础上,SAM-Track 实现了多个传统视频分割任务的统一,使其能够一键分割和追踪任意视频中的任意目标,将传统视频分割技术推向通用视频分割领域。SAM-Track 在复杂场景下表现出卓越的性能,即使在单一GPU卡上也能高质量地稳定跟踪数百个目标。

SAM-Track 模型基于 ECCV’22 VOT Workshop 四个赛道的冠军方案 DeAOT。DeAOT 是一种高效的多目标视频对象分割模型,在提供首帧物体标注的情况下,可以对视频的其余帧中的物体进行追踪分割。DeAOT 使用一种识别机制,将一个视频中的多个目标嵌入到同一高维空间中,从而实现对多个物体的同时跟踪。DeAOT 在多物体追踪方面的速度表现媲美其他专注于单个物体追踪的 VOS 方法。此外,通过基于分层 Transformer 的传播机制,DeAOT 更好地整合了长时序和短时序信息,表现出卓越的追踪性能。然而,DeAOT 需要参考帧的标注来初始化,为了提高方便性,SAM-Track 利用了图像分割领域的明星模型 SAM,以获取高质量的参考帧标注信息。SAM 凭借出色的零样本迁移能力以及多种交互方式,使 SAM-Track 能够为 DeAOT 高效获取高质量的参考帧标注信息。

虽然 SAM 模型在图像分割领域表现出色,但它无法输出语义标签,并且文本提示也无法有效地支持 Referring Object Segmentation 以及其他依赖深层语义理解的任务。因此,SAM-Track 模型进一步集成了 Grounding DINO,实现了高精度的语言引导视频分割。Grounding DINO 是一种开放集合目标检测模型,具备出色的语言理解能力。

2. 项目部署

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

3.项目应用

运行项目之后,打开项目的交互界面,然后打开要分割的视频,然后等待一会,下面的窗口就出现视频的第一帧图像。

  1. 第一步点Click这个功能,把gam_gap拉到最大,然后点击Reset:
    在这里插入图片描述

  2. 第二步,使用鼠标点击要分割部分,Positive是选择扩展区域,Negative是删除区域,Undo是撤消上一步操作。
    在这里插入图片描述

  3. 选择完成一个部分之后,点击Add new object添加新的部分,在这个项目中,总共有三个部分,分别是头部,脖子,身体。

  4. 当所有的部分都分割完成之后,点Start Tracking开始对目标进行目标追踪。
    在这里插入图片描述

  5. 项目会运行一段时间,时间长短取决于视频的长短,运行完成之后,在项目目标下,可以找到追踪分割出来的mask图像:
    在这里插入图片描述

三、合成数据

分割完成之后,可以看到最终分割结果比源码自带的效果要好很多,但要改成NeRF要的颜色格式,就是头部用蓝色表示,脖子用绿色表示,身体部用红色表示,背景部分用白色表示。

1.获取颜色值

这里要获取分割出来的颜色值,才能把它改成想的颜色值,使用python和cv2实现点击获取颜色值:

def mouse_callback(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        # 获取鼠标点击处的像素颜色
        pixel_color = cv_src[y, x]
        b, g, r = pixel_color
        print(f"颜色值 (B, G, R):({b}, {g}, {r})")

        # 在图像上绘制颜色值
        color_str = f"({b}, {g}, {r})"
        cv2.putText(cv_src, color_str, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
        cv2.imshow('Color Value', cv_src)


# 获取
def get_color_val(cv_src):
    cv2.namedWindow('Color Value', 0)
    # 在窗口中显示图像
    cv2.imshow('Color Value', cv_src)

    # 设置鼠标点击事件回调函数
    cv2.setMouseCallback('Color Value', mouse_callback)

    # 等待用户点击窗口并按下ESC键退出

    while True:
        key = cv2.waitKey(1)
        if key == 27:  # 按下ESC键退出
            break

    cv2.destroyAllWindows()

运行代码后,使用鼠标点击获取分割出来的这三个色块的值:
在这里插入图片描述

2.更改颜色

获取分割的色块颜色值之后,要对现有的颜色值更改成源码需要的颜色值,在这个过程中顺带把色块之后的孔洞给填充上。

def get_color_part(cv_src,neck_color,head_color,body_color):
    height, width, channels = cv_src.shape
    cv_dst = np.ones((height, width, 3), dtype=np.uint8) * 255
    neck = np.zeros((height, width, 3), dtype=np.uint8)
    head = np.zeros((height, width, 3), dtype=np.uint8)
    body = np.zeros((height, width, 3), dtype=np.uint8)

    for y in range(height):
        for x in range(width):
            # 获取像素值(B, G, R)
            b, g, r = cv_src[y, x]
            if b == 0 and g == 0 and r ==0:
                continue

            elif [b,g,r] == neck_color:
                neck[y,x] = b,g,r

            elif [b,g,r] == head_color:
                head[y,x] = b,g,r

            elif [b,g,r] == body_color:
                body[y,x] = b,g,r

    # np_head = filling_hole(head,(255,0,0))
    np_head = dilation_img(head, (3,3))
    np_body = closing_color(body,(5,5))
    np_neck = dilation_img(neck, (3,3))

    cv_neck = cv2.cvtColor(np_neck, cv2.COLOR_GRAY2BGR)
    cv_body = cv2.cvtColor(np_body, cv2.COLOR_GRAY2BGR)
    cv_head = cv2.cvtColor(np_head, cv2.COLOR_GRAY2BGR)

    for y in range(height):
        for x in range(width):
            n_b, n_g, n_r = cv_neck[y, x]
            if [n_b,n_g,n_r] > [0,0,0]:
                cv_dst[y,x] = 0,255,0

            b_b,b_g,b_r = cv_body[y,x]
            if [b_b,b_g,b_r] > [0,0,0]:
                cv_dst[y, x] = 0, 0, 255

            h_b, h_g, h_r = cv_head[y, x]
            if [h_b, h_g, h_r] > [0, 0, 0]:
                cv_dst[y, x] = 255, 0, 0

    return cv_dst

运行结果:
在这里插入图片描述

3.处理整个目录

def pro_dir(src_dir,dst_dir,neck_color,head_color,body_color):
    files_name = os.listdir(src_dir)
    i = len(files_name)
    j = 0
    for file in files_name:
        name = os.path.join(src_dir,file)
        cv_src = cv2.imread(name)
        cv_dst = get_color_part(cv_src,neck_color,head_color,body_color)
        save_name = os.path.join(dst_dir,file)
        cv2.imwrite(save_name, cv_dst)
        print(j,i)
        j = j +1

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

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

相关文章

通天之网:卫星互联网与跨境电商的数字化未来

在当今数字化时代,互联网已经成为商业的核心。跨境电商,作为在线商业的一部分,一直在寻求新的途径来拓宽其边界。近年来,卫星互联网技术的发展已经成为这一领域的重要驱动力,不仅将互联网带到了全球各个角落&#xff0…

zookeeper源码(02)源码编译启动及idea导入

本文介绍一下zookeeper-3.9.0源码下载、编译及本地启动。 下载源码 git clone https://gitee.com/apache/zookeeper.gitcd zookeeper git checkout release-3.9.0 git checkout -b release-3.9.0源码编译 README_packaging.md文件 该文件介绍了编译zookeeper需要的环境和命…

什么是React Router?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

elasticsearch-5.6.15集群部署,如何部署x-pack并添加安全认证

目录 一、环境 1、JDK、映射、域名、三墙 2、三台服务器创建用户、并为用户授权 二、配置elasticsearch-5.6.15实例 1、官网获取elasticsearch-5.6.15.tar.gz,拉取到三台服务器 2、elas环境准备 3、修改elasticsearch.yml配置 4、修改软、硬件线程数 5、修改…

【springcloud-config】配置中心客户端导入依赖spring-cloud-config-server后,maven一直爆红问题解决

问题描述 配置中心客户端导入了 spring-cloud-config-server 后&#xff0c;导入依赖爆红&#xff1b; 解决办法&#xff1a; 参考官网中文文档&#xff1a;spring-cloud -config 配置中心 中文文档 补充导入 spring-config-starter-config 配置即可 <!--springcloud-c…

Linux系统之file命令的基本使用

Linux系统之file命令的基本使用 一、file命令介绍1.1 Linux简介1.2 file命令简介 二、file命令的使用帮助2.1 file命令的help帮助信息2.2 file命令的语法解释2.3 file命令的man手册 三、文件类型介绍四、file命令的基本使用4.1 查询file版本4.2 显示文件类型4.3 输出时不显示文…

MATLAB——一维离散小波的单层分解

%% 学习目标&#xff1a;一维离散小波的单层分解 %% clear all; close all; load noissin.mat; [cA,cD]dwt(noissin,sym4); %% cA是近似系数&#xff08;低频部分&#xff09;&#xff0c;cD是细节系数&#xff08;高频部分&#xff09;&#xff0c;采用的小波是sym4 f…

01. 板载硬件资源和开发环境

一、板载硬件资源 STM32F4VGT6-DISCOVERY硬件资源如下&#xff1a; (1). STM32F407VGT6微控制器有1M的FLASH存储器&#xff0c;192K的RAM&#xff0c;LQFP100封装 (2). 板上的ST-LINK_V2可以使用选择的方式把套件切换成一个独立的ST-LINK/V2来 使用&#xff08;可以使用SWD…

使用vite搭建前端项目

1、在vscode 终端那里执行创建前端工程项目&#xff0c;其中shop-admin为项目名称&#xff1a; npm init vite-app shop-admin 提示如需安装其他依赖执行npm install ....,否则忽略(第三步再讲)。 2、执行npm run dev 命令直接运行创建好的项目&#xff0c;在浏览器打开链接…

ubuntu执行普通用户或root用户执行apt-get update时报错Couldn‘t create temporary file /tmp/...

apt-get update无法更新&#xff0c;报错&#xff1a; Couldnt create temporary file /tmp/apt.conf.GSzv74 for passing config to&#xff0c;&#xff0c;&#xff0c; 这是由于/tmp目录没有权限导致的&#xff0c;解决办法&#xff1a; chmod 777 /tmp

遥感语义分割、变化检测论文小trick合集(持续更新)

目录 &#x1f497;&#x1f497;1.影像融合机制 &#x1f497;&#x1f497;2.上下文聚合模块 &#x1f497;&#x1f497;3.adapter即插即用模块 &#x1f497;&#x1f497;1.影像融合机制 参考【多源特征自适应融合网络的高分遥感影像语义分割】文章中的“多源特征自适应…

编译报错 internal compiler error: Segmentation fault 解决方法

问题描述 最近在使用虚拟机 ubuntu 20.04 编译 musl gcc 工具链时&#xff0c;遇到一个奇怪的问题&#xff0c;编译过程中异常退出&#xff0c;清理了多次重新编译&#xff0c;发现编译报错提示的信息是 internal compiler error: Segmentation fault 由于之前是可以正常编译的…

Linux shell编程学习笔记15:定义数组、获取数组元素值和长度

一、 Linux shell 脚本编程中的数组概述 数组是一种常见的数据结构。跟大多数编程语言一样&#xff0c;大多数Linux shell脚本支持数组&#xff0c;但对数组的支持程度各不相同&#xff0c;比如数组的维度&#xff0c;是支持一维数组还是多维数组&#xff1f;再如&#xff0c;…

【Linux】从零开始学习Linux基本指令(三)

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;Linux入门 &#x1f525;该文章主要了解Linux操作系统下的基本指令。 ⚡️该篇为Linux指令部分的终章&#xff0c;如果您想了解前两篇文章的…

【字符串】【将字符数组转为字符串】Leetcode 122 路径加密

【将字符数组转为字符串】Leetcode 122 路径加密 解法1 在Java中&#xff0c;char数组没有直接的toString()方法来将其转换为字符串。如果你想将char数组转换为字符串&#xff0c;可以使用String类的构造函数来实现&#xff1a; ⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐…

Kafka与Spark案例实践

1.概述 Kafka系统的灵活多变&#xff0c;让它拥有丰富的拓展性&#xff0c;可以与第三方套件很方便的对接。例如&#xff0c;实时计算引擎Spark。接下来通过一个完整案例&#xff0c;运用Kafka和Spark来合理完成。 2.内容 2.1 初始Spark 在大数据应用场景中&#xff0c;面对…

为什么HashMap头插法会造成死循环?

循环之后就直接退出了&#xff0c;所以当时没有造成死锁&#xff0c;是在下一次插入时&#xff0c;才造成的死锁

postman打开后,以前的接口记录不在,问题解决

要不这些文件保存在C:\Users\{用户名}\AppData\Roaming\Postman 比如&#xff0c;你目前使用的window登录用户是abc&#xff0c;那么地址便是C:\Users\abc\AppData\Roaming\Postman 打开后&#xff0c;这个目录下会有一些命名为backup-yyyy-MM-ddThh-mm-ss.SSSZ.json类似的文…

双十一购物狂欢节准备好买什么了吗?双十一这些好物不能错过

双十一是电商节&#xff0c;各大电商平台都会推出各种促销活动&#xff0c;吸引消费者抢购商品。在这个特别的时刻&#xff0c;许多人都迫不及待地开始筹备自己的购物清单&#xff0c;想要趁着这个机会购买自己心仪的商品。那么&#xff0c;在这个双十一购物狂欢节&#xff0c;…

LVS负载均衡及LVS-NAT模式

一、集群概述 1.1 集群的背景 集群定义&#xff1a;为解决某个特定问题将多个计算机组合起来形成一个单系统 集群目的&#xff1a;为了解决系统的性能瓶颈 集群发展历史&#xff1a; 垂直扩展&#xff1a;向上扩展&#xff0c;增加单个机器的性能&#xff0c;即升级硬件 水…
最新文章