هذه وثيقة شاملة حول نظام بناء الصور المستند إلى CNN الخاص بنا.
يمكن توسيع عبارة iseenn كما أرى (مع) CNN .
نحن نقدم عرضًا تجريبيًا عبر الإنترنت هنا ، والذي يفهرس مجموعة بيانات miRflickr 1M. إنه فقط لغرض العرض التوضيحي ، وقد لا يكون متاحًا دائمًا.
يتكون النظام من ثلاثة مكونات رئيسية:
يظهر النظام في:
يمكن توضيح إطار نظامنا على النحو التالي: 
في هذا الجزء ، سأعرض تفاصيل إعداد النظام.
نظامنا مبني على عدد من خوادم Linux. في الأساس ، ليس Iseenn نظامًا موزعًا ، ولكن فقط مع دعم تخزين الصور وجلبه من خوادم متعددة.
فيما يلي تكوين تنفيذنا الأول:
| بطاقة تعريف | نظام التشغيل | دور | IP الداخلي | GPU | ذاكرة |
|---|---|---|---|---|---|
| 1 | Ubuntu 14.04 x64 | نظام الواجهة الأمامية والاسترجاع وخادم مونغو | 192.168.6.232 | K80 × 4 | 64 جم |
| 2 | افتح SUSE 13.2 x64 | خادم الصور | 192.168.104.244 | K40 × 2 | 64 جم |
| 3 | افتح 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_retrival الخاصة بنا.
نستخدم البرنامج النصي الذي كتبه Frodenas للتهيئة.
# 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_retrival ، بواسطة
$ 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 مع ملف التكوين /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 لخدمة الويب وخلفية MongoDB الخاصة بها
من المعتاد خلق بيئة وقت تشغيل Python المستقلة مع VirtualEnV.
تثبيت virtualenv :
$ sudo pip install virtualenvالآن في مساحة العمل الخاصة بك ، قم بإنشاء وإدخال بيئة افتراضية:
$ virtualenv --no-site-packages -p python3 image_retrieval
$ cd image_retrieval
$ source bin/activateالإعداد Django ، Mongoengine ، Ski-heices and Pillow:
$ pip install django
$ pip install mongoengine
$ pip install scikit-image
$ pip install Pillowثم قم بإعداد TensorFlow تحت تعليمات الموقع.
الآن لدينا بيئة بيثون (اعتمادًا على بيئتك الخاصة):
$ 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 الخاص بنا:
$ 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 ++ مع تعزيز Python ليتعرض كوحدة Python.
تأكد من تثبيت Boost-Dev و Boost-Python-Dev مع دعم Python 3.
لأوبونتو:
$ 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/ تم تنفيذه مع 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='' in Indexer/indexer.py . ربما تريد أيضًا تحديد نوع Normalizer ونوع الطراز. حاليا هذا البرنامج النصي غير منظم بشكل جيد. سنقوم بمراجعة في المستقبل.
قم بتشغيل cd Indexer && python indexer.py
قم بتجميع وتثبيت الواجهة الخلفية لمحرك البحث:
$ cd search_engine && ./build.sh$ cd ISeeNN && ./manager.py runserver 0.0.0.0:8000