软件杯 深度学习人体语义分割在弹幕防遮挡上的实现 - 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/810989.shtml

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

相关文章

二叉树学习

树 树是n个结点的有限集合,当n0时为空树,在任意一颗非空的树中,有且只有一个特定的称为根的结点,当n>1时,其余结点又可以分为m个不相交的有限集,其中每一个集合又是一棵树,并且称为根的子树…

【Java探索之旅】从输入输出到猜数字游戏

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java编程秘籍 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、输入输出1.1 输出到控制台1.2 从键盘输入 二、猜数字游戏2.1 所需知识&#xff1a…

《猎灵online》游戏完整源码(源码+客户端+服务端+文档+工具),云盘下载

《猎灵》是一款由国内知名开发运营开发的大型3D魔幻网游,《猎灵》研发团队突破诸多瓶颈,首创“全自由无限制PK”,让玩家拒绝无意义等待,自由作战不受任何束缚,真正的实现想战就战,游戏创建了六界神魔乱斗的…

Amazon SageMaker:让机器学习变得更简单、更强大

授权说明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 前言: 在大数据时代的浪潮中,数据不再只是…

Python神器!WEB自动化测试集成工具 DrissionPage

案例 跟踪商品价格,降价自动推送消息到微信 咱买不起还等不起吗? from DrissionPage import * import re from time import sleep import csv import os import datetime#写入时间p MixPage() p.get(http://xxxxxxx) #快快买网址 p.to_iframe(iframe…

云服务器centos提示 Cannot prepare internal mirrorlist: No URLs in mirrorlist的解决办法

yum update -y CentOS-8 - AppStream 118 B/s | 38 B 00:00 Error: Failed to download metadata for repo AppStream: Cannot prepare internal mirrorlist: No URLs in mirrorlist 执行下面的命令就可…

CSS特效---纯CSS实现点击切换按钮

1、演示 2、一切尽在代码中 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"w…

HashMap的常见问题

Entry中的hash属性为什么不直接使用key的hashCode()返回值呢&#xff1f; 不管是JDK1.7还是JDK1.8中&#xff0c;都不是直接用key的hashCode值直接与table.length-1计算求下标的&#xff0c;而是先对key的hashCode值进行了一个运算&#xff0c;JDK1.7和JDK1.8关于hash()的实现…

c++ 指针总结

概述 内存地址 在计算机内存中&#xff0c;每个存储单元都有一个唯一的地址(内存编号)。通俗理解&#xff0c;内存就是房间&#xff0c;地址就是门牌号 指针和指针变量 指针&#xff08;Pointer&#xff09;是一种特殊的变量类型&#xff0c;它用于存储内存地址。指针的实质…

算力租赁费用包括哪些

相比于企业自购设备、自建机房、自己运营&#xff0c;服务器租赁是绝大数企业的首先&#xff0c;租赁服务器从一定程度上解决了企业资金预算不足、AI芯片难买的局面。 随着文生视频大模型Sora、大语言模型Grok-1的相继出现&#xff0c;对高新能算力资源和服务的需求不断提高&a…

暴力枚举法

虽然暴力枚举法有时候效率低&#xff0c;时间复杂度高&#xff0c;但是在面对小规模数据集的时候&#xff0c;暴力枚举法往往是很好的思维利器。 B: 01 串的熵&#xff08;5分&#xff09; 问题描述 #include <iostream> #include <cmath> #include <algorithm…

什么是云HIS?云HIS的优点是什么?云HIS适用于什么医院?

什么是云HIS&#xff1f;云HIS的优点是什么&#xff1f;云HIS适用于什么医院&#xff1f; 一、什么是云HIS&#xff1f; 云HIS系统是一个运用云计算、大数据、物联网等新兴信息技术的业务和技术平台。它旨在按照现代医疗卫生管理要求&#xff0c;以数字化形式提供医疗卫生行业…

Mybatis generate xml 没有被覆盖

添加插件即可 <plugin type"org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>

epic免费游戏在哪里领 epic免费游戏怎么领取 图文教程一看就会

Epic Games是一家位于美国北卡罗来纳州卡里的视频游戏和软件开发商&#xff0c;由Tim Sweeney于1991年创立。该公司最著名的作品包括《堡垒之夜》和虚幻引擎&#xff0c;后者是一种广泛用于游戏开发的商用游戏引擎。Epic Games在2020年和2024年分别与索尼和迪士尼达成财务合作及…

ARM架构麒麟操作系统安装配置Mariadb数据库

、安装配置JDK (1)检查机器是否已安装JDK 执行 java -version命令查看机器是否安装JDK,一般麒麟操作系统默认安装openjdk 1.8。 (2)安装指定版本JDK 如果麒麟操作系统默认安装的openjdk 1.8不符合需求的话,可以卸载机器安装的openjdk 1.8并按需安装所需的openjdk版本…

#esp8266模块通过AT指令获取网络时间(苏宁时间)

一、IDE&#xff1a;keil、cubemx、Arduino......... 二、记录&#xff1a; 1.依次发送以下指令&#xff08;发送新行&#xff09; AT ATCWMODE1 ATCWDHCP1,1 ATCWJAP"Redmi K40 Gaming","87654321" ATCIPSTART"TCP","quan.suning.com&quo…

Leetcode110_平衡二叉树

1.leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;…

RabbbitMQ

初识MQ 同步通讯和异步通讯 什么是同步通讯呢&#xff1f;举个例子&#xff0c;你认识了一个小姐姐&#xff0c;聊的很火热&#xff0c;于是你们慢慢开始打电话&#xff0c;视频聊天&#xff0c;这种方式就成为同步通讯&#xff0c;那什么是一部通讯呢&#xff0c;同样的&…

【性能测试】接口测试各知识第3篇:Jmeter 基本使用流程,学习目标【附代码文档】

接口测试完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;接口测试&#xff0c;学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标&#xff0c;RESTFUL1. 理解接口的概念,2.什么是接口测试…

python知识点汇总(十一)

python知识点总结 1、当Python退出时&#xff0c;是否会清除所有分配的内存&#xff1f;2、Python的优势有哪些&#xff1f;3、什么是元组的解封装4、Python中如何动态获取和设置对象的属性&#xff1f;5、创建删除操作系统上的文件6、主动抛出异常7、help() 函数和 dir() 函数…