项目实训(十二)---视频中场景约束

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)

效果:

视频-人物-场景对应关系的结果生成。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值