<embed src="//music.163.com/style/swf/widget.swf?sid=466844094&type=2&auto=1&width=320&height=66" width="340" height="86" allowNetworking="all"></embed>
使用Homebrew在OSX上安装boost和boost-python
作者:Adrian Rosebrock于2015年4月27日在图书馆,资源
我真的,真的希望有人发现这个资源很有用。我过去几个月浪费的时间(被动)试图通过Homebrew在我的OSX机器上安装和升级python,这简直令人难以忍受。
别误会我的意思,我喜欢自制软件。如果你在OSX机器上并且没有使用Homebrew,那么我建议你不要再阅读这篇文章并立即安装它。
无论如何,就像我说的那样,我希望这篇文章可以节省其他人一些时间和麻烦。虽然这篇文章并不完全致力于计算机视觉,但如果您使用Python和OpenCV开发基于计算机视觉的应用程序,它仍然非常重要。
诸如Spotify的用于近似最近邻搜索的Annoy之类的包在基于内容的图像检索(CBIR)/图像搜索引擎空间中具有直接应用。
2015年5月4日更新:Erik Bernhardsson发布了对Annoy的更新,消除了来自Annoy的Boost和Boost.Python的依赖性。你现在可以使用pip:pip install annoy简单地安装Annoy而不需要任何额外的依赖。
dlib等库提供了Python绑定,因此您可以利用Python shell中dlib的强大功能。
Annoy和dlib只是需要使用boost的两个包的例子(如果你想要Python绑定,还有boost-python)。
无论如何,让我们继续开始这个教程 - 我绝对浪费了我的时间来处理这个问题,我也不想浪费你的任何一个!
什么是Homebrew?
Homebrew是“缺少OSX的软件包管理器”。它使得安装和管理默认Apple安装未安装的软件包变得轻而易举,就像Debian apt-get一样。
注意:将Homebrew与apt-get进行比较并不完全公平,但如果这是您第一次听到Homebrew,那么这种比较就足够了。
什么是boost和boost-python?
Boost是经过同行评审(即非常高质量)的C ++库的集合,可帮助程序员和开发人员不再陷入重新发明轮子的境地。 Boost提供了线性代数,多线程,基本图像处理和单元测试的实现,仅举几例。
同样,这些库经过同行评审,质量非常高。大量的C ++应用程序,特别是在科学领域,以某种方式依赖于Boost库。
我们还有boost-python,它提供了C ++和Python编程语言之间的互操作性。
为什么这有用?
好吧,假设您正在实现近似最近邻算法(如Spotify's Annoy),并且您希望提供纯粹的,普通的Python支持。
但是,您希望将最后一点内存和CPU性能从库中提取出来,因此您决定在C ++中实现性能关键部分。
为此,您将使用boost在C ++中编写这些关键任务 - 然后使用boost-python与Python编程语言进行交互。
事实上,这正是Annoy包的功能。虽然软件包是可以安装pip的,但软件包需要boost和boost-python才能编译和安装。
使用Homebrew在OSX上安装boost和boost-python
现在我们已经有了一些基本的术语,让我们继续安装我们的软件包。
第1步:安装Homebrew
安装Homebrew并不容易。
只需前往Homebrew主页,将以下代码复制并粘贴到您的终端中:
1
$ ruby -e“$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
注意:此博客文章是在2015年1月撰写的。绝对可以访问Homebrew主页并使用Homebrew社区提供的最新安装脚本。
第2步:更新Homebrew
现在您已经安装了Homebrew,您需要更新它并获取最新的包(即“公式”)定义。这些公式只是有关如何安装给定库或包的说明。
要更新Homebrew,只需执行以下操作:
1
$brew update
第3步:安装Python
使用系统Python作为主要解释器是不好的形式。如果您打算使用virtualenv,尤其如此。
在我们继续之前,让我们通过brew安装Python:
使用HomebrewShell在OSX上安装boost和boost-python
1
$ brew install python
第4步:安装boost
到现在为止还挺好。但是现在是时候安装boost了。
这是你真正需要开始关注的地方。
要安装boost,请执行以下命令:
使用HomebrewShell在OSX上安装boost和boost-python
1
$brew install boost --with-python
你看到--with-python旗帜?
是的,不要忘记 - 这很重要。
在我的例子中,我认为在给定--with-python的情况下已经安装了boost-python
显然情况并非如此。 您还需要显式安装boost-python。 否则,当您尝试从Python中调用期望查找boost绑定的包时,您将会遇到可怕的段错误。
此外,您可能希望在增强下载,编译和安装的同时进行一些不错的步行。这是一个大型图书馆,如果你热衷于在整个工作日期间优化你的时间(就像我一样),那么我强烈建议你上下文切换并完成其他工作。
Step 5: Installing boost-python
boost安装完毕,类似的,我们可以安装boost-python:
1 $ brew install boost-python
boost-python软件包的安装速度应该比boost更快,但是你仍然可能想要自己做一杯咖啡,特别是如果你的系统很慢。
Step 6: 确认boost和boost-python已安装
确保安装了boost和boost-python:
1 $ brew list | grep 'boost'
2 boost
3 boost-python
正如您从终端输出中看到的那样,boost和boost-python都已成功安装(前提是您没有从上述步骤中获得任何错误)。
已经在使用Python + virtualenv了吗?继续阅读。
哦,你以为我们完成了?
我也是。孩子,这是一个错误。
因为猜什么?如果你已经安装了Python并且正在使用virtualenv(在我的情况下,还有virtualenvwrapper),你还有一些工作要做。
注意:如果您尚未使用virtualenv和virtualenvwrapper来管理Python包,那么您应该仔细研究这个问题。它让你的生活变得更加轻松 - 相信我。
新的virtualenvs:
如果你正在创造一个新的virtualenv,你会很高兴。无需额外的工作,一切都将顺利开箱即用。
现有的virtualenvs:
所以,让我告诉你一些你已经知道的事情:当我们构建一个虚拟环境时,我们的Python可执行文件以及相关的库包括,并且站点包被克隆并隔离到它们自己的独立环境中。
让我告诉你一些你可能不知道的事情:如果你在编译和安装boost和boost-python之前已经有了virtualenv设置(就像我一样),那么你将无法访问你的boost绑定。
那么解决这个问题的最佳方法是什么?
老实说,我不确定“最好”的方式是什么。必须有比我提议的更优雅的方法。但以下是我解决的解决办法:
- 为virtualenv生成了requirements.txt
- 停用并删除了我的virtualenv
- 重新创造了我的virtualenv
- pip install -r requirements.txt 完成这个步骤
(在此团子酱查阅了anaconda下安装虚拟环境的步骤https://blog.csdn.net/suelai/article/details/80538599,以及anaconda安装好后需要进行的环境配置https://blog.csdn.net/lq_547762983/article/details/81003528)
在您执行这些步骤之后,您的新virtualenv将具有boost-python绑定。希望你不会浪费尽可能多的时间。
一个annoy的例子
现在我们已经安装了boost和boost-python,让我们使用Annoy包将它们用于测试驱动器。
2015年5月4日更新:正如我在本文顶部提到的,Erik Bernhardsson已经发布了对Annoy的更新,它消除了来自Annoy的Boost和Boost.Python的依赖性。您现在可以使用pip简单地安装Annoy,而无需安装Boost或Boost.Python。
让我们首先使用virtualenvwrapper创建virtualenv:
1 2 3 4 | $ mkvirtualenv annoy ... $ pip install numpy annoy ... |
现在我们已经安装了包,让我们用128-D创建1000个随机向量。 我们将这些向量传递给Annoy并使用10棵树构建嵌入:
>>>
import numpy as np
>>>
M = np.random.normal(size=(1000, 128))
>>>
from annoy import AnnoyIndex
>>>
ann = AnnoyIndex(128)
>>>
for (i, row) in enumerate(M):
...
ann.add_item(i, row.tolist())
...
>>> ann.build(10)
现在我们创建了嵌入,让我们找到列表中第一个向量的10个(近似)最近邻居:
1 >>> ann.get_nns_by_item(0, 10)
2 [0, 75, 934, 148, 506, 915, 392, 849, 602, 95]
我们还可以找到尚未成为索引的一部分的最近邻居:
1 >>> ann.get_nns_by_vector(np.random.normal(size=(128,)).tolist(), 10)
2 [176, 594, 742, 215, 478, 903, 516, 413, 484, 480]
那么如果你试图在没有安装boost和boost-python的情况下执行这段代码会怎么样?
在get_nns_by_item和get_nns_by_vector函数期间,您的代码会出现段错误。如果您使用的是dlib,那么在导入过程中会出现段错误(segfault)。绝对要记住一些事情。如果你在这些函数中是段错误的,那么你的boost和boost-python安装就会变得很糟糕。
摘要
在这篇博文中,我回顾了如何使用Homebrew在OSX上安装boost和boost-python。就个人而言,我在几个月的时间内被动地处理这个问题浪费了大量的时间 - 本文的目标是(希望)帮助您节省时间并避免任何心痛和挫折。