详细了解算法运算过程
环境配置
python=3.x
Pytorch
GPU
tabulate
文件结构
项目地址https://github.com/TorRient/Video-Summarization-Pytorch 可通过git clone项目
create_data
首先第一步是准备数据集,即将视频片段放入dataset中,并启动create_data方法,其中的关键代码是
gen = Generate_Dataset(args.input, args.output)
gen.generate_dataset()
这是利用了utils中generate_dataset方法,是一个生成数据集的过程:将视频转换为帧,特征提取,获得转换点,最后用户总结(用于评估)同时注意输入的参数,这期间可能会报错很多,问题大多集中在环境配置问题和参数输入的对错。
结果
_x_xMr-HKMfVA为测试使用的视频文件,data是测试结果文件(自主命名),
create_split
以json形式创建拆分的代码
结果
train_video_summarisation
训练模型同时找出关键帧,关键代码
def evaluate(model, dataset, test_keys, use_gpu):
with torch.no_grad():
if config.SAVE_RESULTS:
h5_res = h5py.File(os.path.join(config.SAVE_DIR, 'result.h5'), 'w')
for key_idx, key in enumerate(test_keys):
seq = dataset[key]['features'][...]
seq = torch.from_numpy(seq).unsqueeze(0)
if use_gpu: seq = seq.cuda()
probs = model(seq)
probs = probs.data.cpu().squeeze().numpy()
cps = dataset[key]['change_points'][...]
num_frames = dataset[key]['n_frames'][()]
nfps = dataset[key]['n_frame_per_seg'][...].tolist()
positions = dataset[key]['picks'][...]
user_summary = dataset[key]['user_summary'][...]
machine_summary = vsum_tool.generate_summary(probs, cps, num_frames, nfps, positions)
fm, _, _ = vsum_tool.evaluate_summary(machine_summary, user_summary, eval_metric)
fms.append(fm)
if config.SAVE_RESULTS:
h5_res.create_dataset(key + '/score', data=probs)
h5_res.create_dataset(key + '/machine_summary', data=machine_summary)
h5_res.create_dataset(key + '/gtscore', data=dataset[key]['gtscore'][...])
h5_res.create_dataset(key + '/fm', data=fm)
return mean_fm
其中确认是否是关键帧的数据储存在machine_summary中,储存在result.h5中,同时根据此视频训练的model也储存再model文件夹下
结果
video_summary
Pytorch无监督视频摘要代码,视频摘要将保存到文件夹output 关键代码:生成摘要后的短视频并输出
def video2summary(h5_dir,video_dir,output_dir):
if not osp.exists(output_dir):
os.mkdir(output_dir)
h5_res = h5py.File(h5_dir, 'r')
for idx1 in range(len(list(h5_res.keys()))):
key = list(h5_res.keys())[idx1]
summary = h5_res[key]['machine_summary'][...]
video_name = h5_res[key]['video_name'][()].split('/')[-1]
fps = h5_res[key]['fps'][()]
if not os.path.isdir(osp.join(output_dir, video_name)):
os.mkdir(osp.join(output_dir, video_name))
vid_writer = cv2.VideoWriter(
osp.join(output_dir,video_name, args.save_name),
cv2.VideoWriter_fourcc('M','J','P','G'),
fps,
(args.width, args.height),
)
frm2video(video_dir, summary, vid_writer)
vid_writer.release()
h5_res.close()
|