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”