再生中の動画の各フレームに、物体検出をリアルタイムに実行してみた


以下の方法を行うと、元の動画ファイルに対する処理が、工程「３」まで終わる間の時間、解析結果の動画を見ることができません。

1. 動画ファイルから、各タイムフレームの静止画ファイルを切り出す。
2. 「1」で切り出した各静止画ファイル、一ファイル毎に、順次、一般物体認識器を適用する。
-> 「2」の結果、画面内に検出された物体の輪郭領域が矩形表示された静止画ファイルの束が、吐き出される。
3. 吐き出された各静止画ファイルを、タイムフレーム順に連結する。
4. 連結されたファイルの各コマ（各タイムフレームの静止画）をパラパラめくり、動画として閲覧する。

今回は、**手元の動画ファイルを再生させながら、再生中の（各タイムフレームの）静止画に対して**、リアルタイムに、次の2つの処理を行うスクリプトを動かしてみました。

__（１） 物体検出処理__
__（２） 物体の輪郭（矩形）領域の枠表示処理__


##解析対象の動画ファイル

今回は、YouTubeにある次の動画を、youtube-dlで取得したMP4ファイル、題材として使用しました。

- [【和訳】大統領の登場にブーイングの嵐、そして... | AGT 2017](https://www.youtube.com/watch?v=JehluvQRPe4)

##出力された動画 

動画（MP4）ファイルの格納パスを、Pythonスクリプトファイルに対して、コマンドライン引数で渡してエンターキーを押すと、Macbookの画面ウィンドウが即座に立ち上がり、**物体ラベルが重畳表示**された状態の**動画**が再生され始めました。

事前に、動画ファイル（元ファイル）に対する工程１〜４の解析処理を行うことで、元ファイルとは別に、解析済みの動画ファイルを生成するという事前作業を行うことなく、いきなり、**物体ラベルが重畳表示**された状態の**動画**を再生・閲覧することができました。

この記事では、上述の動画ファイルから、画面キャプチャで切り取ったスナップショットを、いくつか掲載します。

![スクリーンショット 2021-07-12 18.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/0cade33a-a363-269a-7bf2-c1568ef6bd5c.png)

![スクリーンショット 2021-07-12 18.55.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/5b12ea7a-a329-12b6-63fb-2128ae0f9b04.png)

![スクリーンショット 2021-07-12 18.55.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/3592997e-31db-63df-9168-2f5f07b44f56.png)

![スクリーンショット 2021-07-12 18.55.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/acfc382e-512a-68bc-ec6f-edd8106e9b55.png)

![スクリーンショット 2021-07-12 18.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/d4c43870-4ab3-a168-c312-11855f99558a.png)

##参考にしたウェブページ

- [パソコン関連もろもろ 「動画ファイルに対して物体検出（yolo3_mobilenet1.0_coco）」](https://touch-sp.hatenablog.com/entry/2020/05/08/151544)

##（ 実行画面 ）

- Macbookの画面ウィンドウが自動で立ち上がり、**物体ラベルが重畳表示}**された**動画**が再生された。
- 動画は長いため、最後まで見ないで、**途中でCtrl-Z**して、__*yolo3_movie.py*__を**強制終了**した。


```bash:Terminal
electron@ydiynoMacBook-Pro yolo3_movie % python3 yolo3_movie.py trump.mp4
次の動画ファイルを解析します。 ：trump.mp4
Downloading /Users/electron/.mxnet/models/yolo3_mobilenet1.0_coco-66dbbae6.zip from https://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/gluon/models/yolo3_mobilenet1.0_coco-66dbbae6.zip...
88993KB [00:06, 13802.08KB/s]                                                                                                                         
^Z
zsh: suspended  python3 yolo3_movie.py trump.mp4
electron@ydiynoMacBook-Pro yolo3_movie %
```


##（ 変更点 ）

上述のウェブページに掲載されているPythonコードを、次の部分を変更した。

- 解析する動画ファイル（MP4ファイル）のファイル名を、コマンドライン引数から受け取るように変更
（ *argparse*モジュールを採用 ）

##変更後のスクリプトファイル

```Python3:yolo3_movie.py
import mxnet as mx
import gluoncv
import time
import cv2
import argparse    

# 動画ファイル名をコマンドライン引数から受け取る
parser = argparse.ArgumentParser(description='')    #
parser.add_argument('file_name')  
args = parser.parse_args()  

movie_file = args.file_name
print('次の動画ファイルを解析します。 ：' + movie_file)

# Load the model
net = gluoncv.model_zoo.get_model('yolo3_mobilenet1.0_coco', pretrained=True)
# Compile the model for faster speed
net.hybridize()

# Load the webcam handler
cap = cv2.VideoCapture(movie_file)
fps = cap.get(cv2.CAP_PROP_FPS)

start = time.time()

while(True):
    # Load frame from the camera
    end = time.time()
    sec = end-start
    cap.set(cv2.CAP_PROP_POS_FRAMES, round(fps * sec))
    ret, frame = cap.read()

    if(ret):
        # Image pre-processing
        frame = mx.nd.array(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)).astype('uint8')
        rgb_nd, frame = gluoncv.data.transforms.presets.yolo.transform_test(frame,short=360)

        # Run frame through network
        class_IDs, scores, bounding_boxes = net(rgb_nd)

        # Display the result
        img = gluoncv.utils.viz.cv_plot_bbox(frame, bounding_boxes[0], scores[0], class_IDs[0], class_names=net.classes)
        gluoncv.utils.viz.cv_plot_image(img)
    else:
        break

    # escを押したら終了
    if cv2.waitKey(1) == 27:
        break

cap.release()
cv2.destroyAllWindows()
```

##環境構築

- 必要となるPythonモジュールをインストール（ pip install ）

```bash:Terminal
electron@ydiynoMacBook-Pro ~ % cd Desktop 
electron@ydiynoMacBook-Pro Desktop % pip3 install mxnet
```

```bash:Terminal
electron@ydiynoMacBook-Pro Desktop % pip3 install gluoncv
```

```bash:Terminal
electron@ydiynoMacBook-Pro Desktop % pip3 install opencv-python
```


##動画（MP4)ファイルの取得

- Youyube-dlで、冒頭に記載した動画ファイルをダウンロードするときに、最適なファイル形式がどれかを確認

```bash:Terminal
electron@ydiynoMacBook-Pro yolo3_movie % youtube-dl https://youtu.be/JehluvQRPe4 -F               
[youtube] JehluvQRPe4: Downloading webpage
[youtube] JehluvQRPe4: Downloading player 51ff6aac
[info] Available formats for JehluvQRPe4:
format code  extension  resolution note
249          webm       audio only tiny   44k , webm_dash container, opus @ 44k (48000Hz), 2.19MiB
250          webm       audio only tiny   54k , webm_dash container, opus @ 54k (48000Hz), 2.69MiB
251          webm       audio only tiny  100k , webm_dash container, opus @100k (48000Hz), 4.91MiB
140          m4a        audio only tiny  129k , m4a_dash container, mp4a.40.2@129k (44100Hz), 6.34MiB
160          mp4        256x144    144p   88k , mp4_dash container, avc1.4d400c@  88k, 30fps, video only, 4.34MiB
278          webm       256x144    144p   93k , webm_dash container, vp9@  93k, 30fps, video only, 4.55MiB
133          mp4        426x240    240p  158k , mp4_dash container, avc1.4d4015@ 158k, 30fps, video only, 7.74MiB
242          webm       426x240    240p  203k , webm_dash container, vp9@ 203k, 30fps, video only, 9.96MiB
134          mp4        640x360    360p  306k , mp4_dash container, avc1.4d401e@ 306k, 30fps, video only, 14.99MiB
243          webm       640x360    360p  368k , webm_dash container, vp9@ 368k, 30fps, video only, 18.06MiB
135          mp4        854x480    480p  473k , mp4_dash container, avc1.4d401f@ 473k, 30fps, video only, 23.17MiB
244          webm       854x480    480p  650k , webm_dash container, vp9@ 650k, 30fps, video only, 31.84MiB
136          mp4        1280x720   720p  735k , mp4_dash container, avc1.4d401f@ 735k, 30fps, video only, 36.02MiB
247          webm       1280x720   720p 1273k , webm_dash container, vp9@1273k, 30fps, video only, 62.34MiB
18           mp4        640x360    360p  663k , avc1.42001E, 30fps, mp4a.40.2 (44100Hz), 32.50MiB
22           mp4        1280x720   720p  864k , avc1.64001F, 30fps, mp4a.40.2 (44100Hz) (best)
electron@ydiynoMacBook-Pro yolo3_movie %
```

- 134のファイル形式（mp4 640x360）を選択して、ダウンロード

```bash:Terminal
electron@ydiynoMacBook-Pro yolo3_movie % youtube-dl https://youtu.be/JehluvQRPe4 -f 134
[youtube] JehluvQRPe4: Downloading webpage
[download] Destination: 【和訳】大統領の登場にブーイングの嵐、そして... _ AGT 2017-JehluvQRPe4.mp4
[download] 100% of 14.99MiB in 00:01
electron@ydiynoMacBook-Pro yolo3_movie % ls | grep 【和訳】大統領の登場にブーイングの*  
【和訳】大統領の登場にブーイングの嵐、そして... _ AGT 2017-JehluvQRPe4.mp4
electron@ydiynoMacBook-Pro yolo3_movie %
```

- ファイル名を、英文字表きに変える

```bash:Terminal
electron@ydiynoMacBook-Pro yolo3_movie % mv 【和訳】大統領の登場にブーイングの嵐* trump.mp4
electron@ydiynoMacBook-Pro yolo3_movie % ls trump.mp4
trump.mp4
```