Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
11
Help us understand the problem. What is going on with this article?
@MuAuan

Flask: カメラ動画・ストリーミング配信やってみた♬

More than 1 year has passed since last update.

stream_animation.gif

動いた!!!

何が問題だったのか。。。

だよね。。。

ということでできました。

参考サイト

Video Streaming with Flask
miguelgrinberg/flask-video-streaming

環境差分ということ

なんと、上記の記事は4年も前なのに。。。ウワンはほんのひと月前に環境構築したのに。。そんなことは関係なく。。
とにかく、アプリのダウンロードはubuntu環境で。。。適当なDir配下に置きます。

$ git clone https://github.com/miguelgrinberg/flask-video-streaming.git

これで、すべての必要なファイルがダウンロードされ、flask-video-streaming 配下に配置されます。
このダウンロードした中にrequirements.txtなどという環境情報が入っています。

requirements.txt
click==6.7
Flask==0.12.2
itsdangerous==0.24
Jinja2==2.9.6
MarkupSafe==1.0
Werkzeug==0.12.2
requirements-pi.txt
。。。
picamera==1.13
requirements-opencv.txt
。。。
numpy==1.13.1
opencv-python==3.2.0.8

動かないと言っていたウワンの環境は以下の通りでした。。。

C:\Users\user>pip list
C:\Users\user>pip list
Package                            Version
---------------------------------- -----------
click                              6.6 X
Flask                              0.11.1 X
itsdangerous                       0.24 〇 
Jinja2                             2.8 X
MarkupSafe                         0.23 X
numpy                              1.14.2 △
opencv-python                      3.4.1 △
Werkzeug                           0.11.11 X

〇:満たしている △:UpperVersion X:LowerVersion

ということで、環境構築
pythonなどが動いている環境であれば、以下のコマンドで一発構築できるはず。。
--userつける前はいろいろ出るけど、以下ですんなりいきました。

ubuntu on windows
python2 環境
$ pip install Flask --user
python3 環境
$ pip3 install Flask --user

windows
python3 環境
C:\Users\user>pip install Flask --user

ここからは基本同じなので、Windows環境を記載します。
このコマンドで以下の環境になりました。

C:\Users\user>pip list
Package                            Version
---------------------------------- -----------
click                              6.6 X
Flask                              1.0.2 〇
itsdangerous                       0.24 〇
Jinja2                             2.10 〇
MarkupSafe                         0.23 X 
numpy                              1.14.2 △
opencv-python                      3.4.1 △
Werkzeug                           0.14.1 △

clickとMarkupSafeが満たしていませんが、。。まずは放置しました。

そして、実行

...>flask-video-streaming>python app.py

なんの苦労もなく動きました!

ちなみにcamera.pyのsleep(1)を以下のように削除すると、。。。2fpsくらい

camera.py
class Camera(BaseCamera):
    """An emulated camera implementation that streams a repeated sequence of
    files 1.jpg, 2.jpg and 3.jpg at a rate of one frame per second."""
    imgs = [open(f + '.jpg', 'rb').read() for f in ['1', '2', '3']]

    @staticmethod
    def frames():
        while True:
            #time.sleep(1)
            yield Camera.imgs[int(time.time()) % 3]

そして、どうせシークエンスに動いているので演算やめて、
以下のようにすると。。。すごく速くなった
※10fpsは超えていると思う

    @staticmethod
    def frames():
        while True:
            #time.sleep(1)
            yield Camera.imgs[0]
            yield Camera.imgs[1]
            yield Camera.imgs[2]

ということで計測しました。

    @staticmethod
    def frames():
        start_time=time.time()
        i=0
        while True:
            yield Camera.imgs[i%3]
            time.sleep(0.1) #0.1をいろいろ変える
            i += 1
            if int(time.time()-start_time)>=10:
                print("i=",i,"fps=",i/10)
                break

以下のとおりな結果でした。読み込まれた画像については、かなり優秀
ただし、これはあくまで関数内でのyieldしているカウント数から見ており、実際はこれ以上のfpsもやってみたが、出力はカクカク乱れて見えた。
以下の通り、この範囲(0.02あたりまで)はグラフも直線的に見える。
※このあたりから別のボトルネックが発生しているようである

wait fps
0.008 118.2
0.01 95.6
0.02 48.3
0.05 18.02
0.1 9.32
0.2 4.84
0.5 1.98
1 1.00
2 0.50
5 0.20

fpsvswait2.jpg

そして、注意!

 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.

ということで、商用環境には使わないでね。。。WSGI
とりあえず、。。ゆっくりやっていこう
【参考】
WSGIとPythonでスマートなWebアプリケーション開発を
Full Stack Python

以下に性能改善とWSGIの話がある
Flask Video Streaming Revisited

まとめ

・Flask:画像・ストリーミングが出来た
 あらためて、環境を意識して開発すべきを肝に銘じた

・実際のカメラ画像でいろいろ遊んでみようと思う

【追記】

カメラ動画・Streaming配信は以下の変更で簡単に出来ました!
※変更は、以下のとおり、camera ⇒ camera_opencv

app.py
else:
    from camera_opencv import Camera

安定した動画が配信できています。
ちなみに、RasPiでPicameraも同様にできた。
以下、ちょっと動画配信の記録。。。
doga_streaming.jpg

これで、リアルタイム物体検出Streaming配信もできそう。。。

11
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
MuAuan
2021年為になる記事にする 記事420いいね2000フォロワー200 2020年;いい記事を書く 記事359/350いいね1590/1500フォロワ ー144/150 2019年 記事275/300いいね1035/1000フォロワー97/100 2018年 記事140/200いいね423/500フォロワー48/50 7/8/2018 記事90いいね227フォロワー25

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
11
Help us understand the problem. What is going on with this article?