开源项目地址:https://github.com/andrefaraujo/videosearch
1、终端模式下切换到root身份:sudo -s -H
查看IP:ifconfig -a
2、Opencv可以直接从库中安装 (选择的是阿里云的源):
sudo apt-get install libopencv-dev python-opencv
3、Ubuntu16.04下安装FFmpeg:
sudo apt-get install ffmpeg
如果提示错误 : E: 软件包 ffmpeg 没有可供安装的候选者
参考:https://blog.csdn.net/weixin_37251044/article/details/78380303
独立安装时,bash: ./configure: 权限不够
给文件加上可执行权限: chmod +x configure
4、ubuntu 安装 pkg-config
sudo apt-get install pkg-config
5、进入目录:cd /usr/lib
新建文件夹:mkdir videosearch
rm -rf 非空目录名 (删除一个包含文件的文件夹)
6、克隆资源库:
git clone https://github.com/andrefaraujo/videosearch.git
此时提示git未安装,则安装:apt install git
不能访问的话,单独下载然后复制进来:
移动一个文件夹到另一个文件夹下:sudo mv 文件名 目标文件夹路径
复制一个文件夹到另一个文件夹下:sudo cp -r 文件名 目标文件夹路径 (-r 就是递归的意思,删除时 也同样这么加-r)
复制一个文件到另一个路径下:sudo cp 文件路径/文件名 目标文件夹路径
sudo cp -r videosearch-master.zip /usr/lib/
然后解压改名字
unzip videosearch-master.zip
mv videosearch-master videosearch
7、建立VLFET库(计算机视觉库)
cd videosearch/common/vlfeat-0.9.18/
make
8、建立YAEL库(图像检索库)
安装之前提示,要安装swig:
sudo apt-get install swig
安装 g++:
sudo apt-get install g++
g++ -version
安装BLAS和LAPACK(https://blog.csdn.net/papageno_xue/article/details/79955599)
sudo apt-get install libblas-dev checkinstall
sudo apt-get install libblas-doc checkinstall
sudo apt-get install liblapack-dev checkinstall
sudo apt-get install liblapack-doc checkinstall
cd /usr/lib/videosearch/common/yael_v260_modif/
./configure.sh
cd yael
make
如果make时显示:yael_wrap.c:125:20: fatal error: Python.h: 没有那个文件或目录
那么需要安装python-dev这个包:
sudo apt-get install python-dev
9、给视频数据库中的视频提取关键帧
cd /usr/lib/videosearch/indexer/keyframes
./run_keyframe_extraction_test.sh
数据库视频中提取关键帧,首先根据“视频列表.txt”文档获取包含视频路径、视频文件名及视频后缀的列表,然后遍历视频数据库列表,对每个视频进行获取关键帧操作,然后把关键帧的列表记录文件和关键帧的图片分别以txt文档和jpg图片格式存放。
10、建立镜头边界检测器并且给数据库中的视频检测视频边界
cd /usr/lib/videosearch/indexer/shot_detector
make
./run_shot_detector_test.sh
建立镜头边界检测器,提取镜头边界用于测试数据库视频。首先根据上一步,提取视频关键帧后,产生视频列表文档,记录每个视频产生的关键帧,然后为每个视频提取视频检测边界。
11、建立SIFT(图像关键点)提取器并且给数据库中的每个关键帧提取SIFT
cd /usr/lib/videosearch/indexer/local_descriptors/
make
./run_sift_extraction_test.sh
首先获取上面步骤产生的关键帧列表keyframes.txt,并设置相应的线程数量threads。Threads个线程,同时对keyframes.txt里面的关键帧所记录的图片遍历,并在每个视频文件生成关键帧的文件夹下生成每张图片对应的SIFT文件。
算法描述
thread,keyframes.txt; |
keyframeslist=read(keyframes.txt); |
for(int i=0;i<thread;i++){ |
thread(i){ |
keyframeimage=read(keyframe(j).jpg) |
sift(keyframeimage) |
output(keyframe(j).siftb) |
} |
} |
编译make的时候出现问题:/usr/bin/ld:extract.o:undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
62行报错,在62行分号之前添加-lpthread
12、建立全局描述子提取器
cd /usr/lib/videosearch/indexer/global_descriptors/
make
构建全局描述符提取器,并提取每个帧、镜头和场景的全局描述符。
首先,为每一个视频剪辑提取基于框架的全局描述符,然后把所有视频的全局描述存放到索引文件中。
算法描述
keyframes.txt; |
keyframeslist=read(keyframes.txt); |
for videoitem in keyframeslist: |
GDS(i)=GD(videoitem) |
output(GDS(i).sift_scfv_idx_k512)//生成单个视频二进制全局描述 output(global_index.sift_scfv_idx_k512)//生成全局描述 |
13、提取查询图片的SIFT
cd /usr/lib/videosearch/indexer/local_descriptors/
./run_sift_extraction_test_query.sh
# Optional: extract global descriptors
cd $mypath/videosearch/indexer/global_descriptors/
./run_query_index_test.sh
为查询图像提取本地描述符(以及可选的全局描述符)(在运行retriever之前需要这样做,这是下一步)。
首先获取记录查询图片的txt文档获取图片列表,为每张图片生成对应的SIFT文件,并输出到对应文件夹中。
算法描述 |
querylist.txt;//查询图片列表所在文件 threads;//线程数量 |
queryimagelist=read(querylist.txt;);//获取查询图片列表 |
for queryimage in queryimagelist: |
output(queryimage.siftb)//生成二进制SIFT文件 |
14、建立检索器
构建检索器并为基于帧、镜头和场景的索引运行。
一是,可以使用基于框架的全局描述符检索,也可以使用基于框架的全局描述符检索,使用预先计算的查询全局描述符。
算法 | |
frame_db_list.txt | //视频库中所有关键帧列表文件 |
query_list.txt | //需要查询图片列表文件 |
frame_db_list=read(frame_db_list.txt); | |
query_list=read(query_list.txt); | |
for queryitem in query_list: | |
for framedbitem in frame_db_list: | |
if(queryitem ==framedbitem) | |
output(framedbitem) | //输出满足相似度的图片编号 |
二是,使用基于shot的全局描述符(LOC模式)检索。
三是,使用基于shot的全局描述符(INDEP模式)检索。
15、精准度和精准度