软件杯 深度学习人体语义分割在弹幕防遮挡上的实现 - python

news2024/11/28 20:54:03

文章目录

  • 1 前言
  • 1 课题背景
  • 2 技术原理和方法
    • 2.1基本原理
    • 2.2 技术选型和方法
  • 3 实例分割
  • 4 实现效果
  • 5 最后

1 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 深度学习人体语义分割在弹幕防遮挡上的应用

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1 课题背景

弹幕是显示在视频上的评论,可以以滚动、停留甚至更多动作特效方式出现在视频上,是观看视频的人发送的简短评论。

各大视频网站目前都有弹幕功能,之家也于2020年5月正式上线视频弹幕功能,受到了广大网友的喜爱,大家在观看视频的同时,也能通过弹幕进行互动。

但密集的弹幕,遮挡视频画面,严重影响用户观看体验,如何解决?
在这里插入图片描述
查阅了相关视频网站,发现B站推出了一种蒙版弹幕技术,可以让弹幕自动躲避人形区域,达到弹幕不挡人的效果。
B站视频弹幕不挡人的效果

在这里插入图片描述

2 技术原理和方法

2.1基本原理

通过AI计算机视觉的技术,对视频内容进行分析,并将之前已经定义好的“视频主体内容”进行识别,生成蒙版并分发给客户端后,让客户端利用 CSS3
的特性进行渲染从而达成最终的效果。这样就形成了我们最终看到的,“不挡脸”弹幕效果。

实现方法就正如 PS
中的“蒙版“一样,实心区域允许,空白区域拒绝,从而达到弹幕不挡人的效果。而技术的核心就在蒙版的生成上,所以将这个功能称之为“蒙版弹幕”。

2.2 技术选型和方法

1、提取视频帧画面。对音视频的处理,大家一般都会想到FFmpeg组件,我们也是使用FFmpeg组件提取每帧的视频画面,使用的是PyAV组件,PyAV是FFmpeg封装,能够灵活的编解码视频和音频,并且支持Python常用的数据格式(如numpy)。

2、识别视频帧画面人像区域。解决方案:使用AI计算机视觉的实例分割技术,可以识别视频帧画面的人像区域。

3、AI框架:目前市面上的AI框架,主要以TensorFlow,PyTorch最流行。

  • TensorFlow :出身豪门的工业界霸主,由Google Brain团队研发。具有如下优点:支持多种编程语言;灵活的架构支持多GPU、分布式训练,跨平台运行能力强;自带 TensorBoard 组件,能可视化计算图,便于让用户实时监控观察训练过程;官方文档非常详尽,可查询资料众多;社区庞大,大量开发者活跃于此。
  • PyTorch :以动态图崛起的学术界宠儿,是基于 Torch 并由Facebook强力支持的python端的开源深度学习库。具有如下优点:简洁: PyTorch 在设计上更直观,追求尽量少的封装,建模过程透明,代码易于理解;易用:应用十分灵活,接口沿用 Torch ,契合用户思维,尽可能地让用户实现“所思即所得”,不过多顾虑框架本 PyTorch 。原因: TensorFlow 入门难度较大,学习门槛高,系统设计过于复杂;而 PyTorch 入门难度低,上手快,而且提供的功能也非常易用,预训练模型也非常多。

4、实例分割技术:实例分割(Instance Segmentation)是视觉经典四个任务中相对最难的一个,它既具备语义分割(Semantic
Segmentation)的特点,需要做到像素层面上的分类,也具备目标检测(Object
Detection)的一部分特点,即需要定位出不同实例,即使它们是同一种类。

3 实例分割

简介
实例分割已成为机器视觉研究中比较重要、复杂和具有挑战性的领域之一。为了预测对象类标签和特定于像素的对象实例掩码,它对各种图像中出现的对象实例的不同类进行本地化。实例分割的目的主要是帮助机器人,自动驾驶,监视等。

实例分割同时利用目标检测和语义分割的结果,通过目标检测提供的目标最高置信度类别的索引,将语义分割中目标对应的Mask抽取出来。实例分割顾名思义,就是把一个类别里具体的一个个对象(具体的一个个例子)分割出来。
在这里插入图片描述
Mask R-CNN算法
本项目使用Mask R-CNN算法来进行图像实例分割。
网络结构图:
在这里插入图片描述
Mask R-CNN,一个相对简单和灵活的实例分割模型。该模型通过目标检测进行了实例分割,同时生成了高质量的掩模。通常,Faster
R-CNN有一个用于识别物体边界框的分支。Mask R-CNN并行添加了一个对象蒙版预测分支作为改进。使用FPN主干的head架构如图所示。
在这里插入图片描述
关键代码



    ##利用不同的颜色为每个instance标注出mask,根据box的坐标在instance的周围画上矩形
    ##根据class_ids来寻找到对于的class_names。三个步骤中的任何一个都可以去掉,比如把mask部分
    ##去掉,那就只剩下box和label。同时可以筛选出class_ids从而显示制定类别的instance显示,下面
    ##这段就是用来显示人的,其实也就把人的id选出来,然后记录它们在输入ids中的相对位置,从而得到
    ##相对应的box与mask的准确顺序
    def display_instances_person(image, boxes, masks, class_ids, class_names,
                          scores=None, title="",
                          figsize=(16, 16), ax=None):
        """
        the funtion perform a role for displaying the persons who locate in the image
        boxes: [num_instance, (y1, x1, y2, x2, class_id)] in image coordinates.
        masks: [height, width, num_instances]
        class_ids: [num_instances]
        class_names: list of class names of the dataset
        scores: (optional) confidence scores for each box
        figsize: (optional) the size of the image.
        """
        #compute the number of person
        temp = []
        for i, person in enumerate(class_ids):
            if person == 1:
                temp.append(i)
            else:
                pass
        person_number = len(temp)
        
        person_site = {}
        
        for i in range(person_number):
            person_site[i] = temp[i]


        NN = boxes.shape[0]   
        # Number of person'instances
        #N = boxes.shape[0]
        N = person_number
        if not N:
            print("\n*** No person to display *** \n")
        else:
           # assert boxes.shape[0] == masks.shape[-1] == class_ids.shape[0]
            pass
     
        if not ax:
            _, ax = plt.subplots(1, figsize=figsize)
     
        # Generate random colors
        colors = random_colors(NN)
     
        # Show area outside image boundaries.
        height, width = image.shape[:2]
        ax.set_ylim(height + 10, -10)
        ax.set_xlim(-10, width + 10)
        ax.axis('off')
        ax.set_title(title)
     
        masked_image = image.astype(np.uint32).copy()
        for a in range(N):
            
            color = colors[a]
            i = person_site[a]

            # Bounding box
            if not np.any(boxes[i]):
                # Skip this instance. Has no bbox. Likely lost in image cropping.
                continue
            y1, x1, y2, x2 = boxes[i]
            p = patches.Rectangle((x1, y1), x2 - x1, y2 - y1, linewidth=2,
                                  alpha=0.7, linestyle="dashed",
                                  edgecolor=color, facecolor='none')
            ax.add_patch(p)
     
            # Label
            class_id = class_ids[i]
            score = scores[i] if scores is not None else None
            label = class_names[class_id]
            x = random.randint(x1, (x1 + x2) // 2)
            caption = "{} {:.3f}".format(label, score) if score else label
            ax.text(x1, y1 + 8, caption,
                    color='w', size=11, backgroundcolor="none")
            
             # Mask
            mask = masks[:, :, i]
            masked_image = apply_mask(masked_image, mask, color)
     
            # Mask Polygon
            # Pad to ensure proper polygons for masks that touch image edges.
            padded_mask = np.zeros(
                (mask.shape[0] + 2, mask.shape[1] + 2), dtype=np.uint8)
            padded_mask[1:-1, 1:-1] = mask
            contours = find_contours(padded_mask, 0.5)
            for verts in contours:
                # Subtract the padding and flip (y, x) to (x, y)
                verts = np.fliplr(verts) - 1
                p = Polygon(verts, facecolor="none", edgecolor=color)
                ax.add_patch(p)
           
        ax.imshow(masked_image.astype(np.uint8))
        plt.show()


4 实现效果

原视频
在这里插入图片描述
生成帧蒙板
在这里插入图片描述
最终效果
在这里插入图片描述

5 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

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

相关文章

基于Springboot4S店车辆管理系统

采用技术 基于Springboot4S店车辆管理系统的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员功能 首页 销售员管理 维修员管理 客户管理 供应…

前端开发之Element树结构组件el-input的type=“password“时候账号密码自动填充解决方案

Element树结构组件el-input的type“password“时候账号密码自动填充解决方案 前言效果图解决方案 前言 在使用element的input的password当参数和login的参数相同时,在浏览器保存的用户名密码会自动填充,导致input附加上默认值 使用场景一般是在用户管理…

海量智库 | ANY权限原理介绍

ANY权限是Vastbase中的一种特殊的管理权限,用户能够通过ANY权限执行更广泛的操作,更加便利的管理数据库。 本文将为您介绍ANY权限管理的相关原理。 ANY权限管理相关解释 ANY权限管理,是对数据库内的某一类对象的所有实体进行特定的权限管理…

数据产品+AI产品 通关上岸,创建能带来商业价值的AI产品,学习AI产品开发

数据产品 AI产品 通关上岸,创建能带来商业价值的AI产品,学习AI产品开发流程 数据产品+AI产品 通关上岸,创建能带来商业价值的AI产品,学习AI产品开发 - 百创网-源码交易平台_网站源码_商城源码_小程序源码 人工智能快速渗入到各个行业,AI产品经理缺口高达6.8万,成为稀缺…

数字电子基础——编码器

编码器 编码:用文字、符号或数字表示特定对象的过程。在数字电路中,采用二进制进行编码 编码器:实现编码功能的电路 二进制编码器 用 n n n 位二进制代码对 N 2 n N2^n N2n 个信号进行编码的电路 应用举例 【例】设计一个能将 I 0 、…

【cocos creator】【编辑器插件】cocos creator文件复制时,解决cocos creator uuid冲突

!!!修改前先备份 1、将文件夹放在packages文件夹下 2、打开项目,选择要刷新uuid的文件夹 3、菜单栏点击 扩展->refresh-uuid 4、等控制台提示:资源uuid刷新完成,重启项目(!&#…

JavaScript(二)-Web APIS

文章目录 Web API 基本认知作用和分类什么是DOMDOM树DOM对象获取DOM对象操作元素内容操作元素属性操作元素常用属性操作元素样式属性自定义属性 定时器-间歇函数定时器函数的理解定时器函数使用间歇函数 事件监听与绑定事件监听事件监听版本事件类型事件对象什么是事件对象获取…

转让名称带中国的金融控股集团公司要多少钱

随着公司的发展和市场竞争的影响,越来越多的创业者希望注册一家好名称的公司,以提高企业知名度和竞争力。但是,注册中字头无地域公司需要满足一定的条件和流程。本文将对中字头无地域公司注册条件及流程进行详细的介绍。可以致电咨询我或者来…

Sketch是免费软件吗?这款软件支持导入!

Sketch 是一款针对网页、图标、插图等设计的矢量绘图软件。Sketch 的操作界面非常简单易懂,帮助全世界的设计师创作出许多不可思议的作品。但是同时,Sketch 也有一些痛点:使用 Sketch 需要安装 InVision、Abstract 、Zeplin 等插件&#xff0…

粉丝答疑:电脑蓝屏了怎么办?

昨天大白在直播的时候,有粉丝朋友在直播间问到了大白电脑蓝屏了怎么办?今天也特意帮粉丝朋友整理和收集了常见电脑蓝屏代码大全。 电脑蓝屏代码大全及解决办法合集 代码 含意 0 0x00000000 作业完成。 1 0x00000001 不正确的函数。 2 0x00000002 系…

qt自定义窗口在拖动过程中出现抖动且拖动后位置看上去不对

自定义窗口拖动 引言开发环境关键性代码运行结果原因分析改进代码运行结果globalPos()globalPosition()再次修改代码运行结果区别 引言 本文旨在一个问题的记录:自定义窗口拖动的过程中,窗口不能很好的跟随鼠标移动,此外会出现窗口拖动时抖动…

剑指Offer题目笔记29(动态规划矩阵路径问题)

面试题98: 问题: ​ 一个机器人从m x n的格子的左上角出发,它每一步只能向下走或者向右走,计算机器人从左上角到达右下角的路径数量。 解决方案: 机器人每走一步都有两个选择,要么向下走要么向右走。一个任务需要多…

curl下载nexus中的jar包

下载并保持原名称 curl -u admin:password -O "http://127.0.0.1:8081/repository/maven-snapshots/com/edgej/edgej-modules-research/1.0-SNAPSHOT/edgej-modules-research-1.0-20240407.090116-1.jar"下载并重命名 curl -u admin:password -o "edgej-modul…

利用Leaflet + React:构建WEBGIS

React是 Facebook 开发的一个开源库,用于构建用户界面。就其本身而言,Leaflet是一个用于将地图发布到网络的JavaScript 库。这两个工具的组合很简单,允许您创建动态网络地图。在本文中,我们将看到这种组合的一些特征以及一些简单的…

【C++】详解vector二维数组的全部操作(超细图例解析!!!)

目录 一、前言 二、 深度理解vector 的二维数组(重点!) 三、vector 二维数组的空间理解(重点!) ✨问题分析 ✨如何合理定制vector的内存空间 四、vector 二维数组的初始化 五、vector 二维数组的 添加…

宝宝眼部健康,斗鸡眼小心防护

引言: 新生儿期间,宝宝的眼睛需要特别关注和呵护,因为眼睛是宝宝感知世界的窗户。斗鸡眼,即眼球表面的角膜上形成的小疙瘩,虽然在新生儿中比较罕见,但家长们仍然需要了解斗鸡眼的相关知识,并采取…

Vue 有哪些主要的指令修饰符

目录 1. 什么是指令修饰符 2. 指令修饰符有哪些 2.1. 按键修饰符 2.2. v-model修饰符 2.3. 事件修饰符 1. 什么是指令修饰符 通过 "." 指明一些指令 后缀,不同 后缀 封装了不同的处理操作 目的:简化代码 2. 指令修饰符有哪些 2.1. 按键…

让chatGPT控制物理设备

作为自动控制行业的工程师,我们也许最关心的是如何使chatGPT 控制物理设备。我发现许多人仍然停留在传统程序设计的思维阶段,比如让大模型编写一段PLC 代码,或者是生成一些信息模型。 其实大模型具备判断与思考的能力,AI …

尚硅谷html5+css3(2)CSS5基本知识

1.网页分为三个部分: 结构:HTML 表现:CSS 行为JavaScript CSS:层叠样式表,网页实际上是一个多层结构,通过CSS可以分别为网页的每一个层来设置样式,最终用户只看最上面的一层,总之&#xff0…

适用于 Windows 10 的 10 大免费数据恢复软件

数据丢失可能是一场噩梦,尤其是在涉及重要文件和文档时。无论是由于意外删除、系统崩溃还是病毒攻击,找到适合 Windows 10 的文件夹恢复软件都可以在恢复丢失的数据方面发挥重要作用。在本指南中,我们将探索适用于 Windows 10 用户的 10 大免…