勉強しないとな~blog

ちゃんと勉強せねば…な電気設計エンジニアです。

OpenPoseやってみる - 4

OpenPose続き。

nokixa.hatenablog.com

今回は内容だらだら長め。

やっておきたいこと

ピアノの手の動きの認識もしたいが、その前にちょっとやってみたいと思っていたのが、人以外にも姿勢推定してくれそうかどうか。

ガンプラなら人っぽく見えるので、姿勢推定してくれそうな気がする。

ということでやってみる。

使うデータ

HGのバルバトスルプスくんで。

他にもガンプラの写真があったので、それも試してみる。

ほかにも

今まで撮ったガンプラの写真探してたら、ほかにも面白そうなものがあったので、ついでに。

お台場ガンダム

ユニコーンも。

はにわ

埼玉県立歴史と民俗の博物館にて。

この博物館は、一般展示は写真撮影OK。
SNSやブログでの公開はよくわからないが、禁止とは書かれていないので、問題ないのでは。
ブログで写真付きの記事を上げてる人はいるし、問題ないのでは?

写真撮影について - 埼玉県立歴史と民俗の博物館

美術館でも広がる「スマホで撮影OK」、撮った画像は自由に使えるの? - 弁護士ドットコム

ディズニーランドのくまさん

プーさんではない。
結構人っぽい。

初音ミクさん

ピザの箱。

カッチカチのひと

2016年末、横浜のヨドバシ前、UQ mobileのイベントで。

"冬の恒例イベント!"「UQ mobile×UQ WiMAX スペシャルお笑いSHOW」開催 |

肖像権とか、パブリシティ権とかの問題がありそうなので、写真載せるのは保留。
ダメ元で問い合わせだけしてみる。
もし返答来てOKだったら、写真掲載します。

【応援してくださる皆様へ】SNS利用に関する大切なお願い | ワタナベエンターテインメント

ポケモン

Pokemon Goのスクショ。
マダツボミは人っぽい。

兵長イラスト

2015年 上野の森美術館で開催された進撃の巨人展で。

これも写真撮影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時間近くかかることがあるのはつらい。

以上

だらだら記事になったが、今回ここまで。

続き何やるかは検討中。