视频场景切换检测(镜头边界检测、镜头分割)
超链接:深度学习工作常用方法汇总,矩阵维度变化、图片、视频等操作,包含(torch、numpy、opencv等)
一、现有开源方案
深度学习算法
1. TransNetV2
github链接
论文链接
结论:
这个算法通过测试看,准确度还是很高的,偶尔检测错误(镜头过渡切换),但是因为输入的数据是100帧,那么此算法只能是跑离线视频,无法在实时流中使用。
简介:
TransNetV2 算法输入是一个视频,模型会对视频每一帧压缩到统一的小尺寸48x27x3,每隔100帧作为一个片段(但只取中间50帧的结果,前后25帧类似于overlap)输入神经网络得到每一帧是否是边界帧的概率,以此计算完整段视频后,大于阈值(默认是0.5)的则判定为镜头边界帧。
作者提供了Tensorflow2.x的训练代码,torch只提供了predict代码。
传统算法
1. Pysencedetect
Pysencedetect中提供的也是处理视频的脚本以及命令行,可以自己把识别算法提出来,改成处理实时流的。
由于传统算法准确率比较低,而Transnetv2准确率够,但不能进行实时流的识别,所有个人进行了模型搭建,以实现对实时流的镜头切换检测。
软件
1. 万兴喵影(PC端)
这个软件提供的场景检测效果,准确率还是很高的,使用也挺方便,而且处理时软件可以进行GPU加速。
二、个人算法
GitHub链接:待上传
视频效果:见B站
注意看视频的左上角,当视频切换时,会出现‘Scene switching’的字样,速度太快,注意看🤣
效果:
本算法使用 分类模型 思想进行实现,直接分类虽然简单,但是最终效果很不错。
1. 数据集
ClipShots dataset 数据集
本算法只使用了ClipShots 这一个数据集进行训练。
2. 算法方案
最终方案:
将当前帧同上3帧图片同当前帧图片再channel维度进行拼接([3, 224, 224] + [3, 224, 224] + [3, 224, 224] + [3, 224, 224] = [12, 224, 224]),然后使用resnet50模型进行分类,最后发现效果还是很不错的,准确率同Transnetv2相比差不了多少,而我们基本能实现实时检测。
实现过程中的不同测试方案:
1. 分类模型backbone:resnet18、resnet50、resnet101、CSPdarknet53
2. 图片大小:(112, 112)、(224, 224)
3. 前后帧的数量:2帧、4帧、6帧
4. 灰度图(3通道图片转为单通道图片,再合并)
5. 孪生神经网络
根据以上方案总共做了不同的几种交叉测试,结论如下:
1. backbone部分,resnet18模型效果比较差,resnet50、resnet101、CSPdarknet53这三个模型的效果差不多,基本上分不出高低来。
2. 图片大小,(112,112)大小的图片准确率下降比较多,(224, 224)大小的准确率比较高
3. 前后帧数量,要是想要达到实时,最好的就是2帧(上一帧 + 当前帧)图片输入到模型中,但是通过测试发现,只传入2帧画面,检测效果会比较差,而传入6帧画面,准确率也并没有提高很高,所以4帧相对来说是最合适的。
4. 灰度图, 做这个测试主要是发现在综艺节目中,灯光会瞬间变化(蓝光 — 红光),容易造成误检,原本想通过灰度图,降低这种情况的误检,但是效果并不理想,并不能减少此情况的误检(同3通道的数据相比,是否降低准去率,没有准确测试,目测效果差不多)
5. 孪生神经网络, 之所以构建孪生网络,是因为想的是,进行镜头切换检测的本质是进行两张图片的相似度对比,当两张图片的相似度比较高的时候,代表是同一镜头,而相似度比较低的时候代表镜头进行了切换,但通过实际测试发现,效果并不理想😂,所以就换成了直接分类(不过我觉得大概率是自己搭建的模型有问题)。
通过以上的测试,最终确定 resnet50/CSPdarknet53 + (224, 224) + 4帧 + 3通道的方案。
总结:
1. 我们最终确定的是4张图片一起进入到模型中,也就是进行跳转的这一帧画面,我们有3次机会去进行检测识别,此方法能够提高准确率,而对实时的影响也很小,最多延迟3帧识别。
2. Transnetv2中是将图片缩放到了 48x27大小,我们只能到224x224大小,应该是因为它是连续100帧,能够提取到的前后帧的信息更多一些,我们只有4帧,信息太少造成的。
3. 当镜头进行过渡切换的时候,有时候会检测不出来,可能是由数据集造成的,ClipShots数据集中提供了一些过渡的数据集,但是因为持续时间太长,无法放入到模型里训练。