Привет! Сегодня мы создадим API машинного обучения, используя YOLOv5 и FAST API.

Если вы раньше использовали Flask, вам будет легко работать с FAST API, поскольку он предоставляет готовый к работе код с минимальным количеством настроек.

FAST API также поставляется с автоматической интерактивной документацией с OpenAPI. Помимо лучшего опыта разработчиков, ASGI (интерфейс асинхронного серверного шлюза) сделал FAST API одним из самых быстрых доступных фреймворков Python.

Что такое YOLOv5?

YOLOv5 — это семейство архитектур и моделей обнаружения объектов, предварительно обученных на наборе данных COCO, и представляет собой исследование с открытым исходным кодом Ultralytics будущих методов искусственного интеллекта для зрения, включающее извлеченные уроки и лучшие практики, полученные за тысячи часов исследований и разработок.



YOLO расшифровывается как «Вы смотрите только один раз» и представляет собой модель глубокого обучения, которая является быстрой и эффективной, поскольку использует детектор одиночного снимка (SSD) и детектор объектов YOLO для разделения входного изображения на сетку SxS.

Вы можете увидеть впечатляющее сравнение YOLOv5 ниже:

Используемая технология

  1. FastAPI для обслуживания API аутентификации с асинхронным паттерном.
  2. OpenAPI (ранее известный как swagger) для документирования спецификации API.
  3. Докер для сборки образов контейнеров.

Шаг 0: Подготовьте свою индивидуальную модель YOLOv5

Для обучения распознаванию пользовательских объектов с помощью YOLOv5 вы можете перейти по ссылке ниже:



Вы можете обойтись без этого шага, используя мою собственную модель машинного обучения. Модель поддерживает обнаружение 6 видов продуктов, включая куриные крылышки, пончики, картофель фри, гёзу, хот-дог и вафли.

Шаг 1: Клонируйте или загрузите проект Github

Перейдите на https://github.com/DanielChuDC/yolov5-fastapi, чтобы клонировать или загрузить проект. Извлеките загруженный zip-файл.

Справочник объяснил:

.
├── Dockerfile # For containerised this application
├── README.md
├── main.py # The entry point of the program
├── model
│   ├── __init__.py
│   └── best.pt # Where you custom training model place
├── requirements.in # To generate requirements.txt
├── requirements.txt # Usage: pip install -r requirements.txt
├── segmentation.py # for import local yolov5 and scale image
└── yolov5 # Get from https://github.com/ultralytics/yolov5

main.py — это точка входа приложения. Здесь мы определим 3 конечные точки и разрешим загрузку файлов с байтами в FAST API:

from fastapi import FastAPI, File
from segmentation import get_yolov5, get_image_from_bytes
from starlette.responses import Response
import io
from PIL import Image
import json
from fastapi.middleware.cors import CORSMiddleware
model = get_yolov5()
app = FastAPI(
    title="Custom YOLOV5 Machine Learning API",
    description="""Obtain object value out of image
    and return image and json result""",
    version="0.0.1",
)
origins = [
    "http://localhost",
    "http://localhost:8000",
    "*"
]
app.add_middleware(
     CORSMiddleware,
     allow_origins=origins,
     allow_credentials=True,
     allow_methods=["*"],
     allow_headers=["*"],
)

@app.get('/notify/v1/health')
def get_health():
    return dict(msg='OK')

@app.post("/object-to-json")
async def detect_food_return_json_result(file: bytes = File(...)):
    input_image = get_image_from_bytes(file)
    results = model(input_image)
    detect_res = results.pandas().xyxy[0].to_json(orient="records")
    detect_res = json.loads(detect_res)
    return {"result": detect_res}

@app.post("/object-to-img")
async def detect_food_return_base64_img(file: bytes = File(...)):
    input_image = get_image_from_bytes(file)
    results = model(input_image)
    results.render()  # updates results.imgs with boxes and labels
    for img in results.imgs:
        bytes_io = io.BytesIO()
        img_base64 = Image.fromarray(img)
        img_base64.save(bytes_io, format="jpeg")
    return Response(content=bytes_io.getvalue(),
media_type="image/jpeg")

segmentation.py определяет 2 метода:

  1. get_yolov5(): здесь yolov5 может использовать пользовательскую модель. Обратите внимание на model.conf=0.5 , это означает, что в возвращаемом результате будут отображаться только те обнаруженные объекты с уровнем достоверности более 0,5.
  2. get_image_from_bytes(): здесь размер изображения изменился.
import torch
from PIL import Image
import io
def get_yolov5():
    model = torch.hub.load('./yolov5', 'custom', path='./model/best.pt', source='local')
    model.conf = 0.5
    return model
def get_image_from_bytes(binary_image, max_size=1024):
    input_image =Image.open(io.BytesIO(binary_image)).convert("RGB")
    width, height = input_image.size
    resize_factor = min(max_size / width, max_size / height)
    resized_image = input_image.resize((
        int(input_image.width * resize_factor),
        int(input_image.height * resize_factor)
    ))
    return resized_image

Шаг 2: Поместите пользовательский файл best.pt в папку модели в каталоге проекта.

После обучения пользовательской модели у вас будет пользовательская модель с именем best.pt . Замените best.pt в папке model.

Шаг 3: Запустите проект этой командой

Выполните следующую команду в терминале

uvicorn main:app --reload --host 0.0.0.0 --port 8000

Если вы видите подобный результат ниже, это означает успешный запуск проекта.

Вы можете установить требуемый пакет, запустив pip install -r requirements.txt, если вы столкнулись с какой-либо ошибкой, связанной с отсутствующим пакетом.

Шаг 4: Проверьте результат

Перейдите к http://0.0.0.0:8000/docs#/ в вашем браузере. Вы должны увидеть схему Open API, которая имеет 3 конечных точки:

  1. /notify/v1/health — Эта конечная точка предназначена для проверки readinessProbe и livenessProbe Kubernetes.

Вы можете выполнить конечную точку, нажав кнопку try it out.

Ожидаемый результат: {"msg": "OK"} с кодом состояния 200.

2. /object-to-json — Эта конечная точка предназначена для возврата значения обнаруженного объекта в формате JSON.

Вы можете выполнить конечную точку, нажав кнопку try it out и загрузив изображение.

Ожидаемый результат: {"result": []} с кодом состояния 200. Если модель обнаружила значение более 0,5, оно будет добавлено в массив.

Примечание. Если вы использовали свои обычаи best.pt, обнаруженный объект может быть другим.

3./object-to-imgЭта конечная точка предназначена для возврата значения обнаруженного объекта в формате изображения.

Вы можете выполнить конечную точку, нажав кнопку try it out и загрузив изображение.

Ожидаемый результат — помеченное изображение с обнаруженным пищевым объектом с кодом состояния 200. Если модель обнаружит что-то с более чем 0,5, оно появится с меткой и рамкой.

Примечание. Если вы использовали свои обычаи best.pt, обнаруженный объект может быть другим.

Шаг 5. Встройте этот проект в образ контейнера для микросервиса.

Мы зашли так далеко! Давайте встроим этот проект в образ контейнера.

Откройте docker desktop и дождитесь готовности.

Докерфайл

FROM tiangolo/uvicorn-gunicorn:python3.9-slim
LABEL maintainer="danielchu"ENV WORKERS_PER_CORE=4
ENV MAX_WORKERS=24
ENV LOG_LEVEL="warning"
ENV TIMEOUT="200"
RUN mkdir /yolov5-fastapi
COPY requirements.txt /yolov5-fastapi
COPY . /yolov5-fastapi
WORKDIR /yolov5-fastapi
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

Теперь создайте образ, запустив

docker build -t yolov5-fastapi:0.0.1 .

Если вы видите результат, подобный показанному на скриншоте ниже, значит, образ создан успешно!

Вы можете запустить образ контейнера,

docker run -p 8080:8000 yolov5-fastapi:0.0.1

Заключение

В этой статье мы создали API модели машинного обучения с помощью YOLOv5 и FAST API. Это приложение подходит для обнаружения объектов, позволяя загружать изображения и получать результаты в формате JSON или изображения.

Это приложение также подходит для облачного развертывания с использованием образа контейнера.

Мы можем еще больше улучшить этот проект, сохранив обнаруженный результат в базе данных для улучшения машинного обучения. Но это история в другой раз.

Если вы заинтересованы в создании API аутентификации с использованием FAST API, вы можете перейти по ссылке ниже: