当前位置:   article > 正文

使用FastAPI构建机器学习API

fastapi api

FastAPI是用于在Python中构建API的高性能异步框架。
它提供了对Swagger UI开箱即用的支持。

该博客的源代码可用https://github.com/aniketmaurya/tensorflow-web-app-starter-pack

让我们从一个简单的hello-world示例开始

首先,我们导入FastAPIclass并创建一个object app。此类具有有用的参数,例如我们可以传递Swagger UI的标题和描述。

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

我们定义一个函数并用修饰它@app.get。这意味着我们的API /index支持GET方法。此处定义的函数是async,FastAPI通过为常规def函数创建线程池来自动处理async,而无需使用async方法,并且async事件循环用于async函数。

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

金字塔支持

FastAPI提供的我最喜欢的功能之一是Pydantic支持。我们可以定义Pydantic模型,并且FastAPI将为这些模型处理请求-响应。
让我们创建一个COVID-19症状检查器API来理解这一点。

Covid-19(新冠肺炎)症状检查器API

我们创建一个请求主体,它是客户端发送请求的格式。它将由Swagger UI使用。

  1. from pydantic import BaseModel
  2. class Symptom(BaseModel):
  3. fever: bool = False
  4. dry_cough: bool = False
  5. tiredness: bool = False
  6. breathing_problem: bool = False

让我们创建一个函数,根据输入分配风险级别。

这仅用于学习,不应在现实生活中使用,最好请教医生。

  1. def get_risk_level(symptom: Symptom):
  2. if not (symptom.fever or symptom.dry_cough or symptom.tiredness or symptom.breathing_problem):
  3. return 'Low risk level. THIS IS A DEMO APP'
  4. if not (symptom.breathing_problem or symptom.dry_cough):
  5. if symptom.fever:
  6. return 'moderate risk level. THIS IS A DEMO APP'
  7. if symptom.breathing_problem:
  8. return 'High-risk level. THIS IS A DEMO APP'
  9. return 'THIS IS A DEMO APP'

让我们创建用于检查症状的API

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

图像识别API

我们将创建一个API来对图像进行分类,我们将其命名为predict/image
我们将使用Tensorflow创建图像分类模型。

使用Tensorflow进行图像分类的教程

我们创建一个函数load_model,该函数将返回具有预先训练的权重的MobileNet CNN模型,即,它已经过训练,可以对1000种独特的图像类别进行分类。

  1. import tensorflow as tf
  2. def load_model():
  3. model = tf.keras.applications.MobileNetV2(weights="imagenet")
  4. print("Model loaded")
  5. return model
  6. model = load_model()

我们定义了一个predict函数,该函数将接受图像并返回预测。
我们将图像调整为224x224并将像素值标准化为[-1,1]。

from tensorflow.keras.applications.imagenet_utils import decode_predictions

decode_predictions用于解码预测对象的类名称。
在这里,我们将返回前2个可能的类。

  1. def predict(image: Image.Image):
  2. image = np.asarray(image.resize((224, 224)))[..., :3]
  3. image = np.expand_dims(image, 0)
  4. image = image / 127.5 - 1.0
  5. result = decode_predictions(model.predict(image), 2)[0]
  6. response = []
  7. for i, res in enumerate(result):
  8. resp = {}
  9. resp["class"] = res[1]
  10. resp["confidence"] = f"{res[2]*100:0.2f} %"
  11. response.append(resp)
  12. return response

现在,我们将创建一个/predict/image支持文件上传的API 。我们将过滤文件扩展名以仅支持jpg,jpeg和png格式的图像。

我们将使用枕头Pillow加载图像。

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

最终代码

  1. import uvicorn
  2. from fastapi import FastAPI, File, UploadFile
  3. from application.components import predict, read_imagefile
  4. app = FastAPI()
  5. @app.post("/predict/image")
  6. async def predict_api(file: UploadFile = File(...)):
  7. extension = file.filename.split(".")[-1] in ("jpg", "jpeg", "png")
  8. if not extension:
  9. return "Image must be jpg or png format!"
  10. image = read_imagefile(await file.read())
  11. prediction = predict(image)
  12. return prediction
  13. @app.post("/api/covid-symptom-check")
  14. def check_risk(symptom: Symptom):
  15. return symptom_check.get_risk_level(symptom)
  16. if __name__ == "__main__":
  17. uvicorn.run(app, debug=True)

FastAPI文档是了解更多有关框架核心概念的最佳场所。(https://fastapi.tiangolo.com/)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/824952
推荐阅读
相关标签
  

闽ICP备14008679号