进入主题之前,先聊聊计算机视觉。
计算机视觉是指利用摄像头和电脑识别、跟踪和测量目标,并进行图像处理,使其适合人眼观察或仪器检测。作为一个科学学科,计算机视觉模拟生物视觉,旨在实现图像和视频的“识别”和“理解”。
计算机视觉中的“理解”任务是试图让机器能够像人类一样理解和解释图像或视频,主要涉及到对图像或视频的测量、检测和定位。
计算机视觉通过“理解”和“识别”,模仿人类视觉系统的能力,以便能够理解和解释我们环境中的视觉信息,此能力亦使其成为许多行业和应用的关键技术。
计算机视觉领域已形成相对成熟的核心技术,催生出完整的产业链,渗透到了国民经济和居民生活的方方面面。本文所谈滤帧技术是此领域的核心技术之一,通过该技术实现图像帧的筛选与过滤,目前普遍应用于视频的识别与理解。
基于视频的应用已非常广泛,特别是在公共安全方面,公安系统的”天网”即非常有代表性,假如当时现场有一套密集人群分析系统,首尔梨泰院的踩踏事件就不会发生。(可以通过对区域内单位面积人员数量进行分析)
上图所示为山火监控,其实现的逻辑是通过摄像头拍摄视频完成输入,处理时将视频以时间为单位截成图像;摄像头后端通过图像识别技术来判断是否发生山火。由于山火是低频率事件,通过滤帧技术过滤重复图像,实现山火监控的同时,可节省大量计算资源。
滤帧技术的本质是通过选择或排除特定的图像帧来优化视频处理或分析任务。这种技术可以根据各种因素来筛选图像帧,包括但不限于:图像内容、场景变化程度等。滤帧技术的主要目标通常是减少需要处理的图像帧数据量,提高处理速度,以及提高后续任务(如物体检测、追踪或行为识别)的精度。滤帧技术可以看作是一种预处理步骤。
当前业界针对滤帧技术的主要诉求是根据应用场景的需要,选择关键图像帧,减少图像帧数,提取重要信息。滤帧技术的需求是如何产生的呢?
视频实际上就是一系列的图像帧(或称为“帧”),它们以特定的速率(通常是每秒24帧、30帧或60帧)连续播放。每一帧都是静态的图像,而当这些帧以足够快的速度连续播放时,由于人眼的视觉暂留效应,我们会感觉到图像在移动,就形成了动态的视频。
实际应用中,视频内容在一段时间内没有变化,视频的图像帧将出现大量的重复,这是一个非常普遍的现象。因此,过滤重复内容的图像帧,在视频识别与理解过程中显得尤为必要。
滤帧技术是如何被应用的呢?
如上图所示, “视频截帧成图像帧——图像帧筛选——筛选好的图像帧进行预测和识别”构成视频识别与理解的“通常链路”,无论是识别、测量、检测还是定位,基本上都是基于该链路实现。滤帧技术在视频截帧成图像之后,主要承担了图像帧筛选。大量的实时监控场景和海量的视频数据,使得图像帧筛选成为了不可或缺的环节。
滤帧的价值在于,通过滤帧技术的预处理和筛选,可以从视频流中提取出最有用的图像帧,以满足对应的需求,同时提高效率、节省计算资源、节省存储空间。这在实时视频监控、视频摘要、视频压缩、视频索引和快速浏览等应用中很有用,对滤帧技术的探讨和研究具有重要意义。
针对滤帧技术的诉求主要取决于具体应用场景和需求。不同的技术和算法可用于满足不同的目标,以下总结滤帧技术的5种常用的实现方法:
帧间差分法:该技术通过比较连续帧之间的像素差异来检测图像的内容变化。通过计算当前帧与前一帧之间的差异,可以获得图像内容的变化情况。这对于剔除冗余帧图像、剔除重复帧图像和实现最优帧图像筛选非常有用。
光流估计法:光流估计是一种通过分析图像中的像素运动模式来获取运动信息的技术。具体算法包括基于亮度约束的光流方法(如Lucas-Kanade光流)、基于匹配的光流方法(如基于相关性的光流)和基于能量优化的光流方法(如Horn-Schunck光流、TV-L1光流)等。通过计算相邻帧之间的光流向量,可以获得图像中的运动信息。这对于检测和筛选具有显著运动的帧非常有用。
背景建模法:通过对视频序列进行背景分析和理解,可以识别出重要的背景变化和关键事件。背常用的算法包括高斯混合模型、自适应背景模型、基于梯度的背景建模和基于学习的背景建模。这些算法通过建立背景模型,利用像素值、梯度等信息来识别前景对象。基于背景分析的滤帧方法可以根据场景的变化情况选择关键帧。
目标检测算法:利用目标检测算法,可以识别视频中的特定目标或关键物体。通过选择包含特定目标的帧作为关键帧,可以提取出重要的内容。算法具体实现包括基于深度学习的目标检测算法(如Faster R-CNN、YOLO、SSD等)和基于传统特征的目标检测算法(如Haar特征和HOG特征结合的级联分类器)等。
运动分析法:通过分析视频序列中的运动模式和变化,可以选择具有显著运动的帧作为关键帧。常见的支持算法有运动向量分析、运动边缘检测和运动分割。运动向量分析计算像素的位移,运动边缘检测捕捉运动物体的边缘,运动分割将像素划分为运动和静止部分。这些算法可以根据应用需求选择关键帧,提取视频序列中的显著运动信息。
上述滤帧技术可以单独应用或结合使用,具体取决于应用场景和需求。根据实际情况,还可以使用其他滤波技术或自定义算法来实现特定的滤帧效果。
场景案例:某街道的占道经营实时监控
场景分析:在该场景下,需通过摄像头实时监控指定街道位置是否有小摊贩在街道上违规占道经营。该街道在下午6点至次日凌晨2点这8小时的时间段,经常出现占道经营的情况。然而,在凌晨2点到当天下午6点之间的这16小时之间,街道占道经营非常少。
技术分析:典型的视频分析类型应用,滤帧的诉求是最优帧筛,即剔除重复的截帧图像和冗余的截帧图像,筛选出图像内容有变化的截帧图像,用于识别是否有小摊贩占道经营,可选择帧间差分技术。
数据准备:选取该街道其中一路摄像头,选取2天的监控视频数据。
帧间差分技术流程引入如上图所示,图中灰色背景框内的流程即为帧间差分,帧间差分的实现,主要分为四个核心步骤:
第一步:计算前后帧差分图
首先,针对前后两帧的图像进行作差。计算方法是将当前帧与上一帧之间的绝对差异值计算出来,生成一幅差分图。这可以通过opencv库中的主函数Absdiff实现。openCV是是由Intel公司于1999年开发并在2000年首次发布的,后来由Willow Garage和Itseez等公司提供支持和贡献,这是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法的实现。差分图有助于突出图像中发生变化的区域,如下图,将差分图像转换为灰度图像。第一帧图像作为背景,没有人,第二帧图像有人出现,通过运算,得到了占道经营的整体轮廓:
第二步:提取差分图的直方图
其次,针对差分图,需要提取其直方图。直方图是一种表达图像中灰度分布的方法。它的 x 轴表示图像,y 轴表示具有同一灰度值的像素点数目。通过直方图,可以对整幅图像的灰度分布有一个整体的了解。这可以通过opencv库中主函数calcHist实现。针对上述的差分图,会进行提取直方图,大部分像素值(即差值)接近于0,因此产生的差值直方图具有更大的峰值,如下图:
第三步:计算直方图的均方根值
计算直方图的均方根值(RMS),以代表两张图之间的差异值。均方根值(RMS)是一种用来衡量信号幅值的度量方法,其计算过程包括先平方和,再求平均值,然后开方。RMS 值可以有效地描述图像差异程度,其计算公式如下:
在得到的计算结果中,RMS值越大,表示两张图像的差异程度越大。
第四步:比较阈值和差异值
最后,需要将计算出的差异值(RMS值)与预设的阈值进行比较。如果差异值大于阈值,则认为前后图像发生了变化;如果差异值小于阈值,则认为图像无变化。阈值可以根据不同场景的敏感度进行人工干预设置。阈值越小,对于图像变化(如光线、细小动作等)越敏感。
本例选用的是中敏感度识别,阈值为0.3
敏感度 |
阈值 |
高 |
0.5 |
中 |
0.3 |
低 |
0.1 |
注:具体阈值可根据事件在视频画面中的占比等实际场景情况设计阈值
案例占道经营监测中,有1/3的时间存在明显的变化需要进行实时计算和分析。帧间差分技术过滤无变化的图像帧的比例为2/3。以每秒截取一帧图像的频率计算,一天的总帧数为24小时 * 3600秒/小时 = 86,400帧。根据上述比例,经过智能滤帧后,每天会被过滤掉的图像帧数为86,400帧 * (2/3) = 57,600帧。与全量参与识别计算相比,滤掉了大量的无效计算,提升了监测事件(占道经营)被发现的时效性,同时也节省了大约2/3的算力资源。
通过帧间差分技术实现的智能滤帧,可以提高视频分析的效率,还能大大节省算力,这项技术对于需要实时响应和持续监测的应用场景具有重要的价值。