1、引言 家中超市安装了监控,但发生了东西不翼而飞的情况,且不知具体的时间。于是盯着录像,翻看着一个又一个的录像,希望能找到相关的画面,了解到底是怎么回事。但看了4个小时的录像后我放弃了,这种人工方式很低效,且容易由于眼睛疲劳错漏了录像的内容。于是在网上一番搜索,希望能够找到可以搜索或过滤的工具,但没找到这样的工具。问了公司几位监控产线的同事,也没有可使用的工具。随着没有找到工具后,事情就这样不了了之。可是东西又发现有不翼而飞的情况了,一番人工排查录像后还是没找到原因。 对于这种情况,作为一个开发人员,就萌发了自己开发一个可以对视频内容进行过滤或搜索的工具。且现在越来越多的监控/录像设备,很多时候需要翻看录像,相信这样的工具应该还是很有市场的。 2、实现原理 (1)Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相似的图片。 打开Google图片搜索页面:
点击使用上传一张angelababy原图:
点击搜索后,Google将会找出与之相似的图片,图片相似度越高就越排在前面。如:
这种技术的原理是什么?计算机怎么知道两张图片相似呢?
根 据Neal Krawetz博士的解释,实现相似图片搜素的关键技术叫做"感知哈希算法"(Perceptualhash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同图片的指纹。结果越接近,就说明图片越相 似。
(2)参考Google的图片搜索原理,若能将视频中出现人的时间点,使用“感知哈希算法”生成指纹字符串,然后通过指纹字符串即可搜索到出现人的视频时间点。进一步,可搜索指定人员出现的视频时间点,或视频中出现了哪些人等。
3、设计思路 说干就干,利用业余时间,经过在网上一番的搜索和学习。形成了以下的设计思路: (1)从视频文件中截取视频图片 由 于视频比较大,不利于内容搜索,故将视频转化为一张张的图片。一般视频的帧率都比较高(>60fps),若按帧截取图片,每秒截取的图片较多,且占 用硬盘空间,同时,影响处理和搜索的性能。由于1秒内,视频内容变化不会太大,考虑每秒截取的图片为5~10张。处理过程中记录每张截取的图片在视频中对 应的位置,方便后续人工查看及确认。 (2)从截取的视频图片中进行人脸识别 为了视频内容搜索,需要从截取的视频图片中进行人脸识别,并将识别出来的人脸,通过“感知哈希算法”生成指纹字符串。需要注意的是视频图片可能识别出多个人脸,需一一识别,同时,后续可考虑实现物品等的识别。 (3)搜索 上传含人脸的图片,对该图片进行人脸识别,并根据“感知哈希算法”生成指纹字符串,比对该指纹字符串与视频图片生成的指纹,即可找到指定人员在视频中可能出现的时间点。 4、关于“感知哈希算法”(来自百度百科)
感知哈希算法(以下简称PHA)是哈希算法的一类,主要用来做相似图片的搜索工作。
PHA是一类比较哈希方法的统称。图片所包含的特征被用来生成一组指纹(不过它不是唯一的),而这些指纹是可以进行比较的。
下面是简单的步骤,来说明对图像进行PHA的运算过程:
第一步,缩小尺寸。
最快速的去除高频和细节,只保留结构明暗的方法就是缩小尺寸。
将图片缩小到8x8的尺寸,总共64个像素。摒弃不同尺寸、比例带来的图片差异。
第二步,简化色彩。
将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。
第三步,计算平均值。
计算所有64个像素的灰度平均值。
第四步,比较像素的灰度。
算法的精髓,简单、有趣,又充满深意。
将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。
第五步,计算哈希值。
将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了(例如,自左到右、自顶向下、big-endian)。
得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。在理论上,这等同于计算Hammingdistance)。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。
这个算法非常好,无论你改变图片的高宽、亮度甚至颜色,都不会改变哈希值。最关键的是速度极快!
(陈格生) |