Привет! Сегодня мы создадим API машинного обучения, используя YOLOv5 и FAST API.
Если вы раньше использовали Flask, вам будет легко работать с FAST API, поскольку он предоставляет готовый к работе код с минимальным количеством настроек.
FAST API также поставляется с автоматической интерактивной документацией с OpenAPI. Помимо лучшего опыта разработчиков, ASGI (интерфейс асинхронного серверного шлюза) сделал FAST API одним из самых быстрых доступных фреймворков Python.
Что такое YOLOv5?
YOLOv5 — это семейство архитектур и моделей обнаружения объектов, предварительно обученных на наборе данных COCO, и представляет собой исследование с открытым исходным кодом Ultralytics будущих методов искусственного интеллекта для зрения, включающее извлеченные уроки и лучшие практики, полученные за тысячи часов исследований и разработок.
YOLO расшифровывается как «Вы смотрите только один раз» и представляет собой модель глубокого обучения, которая является быстрой и эффективной, поскольку использует детектор одиночного снимка (SSD) и детектор объектов YOLO для разделения входного изображения на сетку SxS.
Вы можете увидеть впечатляющее сравнение YOLOv5 ниже:
Используемая технология
- FastAPI для обслуживания API аутентификации с асинхронным паттерном.
- OpenAPI (ранее известный как swagger) для документирования спецификации API.
- Докер для сборки образов контейнеров.
Шаг 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 метода:
get_yolov5()
: здесь yolov5 может использовать пользовательскую модель. Обратите внимание наmodel.conf=0.5
, это означает, что в возвращаемом результате будут отображаться только те обнаруженные объекты с уровнем достоверности более 0,5.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 конечных точки:
/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, вы можете перейти по ссылке ниже: