Este es un documento integral sobre nuestro sistema de recuperación de imágenes basado en CNN es el procedimiento de construcción.
La frase se puede ampliar como veo (con) cnn .
Proporcionamos una demostración en línea aquí, que indexa el conjunto de datos Mirflickr 1M. Es solo para fines de demostración, y puede no estar siempre disponible.
El sistema consta de tres componentes principales:
El sistema aparece en:
El marco de nuestro sistema se puede ilustrar como: 
En esta parte, mostraré los detalles de configuración del sistema.
Nuestro sistema se basa en varios servidores Linux. Esencialmente, ISeenn no es un sistema distribuido, sino solo con el soporte del almacenamiento de imágenes y la obtención de múltiples servidores.
Aquí está la configuración de nuestro principal implemento:
| IDENTIFICACIÓN | Sistema operativo | Role | IP interna | GPU | Memoria |
|---|---|---|---|---|---|
| 1 | Ubuntu 14.04 x64 | Sistema frontal y de recuperación y servidor Mongo | 192.168.6.232 | K80 x 4 | 64g |
| 2 | Abrir SUSE 13.2 x64 | Servidor de imágenes | 192.168.104.244 | K40 x 2 | 64g |
| 3 | Abrir Suse Leap 42.1 x64 | Servidor de imágenes | 192.168.102.200 | GeForce GTX 660 TI | 16g |
Se puede ver que no confiamos en el mismo sistema operativo para diferentes servidores. Elegimos el servidor 1 como el servidor principal porque tiene un recurso informático relativamente más alto. Por supuesto, también puede servir como un servidor de imágenes.
A continuación, primero nos centramos en las configuraciones en el servidor 1 .
Utilizamos MongoDB V3.4.1 como la base de datos de almacenamiento de backend. Los contenidos en la base de datos incluyen:
feature_id -> image_id )image_id -> image_url )Debido a que el repositorio APT es antiguo para MongoDB, descargamos directamente los archivos binarios.
$ 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/binPara inicializar la base de datos, primero creamos usuarios administrativos para el administrador y nuestra base de datos Image_retrieval .
Utilizamos el script escrito por Frodenas para la inicialización.
# 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 " "Primero, cree un usuario administrativo para la base de datos de administración , por
$ ./first_run.sh
MongoDB User: " mongo "
MongoDB Password: " xxxxxxxxxxxxx "
MongoDB Database: " admin "
MongoDB Role: " dbAdminAnyDatabase "Luego, cree un usuario de DBOwner para la base de datos image_retrieval , por
$ 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 "Aquí oculté la contraseña. Recuerde guardar la información del usuario para su uso posterior.
Después de la inicialización, inicie el servidor MongoD con el archivo de configuración /db/mongodb.conf
# /db/mongodb.conf
dbpath=/db/mongo/
logpath=/db/mongodb.log
logappend=true
journal=true
auth = true $ mongod --config /db/mongodb.confAhora prueba tu base de datos
$ 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 ' )
1Utilizamos Python3 para desarrollar el servicio web y extraer características de CNN con la interfaz TensorFlow Python.
En esta parte configuraremos Python con el módulo Django para el servicio web y su backend de MongoDB
Es benificial crear un entorno de tiempo de ejecución de Python independiente con VirtualEnv.
Instalar virtualenv :
$ sudo pip install virtualenvAhora en su espacio de trabajo, cree e ingrese un entorno VirtualEnv:
$ virtualenv --no-site-packages -p python3 image_retrieval
$ cd image_retrieval
$ source bin/activateConfigurar Django, MongoEngine, Ski-Image y almohada:
$ pip install django
$ pip install mongoengine
$ pip install scikit-image
$ pip install PillowLuego configure su TensorFlow bajo las instrucciones del sitio web.
Ahora tenemos el entorno de Python como (dependiendo de su propio entorno):
$ 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.2Y comencemos nuestro proyecto iSeenn :
$ django-admin startproject ISeeNN
$ tree ISeeNN
ISeeNN
├── ISeeNN
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py Para trabajar con el backend de MongoDB, modifique la configuración DATABASE en ISeeNN/settings.py como:
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 ) Y configure la TIMEZONE = 'Asia/Shanghai' .
Debido al débil soporte de Django para MongoDB, no estamos utilizando el componente de administración para esta versión. Así que comentemos el código relacionado en urls.py
from django . conf . urls import url
# from django.contrib import admin
urlpatterns = [
# url(r'^admin/', admin.site.urls),
]¡DE ACUERDO! ahora lanch el servidor por
./manage.py runserver 8000 Luego abra su navegador para explorar http://localhost:8000 para probarlo.
Nuestro backend de los motores de búsqueda se implementa con C ++ para una preocupación de eficiencia. Para llamar a este backend, envolvemos el código C ++ con Boost Python para ser expuesto como un módulo de Python.
Asegúrese de instalar Boost-Dev y Boost-Python-Dev con soporte Python 3.
Para Ubuntu:
$ sudo apt-get install libboost-dev libboost-python-devPara OSX: (es importante establecer las banderas a continuación)
$ brew install boost
$ brew install boost-python --with-python3 --without-pythonPara Suse Linux:
$ sudo zypper in boost-devel
Para usar estas bibliotecas, agregue estas líneas a su 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 })Hay tres partes en este proyecto:
ISeeNN/ , incluidas dos aplicaciones web search_web/ e image_server/ .Indexer/ que se ejecuta fuera de línea, para indexar el conjunto de datos de imágenes específicas en la base de datos.search_engine/ implementó con Wit C ++, que se compilará en la biblioteca compartida para ser utilizada como un módulo Python en la interfaz web.Para ejecutar el proyecto, siga estos pasos:
ISeeNN/IseeNN/personal_settings.py.example a ISeeNN/IseeNN/personal_settings.pyIndexer/indexer.pyimage_server en tu shell Mongo. p.ej, > db.image_server.insert({server_name: ' Amax ' , server_ip: ' 192.168.104.244 ' })indexe su conjunto de datos de imagen de destino en discos locales.
Establezca dir_name = '' , server_name='' en Indexer/indexer.py . Tal vez también desee especificar el tipo de normalizador y el tipo de modelo. Actualmente este guión no está bien organizado. Haremos una revisión en el futuro.
Ejecutar cd Indexer && python indexer.py
compilar e instalar el backend del motor de búsqueda:
$ cd search_engine && ./build.sh$ cd ISeeNN && ./manager.py runserver 0.0.0.0:8000