前提・実現したいこと
現在以下の環境にてWebアプリケーションを開発しています。
初のPythonを用いた開発のため稚拙な質問かと思われますがご容赦ください。
・OS:Raspberry pi
Description: Raspbian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
・使用言語:HTML、Python3.6.1
・フレームワーク等:Flask、OpenCV、Flask-SocketIO
/Users/okamotokoki/Documents/picture/スクリーンショット 2022-07-20 16.27.04.png
本Webアプリの機能は以下の通りです
1. Flaskにて、OpenCVを用いてWebカメラからリアルタイムで映像を取得
2. リアルタイム映像からWeb上に配信
3. 配信しているフレームを別サーバで取得し、解析
参考にしているサイト
こちらの二つを参考に組み合わせて実現を考えています。
https://www.rs-online.com/designspark/article-39-jp
https://qiita.com/mksamba/items/2a8a5428e088aae3e8e0
該当のソースコード
カメラを取り込んで画質やfpsを設定します。
リアルタイムでの処理を行うコードです。
camera.py
import cv2 WIDTH = 1280 HEIGHT = 960 FPS = 30 class Video(object): def __init__(self): self.video = cv2.VideoCapture(0) #cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M','J','P','G')) #self.video.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('Y','U','Y','V')) self.video.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH) self.video.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT) self.video.set(cv2.CAP_PROP_FPS, FPS) def __del__(self): self.video.release() def get_frame(self): stream, image = self.video.read() ret, jpeg = cv2.imencode(".jpg", image) return jpeg
Flaskを用いて、画像が埋め込まれたHTMLを返します。http: //localhost/にリクエストがあるとstream.htmlをレンダーする。
main.py
import cv2 from flask import Flask, render_template, Response from camera import Video app = Flask(__name__) @app.route("/") def stream(): return render_template('stream.html') def gen(camera): while True: frame = camera.get_frame() if frame is not None: yield (b"--frame\r\n" b"Content-Type: image/jpeg\r\n\r\n" + frame.tobytes() + b"\r\n") else: print("frame is none") @app.route("/video_feed") def video_feed(): return Response(gen(Video()), mimetype="multipart/x-mixed-replace; boundary=frame") if __name__ == "__main__": app.debug = True app.run(host="0.0.0.0", port=80)
stream.htmlでは、img要素のsrcにvideo_feedが指定されており、main.pyのvideo_feed()を呼ぶ。video_feed()ではgen()関数がコールバックされ顔認識処理後のフレームを受け取りレスポンスとして返す。
stream.html
<html> <head> <title>Raspberry Pi Camera Streaming</title> </head> <body> <h1>Flask Streaming Test</h1> <img src="{{ url_for('video_feed') }}"> </body> </html>
(ASE) pi@raspberrypi:~/camusb $ sudo python main.py * Serving Flask app "main" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: on * Running on http://0.0.0.0:80/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 176-589-853 - - [20/Jul/2022 09:31:18] "GET / HTTP/1.1" 200 - - - [20/Jul/2022 09:31:19] "GET / HTTP/1.1" 200 - - - [20/Jul/2022 09:31:21] "GET /video_feed HTTP/1.1" 200 -
実際にリアルタイムでの配信を確認ずみ
試したこと
別サーバ側でYolov5を実行
\yolov5>python detect.py --source "http://OOO.OOO.OOO.OOO" #ライブ配信サーバのipアドレス
リクエストが飛んでいなかった。
質問内容
・別サーバ上で処理させたいのですが手法的にFlaskを用いて実現は可能でしょうか?
・現段階で別サーバからYoloを走らせるときにリクエストが飛んでいなかったのですが問題点がわからず頓挫しています。何か他の手法等、解決策をご教授いただけませんでしょうか?
補足
こういった手法も検討しています。
https://teratail.com/questions/277582
https://lunarwoffie.com/how-to-build-a-realtime-image-processing-datascience-web-app-jp/
0 コメント