Il s'agit d'un document complet sur notre procédure de construction de la récupération d'image basée sur CNN.
La phrase Iseenn peut être élargie comme je le vois (avec) CNN .
Nous fournissons une démo en ligne ici, qui indexte le jeu de données Mirflickr 1M. Il est seulement à des fins de démonstration et peut ne pas être toujours disponible.
Le système se compose de trois composantes principales:
Le système est présenté dans:
Le cadre de notre système peut être illustré comme: 
Dans cette partie, je vais afficher les détails de configuration du système.
Notre système est construit sur un certain nombre de serveurs Linux. Essentiellement, Iseenn n'est pas un système distribué, mais uniquement avec le support du stockage d'images et la récupération à partir de plusieurs serveurs.
Voici la configuration de notre premier implément:
| IDENTIFIANT | Système opérateur | Rôle | IP interne | GPU | Mémoire |
|---|---|---|---|---|---|
| 1 | Ubuntu 14.04 x64 | Système frontal et récupération et serveur Mongo | 192.168.6.232 | K80 x 4 | 64g |
| 2 | Open SUSE 13.2 x64 | Serveur d'images | 192.168.104.244 | K40 x 2 | 64g |
| 3 | Open SUSE Leap 42.1 x64 | Serveur d'images | 192.168.102.200 | Geforce gtx 660 ti | 16g |
On peut voir que nous ne comptons pas sur le même système d'exploitation pour différents serveurs. Nous choisissons le serveur 1 comme serveur principal car il dispose d'une ressource informatique relativement plus élevée. Bien sûr, il peut également servir de serveur d'images.
Dans ce qui suit, nous nous concentrons d'abord sur les configurations sur le serveur 1 .
Nous utilisons MongoDB V3.4.1 comme base de données de stockage backend. Le contenu de la base de données comprend:
feature_id -> image_id )image_id -> image_url )Parce que le référentiel APT est ancien pour MongoDB, nous téléchargeons directement les fichiers binaires.
$ 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/binPour initialiser la base de données, nous créons d'abord des utilisateurs d'administration pour l' administrateur et notre base de données Image_Retrieval .
Nous utilisons le script écrit par Frodenas pour l'initialisation.
# 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 " "Créez d'abord un utilisateur administrateur pour la base de données Admin , par
$ ./first_run.sh
MongoDB User: " mongo "
MongoDB Password: " xxxxxxxxxxxxx "
MongoDB Database: " admin "
MongoDB Role: " dbAdminAnyDatabase "Ensuite, créez un utilisateur DBOwner pour la base de données Image_Retrieval , par
$ 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 "Ici, j'ai caché le mot de passe. N'oubliez pas d'enregistrer les informations de l'utilisateur pour une utilisation ultérieure.
Après l'initialisation, démarrez le serveur Mongod avec du fichier de configuration /db/mongodb.conf
# /db/mongodb.conf
dbpath=/db/mongo/
logpath=/db/mongodb.log
logappend=true
journal=true
auth = true $ mongod --config /db/mongodb.confMaintenant, testez votre base de données
$ 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 ' )
1Nous utilisons Python3 pour développer le service Web et pour extraire les fonctionnalités CNN avec interface TensorFlow Python.
Dans cette partie, nous configurerons Python avec le module Django pour le service Web et son backend MongoDB
Il est bénicipal de créer un environnement d'exécution Python autonome avec VirtualEnv.
Installez virtualenv :
$ sudo pip install virtualenvMaintenant dans votre espace de travail, créez et entrez un environnement VirtualEnv:
$ virtualenv --no-site-packages -p python3 image_retrieval
$ cd image_retrieval
$ source bin/activateConfiguration Django, MongoEngine, Image de ski et oreiller:
$ pip install django
$ pip install mongoengine
$ pip install scikit-image
$ pip install PillowConfigurez ensuite votre tensorflow sous l'instruction du site Web.
Maintenant, nous avons un environnement python comme (selon votre propre environnement):
$ 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.2Et commençons notre projet Iseenn :
$ django-admin startproject ISeeNN
$ tree ISeeNN
ISeeNN
├── ISeeNN
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py Pour travailler avec le backend MongoDB, modifiez le paramètre DATABASE dans ISeeNN/settings.py en tant que:
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 ) Et configurer le TIMEZONE = 'Asia/Shanghai' .
En raison du faible soutien de Django pour MongoDB, nous n'utilisons pas le composant administrateur pour cette version. Alors commençons le code connexe dans urls.py
from django . conf . urls import url
# from django.contrib import admin
urlpatterns = [
# url(r'^admin/', admin.site.urls),
]D'ACCORD! maintenant lanch le serveur par
./manage.py runserver 8000 Ouvrez ensuite votre navigateur pour parcourir http://localhost:8000 pour le tester.
Notre backend de moteur de recherche est mis en œuvre avec C ++ pour un problème d'efficacité. Pour appeler ce backend, nous enroulons le code C ++ avec Boost Python à exposer en tant que module Python.
Assurez-vous d'installer Boost-DEV et boost-python-DEV avec la prise en charge de Python 3.
Pour Ubuntu:
$ sudo apt-get install libboost-dev libboost-python-devPour OSX: (il est important de définir les drapeaux ci-dessous)
$ brew install boost
$ brew install boost-python --with-python3 --without-pythonPour Suse Linux:
$ sudo zypper in boost-devel
Pour utiliser ces bibliothèques, ajoutez ces lignes à votre 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 })Il y a trois parties dans ce projet:
ISeeNN/ , y compris deux applications Web search_web/ et image_server/ .Indexer/ qui s'exécute hors ligne, pour indexer un ensemble de données d'image spécifique dans la base de données.search_engine/ implémenté avec C ++, qui sera compilé dans la bibliothèque partagée pour être utilisée comme module Python dans l'interface Web.Pour exécuter le projet, suivez ces étapes:
ISeeNN/IseeNN/personal_settings.py.example à ISeeNN/IseeNN/personal_settings.pyIndexer/indexer.pyimage_server dans votre shell Mongo. par exemple, > db.image_server.insert({server_name: ' Amax ' , server_ip: ' 192.168.104.244 ' })Indexez votre ensemble de données d'image cible dans les disques locaux.
Définissez le dir_name = '' , server_name='' dans Indexer/indexer.py . Peut-être que vous souhaitez également spécifier le type de normalisation et le type de modèle. Actuellement, ce script n'est pas bien organisé. Nous ferons une révision à l'avenir.
Exécuter cd Indexer && python indexer.py
Compiler et installer le backend du moteur de recherche:
$ cd search_engine && ./build.sh$ cd ISeeNN && ./manager.py runserver 0.0.0.0:8000