[Python] FAST API란?

who_am_I·2024년 4월 12일

[Upstage AI Lab]

목록 보기
5/19
post-thumbnail

Upstage 교육에서 FastAPI를 접하였는데 요즘 백엔드씬,AI씬에서 꽤나 각광받는 web framework 이다. 백엔드에 대한 경험을 해보고 싶고 궁금했는데 FastAPI가 입문하는 계기가 되었다.

pip install python-multipart
pip install fastapi
pip install uvicorn
pip install tensorflow

장점

1. 빠르다

  • Starlettepydantic 라이브러리를 사용해서 속도가 빠르다. 그래서 대용량의 데이터를 다루는 ML 모델을 deploy할 때 유용하다

  • async / await 문으로 비동기처리(Asynchronous Processing) : 어려운 task과 쉬운 task를 분리해서 쉬운 task 먼저 실행하도록 한다

2. 쉽다

  • Python 언어만 사용한다
  • 백엔드 몰라도 서버를 만들 수 있고 문서 형태까지 제공해서 모델을 쉽게 배포할 수 있다

FAST-API test : 이미지 분류 (골든리트리버 강아지)

모델 불러오기 - model_loader.py


import tensorflow as tf

# 모델을 불러오기
def load_model():
    model = tf.keras.applications.MobileNetV2(weights = 'imagenet')
    print("Successfully loaded model")
    return model

model = load_model()

다른 모델은 여기를 참고! MovileNet의 성능이 가장 우수한편
https://www.tensorflow.org/api_docs/python/tf/keras/applications

예측결과 가져오기 - predict.py

# input data 전처리

from PIL.Image import Image # pip install pillow
from model_loader import model

# 이미지 사이즈 224 * 224로 조절 => Numpy array로 변환
def predict(image:Image):

    image = np.asarray(image.resize((224,224)))[...,:3] # 3가지 RGB 만 선택
    image = np.expand_dims(image, 0)
    image = (image / 127.5) -1 # 정규화작업 (이미지 픽셀이 0~255 => -1~1)

    results= tf.keras.applications.imagenet_utils.decode_predictions(
        model.predict(image) , 10
    )[0]  # top 10 결과에 대해 확률값만 추출

    print(results)

    # API 생성하는 부분 => {'key':'value','key':'value','key':'value}

    result_list = []
    for i in results:
        result_list.append({
            'class' : i[1], # class name
            'confidence' : f'{i[2]*100:0.2f}%', # 정확도 %
        })
    
    return result_list

FastAPI로 model deploy하기 : main.py

from fastapi import FastAPI, UploadFile, File
app = FastAPI()
app.include_router(books_router) 

from PIL import Image
from io import BytesIO
from predict import predict # predict.py

@app.post("/predict/image")

async def predict_image(file:UploadFile = File(...)):
    img = Image.open(BytesIO(await file.read()))
    result = predict(img)
    
    return result

# 파이썬 동기화 문제 -> 비동기화 async await 로 해결
 


if __name__ == "__main__":  # python main.py
    import uvicorn # ASGI server execute
    uvicorn.run("main:app",reload = True)


이렇게 실행하면 다음과 같이 서버주소가 나오는데

서버 주소 / docs 로 이동하면 이렇게 모델을 평가해볼 수 있는 페이지로 연결된다 원하는 이미지를 파일선택 해주면 다음과 같이 결과를 확인할 수 있다!

입력한 이미지는 이 친구였다. 너 골든리트리버 맞지...?

추가

  • Fast API 맛보기로 해보았고 더 꾸며볼수도 있고 데이터베이스를 연동해서 다양한 프로젝트를 진행할 수 있다

  • 점프투 FAST API 책을 보며 더 공부해보자 https://wikidocs.net/175214

profile
Data, AI

0개의 댓글