- Python 3
- Virtualenv
- Django
- NGINX
Sơ đồ minh hoạ kiến trúc các công nghệ được sử dụng trong ứng dụng.
Đối với hệ điều hành Windows, việc cài đặt và thiết lập uWSGI phức tạp và phát sinh nhiều vấn đề chưa được hỗ trợ đầy đủ bởi nhà phát hành nên bài viết giới hạn tới phần chạy ứng dụng Django.
-
Tải về và cài đặt phiên bản Python 3 mới nhất tại địa chỉ. https://www.python.org/downloads/
-
Tải về và cài đặt Git phiên bản mới nhất tại địa chỉ. https://git-scm.com/downloads
-
Clone project bằng cách nhập vào câu lệnh sau:
git clone https://github.com/tiendv/coloursearch.git
-
Mở Command Prompt (hoặc Windows Powershell hoặc Mingw-w64, Cygwin), cài đặt Virtual Environment (Virtualenv) bằng PyPI (pip) (đã được cài đặt cùng với Python 3):
pip install virtualenv
-
Tạo một môi trường ảo cho project (để cài đặt các package của Python vào môi trường này) bằng Virtualenv:
virtualenv <tên môi trường ảo>
# Thí dụ: virtualenv cbir
-
Kích hoạt môi trường ảo:
.\cbir\Scripts\activate
-
Cài đặt các package của Python thông qua PyPI (pip) được mô tả trong file
requirements.txt
(bao gồm Django, mysqlclient, numpy, scipy, opencv, faiss và một số thư viện khác):pip install -r requirements.txt
Lưu ý: Tới thời điểm hiện tại, faiss chưa hỗ trợ Windows, khi build trên Windows sẽ bị lỗi. Một giải pháp thay thế cho việc indexing bằng faiss là dùng multiprocessing. Để deploy project trên Windows, người dùng comment các dòng số
212-232
,326-346
,444-464
và bỏ comment các dòng số235-249
,349-365
,467-483
. -
Tải về và cài đặt hệ quản trị cơ sở dữ liệu MySQL tại địa chỉ. https://dev.mysql.com/downloads/installer/
Lưu ý: Đối với Windows, yêu cầu cài đặt Microsoft .NET Framework từ 3.5.2 trở lên và Microsoft Visual C++ Redistributable Package để có thể cài đặt MySQL.
-
Sau khi cài đặt thành công MySQL và đã khởi động các service cần thiết. Đăng nhập vào MySQL Shell, tạo cơ sở dữ liệu có tên là cbir (khớp với tên cơ sở dữ liệu trong file
content-based-image-retrieval\src\settings.py
, dòng 83):CREATE DATABASE cbir;
Tạo tài khoản người dùng mới trong MySQL (khớp với
username
vàpassword
trong filecontent-based-image-retrieval\src\cbir\settings.py
, dòng 84, 85)CREATE USER 'django_user'@'localhost' IDENTIFIED BY '123456';
Thêm quyền cho tài khoản người dùng vừa tạo trên cơ sở dữ liệu
cbir
:GRANT ALL PRIVILEGES ON cbir.* TO 'django_user'@'localhost';
-
Migrate cấu trúc model trong project Django qua database schema:
Kích hoạt môi trường ảo
cbir
:.\cbir\Scripts\activate
Migrate từ thư mục chứa file
manage.py
:python manage.py migrate
Nếu thông báo migrate tất cả các file thành công, trong MySQL sẽ hiện ra các table.
Migrate cấu trúc model trong project Django qua database schema.
Các table được tạo ra trong MySQL.
-
Để chạy ứng dụng Django, chạy lệnh sau:
python manage.py runserver
Mở trình duyệt web, truy cập vào địa chỉ http://127.0.0.1:8000 màn hình ứng dụng sẽ hiện ra.
-
Cài đặt Python 3:
sudo apt update sudo add-apt-repository ppa:deadsnakes/ppa sudo apt install python3.7 sudo apt install build-essential libssl-dev libffi-dev python3-dev
Vào file
.bashrc
của Ubuntu, thêm dòng sau để alias python3 thành python:alias python='python3' alias pip='pip3
Khởi động lại Terminal để sử dụng.
-
Cài đặt Git:
sudo apt install git
-
Clone project bằng cách nhập vào câu lệnh sau:
git clone https://github.com/tiendv/coloursearch.git
-
Cài đặc PyPI (pip):
sudo apt install -y python3-pip
-
Cài đặt Virtual Environment (Virtualenv):
sudo apt install -y python3-venv
-
Tạo một môi trường ảo cho project (để cài đặt các package của Python vào môi trường này) bằng Virtualenv:
python -m venv cbir
-
Kích hoạt môi trường:
source cbir/bin/activate
-
Cài đặt MySQL:
sudo apt install -y mysql-server sudo apt install -y libmysqlclient-dev
-
Cài đặt các package của Python thông qua PyPI (pip) được mô tả trong file requirements.txt (bao gồm Django, mysqlclient, numpy, scipy, opencv, faiss và một số thư viện khác):
pip install -r requirements.txt
-
Sau khi cài đặt thành công MySQL và đã khởi động các service cần thiết. Đăng nhập vào MySQL Shell, tạo cơ sở dữ liệu có tên là cbir (khớp với tên cơ sở dữ liệu trong file
content-based-image-retrieval/src/settings.py
, dòng 83):Đăng nhập MySQL Shell:
mysql -u root -p
Tạo cơ sở dữ liệu cbir:
CREATE DATABASE cbir;
Tạo tài khoản người dùng mới trong MySQL (khớp với username và password trong file
content-based-image-retrieval/src/cbir/settings.py
, dòng 84, 85)CREATE USER 'django_user'@'localhost' IDENTIFIED BY '123456';
Thêm quyền cho tài khoản người dùng vừa tạo trên cơ sở dữ liệu
cbir
:GRANT ALL PRIVILEGES ON cbir.TO 'django_user'@'localhost';
-
Migrate cấu trúc model trong project Django qua database schema:
Kích hoạt môi trường ảo:
source cbir/venv/activate
Migrate từ thư mục
content-based-image-retrieval/src/
:python manage.py migrate
Nếu thông báo migrate tất cả các file thành công, trong MySQL sẽ hiện ra các table.
-
Cài đặt nginx server:
sudo apt install -y nginx
Điều chỉnh cấu hình Ubuntu firewall:
Kiểm tra danh sách cấu hình ứng dụng mà Ubuntu firewall nhận diện được có tồn tại Nginx hay không:
sudo ufw app list
Output:
Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH
Cho phép Nginx HTTP
sudo ufw allow 'Nginx HTTP'
Kiểm tra trạng thái hoạt động của Nginx bằng câu lệnh sau:
systemctl status nginx
-
Tạo một file
.ini
để mô tả các thiết lập cấu hình uWSGI cho project.# cbir_uwsgi.ini file [uwsgi] # Django-related settings # the base directory (full path) chdir = /home/username/content-based-image-retrieval/src # Django's wsgi file module = cbir.wsgi # the virtualenv (full path) home = /home/username/content-based-image-retrieval/cbir # process-related settings # master master = true # maximum number of worker processes processes = 10 # the socket (use the full path to be safe socket = /home/username/content-based-image-retrieval/cbir.sock # ... with appropriate permissions - may be needed chmod-socket = 666 # clear environment on exit vacuum = true
Trong đó:
chdir
là đường dẫn của thư mục chứa filemanage.py
của project.module
là tên module WSGI của project được mô tả trong filecontent-based-image-retrieval/src/cbir/apps.py
.home
là đường dẫn của thư mục virtualenv của project.socket
là đường dẫn của file socket muốn tạo.
-
Cài đặt uwsgi:
pip install uwsgi
Tạo file
uwsgi.serivce
tại đường dẫn/etc/systemd/system/
có nội dung như sau:[Unit] Description=uWSGI Emperor service After=syslog.target [Service] ExecStart=/usr/local/bin/uwsgi --emperor /home/username/content-based-image-retrieval/cbir_uwsgi.ini Restart=always KillSignal=SIGQUIT Type=notify StandardError=syslog NotifyAccess=all [Install] WantedBy=multi-user.target
Trong đó:
-
ExecStart=/usr/local/bin/uwsgi
mô tả đường dẫn của uWSGI được cài đặt trong máy, để có thể lấy đường dẫn này, chạy lệnhwhich uwsgi
hoặcwhereis uwsgi
. -
--emperor /home/username/content-based-image-retrieval/cbir_uwsgi.ini
là địa chỉ đường dẫn tới file.ini
ở trên.
Làm mới trạng thái của
systemd
với uWSGI service:sudo systemctl daemon-reload
Khởi động uWSGI
sudo systemctl start uwsgi
-
-
Tạo file cấu hình của NGINX tên
cbir.conf
tại đường dẫn/etc/nginx/conf.d
có nội dung như sau:# cbir.conf upstream django { server unix:///home/username/content-based-image-retrieval/cbir.sock; } # configuration of the server server { listen 80; server_name cbir.net; charset utf-8; client_max_body_size 75M; location /static { alias /home/username/content-based-image-retrieval/src/static; } location / { uwsgi_pass django; include /etc/nginx/uwsgi_params; } }
Trong đó:
/home/username/content-based-image-retrieval/cbir.sock
là đường dẫn chứa file socket của project./home/username/content-based-image-retrieval/src/static
là đường dẫn chứa các file tĩnh (static) của project./etc/nginx/uwsgi_params
là đường dẫn file chứa các tham số uWSGI để NGINX có thể phục vụ.
Khởi động lại NGINX:
sudo systemctl restart nginx
Mở trình duyệt web, truy cập vào địa chỉ http://127.0.0.1:8000 sẽ ra được màn hình ứng dụng.
Màn hình ứng dụng
-
Câu lệnh sau thực hiện việc trích xuất đặc trưng từ dữ liệu hình ảnh:
python manage.py extract -p1 <tham số 1> -p2 <tham số 2> -p3 <tham số 3> '<đường dẫn thư mục hình ảnh trong dấu nháy đơn>' '<loại đặc trưng cần trích xuất>'
# Thí dụ python manage.py extract -p1 4096 -p2 64 -p3 1.9 '/home/username/images' 'fuzzy_color_histogram'
Trong đó, loại đặc trưng cần trích xuất kèm theo tham số thường được sử dụng có trong bảng sau:
Tên đặc trưng Mã đặc trưng Tham số 1 Tham số 2 Tham số 3 Fuzzy Color Histogram fuzzy_color_histogram Số lượng màu sắc thô - n (Number of coarse colors) Số lượng màu sắc sau xử lý - n' (Number of fine colors) Số mũ đóng vai trò trọng số - m Color Correlogram color_correlogram Số lượng màu sắc - n (Number of colors) Khoảng cách tối đa - d (Distance) Gia số - i (Increment) Color Coherence Vector color_coherence_vector Số lượng màu sắc - n (Number of colors) Đại lượng xác định tính coherence - т (tau) Cumulative Color Histogram cumulative_color_histogram Số lượng màu sắc - n (Number of colors) Trích xuất đặc trưng thành công.
-
Đối với đặc trưng Fuzzy Color Histogram, để tăng tốc độ truy xuất hình ảnh, thực hiện câu lệnh sau để annotate các màu về một số màu cơ bản:
python manage.py annotate '<đường dẫn thư mục hình ảnh>'
# Thí dụ: python manage.py annotate '/home/username/images'
Câu lệnh này sẽ gán nhãn các hình ảnh trong thư mục với một số màu sắc phổ biến được quy định sẵn và lưu lại trong file
.csv
trong đường dẫncontent-based-image-retrieval/src/annotation
. -
Câu lệnh sau thực hiện việc đánh giá phương pháp trích xuất:
python manage.py evaluate '<tên tập dữ liệu hình ảnh>' '<đường dẫn thư mục hình ảnh truy vấn>' '<extraction_id>' '<k>' '<loại truy vấn>'
# Thí dụ: python manage.py evaluate 'ukbench' '/home/username/query/ukbench_query_images' 1 10 'color_layout'
Trong đó:
<tên tập dữ liệu hình ảnh>
: hiện tại project hỗ trợ đánh giá hai tập dữ liệu hình ảnh làholidays
(INRIA Holidays) vàukbench
(University of Kentucky Benchmark). Người dùng có thể tuỳ chỉnh trong filecontent-based-image-retrieval/src/cbir/views/evaluate.py
<k>
là số hình ảnh đầu tiên trong kết quả tìm kiếm lấy ra để đánh giá.<loại truy vấn>
là cách thức truy vấn hình ảnh, bao gồm:image
vàcolor_layout
.