我们在服务器中专门建立了一个文件夹用于保存用户上传的视频、视频处理的中间结果以及最终果,结构如下:(每个用户都会有一个以ID命名的文件夹,这里我们创建的文件夹仅仅用于测试)
——EasyCut
——ID
——ID_VideoName
——Original_Video //原视频地址
——SceneSeg_Video //场景划分结果
——Key_Frame //视频摘要结果
——Resources //人脸检测和场景约束结果
——SceneFeature //视频特征文件
——SceneSimilar //场景视频聚类结果
LGSS框架关于场景划分处理的原视频的地址、中间结果的保存地址以及划分结果的保存地址都是固定的,如果想要实际运用起来,需要将其设置为参数。
1、pre/ShotDetection/shotdetect.py
(1)原视频地址:运行时由 --video_path 指定:
(2)帧(frame)和镜头(shot)相关文件的保存目录:运行时由 --save_data_root_path 指定:
shot_stats 文件保存和读取地址:
shot_keyf 文件保存地址:
shot_txt 文件保存地址:
2、lgss/config/demo.py
data_root 、shot_frm_path 、video_name:
3、lgss/run.py
config/demo 中的 data_root、shot_frm_path、video_name 由运行时的参数指定:
4、lgss/utilis/dataset_utilis.py:
最终划分结果的保存地址(即 scene_video):
shot_txt 文件的读取也在该程序中:
5、lgss/src/data/demo.py
通过切分出的镜头(shot)进行最后的场景划分时(即运行 lgss/run.py)需要读取 shot_keyf 文件:
6、lgss/utilis目录下的 iou.py 和 recall_time.py 中相关中间结果文件的地址也需要进行相应修改
测试:
1、运行 shotdetect.py:
python ShotDetection/shotdetect.py --print_result --save_keyf --save_keyf_txt --video_path /opt/data/private/xuyunyang/EasyCut/ID/ID_VideoName/Original_Video/demo.mp4 --save_data_root_path /opt/data/private/xuyunyang/EasyCut/ID/ID_VideoName/SceneSeg_Video
python run.py config/demo.py /opt/data/private/xuyunyang/EasyCut/ID/ID_VideoName demo
运行场景划分、视频摘要、人脸检测算法、特征提取、场景聚类、场景约束等需要多次通过命令行、使用多个参数,为了更方便地在后端使用,需要将这相应的算法连起来,对外提供一个调用接口:
1、执行场景划分、视频摘要、特征提取、人脸检测、场景约束算法:
新建一个接口文件 algorithm_run.py ,使用 subprocess.call ( ) 来执行命令行:
import subprocess
import argparse
from app import start
if __name__ == '__main__':
parser = argparse.ArgumentParser("Single Video ShotDetect")
parser.add_argument('ID')
parser.add_argument('ID_VideoName')
parser.add_argument('video_name')
args = parser.parse_args()
#SceneSeg
path_root='/opt/data/private/xuyunyang/2022419/SceneSeg'
save_path='/opt/data/private/xuyunyang/EasyCut/'+args.ID+'/'+args.ID_VideoName
command1='python '+path_root+'/pre/ShotDetection/shotdetect.py --print_result --save_keyf --save_keyf_txt --video_path '+save_path+'/Original_Video/'+args.video_name+' --save_data_root_path '+save_path+'/SceneSeg_Video'
retcode1=subprocess.call(command1,shell=True)
command2='python '+path_root+'/lgss/run.py '+path_root+'/lgss/config/demo.py '+save_path+' '+args.video_name.split('.')[0]
retcode2=subprocess.call(command2,shell=True)
# key frame
command3='python /opt/data/private/xuyunyang/run.py --ID '+args.ID+' --ID_VideoName '+args.ID_VideoName+' --video_name '+args.video_name
retcode3=subprocess.call(command3,shell=True)
#extract_ sceneFeature
path_root2='/opt/data/private/xuyunyang/2022419/SceneFeatureExtract/'
command4='python '+path_root2+'extract_video_feature.py --ID '+args.ID+' --ID_VideoName '+args.ID_VideoName+' --VideoName '+args.video_name.split('.')[0]
retcode4=subprocess.call(command4,shell=True)
# face detect
start(args.ID,args.ID_VideoName,args.video_name)
#scene_gennerate
command5='python '+path_root2+'scene_gennerate.py --ID '+args.ID+' --ID_VideoName '+args.ID_VideoName
retcode5=subprocess.call(command5,shell=True)
print('END ALL')
2、执行场景划分、视频摘要、特征提取、场景聚类算法:
新建一个接口文件 algorithm2_run.py:
import subprocess
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser("Single Video ShotDetect")
parser.add_argument('ID')
parser.add_argument('ID_VideoName')
parser.add_argument('video_name')
args = parser.parse_args()
#SceneSeg
path_root='/opt/data/private/xuyunyang/2022419/SceneSeg'
save_path='/opt/data/private/xuyunyang/EasyCut/'+args.ID+'/'+args.ID_VideoName
command1='python '+path_root+'/pre/ShotDetection/shotdetect.py --print_result --save_keyf --save_keyf_txt --video_path '+save_path+'/Original_Video/'+args.video_name+' --save_data_root_path '+save_path+'/SceneSeg_Video'
retcode1=subprocess.call(command1,shell=True)
command2='python '+path_root+'/lgss/run.py '+path_root+'/lgss/config/demo.py '+save_path+' '+args.video_name.split('.')[0]
retcode2=subprocess.call(command2,shell=True)
# key frame
command3='python /opt/data/private/xuyunyang/run.py --ID '+args.ID+' --ID_VideoName '+args.ID_VideoName+' --video_name '+args.video_name
retcode3=subprocess.call(command3,shell=True)
#extract_ sceneFeature
path_root2='/opt/data/private/xuyunyang/2022419/SceneFeatureExtract/'
command4='python '+path_root2+'extract_video_feature.py --ID '+args.ID+' --ID_VideoName '+args.ID_VideoName+' --VideoName '+args.video_name.split('.')[0]
retcode4=subprocess.call(command4,shell=True)
#clustering
command5='python '+path_root2+'clustering.py --ID '+args.ID+' --ID_VideoName '+args.ID_VideoName
retcode5=subprocess.call(command5,shell=True)
print('END ALL')