Este é um documento abrangente sobre o nosso procedimento de construção de recuperação de imagens baseado na CNN.
A frase iseenn pode ser expandida como eu vejo (com) CNN .
Fornecemos uma demonstração on -line aqui, que indexa o conjunto de dados Mirflickr 1M. É apenas para fins de demonstração e nem sempre está disponível.
O sistema consiste em três componentes principais:
O sistema é apresentado em:
A estrutura do nosso sistema pode ser ilustrada como: 
Nesta parte, mostrarei os detalhes da configuração do sistema.
Nosso sistema é criado em vários servidores Linux. Essencialmente, o ISEENN não é um sistema distribuído, mas apenas com o suporte ao armazenamento de imagens e busca de vários servidores.
Aqui está a configuração do nosso principal implemento:
| EU IA | Sistema operacional | Papel | IP interno | GPU | Memória |
|---|---|---|---|---|---|
| 1 | Ubuntu 14.04 x64 | Front End & Retrieval System & Mongo Server | 192.168.6.232 | K80 x 4 | 64G |
| 2 | Suse aberto 13.2 x64 | Servidor de imagem | 192.168.104.244 | K40 x 2 | 64G |
| 3 | Open Suse Salp 42.1 x64 | Servidor de imagem | 192.168.102.200 | GeForce GTX 660 TI | 16G |
Pode -se observar que não confiamos no mesmo sistema operacional para diferentes servidores. Escolhemos o servidor 1 como o principal servidor porque possui um recurso de computação relativamente mais alto. Claro que também pode servir como um servidor de imagem.
A seguir, primeiro focamos nas configurações no servidor 1 .
Usamos o MongoDB v3.4.1 como banco de dados de armazenamento de back -end. O conteúdo no banco de dados inclui:
feature_id -> image_id )image_id -> image_url )Como o repositório APT é antigo para o MongoDB, baixamos diretamente os arquivos binários.
$ 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 o banco de dados, primeiro criamos usuários administrativos para o administrador e nosso banco de dados Image_retrieval .
Usamos o script escrito por Frodenas para a inicialização.
# 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 " "Primeiro, crie um usuário administrador para o banco de dados do administrador , por
$ ./first_run.sh
MongoDB User: " mongo "
MongoDB Password: " xxxxxxxxxxxxx "
MongoDB Database: " admin "
MongoDB Role: " dbAdminAnyDatabase "Em seguida, crie um usuário do DBOWNER para o banco de dados 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 "Aqui eu escondei a senha. Lembre -se de salvar as informações do usuário para uso posterior.
Após a inicialização, inicie o servidor MongoD com o arquivo de configuração /db/mongodb.conf
# /db/mongodb.conf
dbpath=/db/mongo/
logpath=/db/mongodb.log
logappend=true
journal=true
auth = true $ mongod --config /db/mongodb.confAgora teste seu banco de dados
$ 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 ' )
1Usamos o Python3 para desenvolver o serviço da Web e extrair recursos da CNN com interface Python Tensorflow.
Nesta parte, configuraremos Python com o módulo Django para serviço da web e seu back -end do MongoDB
É benífico criar um ambiente independente de tempo de execução do Python com o VirtualENV.
Instale virtualenv :
$ sudo pip install virtualenvAgora, em seu espaço de trabalho, crie e insira um ambiente VirtualENV:
$ virtualenv --no-site-packages -p python3 image_retrieval
$ cd image_retrieval
$ source bin/activateConfigurar Django, Mongoengine, Ski-Image e travesseiro:
$ pip install django
$ pip install mongoengine
$ pip install scikit-image
$ pip install PillowEm seguida, configure seu TensorFlow sob a instrução do site.
Agora temos o ambiente Python como (dependendo do seu próprio ambiente):
$ 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.2E vamos começar nosso projeto ISEENN :
$ django-admin startproject ISeeNN
$ tree ISeeNN
ISeeNN
├── ISeeNN
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py Para trabalhar com o back -end do MongoDB, modifique a configuração DATABASE em 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 ) E configurar o TIMEZONE = 'Asia/Shanghai' .
Devido ao fraco apoio do Django para MongoDB, não estamos usando o componente de administrador para esta versão. Então, vamos comentar o código relacionado em urls.py
from django . conf . urls import url
# from django.contrib import admin
urlpatterns = [
# url(r'^admin/', admin.site.urls),
]OK! agora é o servidor por
./manage.py runserver 8000 Em seguida, abra seu navegador para navegar http://localhost:8000 para testá -lo.
Nosso back -end do mecanismo de pesquisa é implementado com C ++ para uma preocupação com eficiência. Para chamar isso de back -end, envolvemos o código C ++ com o Boost Python a ser exposto como um módulo Python.
Certifique-se de instalar o Boost-Dev e o Boost-Python-Dev com suporte Python 3.
Para Ubuntu:
$ sudo apt-get install libboost-dev libboost-python-devPara OSX: (é importante definir as bandeiras abaixo)
$ brew install boost
$ brew install boost-python --with-python3 --without-pythonPara SUSE Linux:
$ sudo zypper in boost-devel
Para usar essas bibliotecas, adicione essas linhas aos seus 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 })Existem três partes neste projeto:
ISeeNN/ , incluindo dois aplicativos da web search_web/ e image_server/ .Indexer/ que é executado off-line, para indexar o conjunto de dados de imagem específica no banco de dados.search_engine/ implementado wit c ++, que será compilado na biblioteca compartilhada para ser usada como um módulo Python na interface da web.Para executar o projeto, siga estas etapas:
ISeeNN/IseeNN/personal_settings.py.example para ISeeNN/IseeNN/personal_settings.pyIndexer/indexer.pyimage_server em seu shell mongo. por exemplo, > db.image_server.insert({server_name: ' Amax ' , server_ip: ' 192.168.104.244 ' })indexem seu conjunto de dados de imagem de destino em discos locais.
Defina o dir_name = '' , server_name='' em Indexer/indexer.py . Talvez você também queira especificar o tipo de normalizador e o tipo de modelo. Atualmente, esse script não está bem organizado. Faremos uma revisão no futuro.
Execute cd Indexer && python indexer.py
Compilar e instalar o back -end do mecanismo de pesquisa:
$ cd search_engine && ./build.sh$ cd ISeeNN && ./manager.py runserver 0.0.0.0:8000