Время прочтения: 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 запроса на наш микросервис, в нашем случае на обработку изображения.