这是有关我们基于CNN的图像检索系统ISEENN构建程序的全面文件。
当我看到(使用)CNN时,可以扩展ISEENN短语。
我们在此处提供一个在线演示,该演示索引Mirflickr 1M数据集。它仅是出于演示目的,并且可能不会总是可用。
该系统由三个主要组成部分组成:
该系统在:
我们系统的框架可以说明为: 
在这一部分中,我将显示系统设置详细信息。
我们的系统建立在许多Linux服务器上。从本质上讲, Iseenn不是分布式系统,而是仅利用图像存储并从多个服务器获取。
这是我们主要实施的配置:
| ID | 操作系统 | 角色 | 内部IP | GPU | 记忆 |
|---|---|---|---|---|---|
| 1 | Ubuntu 14.04 x64 | 前端和检索系统和Mongo服务器 | 192.168.6.232 | K80 x 4 | 64克 |
| 2 | Open Suse 13.2 x64 | 图像服务器 | 192.168.104.244 | K40 x 2 | 64克 |
| 3 | Open Suse Leap 42.1 x64 | 图像服务器 | 192.168.102.200 | GeForce GTX 660 TI | 16G |
可以看出,我们不依赖不同服务器的操作系统。我们选择服务器1作为主服务器,因为它具有相对较高的计算资源。当然,它也可以用作图像服务器。
在下面,我们首先关注服务器1上的配置。
我们将MongoDB v3.4.1用作后端存储数据库。数据库中的内容包括:
feature_id -> image_id )image_id -> image_url )因为APT存储库是MongoDB旧的,所以我们直接下载了二进制文件。
$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1404-3.4.1.tgz
$ tar zxvf mongodb-linux-x86_64-ubuntu1404-3.4.1.tgz
$ sudo cp mongodb-linux-x86_64-ubuntu1404-3.4.1/bin/ * /usr/local/bin要初始化数据库,我们首先为管理员和我们的Image_retRieval数据库创建管理用户。
我们使用Frodenas编写的脚本进行初始化。
# first_run.sh
#! /bin/bash
USER= ${MONGODB_USERNAME :- mongo}
PASS= ${MONGODB_PASSWORD :- $(pwgen -s -1 16)}
DB= ${MONGODB_DBNAME :- admin}
DBPATH=/db/mongo # set your own db_path here
if [ ! -z " $MONGODB_DBNAME " ]
then
ROLE= ${MONGODB_ROLE :- dbOwner}
else
ROLE= ${MONGODB_ROLE :- dbAdminAnyDatabase}
fi
# Start MongoDB service
mongod --dbpath $DBPATH --nojournal &
while ! nc -vz localhost 27017 ; do sleep 1 ; done
# Create User
echo " Creating user: " $USER " ... "
mongo $DB --eval " db.createUser({ user: ' $USER ', pwd: ' $PASS ', roles: [ { role: ' $ROLE ', db: ' $DB ' } ] }); "
# Stop MongoDB service
mongod --dbpath $DBPATH --shutdown
echo " MongoDB User: " $USER " "
echo " MongoDB Password: " $PASS " "
echo " MongoDB Database: " $DB " "
echo " MongoDB Role: " $ROLE " "首先,为管理数据库创建管理用户
$ ./first_run.sh
MongoDB User: " mongo "
MongoDB Password: " xxxxxxxxxxxxx "
MongoDB Database: " admin "
MongoDB Role: " dbAdminAnyDatabase "然后,为image_retrieval数据库创建dbowner用户,
$ export MONGODB_USERNAME=webclient
$ export MONGODB_DBNAME=image_retrieval
$ ./first_run.sh
MongoDB User: " webclient "
MongoDB Password: " xxxxxxxxxxxxx "
MongoDB Database: " image_retrieval "
MongoDB Role: " dbOwner "在这里,我抓住了密码。请记住保存用户信息以备进一步使用。
初始化之后,使用config file /db/mongodb.conf启动蒙哥德服务器
# /db/mongodb.conf
dbpath=/db/mongo/
logpath=/db/mongodb.log
logappend=true
journal=true
auth = true $ mongod --config /db/mongodb.conf现在测试您的数据库
$ mongo
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
> use image_retrieval
switched to db image_retrieval
> db.auth( ' webclient ' , ' xxxxxxxxxxx ' )
1我们使用Python3开发Web服务,并使用Tensorflow Python接口提取CNN功能。
在这一部分中,我们将使用用于Web服务及其MongoDB后端的Django模块配置Python
使用Virtualenv创建独立的Python运行时环境是一种欣喜。
安装virtualenv :
$ sudo pip install virtualenv现在在您的工作区中,创建并输入虚拟环境:
$ virtualenv --no-site-packages -p python3 image_retrieval
$ cd image_retrieval
$ source bin/activate设置Django,MongoEngine,Ski-Image和枕头:
$ pip install django
$ pip install mongoengine
$ pip install scikit-image
$ pip install Pillow然后在网站的指示下设置张量。
现在,我们拥有Python环境(取决于您自己的环境):
$ pip freeze
appdirs==1.4.0
cycler==0.10.0
dask==0.13.0
decorator==4.0.11
Django==1.10.5
matplotlib==2.0.0
mongoengine==0.11.0
networkx==1.11
numpy==1.12.0
olefile==0.44
packaging==16.8
Pillow==4.0.0
protobuf==3.2.0
pymongo==3.4.0
pyparsing==2.1.10
python-dateutil==2.6.0
pytz==2016.10
scikit-image==0.12.3
scipy==0.18.1
six==1.10.0
tensorflow-gpu==0.12.1
toolz==0.8.2让我们开始我们的ISEENN项目:
$ django-admin startproject ISeeNN
$ tree ISeeNN
ISeeNN
├── ISeeNN
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py要使用MongoDB后端,请在ISeeNN/settings.py中修改DATABASE设置:
import mongoengine
...
DATABASES = {
'default' : {
'ENGINE' : '' ,
}
}
_MONGODB_USER = 'webclient'
_MONGODB_PASSWD = 'xxxxxxxxxxxxxx'
_MONGODB_HOST = '192.168.6.232'
_MONGODB_NAME = 'image_retrieval'
_MONGODB_DATABASE_HOST =
'mongodb://%s:%s@%s/%s'
% ( _MONGODB_USER , _MONGODB_PASSWD , _MONGODB_HOST , _MONGODB_NAME )
mongoengine . connect ( _MONGODB_NAME , host = _MONGODB_DATABASE_HOST )并配置TIMEZONE = 'Asia/Shanghai' 。
由于Django对MongoDB的支持较弱,因此我们没有使用此版本的管理组件。因此,让我们在urls.py中评论相关代码
from django . conf . urls import url
# from django.contrib import admin
urlpatterns = [
# url(r'^admin/', admin.site.urls),
]好的!现在通过
./manage.py runserver 8000然后打开浏览器以浏览http://localhost:8000进行测试。
我们的搜索引擎后端与C ++实施,以解决效率。为了调用此后端,我们将C ++代码与Boost Python包装为Python模块。
确保在Python 3支持下安装Boost-dev和Boost-Python-Dev。
对于Ubuntu:
$ sudo apt-get install libboost-dev libboost-python-dev对于OSX :(在下面设置标志很重要)
$ brew install boost
$ brew install boost-python --with-python3 --without-python对于Suse Linux:
$ sudo zypper in boost-devel
要使用这些库,请将这些行添加到您的cmakelists.txt:
INCLUDE ( FindPythonLibs )
FIND_PACKAGE ( PythonInterp )
FIND_PACKAGE ( PythonLibs )
FIND_PACKAGE ( Boost COMPONENTS python3 )
INCLUDE_DIRECTORIES (${ Boost_INCLUDE_DIRS } ${ PYTHON_INCLUDE_DIRS })
LINK_LIBRARIES (${ Boost_LIBRARIES } ${ PYTHON_LIBRARIES })
PYTHON_ADD_MODULE ( your_target ${ SOURCE_FILES })这个项目中有三个部分:
ISeeNN/ ,包括两个Web应用程序search_web/ and image_server/ 。Indexer/离线运行,将特定图像数据集索引到数据库中。search_engine/已实现的WIT C ++,将其编译到共享库中,以用作Web界面中的Python模块。要运行该项目,请执行以下步骤:
ISeeNN/IseeNN/personal_settings.py.example ISeeNN/IseeNN/personal_settings.pyIndexer/indexer.py中指定mongoDB用户名和密码image_server文档。例如, > db.image_server.insert({server_name: ' Amax ' , server_ip: ' 192.168.104.244 ' })在本地磁盘中索引您的目标图像数据集。
在Indexer/indexer.py中设置dir_name = '' , server_name='' 。也许您还想指定归一化器类型和模型类型。目前,此脚本的组织还不够好。将来我们将进行修订。
运行cd Indexer && python indexer.py
编译并安装搜索引擎后端:
$ cd search_engine && ./build.sh$ cd ISeeNN && ./manager.py runserver 0.0.0.0:8000