2021SC@SDUSC
原功能是寻找特定人物出现的片段,现在进行了拓展,可以进行指定场景下人物的寻找。主要思路是用户上传一个场景照片,对关键帧生成的视频进行特征提取与上传的照片的特征向量进行相似度的计算,来进行匹配,阈值设置为0.81,可以用来选择出目标人物在特定场景出现的视频片段。
一.使用的库
import pandas as pd
import torch as t
import cv2
import numpy as np
import os
import h5py
import argparse
from torchvision.models import googlenet
二.视频特征读取
def H5Filepocess():
h5_file_path_dir = '/opt/data/private/xuyunyang/EasyCut/' + args.ID + '/' + args.ID_VideoName + '/SceneFeature'
dirs = os.listdir(h5_file_path_dir)
for file in dirs:
h5_file_path = h5_file_path_dir + '/' + file
h5 = h5py.File(h5_file_path, 'r')
data = h5['video_1']['features'][...]
h5FileName_feature[h5_file_path] = data
三.照片特征提取
def _extract_feature(path):
frame = cv2.imread(path)
# 改变图像的颜色空间
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 对图片进行缩放
frame = cv2.resize(frame, (224, 224))
EF = [frame[:, :, 0], frame[:, :, 1], frame[:, :, 2]]
EF = np.array(EF)
frameTen = t.from_numpy(EF).unsqueeze(dim=0).cuda().float()
google = googlenet(pretrained=True)
google.float()
google.cuda()
google.eval()
res_pool5 = google(frameTen)
frame_feat = res_pool5.cpu().data.numpy().flatten()
return frame_feat
四.相似度计算
这里设置阈值为0.81
def CalculateDistance(path_dir):
path=path_dir+'/'+os.listdir(path_dir)[0]
distance = dict()
p=_extract_feature(path)
for i in h5FileName_feature.keys():
print('i:',i)
B = h5FileName_feature[i]
b = np.average(B, axis=0)
# cosin相似度(余弦相似度)方法:把图片表示成一个向量,通过计算向量之间的余弦距离来表征两张图片的相似度。
p_norm = np.linalg.norm(p)
b_norm = np.linalg.norm(b)
cosin = np.dot(p, b) / (p_norm * b_norm)
distance[i.split('.')[0]+'.mp4'] = cosin
for i in distance.keys():
if distance[i]>0.99:
distance[i]=1
else:
distance[i] = 0
print(distance)
效果:
视频-人物-场景对应关系的结果生成。