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

文章目录

  • 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 imageboxes: [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 datasetscores: (optional) confidence scores for each boxfigsize: (optional) the size of the image."""#compute the number of persontemp = []for i, person in enumerate(class_ids):if person == 1:temp.append(i)else:passperson_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_numberif not N:print("\n*** No person to display *** \n")else:# assert boxes.shape[0] == masks.shape[-1] == class_ids.shape[0]passif not ax:_, ax = plt.subplots(1, figsize=figsize)# Generate random colorscolors = 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 boxif not np.any(boxes[i]):# Skip this instance. Has no bbox. Likely lost in image cropping.continuey1, 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)# Labelclass_id = class_ids[i]score = scores[i] if scores is not None else Nonelabel = class_names[class_id]x = random.randint(x1, (x1 + x2) // 2)caption = "{} {:.3f}".format(label, score) if score else labelax.text(x1, y1 + 8, caption,color='w', size=11, backgroundcolor="none")# Maskmask = 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] = maskcontours = find_contours(padded_mask, 0.5)for verts in contours:# Subtract the padding and flip (y, x) to (x, y)verts = np.fliplr(verts) - 1p = 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.mzph.cn/news/115289.shtml

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

相关文章

如何使用Vue CLI进行预渲染

在Vue CLI中使用预渲染,你可以借助插件vue-cli-plugin-prerender-spa来实现。以下是使用Vue CLI进行预渲染的步骤: 1:安装Vue CLI:首先安装Vue CLI。如果没有安装,可以通过以下命令进行全局安装: npm install -g @vue/cli2:创建Vue项目:使用Vue CLI创建一个新的Vue项…

AQS是什么?AbstractQueuedSynchronizer之AQS原理及源码深度分析

文章目录 一、AQS概述1、什么是AQS2、技术解释3、基本原理4、AQS为什么这么重要 二、AQS数据结构1、AQS的结构2、ReentrantLock与AbstractQueuedSynchronizer3、AQS的state变量4、AQS的队列5、AQS的Node(1)Node的waitStatus(2)属性…

庆祝创造力和技术:2023年的1024程序员节

2023年的10月24日已经来临,这意味着我们又迎来了一年一度的程序员节。这是一个属于全球程序员社区的节日,一个庆祝创造力、创新和技术的时刻。无论你是一名职业程序员、技术爱好者,还是对编程世界感兴趣的新手,1024程序员节都是一…

STM32+2.9inch微雪墨水屏(电子纸)实现显示

本篇文章从硬件原理以及嵌入式编程等角度完整的介绍了墨水屏驱动过程,本例涉及的墨水屏为2.9inch e-Paper V2,它采用的是“微胶囊电泳显示”技术进行图像显示,其基本原理是悬浮在液体中的带电纳米粒子受到电场作用而产生迁移,从而改变显示屏各…

【C++入门到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入门 ]

阅读导航 前言一、unordered系列容器二、unordered_map1. unordered_map简介⭕函数特点 2. unordered_map接口- 构造函数- unordered_map的容量- unordered_map的迭代器- unordered_map的元素访问- unordered_map的修改操作- unordered_map的桶操作 三、unordered_set1. unorde…

react中JSX基础与useState的基本使用 + 评论显示删除需求案例

参考视频:https://www.bilibili.com/video/BV1ZB4y1Z7o8/?p3&spm_id_frompageDriver&vd_source5c584bd3b474d579d0bbbffdf0437c70 如果没有安装create-react-app需要先全局安装 命令:npm i -g create-react-app1.快速搭建开发环境 create-re…

动态天气预报:Living Weather HD for Mac

Living Weather HD能够为Mac用户提供及时、准确、个性化的天气信息,并提供了丰富的定制选项,使用户能够更加方便地查看天气状况。 具有以下特点: 显示世界各地的准确天气预报和当地时间。自动探测出用户所在的首个地点,并通过搜…

CUDA学习笔记(八)Branch Divergence and Unrolling Loop

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/,仅用于学习。 Avoiding Branch Divergence 有时,控制流依赖于thread索引。同一个warp中,一个条件分支可能导致很差的性能。通过重新组织数据获取模式可以减少或避免warp diverge…

HarmonyOS开发:Log工具类源码分析

前言 一转眼就十月中旬了,国庆的劲真大,到现在还未缓过来,以至于要更新的文章迟迟未发布,大家可以看到,最近一段时间的文章,都是关于HarmonyOS相关的,两个原因吧,一是我司有这样的任…

解决AndroidStudio Gradle只有testDebugUnitTest

问题复现: 问题解决: 1:点击Task list not built... 2:取消勾选Configure all Gradle tasks during Gradle Sync... 大功告成,现在去看看Gradle,屏蔽的都显示出来了。

深度学习 | Pytorch深度学习实践 (Chapter 1~9)

一、overview 基于pytorch的深度学习的四个步骤基本如下: 二、线性模型 - Linear Model 基本概念 数据集分为测试集和训练集(训练集、开发集)训练集(x,y)测试集只给(x)过拟合&#…

解读 | 快速精确的体素GICP三维点云配准算法

原创 | 文 BFT机器人 01 摘要 本文提出了体素化广义迭代最近点(VGICP)算法,用于快速准确的三维点云配准。所提出的方法通过体素化扩展了广义迭代最近点(GICP)方法,以避免昂贵的最近邻搜索,同时…

Microsoft Edge浏览器中使用免费的ChatGPT

一、双击打开浏览器 找到:扩展,打开 二、打开Microsoft Edge加载项 三、Move tab新标签 获取免费ChatGPT 四、启用Move tab。启用ChatGPT。 扩展 管理扩展 启用 五、新建标签页,使用GPT 六、使用举例 提问 GPT回复

酷开科技 | 酷开系统,为居家生活打开更精彩的窗口

电视在我们的日常生活中扮演着重要的角色。虽然,作为客厅C位的扛把子——电视的娱乐作用深入人心,但是,它的涵义和影响力却因我们每个人的具体生活环境而存在着种种差异,而我们的生活环境又受到我们所处的社会及文化环境的影响。 …

Gartner发布2024 年十大战略技术趋势

10月17日,Gartner 发布2024年企业机构需要探索的****十大战略技术趋势。Gartner研究副总裁Bart Willemsen表示:“由于技术变革以及社会经济方面的不确定性,我们必须大胆采取行动并从战略上提高弹性,而不是采取临时措施。IT领导者的…

页面查询多项数据组合的线程池设计 | 京东云技术团队

背景 我们应对并发场景时一般会采用下面方式去预估线程池的线程数量,比如QPS需求是1000,平均每个任务需要执行的时间是t秒,那么我们需要的线程数是t * 1000。 但是在一些情况下,这个t是不好估算的,即便是估算出来了&…

VS Code C# 开发工具包正式发布

前言 微软于本月正式发布Visual Studio Code C#开发工具包,此前该开发套件已经以预览版的形式在6月份问世。经过4个月的测试和调整,微软修复了350多个问题,其中大部分是用户反馈导致的问题。此外,微软还对产品进行了300多项有针对…

1024 CSDN 程序员节-知存科技-基于存内计算芯片开发板验证语音识别

前言 在今年的 CSDN 程序员节上,我参与了这次知存科技举办的一个 AI Workshop 小活动——“基于存内计算芯片开发板验证语音识别”,并且有幸成为完成任务的学习者之一XD。上一次参与类似的活动是算能公司举办的“千校万里行”AIGC 大模型编译部署活动&a…

【Django 04】Serialization 序列化的高级使用

序列化器 serializers 序列化器的作用 序列化将 queryset 和 instance 转换为 json/xml/yaml 返回给前端 反序列化与序列化则相反 定义序列化器 定义类,继承自 Serializer 通常新建一个 serializers.py 文件 撰写序列化内容 suah as 目前只支持 read_only 只…

设计模式:外观模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

大家好!本节主要介绍设计模式中的外观模式。 简介: 外观模式,它是一种设计模式,它为子系统中的一组接口提供一个统一的、简单的接口。这种模式主张按照描述和判断资料来评价课程,关键活动是在课程实施的全过程中进行…