Ini adalah dokumen komprehensif tentang sistem pengambilan gambar ISEENN berbasis CNN kami.
Frasa ISEENN dapat diperluas seperti yang saya lihat (dengan) CNN .
Kami memberikan demo online di sini, yang mengindeks dataset 1M Mirflickr. Ini hanya untuk tujuan demonstrasi, dan mungkin tidak selalu tersedia.
Sistem ini terdiri dari tiga komponen utama:
Sistem ini ditampilkan dalam:
Kerangka kerja sistem kami dapat diilustrasikan sebagai: 
Di bagian ini, saya akan menunjukkan detail pengaturan sistem.
Sistem kami dibangun di atas sejumlah server Linux. Pada dasarnya, ISEENN bukan sistem terdistribusi, tetapi hanya dengan mendukung penyimpanan gambar dan mengambil dari banyak server.
Berikut adalah konfigurasi implement utama kami:
| PENGENAL | Sistem Operasi | Peran | IP internal | GPU | Ingatan |
|---|---|---|---|---|---|
| 1 | Ubuntu 14.04 x64 | Sistem ujung depan & pengambilan & server Mongo | 192.168.6.232 | K80 x 4 | 64g |
| 2 | Buka SUSE 13.2 x64 | Server gambar | 192.168.104.244 | K40 x 2 | 64g |
| 3 | Buka SUSE Leap 42.1 x64 | Server gambar | 192.168.102.200 | GeForce GTX 660 Ti | 16g |
Dapat dilihat bahwa kita tidak mengandalkan sistem operasi yang sama untuk server yang berbeda. Kami memilih server 1 sebagai server utama karena memiliki sumber daya komputasi yang relatif lebih tinggi. Tentu saja itu juga dapat berfungsi sebagai server gambar.
Berikut ini kami pertama -tama fokus pada konfigurasi di server 1 .
Kami menggunakan MongoDB v3.4.1 sebagai database penyimpanan backend. Isi dalam database meliputi:
feature_id -> image_id )image_id -> image_url )Karena repositori yang tepat sudah lama untuk MongoDB, kami langsung mengunduh file biner.
$ 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/binUntuk menginisialisasi database, pertama -tama kami membuat pengguna admin untuk admin dan database Image_Retrieval kami.
Kami menggunakan skrip yang ditulis oleh Frodenas untuk inisialisasi.
# 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 " "Pertama, buat pengguna admin untuk database admin , dengan
$ ./first_run.sh
MongoDB User: " mongo "
MongoDB Password: " xxxxxxxxxxxxx "
MongoDB Database: " admin "
MongoDB Role: " dbAdminAnyDatabase "Kemudian, buat pengguna DBOWNER untuk database Image_Retrieval , oleh
$ 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 "Di sini saya menyembunyikan kata sandinya. Ingatlah untuk menyimpan informasi pengguna untuk digunakan lebih lanjut.
Setelah inisialisasi, mulailah server Mongod dengan file config /db/mongodb.conf
# /db/mongodb.conf
dbpath=/db/mongo/
logpath=/db/mongodb.log
logappend=true
journal=true
auth = true $ mongod --config /db/mongodb.confSekarang uji database Anda
$ 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 ' )
1Kami menggunakan Python3 untuk mengembangkan layanan web, dan untuk mengekstrak fitur CNN dengan antarmuka TensorFlow Python.
Pada bagian ini kami akan mengonfigurasi python dengan modul django untuk layanan web dan backend mongodb -nya
Adalah baik untuk menciptakan lingkungan runtime Python mandiri dengan VirtualEnv.
Instal virtualenv :
$ sudo pip install virtualenvSekarang di ruang kerja Anda, buat dan masukkan lingkungan VirtualEnv:
$ virtualenv --no-site-packages -p python3 image_retrieval
$ cd image_retrieval
$ source bin/activatePengaturan Django, Mongoengine, Ski-Image dan Bantal:
$ pip install django
$ pip install mongoengine
$ pip install scikit-image
$ pip install PillowKemudian siapkan TensorFlow Anda di bawah instruksi situs web.
Sekarang kami memiliki lingkungan Python sebagai (tergantung pada lingkungan Anda sendiri):
$ 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.2Dan mari kita mulai proyek ISEENN kami:
$ django-admin startproject ISeeNN
$ tree ISeeNN
ISeeNN
├── ISeeNN
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py Untuk bekerja dengan backend mongoDB, ubah pengaturan DATABASE di ISeeNN/settings.py sebagai:
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 ) Dan konfigurasikan TIMEZONE = 'Asia/Shanghai' .
Karena dukungan yang lemah dari Django untuk MongoDB, kami tidak menggunakan komponen admin untuk versi ini. Jadi mari kita berkomentar kode terkait dalam urls.py
from django . conf . urls import url
# from django.contrib import admin
urlpatterns = [
# url(r'^admin/', admin.site.urls),
]OKE! Sekarang Lanch the Server oleh
./manage.py runserver 8000 Kemudian buka browser Anda untuk menelusuri http://localhost:8000 untuk mengujinya.
Backend mesin pencari kami diimplementasikan dengan C ++ untuk masalah efisiensi. Untuk menyebutnya backend ini, kami membungkus kode C ++ dengan boost python untuk diekspos sebagai modul python.
Pastikan untuk menginstal Boost-Dev dan Boost-Python-dev dengan dukungan Python 3.
Untuk Ubuntu:
$ sudo apt-get install libboost-dev libboost-python-devUntuk OSX: (Penting untuk mengatur bendera di bawah)
$ brew install boost
$ brew install boost-python --with-python3 --without-pythonUntuk suse linux:
$ sudo zypper in boost-devel
Untuk menggunakan pustaka ini, tambahkan baris ini ke cmakelists Anda.
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 })Ada tiga bagian dalam proyek ini:
ISeeNN/ , termasuk dua aplikasi web search_web/ dan image_server/ .Indexer/ yang berjalan off-line, untuk mengindeks dataset gambar spesifik ke dalam database.search_engine/ diimplementasikan dengan C ++, yang akan dikompilasi ke perpustakaan bersama untuk digunakan sebagai modul python di antarmuka web.Untuk menjalankan proyek, ikuti langkah -langkah ini:
ISeeNN/IseeNN/personal_settings.py.example to ISeeNN/IseeNN/personal_settings.pyIndexer/indexer.pyimage_server di shell Mongo Anda. misalnya, > db.image_server.insert({server_name: ' Amax ' , server_ip: ' 192.168.104.244 ' })Indeks dataset gambar target Anda di disk lokal.
Setel dir_name = '' , server_name='' di Indexer/indexer.py . Mungkin Anda juga ingin menentukan tipe Normalizer dan jenis model. Saat ini skrip ini tidak terorganisir dengan baik. Kami akan membuat revisi di masa depan.
Jalankan cd Indexer && python indexer.py
Kompilasi dan pasang backend mesin pencari:
$ cd search_engine && ./build.sh$ cd ISeeNN && ./manager.py runserver 0.0.0.0:8000