人の検出に特化したPINTOさんの物体検出がなかなかすごいので動かしてみた
語彙力がなさ過ぎて申し訳ございませんが、この人検出は凄まじいです。ほんと。
きっかけは、以下のXのポスト。
僕の魂を削って作った高精度人検出モデルをコミット。
— Super PINTO (@PINTO03091) November 27, 2023
"Halfway compromises are never acceptable."https://t.co/mtlMCQmIOn pic.twitter.com/ujYtrAX02J
Super PINTOさんのポストです。ここに出てくる画像は検出結果ではなく、手動のアノテーション作業中のものですが、これを使って作られた学習器もこれに匹敵するくらいのすげえ検出をしてくれます。
あんまりにもすげえんで、つい家で試してみたくなりました。
ということで、まずは以下からコードをゲットして、使うところまでもっていきました。
PINTO_model_zoo/425_Gold-YOLO-Body-Head-Hand at main · PINTO0309/PINTO_model_zoo · GitHub
まず、使うライブラリとしては、
・ Python 3.10
・ onnxruntime 1.16.1
・ opencv-contrib-python 4.8.0.76
・ numpy 1.24.3
です。TensorRTは、とりあえず推論だけなら使わない模様です。
うちではWindows版のPythonで使ってます。入手方法は以下を参照。
Python 3.10 の導入 on Windows #Python - Qiita
で、Python for Windowsをインストール後に、コマンドプロンプトかWindows PowerShellを開き、
pip install onnxruntime opencv-python opencv-contrib-python numpy
のコマンドを実行すれば、必要なライブラリは入るものと思われます。
(CUDAを導入済みのPCなら、onnxruntime_gpuも加えます)
さて、まずは上のGithubからコードをダウンロードします。「demo」フォルダをクリックして、その中にある「demo_goldyolo_onnx.py」「demo_goldyolo_onnx_image.py」を開いて、右上からダウンロードのボタンをクリックして落とします。
それ以外にも、以下のリンクをクリックして、
そこから「resources_n.tar.gz」というファイルをダウンロードします。
Windowsの場合、このファイルを「7-Zip」を使って開き、中にあるファイルを展開します。
70個以上の大量のファイルが得られますが、要るのは一つで、この中から「gold_yolo_n_body_head_hand_post_0461_0.4428_1x3x480x640.onnx」のみを取り出します。
これで準備OK・・・かと思いきや、実はコードにバグがあって、そのままでは使えません。
ちょっとややこしいのですが、VSCode辺りを開き、「demo_goldyolo_onnx.py」の203行目付近、
x_min = int(max(box[2], 0) * image_width / self.input_shapes[0][3])
y_min = int(max(box[3], 0) * image_height / self.input_shapes[0][2])
x_max = int(min(box[4], self.input_shapes[0][3]) * image_width / self.input_shapes[0][3])
y_max = int(min(box[5], self.input_shapes[0][2]) * image_height / self.input_shapes[0][2])
result_boxes.append(
[x_min, y_min, x_max, y_max]
)
result_scores.append(
score
)
こういう部分があるので、以下のように変えます。
x_min = int(max(box[2], 0) * image_width / self.input_shapes[0][3])
y_min = int(max(box[3], 0) * image_height / self.input_shapes[0][2])
x_max = int(min(box[4], self.input_shapes[0][3]) * image_width / self.input_shapes[0][3])
y_max = int(min(box[5], self.input_shapes[0][2]) * image_height / self.input_shapes[0][2])
pid = int(box[1])
result_boxes.append(
)
result_scores.append(
score
)
一見すると何が違うんだ・・・という感じですが、よく見ると「pid」という変数を定義し、それを「result_boxes」という配列の最後に加えてます。
ちなみに、このpidというのは何かというと、推論結果のラベルを現すIDであり、「身体」が0、「顔」が1、「手」が2であることを現してるみたいです。
こうしておかないと、さらに下の方にある295行めの「classid: int = box[4]」がエラーを起こします。
(boxの変数で[4]なんてねえぞゴルァ!的なエラーが出ます)
なんか、バグったままのコードが上げられてたようですね。
ちなみに、「demo_goldyolo_onnx_image.py 」にも同じような部分があるので、直しておきます。
さて、これで準備完了。
いよいよ、コードを動かします。
コマンドプロンプトで、
cd (コードの入ったフォルダのパス)
と入力して移動した後、
python demo_goldyolo_onnx.py
と実行すると、PCに内蔵されたWebカメラで物体検出が始まります。
はい、御覧の通り、手と顔と身体を認識してくれます。
1コマ当たりの推論時間は20~30ms。ほぼリアルタイムですね。
とまあ、我が家のしょぼいGPUでも、結構な速さで動きます。
ちなみに、一人二人程度なら、CPUのみでも動きます。
(会社で実験しました)
これを、カメラではなく動画から動かす場合は、
python demo_goldyolo_onnx.py -v (動画ファイル.mp4)
という具合に「-v」の後にファイル名を指定してやります。
ちなみに、子供の運動会の動画を使ってみたんですが、
さすがにこの人数ではリアルタイムとはいきませんでしたが、それでも結構な速さで人体、顔、手を推論してくれます。
物体追跡のアルゴリズムと組み合わせたら、参加人数を一気にカウントできそうですね。
なお、この時同時に「output.mp4」という、検出結果を納めた動画が出力されます。
ちなみに、もう一つのコード「」の動かし方ですが、まず「00_COCO-Hand-S_base」と「output」という名前のフォルダを作り、この中にJPG画像を入れます。その後に、
python demo_goldyolo_onnx_image.py
と実行すると、「00_COCO-Hand-S_base」の中にある画像の物体検出結果を「output」に入れてくれます。
(上のような感じで、人物を囲んだボックス入りの画像が入ってます)
人物の検出特化な検出器なので、人以外の用途には使えないのが難点ですが、逆に言えば人を感知する点にかけてはおそらく最強の検出器ではないかと思います。
最近は生成AI系にばかり関心がいってましたが、物体検出も地味に進化し続けてますね。時々はウォッチしていこうと思います。
物体検出とGAN、オートエンコーダー、画像処理入門 PyTorch/TensorFlow2による発展的・実装ディープラーニング |
« 現状最強規格のUSB-Cケーブルを買ってみた | トップページ | 例の人検出器をRaspberry Pi 4で動かしてみた »
「数値解析系」カテゴリの記事
- Windows 11でFORTRANをコンパイルしたい!という方への対処法(2025.01.04)
- どこに視線を向けているかを可視化してくれる物体検出器(2024.12.23)
- 2024年まとめ記事(2024.12.31)
- 生成AI解説書籍「ChatGPT & 生成AI」という本を買った(2024.12.08)
- Googleの生成AI「Gemini Advanced」に入ってみた(2024.12.01)
« 現状最強規格のUSB-Cケーブルを買ってみた | トップページ | 例の人検出器をRaspberry Pi 4で動かしてみた »
コメント