Рубрики
Без рубрики

API строительства машинного обучения с FASTAPI

Fastapi-это высокопроизводительная асинхронная структура для строительства API в Python. Он обеспечивает поддержку … Tagged с помощью Tensorflow, Webdav, Python, Machine Learning.

Fastapi-это высокопроизводительная асинхронная структура для строительства API в Python. Он обеспечивает поддержку Swagger UI из коробки.

Исходный код для этого блога доступен aniketmaurya/tensorflow-fastapi-starter-pack

Сначала мы импортируем FASTAPI класс и создайте объект приложение . Этот класс имеет полезный параметры Как мы можем передать название и описание для Swagger UI.

from fastapi import FastAPI
app = FastAPI(title='Hello world', description='This is a hello world example', version='0.0.1')

Мы определяем функцию и украшаем ее @app.get . Это означает, что наш API /index поддерживает метод получить. Функция, определенная здесь, Асинхронизация , FASTAPI автоматически заботится о Async и без асинхронных методов, создавая пул потоков для обычных функций DEF, и использует асинхродиционный цикл событий для асинхронных функций.

@app.get('/index')
async def hello_world():
    return "hello world"

Одной из моих любимых функций, предлагаемых Fastapi, является поддержка Pydantic. Мы можем определить модели Pydantic, и запрос-ответ будет обрабатываться Fastapi для этих моделей. Давайте создадим API Checker Covid-19 Simply API, чтобы понять это.

API COVID-19 Проверка симптомов API

Мы создаем тело запроса, это формат, в котором клиент должен отправлять запрос. Он будет использоваться Swagger UI.

from pydantic import BaseModel

class Symptom(BaseModel):
    fever: bool = False
    dry_cough: bool = False
    tiredness: bool = False
    breathing_problem: bool = False

Давайте создадим функцию для назначения уровня риска на основе входов.

Это просто для обучения и не должно использоваться в реальной жизни, лучше проконсультируйтесь с врачом.

def get_risk_level(symptom: Symptom):
    if not (symptom.fever or symptom.dry_cough or symptom.tiredness or symptom.breathing_problem):
        return 'Low risk level. THIS IS A DEMO APP'

    if not (symptom.breathing_problem or symptom.dry_cough):
        if symptom.fever:
            return 'moderate risk level. THIS IS A DEMO APP'

    if symptom.breathing_problem:
        return 'High-risk level. THIS IS A DEMO APP'

    return 'THIS IS A DEMO APP'

Давайте создадим API для проверки симптомов

@app.post('/api/covid-symptom-check')
def check_risk(symptom: Symptom):
    return get_risk_level(symptom)

Мы создадим API для классификации изображений, мы называем его прогноз/изображение . Мы будем использовать TensorFlow для создания модели классификации изображений.

Учебник для Классификация изображений с TensorFlow

Мы создаем функцию load_model , который вернет модель Mobilenet CNN с предварительно обученными весами, то есть она уже обучена классифицировать 1000 уникальных категорий изображений.

import tensorflow as tf

def load_model():
    model = tf.keras.applications.MobileNetV2(weights="imagenet")
    print("Model loaded")
    return model

model = load_model()

Мы определяем прогнозировать функция, которая примет изображение и возвращает прогнозы. Мы изменяем размер изображения на 224×224 и нормализуем значения пикселей, чтобы быть в [-1, 1] .

from tensorflow.keras.applications.imagenet_utils import decode_predictions

decode_predictions используется для декодирования имени класса прогнозируемого объекта. Здесь мы вернемся на вероятный класс Топ-2.

def predict(image: Image.Image):

    image = np.asarray(image.resize((224, 224)))[..., :3]
    image = np.expand_dims(image, 0)
    image = image / 127.5 - 1.0

    result = decode_predictions(model.predict(image), 2)[0]

    response = []
    for i, res in enumerate(result):
        resp = {}
        resp["class"] = res[1]
        resp["confidence"] = f"{res[2]*100:0.2f} %"

        response.append(resp)

    return response

Теперь мы создадим API /прогноз/изображение который поддерживает загрузку файлов. Мы будем отфильтровать расширение файла для поддержки только JPG, JPEG и PNG -формата изображений.

Мы будем использовать подушку для загрузки загруженного изображения.

def read_imagefile(file) -> Image.Image:
    image = Image.open(BytesIO(file))
    return image
@app.post("/predict/image")
async def predict_api(file: UploadFile = File(...)):
    extension = file.filename.split(".")[-1] in ("jpg", "jpeg", "png")
    if not extension:
        return "Image must be jpg or png format!"
    image = read_imagefile(await file.read())
    prediction = predict(image)

    return prediction
import uvicorn
from fastapi import FastAPI, File, UploadFile

from application.components import predict, read_imagefile

app = FastAPI()

@app.post("/predict/image")
async def predict_api(file: UploadFile = File(...)):
    extension = file.filename.split(".")[-1] in ("jpg", "jpeg", "png")
    if not extension:
        return "Image must be jpg or png format!"
    image = read_imagefile(await file.read())
    prediction = predict(image)

    return prediction


@app.post("/api/covid-symptom-check")
def check_risk(symptom: Symptom):
    return symptom_check.get_risk_level(symptom)


if __name__ == "__main__":
    uvicorn.run(app, debug=True)

Документация FASTAPI это лучшее место, чтобы узнать больше о основных концепциях структуры.

Надеюсь, вам понравилась статья.

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

👉 Twitter: https://twitter.com/aniketmaurya

👉 LinkedIn: https://linkedin.com/in/aniketmaurya

Оригинал: “https://dev.to/aniketmaurya/building-machine-learning-api-with-fastapi-2ecl”