Это всеобъемлющий документ о нашей системе поиска изображений на основе CNN Iseenn .
Фраза Iseenn может быть расширена, как я вижу (с) CNN .
Здесь мы предоставляем онлайн -демонстрацию, которая индексирует набор данных miRflickr 1M. Это только для демонстрационной цели, и может быть не всегда доступно.
Система состоит из трех основных компонентов:
Система представлена в:
Структура нашей системы может быть проиллюстрирована как: 
В этой части я покажу детали настройки системы.
Наша система построена на ряде серверов Linux. По сути, Iseenn не является распределенной системой, а только с поддержкой хранения изображений и получения нескольких серверов.
Вот конфигурация нашего Premier Regain:
| ИДЕНТИФИКАТОР | Операционная система | Роль | Внутренний IP | Графический процессор | Память |
|---|---|---|---|---|---|
| 1 | Ubuntu 14.04 x64 | Front End & Revieval System & Mongo Server | 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 .
Мы используем сценарий, написанный Фроденасом для инициализации.
# 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 "Затем создайте пользователя dbowner для базы данных Image_retrieval ,
$ 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 "Здесь я использовал пароль. Не забудьте сохранить пользовательскую информацию для дальнейшего использования.
После инициализации запустите сервер Mongod с файлом config /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 для разработки веб -службы и для извлечения функций CNN с интерфейсом Python TensorFlow.
В этой части мы будем конфигурировать Python с помощью Django Module для веб -службы и его бэкэнд MongoDB
Бессолютно создавать автономную среду выполнения питона с помощью VirtualEnv.
Установите virtualenv :
$ sudo pip install virtualenvТеперь в вашем рабочем пространстве создайте и введите среду 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Затем настройте TensorFlow под инструкцией веб -сайта.
Теперь у нас есть среда 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 Project:
$ django-admin startproject ISeeNN
$ tree ISeeNN
ISeeNN
├── ISeeNN
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py Чтобы работать с бэкэнд MongoDB, измените настройку DATABASE в ISeeNN/settings.py как:
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.
Обязательно установите Boost-Dev и Boost-Python-Dev с поддержкой Python 3.
Для 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/ , включая два веб -приложения search_web/ и image_server/ .Indexer/ работающий в автономном режиме, чтобы индексировать специфический набор данных изображений в базу данных.search_engine/ wit C ++, которая будет составлена в общую библиотеку, которая будет использоваться в качестве модуля Python в веб -интерфейсе.Чтобы запустить проект, следуйте этим шагам:
ISeeNN/IseeNN/personal_settings.py.example to ISeeNN/IseeNN/personal_settings.pyIndexer/indexer.pyimage_server в своей оболочке Mongo. например, > db.image_server.insert({server_name: ' Amax ' , server_ip: ' 192.168.104.244 ' })Индексируйте свой набор данных целевого изображения на локальных дисках.
Установите dir_name = '' , server_name='' в Indexer/indexer.py . Может быть, вы также хотите указать тип нормализатора и тип модели. В настоящее время этот сценарий не очень хорошо организован. Мы сделаем пересмотр в будущем.
Запустить cd Indexer && python indexer.py
Скомпилируйте и установите бэкэнд поисковой системы:
$ cd search_engine && ./build.sh$ cd ISeeNN && ./manager.py runserver 0.0.0.0:8000