以下の方法を行うと、元の動画ファイルに対する処理が、工程「3」まで終わる間の時間、解析結果の動画を見ることができません。
- 動画ファイルから、各タイムフレームの静止画ファイルを切り出す。
- 「1」で切り出した各静止画ファイル、一ファイル毎に、順次、一般物体認識器を適用する。
-> 「2」の結果、画面内に検出された物体の輪郭領域が矩形表示された静止画ファイルの束が、吐き出される。 - 吐き出された各静止画ファイルを、タイムフレーム順に連結する。
- 連結されたファイルの各コマ(各タイムフレームの静止画)をパラパラめくり、動画として閲覧する。
今回は、手元の動画ファイルを再生させながら、再生中の(各タイムフレームの)静止画に対して、リアルタイムに、次の2つの処理を行うスクリプトを動かしてみました。
(1) 物体検出処理
(2) 物体の輪郭(矩形)領域の枠表示処理
##解析対象の動画ファイル
今回は、YouTubeにある次の動画を、youtube-dlで取得したMP4ファイル、題材として使用しました。
##出力された動画
動画(MP4)ファイルの格納パスを、Pythonスクリプトファイルに対して、コマンドライン引数で渡してエンターキーを押すと、Macbookの画面ウィンドウが即座に立ち上がり、物体ラベルが重畳表示された状態の動画が再生され始めました。
事前に、動画ファイル(元ファイル)に対する工程1〜4の解析処理を行うことで、元ファイルとは別に、解析済みの動画ファイルを生成するという事前作業を行うことなく、いきなり、物体ラベルが重畳表示された状態の動画を再生・閲覧することができました。
この記事では、上述の動画ファイルから、画面キャプチャで切り取ったスナップショットを、いくつか掲載します。
##参考にしたウェブページ
##( 実行画面 )
- Macbookの画面ウィンドウが自動で立ち上がり、物体ラベルが重畳表示}された動画が再生された。
- 動画は長いため、最後まで見ないで、途中でCtrl-Zして、__yolo3_movie.py__を強制終了した。
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モジュールを採用 )
##変更後のスクリプトファイル
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 )
electron@ydiynoMacBook-Pro ~ % cd Desktop
electron@ydiynoMacBook-Pro Desktop % pip3 install mxnet
electron@ydiynoMacBook-Pro Desktop % pip3 install gluoncv
electron@ydiynoMacBook-Pro Desktop % pip3 install opencv-python
##動画(MP4)ファイルの取得
- Youyube-dlで、冒頭に記載した動画ファイルをダウンロードするときに、最適なファイル形式がどれかを確認
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)を選択して、ダウンロード
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 %
- ファイル名を、英文字表きに変える
electron@ydiynoMacBook-Pro yolo3_movie % mv 【和訳】大統領の登場にブーイングの嵐* trump.mp4
electron@ydiynoMacBook-Pro yolo3_movie % ls trump.mp4
trump.mp4