96 lines
2.8 KiB
Python
96 lines
2.8 KiB
Python
from fastapi import FastAPI, HTTPException
|
|
from pydantic import BaseModel
|
|
import asyncio
|
|
import uvicorn
|
|
|
|
import uuid
|
|
import time
|
|
import sdtcloudpubsub
|
|
import logging.handlers
|
|
import glob
|
|
import traceback
|
|
# Communication use grpc
|
|
import grpc
|
|
import grpc.aio
|
|
import utils.image_pb2 as pb2
|
|
import utils.image_pb2_grpc as pb2_grpc
|
|
|
|
###############################################
|
|
# Logger Setting #
|
|
###############################################
|
|
logger = logging.getLogger()
|
|
logger.setLevel(logging.INFO)
|
|
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
|
|
|
log_fileHandler = logging.handlers.RotatingFileHandler(
|
|
filename=f"./logs/log_request.log",
|
|
maxBytes=1024000,
|
|
backupCount=3,
|
|
mode='a')
|
|
|
|
log_fileHandler.setFormatter(formatter)
|
|
logger.addHandler(log_fileHandler)
|
|
|
|
###############################################
|
|
# MQTT Setting #
|
|
###############################################
|
|
sdtcloud = sdtcloudpubsub.sdtcloudpubsub()
|
|
sdtcloud.setClient(f"device-app-{uuid.uuid1()}") # parameter is client ID(string)
|
|
|
|
###############################################
|
|
# FastAPI instance #
|
|
###############################################
|
|
app = FastAPI()
|
|
|
|
###############################################
|
|
# grpc client #
|
|
###############################################
|
|
|
|
async def upload_image(stub, filename):
|
|
with open(filename, 'rb') as f:
|
|
image_data = f.read()
|
|
response = await stub.UploadImage(pb2.ImageRequest(filename=filename, image_data=image_data))
|
|
print(response.message)
|
|
print(f"Inference result: {response.inference_result}")
|
|
return response
|
|
|
|
async def run(image_path):
|
|
async with grpc.aio.insecure_channel('localhost:50051') as channel:
|
|
stub = pb2_grpc.ImageServiceStub(channel)
|
|
response = await upload_image(stub, image_path)
|
|
return response
|
|
|
|
|
|
class ImagePathRequest(BaseModel):
|
|
image_path: str = "./data/test_1.jpg"
|
|
|
|
# FastAPI endpoint
|
|
@app.post("/upload_image/")
|
|
async def upload_image_endpoint(request: ImagePathRequest):
|
|
start_time = time.time()
|
|
try:
|
|
response = await run(request.image_path)
|
|
logger.info('Successfully requested!')
|
|
end_time = time.time()
|
|
data = {
|
|
"processingTime": end_time - start_time
|
|
}
|
|
|
|
print(f"#### Topic: {sdtcloud.topic}")
|
|
print(f"#### DATA: {data}")
|
|
sdtcloud.pubReqMessage(data)
|
|
|
|
return {
|
|
"message": response.message,
|
|
"inference_result": response.inference_result
|
|
}
|
|
except Exception as e:
|
|
logger.error(traceback.format_exc())
|
|
raise HTTPException(status_code=500, detail="Internal Server Error")
|
|
|
|
if __name__ == '__main__':
|
|
uvicorn.run("main:app", host="0.0.0.0", port=8888, reload=True)
|
|
|
|
|
|
|