利用python打造你的视频检索引擎


各位广大影迷们,是不是在为自己几十上百G的视频文件而头大呢,又或者是看到了一部动作大片,明明记得自己硬盘上也有,想再次重温一下,却怎么也找不到的悲惨经历呢。

别着急,今天就陪同大家,一起打造一个简单有效的视频检索工具,从此以后,妈妈再也不用担心我找不到自己喜欢看的片片啦!

首先来快速了解一下:

开发工具:PyCharm,Opencv,PHash库,MYSQL以及一些基本的视频流处理方法。通过本篇文章,将会手把手教你打造自己的检索工具。

主要实现过程:

  • 构建视频指纹库

  • 返回相似视频结果

  • 计算哈希距离

  • 提取哈希值

  • 输入查询的视频

 

预备知识:

PHash及汉明距离的计算过程具体如下:

(1)缩小尺寸:将图像缩小到8*8的尺寸,总共64个像素。这一步的作用是去除图像的细节,只保留结构/明暗等基本信息,摒弃不同尺寸/比例带来的图像差异;

(2)简化色彩:将缩小后的图像,转为64级灰度,即所有像素点总共只有64种颜色;

(3)计算平均值:计算所有64个像素的灰度平均值;

(4)比较像素的灰度:将每个像素的灰度,与平均值进行比较,大于或等于平均值记为1,小于平均值记为0;

(5)计算哈希值:将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图像的指纹。组合的次序并不重要,只要保证所有图像都采用同样次序就行了;

(6)得到指纹以后,就可以对比不同的图像,看看64位中有多少位是不一样的。在理论上,这等同于”汉明距离”(Hamming distance,在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数)。

 

小伙伴准备好了吗?接下来正式开启我们的旅程:感性哈希值-如何用Python打造你的第一个视频搜索引擎。

 

 

 

一.构建视频指纹库:

 

(1)视频截取

获取视频帧率FPS(即每秒钟帧数),假设每5秒钟截取视频一帧,转换为视频帧数为5*FPS帧截取一张视频图像。

对于如下视频:假设视频为20秒,帧率为24,按照每5秒的间隔时长(24*5=120帧)进行切分,那么可以得到如下4个视频截图:

利用python打造你的视频检索引擎

接下来看一下我们准备的视频样本:

利用python打造你的视频检索引擎

 

读取视频,每隔10s截取其静态帧,对每一帧提取感知哈希值,并将提取到的所有哈希值进行拼接,然后将每个视频的哈希值存入MYSQL数据库中。

最终建立了视频指纹库,如下图所示:

利用python打造你的视频检索引擎

采用感知哈希值PHash算法,计算每一张图像的图像指纹,对所有视频进行相同操作,按照相同时间间隔截取视频帧,获取指纹,最终保存起来。 

到此,建立了给定视频的指纹库。目前数据库中包含了3个字段,即:id,videoId,PHash

 

二.相似视频查询

 

在上一步中,我们建立起来了给定视频的指纹库,即:一连串不同时间点下的哈希值。接下来,利用同样的方式,输入一个视频,对该视频提取哈希值,然后在构建的视频指纹库中进行查询,从而判断是否存在相似视频。

视频相似度比较中,衡量相似度的一般方式是计算两个特征之间的距离,常用方法有:欧式距离,余弦距离,汉明距离等。此处我们采用计算汉明距离的方法,来比较两个视频的相似程度。

 

首先读取某个视频,并提取该视频的PHash值,接下来,对数据库中的所有视频进行查询,并计算分别计算输入哈希值和数据库中视频哈希值的汉明距离,并对计距离进行排序,提取前20个相似视频的结果,结果如下图所示:

利用python打造你的视频检索引擎

 

 

最终查询到了这么多个视频,哪一个才是我们想要找到的视频呢?在此我们需要定义一个阈值,通过这个阈值对视频相似度的距离进行筛选,只有符合要求的视频才会留下,不符合要求的视频就直接过滤掉。

在此,我们先把距离小于10的视频定义为相同视频,距离在10~20之间的定义为相似视频,一起来看看结果吧。

利用python打造你的视频检索引擎

通过设置阈值,筛选出符合要求的视频。

其中:

第一个字段:id

第二个字段:视频的videoId

第三个字段:视频之间的汉明距离

第四个字段:相似度文字描述

三.总结:

在本文中,我们探讨了如何从头到尾创建一个视频搜索引擎。第一步是选择图像描述符——我们使用感性哈希值作为视频帧的特征描述子,提取每一个视频帧的指纹拼接起来,由此建立我们的视频指纹库。在此基础上,利用汉明距离定义两幅图像之间的“相似性”。计算距离,筛选,最终获得了符合我们预期要求的视频信息。把以上所有的步骤连接在一起,创建了一个相似视频的搜索引擎。