之前還沒有很瞭接怎麼把YOLO偵測的東西用在網頁上,想問一下現在這樣的架構是否是對的呢?
app.py
from flask import Flask, jsonify, request, render_template, send_file
import torch
import numpy as np
import cv2
import io
app = Flask(__name__)
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
@app.route('/api/yolo', methods=['POST'])
def yolo_api():
# 獲取圖像資料
image_file = request.files['image']
image = cv2.imdecode(np.frombuffer(image_file.read(), np.uint8), cv2.IMREAD_COLOR)
image = cv2.resize(image, (800, 480))
# 執行模型
results = model(image)
# 獲取檢測結果的圖像
output_image = np.squeeze(results.render())
# 將圖像轉換為位元組流
_, image_stream = cv2.imencode('.jpg', output_image)
# 建立記憶體檔案物件
output_stream = io.BytesIO(image_stream.tobytes())
# 將圖像檔案傳送給模板進行顯示
return send_file(output_stream, mimetype='image/jpeg')
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
index.html
<!DOCTYPE html>
<html>
<head>
<title>YOLO API</title>
<style>
body {
font-family: Arial, sans-serif;
}
h1 {
color: #333;
}
</style>
</head>
<body>
<h1>來偵測囉</h1>
<form action="/api/yolo" method="post" enctype="multipart/form-data">
<input type="file" name="image">
<button type="submit">Submit</button>
</form>
</body>
</html>
建議如下:
1.可以考慮把yolo部份抽離,寫個class,以後要抽換比較簡單。
2.因為輸入有做resize,所以輸出要再resize回來,不然圖片會變形!