« 現状最強規格のUSB-Cケーブルを買ってみた | トップページ | 例の人検出器をRaspberry Pi 4で動かしてみた »

2023年11月29日 (水)

人の検出に特化したPINTOさんの物体検出がなかなかすごいので動かしてみた

語彙力がなさ過ぎて申し訳ございませんが、この人検出は凄まじいです。ほんと。

きっかけは、以下のXのポスト。

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」を開いて、右上からダウンロードのボタンをクリックして落とします。

それ以外にも、以下のリンクをクリックして、

https://s3.ap-northeast-2.wasabisys.com/pinto-model-zoo/425_Gold-YOLO-Body-Head-Hand/resources_n.tar.gz

そこから「resources_n.tar.gz」というファイルをダウンロードします。

Windowsの場合、このファイルを「7-Zip」を使って開き、中にあるファイルを展開します。

圧縮・解凍ソフト 7-Zip

70個以上の大量のファイルが得られますが、要るのは一つで、この中から「gold_yolo_n_body_head_hand_post_0461_0.4428_1x3x480x640.onnx」のみを取り出します。

これで準備OK・・・かと思いきや、実はコードにバグがあって、そのままでは使えません。
ちょっとややこしいのですが、VSCode辺りを開き、「demo_goldyolo_onnx.py」の203行目付近、

            if len(boxes_keep) > 0:
                for box, score in zip(boxes_keep, scores_keep):
                    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
                    )

こういう部分があるので、以下のように変えます。

            if len(boxes_keep) > 0:
                for box, score in zip(boxes_keep, scores_keep):
                    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(
                        [x_min, y_min, x_max, y_max, pid]
                    )
                    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カメラで物体検出が始まります。

 

20231129-150724

はい、御覧の通り、手と顔と身体を認識してくれます。
1コマ当たりの推論時間は20~30ms。ほぼリアルタイムですね。

とまあ、我が家のしょぼいGPUでも、結構な速さで動きます。
ちなみに、一人二人程度なら、CPUのみでも動きます。
(会社で実験しました)

これを、カメラではなく動画から動かす場合は、

python demo_goldyolo_onnx.py -v (動画ファイル.mp4)

という具合に「-v」の後にファイル名を指定してやります。

ちなみに、子供の運動会の動画を使ってみたんですが、

Goldyolo01

さすがにこの人数ではリアルタイムとはいきませんでしたが、それでも結構な速さで人体、顔、手を推論してくれます。
物体追跡のアルゴリズムと組み合わせたら、参加人数を一気にカウントできそうですね。

なお、この時同時に「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で動かしてみた »

数値解析系」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« 現状最強規格のUSB-Cケーブルを買ってみた | トップページ | 例の人検出器をRaspberry Pi 4で動かしてみた »

当ブログ内検索

スポンサード リンク

ブログ村

無料ブログはココログ