OpenPose続き。
今回は内容だらだら長め。
やっておきたいこと
ピアノの手の動きの認識もしたいが、その前にちょっとやってみたいと思っていたのが、人以外にも姿勢推定してくれそうかどうか。
ガンプラなら人っぽく見えるので、姿勢推定してくれそうな気がする。
ということでやってみる。
使うデータ
HGのバルバトスルプスくんで。
他にもガンプラの写真があったので、それも試してみる。
ほかにも
今まで撮ったガンプラの写真探してたら、ほかにも面白そうなものがあったので、ついでに。
お台場ガンダム
ユニコーンも。
はにわ
この博物館は、一般展示は写真撮影OK。
SNSやブログでの公開はよくわからないが、禁止とは書かれていないので、問題ないのでは。
ブログで写真付きの記事を上げてる人はいるし、問題ないのでは?
美術館でも広がる「スマホで撮影OK」、撮った画像は自由に使えるの? - 弁護士ドットコム
ディズニーランドのくまさん
プーさんではない。
結構人っぽい。
初音ミクさん
ピザの箱。
カッチカチのひと
2016年末、横浜のヨドバシ前、UQ mobileのイベントで。
"冬の恒例イベント!"「UQ mobile×UQ WiMAX スペシャルお笑いSHOW」開催 |
肖像権とか、パブリシティ権とかの問題がありそうなので、写真載せるのは保留。
ダメ元で問い合わせだけしてみる。
もし返答来てOKだったら、写真掲載します。
【応援してくださる皆様へ】SNS利用に関する大切なお願い | ワタナベエンターテインメント
ポケモン
Pokemon Goのスクショ。
マダツボミは人っぽい。
兵長イラスト
これも写真撮影OKだった。
SNS公開も特に禁止されてなかったと思うが。。。
イベントレポート記事も結構出てたし。。。
小ネタ : Bingチャットでバッチファイルのコード生成
画像データをブログに投稿するにあたり、そのままだとサイズが大きくてはてなフォトライフの容量が心配なので、まとめてリサイズしたいと考えた。
ffmpegでまとめてできないか?
【ffmpeg】動画の解像度を指定してリサイズ、アスペクト比を維持したまま解像度を変更する、回転する - Qiita
ffmpegそのものでは、入力ファイルは1つずつしか指定できなさそうで、バッチファイルを作る必要がありそう。
【暫定版】FFmpegとWindowsバッチを使って、複数の動画を一括エンコードするプログラミングを作成する | じゃぶじゃぶゲーム
Bingチャットに聞いてみる
ffmpegでのリサイズを、フォルダ内の全画像ファイルに適用するwindows バッチファイルを作ってください。
と聞いてみたところ、
以下のバッチファイルを作成することで、指定したフォルダ内の全画像ファイルをリサイズできます。
@echo off set /p folder_path="Enter the folder path: " set /p resolution="Enter the resolution (e.g. 1920x1080): " for %%i in ("%folder_path%\*.jpg") do ( ffmpeg -i "%%i" -vf scale=%resolution% -q:v 2 "%%~ni_resized.jpg" ) for %%i in ("%folder_path%\*.png") do ( ffmpeg -i "%%i" -vf scale=%resolution% -q:v 2 "%%~ni_resized.png" ) echo "Resizing complete." pause
上記バッチファイルでは、以下のようにリサイズを行います。
- フォルダパスと解像度をユーザーに入力してもらいます。
- 指定したフォルダ内の全てのjpgとpng画像に対して、指定された解像度にリサイズします。
- リサイズ後の画像は、元のファイル名に「_resized」を付けた名前で保存されます。
このバッチファイルは、Windows環境で動作します。また、ffmpegがインストールされている必要があります。ffmpegがインストールされていない場合は、¹を参考にインストールしてください。
ソース: Bing との会話 2023/9/4
(1) ffmpeg + バッチファイルで画像を一括リサイズする - Qiita.
https://qiita.com/studio_haneya/items/1e69c2001600a273a7da.
(2) Use FFmpeg to resize image - Stack Overflow. https://stackoverflow.com/questions/28806816/use-ffmpeg-to-resize-image.
(3) Resize more than one image using ffmpeg - Super User. https://superuser.com/questions/839751/resize-more-than-one-image-using-ffmpeg.
(4) undefined. https://qiita.com/studio_haneya/items/ae44e39b5a389cf8cf6e.
てな感じで作ってくれました。
コードを見た感じ、結構いけそうな感じ。
- jpgかpngの拡張子じゃないと使えないが。
OpenPoseの出力画像は全部pngになってたので、ここは問題ない。 - 変換後ファイルの名前の付け方とかは気が利いてる。
- 変換後ファイルはバッチファイルと同じフォルダの下に入る。
全フォルダに実行すると、ファイルが混ざってちょっと面倒だが、日付でソートすれば分けられるか。 - 解像度は"1920x1080"のように、と書かれているが、この指定の仕方なら、正しくは"1920:1080"のようにしないといけない。出してくれたリンクを見ればわかるが。
とりあえずこのまま使ってみる。
下記動かした例。
2ファイル入ってる「haniwa」フォルダ。
Enter the folder path: haniwa Enter the resolution (e.g. 1920x1080): 320:-1 ffmpeg version 6.0-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers built with gcc 12.2.0 (Rev10, Built by MSYS2 project) configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband libavutil 58. 2.100 / 58. 2.100 libavcodec 60. 3.100 / 60. 3.100 libavformat 60. 3.100 / 60. 3.100 libavdevice 60. 1.100 / 60. 1.100 libavfilter 9. 3.100 / 9. 3.100 libswscale 7. 1.100 / 7. 1.100 libswresample 4. 10.100 / 4. 10.100 libpostproc 57. 1.100 / 57. 1.100 Input #0, png_pipe, from 'haniwa\2013-09-14 15.31.59_rendered.png': Duration: N/A, bitrate: N/A Stream #0:0: Video: png, rgb24(pc), 2448x3264, 25 fps, 25 tbr, 25 tbn Stream mapping: Stream #0:0 -> #0:0 (png (native) -> png (native)) Press [q] to stop, [?] for help Output #0, image2, to '2013-09-14 15.31.59_rendered_resized.png': Metadata: encoder : Lavf60.3.100 Stream #0:0: Video: png, rgb24(pc, gbr/unknown/unknown, progressive), 320x427, q=2-31, 200 kb/s, 25 fps, 25 tbn Metadata: encoder : Lavc60.3.100 png [image2 @ 000001e0e06701c0] The specified filename '2013-09-14 15.31.59_rendered_resized.png' does not contain an image sequence pattern or a pattern is invalid. [image2 @ 000001e0e06701c0] Use a pattern such as %03d for an image sequence or use the -update option (with -frames:v 1 if needed) to write a single image. frame= 1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.00 bitrate=N/A speed= 0x video:274kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown ffmpeg version 6.0-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers built with gcc 12.2.0 (Rev10, Built by MSYS2 project) configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband libavutil 58. 2.100 / 58. 2.100 libavcodec 60. 3.100 / 60. 3.100 libavformat 60. 3.100 / 60. 3.100 libavdevice 60. 1.100 / 60. 1.100 libavfilter 9. 3.100 / 9. 3.100 libswscale 7. 1.100 / 7. 1.100 libswresample 4. 10.100 / 4. 10.100 libpostproc 57. 1.100 / 57. 1.100 Input #0, png_pipe, from 'haniwa\2013-09-14 15.32.09_rendered.png': Duration: N/A, bitrate: N/A Stream #0:0: Video: png, rgb24(pc), 2448x3264, 25 fps, 25 tbr, 25 tbn Stream mapping: Stream #0:0 -> #0:0 (png (native) -> png (native)) Press [q] to stop, [?] for help Output #0, image2, to '2013-09-14 15.32.09_rendered_resized.png': Metadata: encoder : Lavf60.3.100 Stream #0:0: Video: png, rgb24(pc, gbr/unknown/unknown, progressive), 320x427, q=2-31, 200 kb/s, 25 fps, 25 tbn Metadata: encoder : Lavc60.3.100 png [image2 @ 000001b3b4ad01c0] The specified filename '2013-09-14 15.32.09_rendered_resized.png' does not contain an image sequence pattern or a pattern is invalid. [image2 @ 000001b3b4ad01c0] Use a pattern such as %03d for an image sequence or use the -update option (with -frames:v 1 if needed) to write a single image. frame= 1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.00 bitrate=N/A speed= 0x video:259kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown "Resizing complete." 続行するには何かキーを押してください . . .
ファイル名について、「連番形式のファイル名じゃない」という指摘はあるが、変換自体はできた。
のでこのまま使う。
Bingチャットさんありがとう。またお願いするよ。
OpenPose実行
今回は画像データなので、--image_dir
で、画像を保存しているディレクトリを指定。
種別ごとにディレクトリ分けした。
ガンプラ
上記の写真以外も含めて11枚を処理。
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\gunpla" --write_images output/openpose_iroiro-1/gunpla Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 174.751445 seconds. (base) PS C:\work\openpose_test\openpose>
全部で11枚、1枚当たり処理時間は約15.9秒。
処理結果。
HG バルバトスルプスはだめだった。HGUC ジェスタキャノンも。
唯一、RG ガンダムエクシアだけちゃんと骨格推定された。
頭を抱えてる感じのポーズでは、左腕と頭部を除いて、当てはめられた骨格も結構合ってる。
エクシアは結構人っぽいのか。
お台場ガンダム
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\odaiba" --write_images output/openpose_iroiro-1/odaiba Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 176.706481 seconds. (base) PS C:\work\openpose_test\openpose>
計12枚、1枚当たり14.7秒。
かろうじてガンダムだけ骨格がついているが、関節位置が違う。
ユニコーンガンダムは、通常モードだろうがデストロイモードだろうが、昼だろうが夜だろうが、全く骨格の推定がされなかった。
手前にいる人はきちんと認識されている。
やっぱり本物の人間は認識されやすい。
はにわ
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\haniwa" --write_images output/openpose_iroiro-1/haniwa Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 26.612257 seconds. (base) PS C:\work\openpose_test\openpose>
計2枚、1枚当たり13.3秒。
片方のはにわは認識された。
顔と肩まで。
顔は、目鼻耳の位置もしっかり認識されている。
ディズニーランドのくまさん
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\kumasan" --write_images output/openpose_iroiro-1/kumasan Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 2.683394 seconds. (base) PS C:\work\openpose_test\openpose>
これは1枚だけ。2.68秒。
確認してみると、LINEから落とした画像データのようで、解像度960x1280だった。
なのでちょっと処理速かったのか。
このくまさんは結構人っぽいのか、しっかり骨格が認識されてる。
鼻の位置は人とは違うが、それでもきちんと正しい鼻の位置が認識されてる。
腰の位置はちょっとずれてる。こんな短足な人はいないよ、ということか。
初音ミクさん
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\mikusan" --write_images output/openpose_iroiro-1/mikusan Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 34.207318 seconds. (base) PS C:\work\openpose_test\openpose>
計3枚、1枚当たり11.4秒。
全滅。
デフォルメ版、上半身だけ、全身、の3パターンあったが、それでもだめだった。
カッチカチのひと
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\katchikachi" --write_images output/openpose_iroiro-1/katchikachi Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 55.067579 seconds. (base) PS C:\work\openpose_test\openpose>
計3枚、1枚当たり18.4秒。
この画像は公開難しいが、--disable_blending
のオプションを付けると、骨格情報だけの出力画像にしてくれるよう。
ということでやってみる。
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\katchikachi" --write_images output/openpose_iroiro-1/katchikachi-2 --disable_blending Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 3.058115 seconds. (base) PS C:\work\openpose_test\openpose>
なぜか処理がめちゃ速くなった。1枚当たり1秒。
画像出力とかが重い原因だったのか?
3枚の画像全部で骨格が認識された。
どこにカッチカチの人がいるか、これだけでもわかるだろう。
ポケモン
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\pokemon" --write_images output/openpose_iroiro-1/pokemon Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 3.742565 seconds. (base) PS C:\work\openpose_test\openpose>
これは1枚だけ、3.7秒。
認識されず。
兵長イラスト
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\heicho" --write_images output/openpose_iroiro-1/heicho Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 15.569506 seconds. (base) PS C:\work\openpose_test\openpose>
1枚だけ、15.6秒。
顔と右肩ぐらいまでなら認識されている。
それ以外はあんまり。
イラストだとちょっと難しかったか。
処理時間について
処理対象にした画像データは古いiPhoneで撮影したものもあり、
- 2448x3264
- 3024x4032
の2種類が混ざってる。
※ポケモンだけ、スクショなので、750x1334の解像度。
解像度ごとの違い
ガンプラの中で骨格認識してくれたガンダムエクシアの1枚で、解像度を変えて処理時間を見てみる。
まずは元の解像度(2448x3264)。
s\openpose_iroiro\gunpla-2" --write_images output/openpose_iroiro-1/gunpla-2 Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 11.890717 seconds. (base) PS C:\work\openpose_test\openpose>
解像度縦横半分にして。
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\gunpla-3" --write_images output/openpose_iroiro-1/gunpla-3 Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 5.531187 seconds. (base) PS C:\work\openpose_test\openpose>
半分ぐらいになった。
出力形式による違い
--display 0
で、処理途中の画像表示がなくなる。これでどうなるか。
解像度は元のままにしておく。
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\gunpla-2" --write_images output/openpose_iroiro-1/gunpla-4 --display 0 Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 12.285879 seconds. (base) PS C:\work\openpose_test\openpose>
変わらなかった。
--disable_blending
にするとどうなるか。
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\gunpla-2" --write_images output/openpose_iroiro-1/gunpla-5 --disable_blending Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 2.685782 seconds. (base) PS C:\work\openpose_test\openpose>
速くなった。
もう一つ、json出力だけにしたらどうなるか?
--display 0
も入れとく、表示用の画像を作ってしまうと結局意味がないので。
あと、その場合は--render_pose 0
も付けろと書いてあった。
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\gunpla-2" --write_json output/openpose_iroiro-1/gunpla-6 --display 0 --render_pose 0 Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 2.366184 seconds. (base) PS C:\work\openpose_test\openpose>
--disable_blending
を付けたのと同じぐらい。
元画像の解像度が高過ぎて、画像生成(コピー+骨格重畳)するのに時間がかかっていただけか?
それだとOpenPose本来の処理が重かったわけではないのか。
入力解像度への依存性
本来の処理部分が解像度に依存するかどうか、が気になる。
解像度に依存しなければ、大きい解像度の画像を入力にする必要性はなくなる。
元々--net_resolution
で設定された解像度(指定なしでデフォルトの垂直368)が処理時の解像度と思っていたので、解像度で処理時間が変わるのが変だなと思ってた。
解像度縦横半分のものを使って確認。
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir "C:\Users\akihiro\Downloads\openpose_iroiro\gunpla-3" --write_json output/openpose_iroiro-1/gunpla-7 --display 0 --render_pose 0 Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 2.264172 seconds. (base) PS C:\work\openpose_test\openpose>
やっぱりほとんど変わらない。
入力画像の解像度を事前に落としておけば、処理結果も変わることはないし、結果のリアルタイム描画も軽くなって、 メリットしかないことになる。
今までの画像データで再確認
MOT16
まずはMOT16で。
全部jpgファイルなので、先ほどのバッチファイルを流用してリサイズできる。
と思ったが、連番の画像ファイルなら、ffmpegで1コマンドでできた。しかもこちらのほうが速かった。
コマンド。
ffmpeg -i ../img1/%06d.jpg -vf "scale=-1:368" %06d.jpg
実行結果
(base) PS C:\work\MOT16\train\MOT16-09\img4> ffmpeg -i ../img1/%06d.jpg -vf "scale=-1:368" %06d.jpg ffmpeg version 6.0-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers built with gcc 12.2.0 (Rev10, Built by MSYS2 project) configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband libavutil 58. 2.100 / 58. 2.100 libavcodec 60. 3.100 / 60. 3.100 libavformat 60. 3.100 / 60. 3.100 libavdevice 60. 1.100 / 60. 1.100 libavfilter 9. 3.100 / 9. 3.100 libswscale 7. 1.100 / 7. 1.100 libswresample 4. 10.100 / 4. 10.100 libpostproc 57. 1.100 / 57. 1.100 Input #0, image2, from '../img1/%06d.jpg': Duration: 00:00:21.00, start: 0.000000, bitrate: N/A Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 25 tbn Stream mapping: Stream #0:0 -> #0:0 (mjpeg (native) -> mjpeg (native)) Press [q] to stop, [?] for help [swscaler @ 0000021374172000] deprecated pixel format used, make sure you did set range correctly Last message repeated 2 times [swscaler @ 0000021374ba63c0] deprecated pixel format used, make sure you did set range correctly Output #0, image2, to '%06d.jpg': Metadata: encoder : Lavf60.3.100 Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown, progressive), 654x368 [SAR 2944:2943 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 25 tbn Metadata: encoder : Lavc60.3.100 mjpeg Side data: cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A frame= 525 fps=186 q=24.8 Lsize=N/A time=00:00:20.96 bitrate=N/A speed=7.43x video:6623kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown (base) PS C:\work\MOT16\train\MOT16-09\img4>
OpenPoseを実行してみると、
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe -image_dir C:\work\MOT16\train\MOT16-09\img4 -write_video output/img4-1.avi --write_video_fps 30 Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. OpenPose demo successfully finished. Total time: 51.713003 seconds. (base) PS C:\work\openpose_test\openpose>
処理時間は51秒だが、前にリサイズ前にやったときは、56秒だった。
あんまり変わってない。。。?
前に時間がかかり過ぎてできなかった--hand
オプション付きも試したが、解像度を下げてもだめだった。
やっぱり強制終了するしかなかった。
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --image_dir C:\work\MOT16\train\MOT16-09\img4 --write_video output/img4-2.avi --write_video_fps 30 --hand Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. (base) PS C:\work\openpose_test\openpose>
ピアノ動画
期待はできないが、一応やっておく。
元の解像度は2304x1296で、これを垂直368にリサイズする。(結果、654x368の解像度になる)
(base) PS C:\work\openpose_test\openpose> .\bin\OpenPoseDemo.exe --video "C:\Users\a\Downloads\2023-08-31 07.48.56_resized.mp4" --write_video output/piano-4.avi --write_video_fps 30 --hand Starting OpenPose demo... Configuring OpenPose... Starting thread(s)... Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0. (base) PS C:\work\openpose_test\openpose>
やっぱりすごい時間かかったので、強制終了。
結論、前回色々試した動画では、元画像の解像度を下げても、処理の重さは変わらない。
9/12追加
OpenPoseDemoの設定、入力解像度と処理時間の関係を網羅していなかったので、追加確認実施。
- ピアノ動画を対象にする。
- すべて
--hand
を付けて、手の骨格認識を実施。 - 動画全部処理をやりきって、処理時間を確認。
設定項目をリストアップすると、
- 入力解像度
- 2304x1296
- 654x368
- 処理中表示内容
- 全部(オプションなし)
- 骨格情報(
--disable_blending
) - なし(
--display 0 --render_pose 0
)
- 動画ファイル出力
- あり(
--write_video ~~.avi --write_video_fps ~~
) - なし(
--write_json ~~
でjsonファイルを出力)
- あり(
入力解像度 | 処理中表示 | 動画出力 | 処理時間 |
---|---|---|---|
2304x1296 | 全部 | あり | 1684秒 (3.68秒/frame) |
654x368 | 全部 | あり | 2863秒 (3.75秒/frame) |
2304x1296 | 骨格情報 | あり | 1721秒 (3.76秒/frame) |
654x368 | 骨格情報 | あり | 2783秒 (3.65秒/frame) |
2304x1296 | なし | なし | 1672秒 (3.65秒/frame) |
654x368 | なし | なし | 2995秒 (3.93秒/frame) |
解像度低いほうが遅くなってしまった。なぜ?と思って調べたら、なぜかフレーム数が違った。
上で計算したフレーム当たりの処理時間は、これを反映している。
フレーム当たり処理時間で見ると、全条件でほぼ同じになっている。
- 元ファイル : 458
- 解像度変更後 : 763
>>> import cv2 >>> cap = cv2.VideoCapture('2023-08-31 07.48.56.mov') [ WARN:0@1933.499] global C:\ci_311\opencv-suite_1676524213139\work\modules\videoio\src\cap_gstreamer.cpp (2386) cv::handleMessage OpenCV | GStreamer warning: your GStreamer installation is missing a required plugin [ WARN:0@1933.499] global C:\ci_311\opencv-suite_1676524213139\work\modules\videoio\src\cap_gstreamer.cpp (2402) cv::handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module uridecodebin5 reported: Your GStreamer installation is missing a plug-in. [ WARN:0@1933.500] global C:\ci_311\opencv-suite_1676524213139\work\modules\videoio\src\cap_gstreamer.cpp (1356) cv::GStreamerCapture::open OpenCV | GStreamer warning: unable to start pipeline [ WARN:0@1933.500] global C:\ci_311\opencv-suite_1676524213139\work\modules\videoio\src\cap_gstreamer.cpp (862) cv::GStreamerCapture::isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created >>> cap.get(cv2.CAP_PROP_FRAME_COUNT) 458.0 >>> cap = cv2.VideoCapture('2023-08-31 07.48.56_resized.mp4') [ WARN:0@1947.782] global C:\ci_311\opencv-suite_1676524213139\work\modules\videoio\src\cap_gstreamer.cpp (2386) cv::handleMessage OpenCV | GStreamer warning: your GStreamer installation is missing a required plugin [ WARN:0@1947.783] global C:\ci_311\opencv-suite_1676524213139\work\modules\videoio\src\cap_gstreamer.cpp (2402) cv::handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module uridecodebin6 reported: Your GStreamer installation is missing a plug-in. [ WARN:0@1947.784] global C:\ci_311\opencv-suite_1676524213139\work\modules\videoio\src\cap_gstreamer.cpp (1356) cv::GStreamerCapture::open OpenCV | GStreamer warning: unable to start pipeline [ WARN:0@1947.785] global C:\ci_311\opencv-suite_1676524213139\work\modules\videoio\src\cap_gstreamer.cpp (862) cv::GStreamerCapture::isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created >>> cap.get(cv2.CAP_PROP_FRAME_COUNT) 763.0 >>>
それにしても30秒の動画で30分とか1時間近くかかることがあるのはつらい。
以上
だらだら記事になったが、今回ここまで。
続き何やるかは検討中。