欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由腾讯云视频发表于云+社区专栏

关注公众号“腾讯云视频”,一键获取 技术干货 | 优惠活动 | 视频方案

本是一名佛性型吃鸡选手,自从被三个妹子带着躺尸吃鸡之后,便立志要成为一名吃鸡高手,一大早便沉迷于各大网站的吃鸡直播中,正看到决赛圈激动人心的时刻,直播花屏了?然后游戏结束了?我的天,我是谁?我在哪?我错过了什么?

作为一名有强迫症的IT小哥哥,怎能让直播花屏现象存在呢?一方面,为了自己能成为一名吃鸡高手。另一方面,不能错过每一个升职加薪的机会。就这样开始了一段漫长的长征之路……

对于直播业务,"秒开、卡顿、时延、进房成功率"是我们经常关注的几个指标,这些指标可以说是从"一个用户能够优雅地进入直播间"的角度来考量的,然而进入直播间后"用户究竟看到的什么内容"也是很关键的一环,内容上除了涉及安全的一些指标外,还可能会有内容是否有花屏、绿屏等其他异常内容,这时我们便会考虑如何衡量和发现外网的花屏情况。

本文主要针对花屏提出了一种基于CNN网络的检测方案。

01

花屏检测能力构建

无论是视频还是直播,都是由一帧帧图像组成的,之所以会以一种动态的形式展现到我们眼前,是因为了人类的视觉暂留现象。

物体在快速运动时, 当人眼所看到的影像消失后,人眼仍能继续保留其影像0.1-0.4秒左右的图像,这种现象被称为视觉暂留现象

既然如此,检测直播中是否存在花屏,其实可以转换为检测直播中的帧画面是否是花屏的画面,即一个图像识别问题。那么如何识别一个图像是否是花屏呢?

通常图像识别总是以特征为基础的,我们会先根据所设定的目标来提取相应的特征,用于我们后面来制定策略。不过好在现在的深度学习卷积神经网络CNN将提取特征和制定决策策略都帮我们完成了。

而使用深度学习CNN网络则绕不开数据集模型训练两大块

1.1数据集准备

困难

要使用深度学习网络,一个门槛是需要足够的带有标签的数据集,否则学习出的网络很容易过拟合,从而泛化能力不强。说其是门槛是因为实际业务中更多情况是缺少数据集,就以现在的花屏为例,目前直播发生花屏的案例非常少,想要通过实际案例来收集足够的花屏图片作为训练集显得异常困难。因此必须探寻其他的路子来收集训练集。

人类之所以能够分辨出花屏,是因为人类眼睛能够找到花屏图像的特征,虽然这些特征我们可能用语言都描述不出来,事实上,如果我们能用语言描述出特征,我们也很容易将其翻译成代码来找到花屏图像的特征。

制作训练集

机器学习其实也是通过特征来工作的,既然如此,我们可以制作一些花屏图像出来,让CNN网络找到它们区别于正常图片的特征,从而学习到花屏图片的检测能力。

在使用YUVviewer工具时,发现当设置错误的分辨率来播放视频文件时会出现花屏情况。灵感来源于此,我们完全可以通过使用错误的分辨率从YUV文件中抽取帧,从而拿到花屏图片。整体流程如下:

这里需要了解YUV文件的存储格式,从而根据格式来进行抽取对应的帧:

YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

YUV采样样式有一下几种,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量,一般情况下我们都使用的是YUV420格式

YUV420格式存储方式如下所示:

按照上面存储方式编写代码来提取帧,代码如下:

def get_frames_from_YUV(filename, dims, numfrm, startfrm, frmstep):"""从给定的YUV文件中抽取对应的帧数据,帧数据格式仍然为YUV:param filename: YUV文件路径:param dims: YUV文件的分辨率:param numfrm: 要提取帧的数量:param startfrm: 从哪一帧开始提取:param frmstep: 抽取帧的帧间隔,即每隔几帧抽一帧:return: 返回抽取帧的Y列表,U列表,V列表"""filesize = os.path.getsize(filename)fp = open(filename, 'rb')blk_size = prod(dims) * 3 / 2     # 计算每帧大小if (startfrm+1+(numfrm-1)*frmstep)*blk_size > filesize:numfrm = (filesize/blk_size - 1 - startfrm)/frmstep +1util.log('文件读取越界--修改为%d'%numfrm)fp.seek(blk_size * startfrm, 0)   # 跳转到指定开始帧Y, U, V= [],[],[]d00 = dims[0] / 2d01 = dims[1] / 2for i in range(numfrm):util.log('文件读取第%d帧' % i)Yt = zeros((dims[1], dims[0]), uint8, 'C')Ut = zeros((d01, d00), uint8, 'C')Vt = zeros((d01, d00), uint8, 'C')for m in range(dims[1]):for n in range(dims[0]):# print m,nYt[m, n] = ord(fp.read(1))for m in range(d01):for n in range(d00):Ut[m, n] = ord(fp.read(1))for m in range(d01):for n in range(d00):Vt[m, n] = ord(fp.read(1))Y = Y + [Yt]U = U + [Ut]V = V + [Vt]fp.seek(blk_size * (frmstep - 1), 1)   # 跳出间隔帧fp.close()return (Y, U, V)

这里对分辨率错误的多种情况也做了下研究,发现如下规律:

1)分辨率正确

2)分辨率width+1情况

3)分辨率width+n情况

4)分辨率width-1情况

5)分辨率width-n情况

上面只是针对图片宽来进行错误干扰,可以看出宽变小花屏条纹方向是左下的,宽变大花屏条纹方向时右下的。

所以我们队宽和高分别设置不同的错误值,会造成不同类型的花屏,于是可以用这种策略构造大量的花屏。

我们用800多个视频,每个视频以一定的间隔来抽10帧,获得了8000多张花屏图片。

这些图片标签为花屏,也就是我们的正样本,负样本可选取实际直播中的正常截图。

至此,数据集准备差不多了。

1.2 模型和训练

模型上使用网上一些知名模型即可,这里我们使用了轻量的mobilenet模型,模型结构如下图所示:

训练采用基于用imagenet已经训练好的模型来进行finetune训练,最后一层使用随机超参数来训练(这一层也无法读取pretrained模型的超参数,因为分类数不一致)。训练可以快速收敛,因为特征太明显了,而且测试集准确率很高。

其实这里训练是一个不断迭代的过程,因为机器学习模型是一张白纸,它要具有怎样的能力完全是你教它的,而教的方式就是通过训练集(数据和标签),而想要让它能够应对更多的情况,你的训练集就要尽可能涵盖各种情况。

而我们的训练集总是不足的,你总会有care不到的地方。训练集不足的情况会怎样?举个例子

你训练个识别飞机的模型,而大部分关于飞机的图片都有天空,这样你给张天空的图片到模型,它也可能会认为是飞机,因为其实模型很可能学到的是天空的特征。而怎么让模型学到飞机的特征呢,当然需要调整训练集,让训练集里不仅包含背景为天空的飞机,还有陆地上的飞机等等。

通过不断低迭代调优,我们在空间场景下检测准确率已经可以达到94%,NOW直播场景检测准确率也已达到90%。

02

直播检测方案

检测能力具备后想要真正地接入直播业务,还需要将直播流进行分帧,然后把对应的帧图片进行花屏检测。

后台整体框架

采用分帧截屏的手段,如果每天需要检测2000万张截图,即10s会有一张截图需要检测,而考虑花屏总是出现在很长的一段时间内,因此这里希望能够以更长的时间来抽样从而避免浪费算力。

附一张目前业务检测花屏结果的截图:

作为一名热爱工作的IT小哥哥,花了一个星期的时间,总算把基于CNN网络的直播花屏检测的工作告一段落了。

工作使我开心,游戏使我快乐,终于可以再次流畅的游走在各大网址的吃鸡直播中啦~

问答
游戏体系结构
相关阅读
团战开黑必备“良药”了解一下!
再也不用担心网吧开黑队友听不清了!
3行代码,为QQ轻游戏加上语音互动能力
【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

此文已由作者授权腾讯云+社区发布,更多原文请点击

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区!

吃鸡决赛圈直播却卡屏的我心好痛,立马找来开发刚了一波相关推荐

  1. 吃鸡决赛圈直播却卡屏的我心好痛,立马找来开发刚了一波 1

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云视频发表于云+社区专栏 关注公众号"腾讯云视频",一键获取 技术干货 | 优惠活动 | 视频方案 本是一名佛 ...

  2. 吃鸡哪个服务器网络稳定,中国地区吃鸡哪个服务器不卡 | 手游网游页游攻略大全...

    发布时间:2018-03-03 绝地求生:大逃杀中国xdd吃鸡的时候被封号,这是怎么回事,很多小伙伴可能都不太了解,下面牛游戏小编就为你们带来了绝地求生:大逃杀xdd吃鸡被封号的介绍,想了解的小伙伴就 ...

  3. 蛇哥开局两星机器人视频_虎牙粉丝活动落幕,蛇哥骚男夺冠,拿下季军的吃鸡一姐直播却哭了...

    近日,在虎牙直播展开了万众瞩目的超级粉丝团活动,这是一档非常考验主播综合实力的活动,不仅需要主播人气高,还要粉丝凝聚力足够强,毕竟是需要粉丝们花一点点钱支持的,路人粉一般都很难做到这点. 在经过入围赛 ...

  4. 超级计算机运行吃鸡,决赛圈的时候,如果两个人同时被手雷炸死该怎么办呢?...

    这款这么火的绝地求生,在决赛圈的时候如果真的两个人被手雷同时炸死该怎么办呢?小编就告诉你自己的亲身经历吧. 第一个:手雷在你手中爆炸,然后与敌人同归,相信大多数人有这样一种习惯,捏住手雷5秒扔掉,这样 ...

  5. 华为手机吃鸡隐藏功能android,环幕屏只是好看?开启华为Mate30 Pro这个隐藏功能,秒变吃鸡大神!...

    原标题:环幕屏只是好看?开启华为Mate30 Pro这个隐藏功能,秒变吃鸡大神! 作为一名吃鸡游戏玩家,今天看到知名游戏博主@高龄玩家老陈 的一条微博可谓感同身受.本来已经达到了英勇黄金的段位,觉得自 ...

  6. 【天池直播--预告】美女程序猿带你用大数据吃鸡(有内涵-这是一个有大奖的活动)...

    每局杀人都不少,就是吃不到鸡... 别人说我是菜,但宝宝内心委屈,怎样才能变成LYB??? 躺在桥上也可以吃鸡,难道这是一款躲猫猫的游戏?? ----------------------------- ...

  7. 吃鸡录屏怎么录到自己的声音 吃鸡录屏怎么隐藏按键

    很多人在玩吃鸡游戏时喜欢将自己的游戏过程录制下来,特别是很多游戏主播会录制视频,录制后将视频分享到社交平台.但是在录制时经常会遇到很多问题,如声音.画面清晰度和完整性等.接下来就来分享一下吃鸡录屏怎么 ...

  8. 改计算机高级设置吃鸡,吃鸡低配置怎么优化 绝地求生大逃杀低配置优化方法...

    火到不行的绝地求生大逃杀你有在玩吗?如果电脑低配玩吃鸡会造成游戏卡顿甚至崩溃闪退,但是又不想换电脑怎么办,下面铁骨网小编教大家电脑低配玩吃鸡该怎样设置的方法~ 首先说本文只针对玩不上游戏的和能玩游戏体 ...

  9. 20G数据告诉你,这才是吃鸡的正确姿势

    据某分析机构的研究表明,截止2018年4月,火爆全球的<绝地求生>收入已超10亿美元,其中有40%是中国的玩家.虽然国服还没遥遥无期,但作为游戏爱好者的小文也还是加入了吃鸡的大部队当中,作 ...

最新文章

  1. 数据处理过程放在oracle,Oracle存储过程语法及常用函数总结
  2. HDLBits 系列(42)根据仿真波形来设计电路之时序逻辑
  3. linux socket中 send recv函数的 flags参数
  4. PHP数组推入弹出的函数:头进头出array_unshift/array_shift 尾进尾出array_push/array_pop
  5. android记账软件开发源代码_如何开发直播软件?直播软件开发的具体流程有哪些?...
  6. 从源码看ConcurrentHashMap
  7. maven的基本命令
  8. php class行为,PHP CLASS
  9. echart 不立即更新 解决首次加载动画问题 vue watch immediate
  10. 12 大热门事件背后,藏着你的 2020 年
  11. 【PAT乙】1033 旧键盘打字 (20分) 字符串
  12. STM32F103C8T6 硬件SPI+DMA 控制WS2811
  13. 一文读懂各种分布式机器学习框架的区别与联系
  14. 软路由虚拟服务器,带你入门软路由 篇三:软路由也玩虚拟化——轻松几步教你配置Esxi网卡直通和软路由虚拟机设置(保姆级教程)...
  15. Go语言编程笔记16:存储数据
  16. 云储存服务器系统内蒙古,内蒙古【存储服务器】怎么选_星际云储
  17. python HTMLParser
  18. 防骗指南-披着交友恋爱的外衣,诱骗受害者赌博转钱
  19. 软件工程与计算II-20-软件交付
  20. python爬取王者_用Python爬取王者农药英雄皮肤

热门文章

  1. 配置webpack.config.js遇到的一些问题
  2. 用 CSS实现Bubble提示框的两种方法
  3. mouseover/out和mouseenter/leave的区别及用法
  4. Linux基础(9)--延时与时间
  5. string类的构造函数,拷贝构造函数,析构函数和赋值函数
  6. 机器学习实战8-sklearn降维(PCA/LLE)
  7. php面试编程题_一位资深php程序员在北京的面试30个题目
  8. root用户连接mysql数据库出错 1045 access denied for user 'root'@'localhost' using password yes
  9. mysql中的基本数据类型_mysql基本数据类型
  10. linux设置temview密码,使用64位系统安装Teamviewer,但出现依赖性错误