這是有關我們基於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