Время прочтения: 4 мин.

В данной публикации рассмотрим создание микросервисного приложения для распознавания лиц и подсчет их количества с помощью таких инструментов, как библиотека OpenCV и Flask для Python и Postman для тестирования запросов.

Прежде чем работать с изображением, его нужно преобразовать в тип Base64 для последующей отправки POST запроса. Для этого пишем скрипт.

Импортируем необходимые для работы библиотеки:

import base64 
import json
import os

Узнаем, в какой директории находится файл, создаем путь к файлу, где находится скрипт:

a = os.path.basename(__file__)
b = os.path.abspath(__file__).replace(a, '')
name = input ('Название картинки в этой же директории: ')

Используя путь до скрипта, находим img файл (картинка) и преобразуем изображение в Base64:

with open(b + name, "rb") as image_file:
encoded_string1 = base64.b64encode(image_file.read())

Приводим к кодировке utf-8, создаем словарь с ключом img и значением переменной encoded_string:

encoded_string = encoded_string1.decode("utf-8")
jsn = {'img':encoded_string}

Далее сохраняем все в json файл:

with open(b + name + '.json','w') as file:
    json.dump(jsn, file)

Переходим к написанию одного из основных скриптов, где будет обрабатываться img файл.

Импортируем необходимые для работы библиотеки:

import cv2
import base64

Создаем функцию с параметрами, где первый – изображение в формате Base64, а второй – файл с результатом:

def find(encoded_string,finish_file):
    base64_image = str.encode(encoded_string)

Создаем пустое изображение, в которое в дальнейшем поместим готовый результат:

    with open("new_py.png", "wb") as fh:
        fh.write(base64.decodebytes(base64_image))

Подгружаем готовый каскад из библиотеки OpenCV, переводим изображение в черно-белый вид и указываем определенные параметры:

image_path = "new_py.png"
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
    image = cv2.imread(image_path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(
        gray,
        scaleFactor = 1.08, 
        minNeighbors = 6,
        minSize = (10, 10)

# scaleFactor = 1.08 –  Значение, которое показывает на сколько изменился (уменьшился) размер изображения на каждый масштаб. Применяется при создании масштабной пирамиды.

 # minNeighbors = 6 – Значение, которое показывает на количество соседей, необходимое для сохранения каждого прямоугольника-кандидата (чем выше, тем больше точность).

 # minSize = (10, 10) –  Значение, которое показывает min-возможную величину объекта. Все объекты меньшего значения не рассматриваются.

#  создается строка на изображении с числом
    faces_detected = "Лиц обнаружено: " + format(len(faces))

Далее рисуем квадраты вокруг лиц:

for (x, y, w, h) in faces:
      cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2)
    cv2.putText(image, faces_detected, (20,60), cv2.FONT_HERSHEY_COMPLEX, 2, 3, 2)

И записываем результат в ранее созданное пустое изображение:

cv2.imwrite(finish_file, image)
  return image, faces_detected

Переходим к написанию заключительного скрипта, в котором выполняется функция вывода результата и старт работы микросервиса.

Импортируем библиотеки:

from flask import Flask,request,send_file
import os
from convet import find
app  = Flask(__name__)

Создаем каталог для запроса, указываем его тип:

@app.route('/recognize',methods=['POST'])

Сама функция вывода результата:

def printing():
    a = os.path.basename(__file__)
    b = os.path.abspath(__file__).replace(a, '')
    final_file = b + "picture.jpeg"
    jsn = request.get_json()
    picture_base64 = jsn['img']
    img, face_text = find(picture_base64,final_file)
    return send_file(final_file, mimetype='image/gif')

Функция, запускающая основную функцию старта работы микросервиса:

if __name__ == '__main__':
    app.run(debug = False)

Переходим к тестированию. Для начала найдем в интернете фотографию, которую будем обрабатывать. После чего преобразуем её в тип Base64 с помощью ранее написанного скрипта. Результат мы получаем в json файле в той же папке, где находится скрипт.

Запускаем наш микросервис.

Переходим в Postman для отправки POST запроса на обработку изображения.

После чего в той же папке получаем обработанное изображение.

Таким образом, было продемонстрировано создание микросервисного приложения для распознавания лиц при помощи библиотек Flask и OpenCV для Python. Один из самых основных плюсов микросервисной архитектуры в отличие от монолита – повышение отказоустойчивости, так как если, например, монолит отключается в случае с неисправностью полностью, то с микросервисной архитектурой перестает работать только какая-то определенная часть, но не вся система.

Также была показана работа с Postman, отправка POST запроса на наш микросервис, в нашем случае на обработку изображения.