概要
物体検出はコンピューター ビジョンの大きな分野であり、コンピューター ビジョンの「実際の」アプリケーションの中でも重要なアプリケーションの XNUMX つです。 そこから、キーポイント検出 (ポーズ推定によく使用される) が抽出されました。
キーポイントは、顔の一部、体の四肢など、さまざまなポイントにすることができます。ポーズ推定は、ポイントが人体の一部であるキーポイント検出の特殊なケースです。
姿勢推定は、コンピュータ ビジョンの驚くべき、非常に楽しく実用的な使用法です。 これにより、ポーズの推定に使用される高価で扱いにくいハードウェア (モーション キャプチャ スーツ) をなくすことができます。 さらに、人間の動きをユークリッド空間のロボットの動きにマッピングすることで、通常はより高いレベルの精度が得られないコントローラーを使用せずに、精密なモーターの動きを可能にします。 キーポイント推定は、私たちの動きを AR および VR の 3D モデルに変換するために使用できます。 最後に、姿勢推定はスポーツやセキュリティに役立ちます。
このガイドでは、最先端の YOLOv7 モデルを使用して、Python でビデオからリアルタイムの姿勢推定を実行します。
具体的には、韓国の平昌で開催された 2018 年冬季オリンピックのビデオを使用します。
Aljona Savchenko と Bruno Massot は、カメラに対して体を重ねたり、高速で滑らかな動きをしたり、空中で回転したりするなど、素晴らしいパフォーマンスを披露しました。 推測が困難な状況をモデルがどのように処理するかを確認する絶好の機会です。
YOLOと姿勢推定
YOLO (一度しか見ない) は方法論であり、オブジェクト検出用に構築されたモデルのファミリーでもあります。 2015 年の開始以来、YOLOv1、YOLOv2 (YOLO9000)、および YOLOv3 は同じ作成者によって提案されており、ディープ ラーニング コミュニティはその後もオープンソース化の進歩を続けてきました。
Ultralytics の YOLOv5 YOLOメソッドの上に構築された業界グレードのオブジェクト検出リポジトリです。 以前の YOLO モデルの C++ とは対照的に、PyTorch で実装され、完全にオープン ソースであり、プロジェクトを柔軟に推論、トレーニング、およびカスタマイズできる美しくシンプルで強力な API を備えています。 YOLOメソッドを改善するためのほとんどの新しい試みがその上に構築されているのは非常に重要です.
これは、どのように YOLOR (You Only Learned One Representation) YOLORの上に構築されたYOLOv7(同じ作者)も作成されました!
YOLOv7 は単なるオブジェクト検出アーキテクチャではありません。以前の YOLO モデルでは標準ではなかったバウンディング ボックス回帰だけでなく、キーポイント (スケルトン) を出力し、インスタンス セグメンテーションを実行できる新しいモデル ヘッドを提供します。 これは驚くべきことではありません。多くのオブジェクト検出アーキテクチャは、一般的なアーキテクチャが共有されているため、インスタンスのセグメンテーションやキーポイント検出タスクにも以前から転用されており、タスクによって出力が異なるからです。
驚くべきことではありませんが、インスタンスのセグメンテーションとキーポイント検出のサポートは、YOLO ベースのモデルの新しい標準になる可能性が高く、精度と速度の両方の点で、数年前に他のすべての XNUMX 段階検出器を実質的に凌駕し始めました。
これにより、XNUMX 段階検出器よりも単純なアーキテクチャで、インスタンスのセグメンテーションとキーポイント検出がこれまで以上に高速に実行されます。
モデル自体は、アーキテクチャの変更と、「景品の袋」と呼ばれるトレーニングの側面の最適化を通じて作成されました。これにより、推論コストを増やすことなく精度が向上しました。
YOLOv7 のインストール
リポジトリのクローンを作成してソースコードを取得することから始めましょう。
! git clone https://github.com/WongKinYiu/yolov7.git
では、に移りましょう yolov7
プロジェクトを含むディレクトリに移動し、内容を確認します。
%cd yolov7
!ls
/content/yolov7
cfg figure output.mp4 test.py
data hubconf.py paper tools
deploy inference README.md train_aux.py
detect.py LICENSE.md requirements.txt train.py
export.py models scripts utils
注: 呼び出し !cd dirname
そのセル内のディレクトリに移動します。 通話中 %cd dirname
同様に、次のセル全体のディレクトリに移動し、そこに留まります。
現在、YOLO はオブジェクト検出器であることを意図しており、デフォルトでポーズ推定の重みが同梱されていません。 重みをダウンロードして、そこから具体的なモデル インスタンスを読み込みます。 重みは同じ GitHub リポジトリで入手でき、CLI からも簡単にダウンロードできます。
! curl -L https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-w6-pose.pt -o yolov7-w6-pose.pt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 153M 100 153M 0 0 23.4M 0 0:00:06 0:00:06 --:--:-- 32.3M
ダウンロードしたら、使用するライブラリとヘルパー メソッドをインポートできます。
import torch
from torchvision import transforms
from utils.datasets import letterbox
from utils.general import non_max_suppression_kpt
from utils.plots import output_to_keypoint, plot_skeleton_kpts
import matplotlib.pyplot as plt
import cv2
import numpy as np
ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!
すごい! モデルをロードし、YOLOv7 と OpenCV を使用してビデオからポーズを推測できるスクリプトを作成しましょう。
YOLOv7 によるリアルタイムの姿勢推定
まず、ダウンロードした重みからモデルをロードするメソッドを作成しましょう。 使用可能なデバイス (CPU または GPU) を確認します。
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
def load_model():
model = torch.load('yolov7-w6-pose.pt', map_location=device)['model']
model.float().eval()
if torch.cuda.is_available():
model.half().to(device)
return model
model = load_model()
GPU があるかどうかに応じて、半精度をオンにします ( float16
float32
これにより、推論が大幅に高速化されます。 小さなビデオで実行しない限り、CPU には実行する能力がない可能性が高いため、リアルタイム速度のために GPU でこれを実行することを強くお勧めします。
推論を実行するための便利なメソッドを書きましょう。 画像を NumPy 配列として受け入れます (これは後でビデオを読みながら渡すことになるためです)。 まず、 letterbox()
関数 – ビデオのサイズを変更し、モデルが操作できる形状にパディングします。 これは、結果のビデオの形状 (解像度) である必要はありません。
次に、変換を適用し、画像を半精度に変換し (GPU が利用可能な場合)、バッチ処理してモデルを実行します。
def run_inference(image):
image = letterbox(image, 960, stride=64, auto=True)[0]
image = transforms.ToTensor()(image)
if torch.cuda.is_available():
image = image.half().to(device)
image = image.unsqueeze(0)
with torch.no_grad():
output, _ = model(image)
return output, image
モデルの予測と画像をテンソルとして返します。 これらは「大まかな」予測です。オーバーラップする多くのアクティベーションが含まれているため、Non-Max Spression を使用して「それらをクリーンアップ」し、予測されたスケルトンを画像自体にプロットします。
def draw_keypoints(output, image):
output = non_max_suppression_kpt(output,
0.25,
0.65,
nc=model.yaml['nc'],
nkpt=model.yaml['nkpt'],
kpt_label=True)
with torch.no_grad():
output = output_to_keypoint(output)
nimg = image[0].permute(1, 2, 0) * 255
nimg = nimg.cpu().numpy().astype(np.uint8)
nimg = cv2.cvtColor(nimg, cv2.COLOR_RGB2BGR)
for idx in range(output.shape[0]):
plot_skeleton_kpts(nimg, output[idx, 7:].T, 3)
return nimg
これらを配置すると、一般的なフローは次のようになります。
img = read_img()
outputs, img = run_inference(img)
keypoint_img = draw_keypoints(output, img)
これをリアルタイムのビデオ設定に変換するには、OpenCV を使用してビデオを読み取り、このプロセスをフレームごとに実行します。 フレームごとに、フレームを新しいファイルに書き込み、ビデオとしてエンコードします。 これにより、推論を実行し、それを表示し、書き込みを行うため、必然的にプロセスが遅くなります。そのため、新しいファイルの作成とループ内での書き込みを回避することで、推論と表示を高速化できます。
def pose_estimation_video(filename):
cap = cv2.VideoCapture(filename)
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
out = cv2.VideoWriter('ice_skating_output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))))
while cap.isOpened():
(ret, frame) = cap.read()
if ret == True:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
output, frame = run_inference(frame)
frame = draw_keypoints(output, frame)
frame = cv2.resize(frame, (int(cap.get(3)), int(cap.get(4))))
out.write(frame)
cv2.imshow('Pose estimation', frame)
else:
break
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
VideoWriter
出力ファイル名、FourCC (ビデオのエンコードに使用されるコーデックを示す XNUMX つのコーデック コード)、フレームレート、およびタプルとしての解像度など、いくつかのパラメーターを受け入れます。 ビデオを推測したりサイズを変更したりしないように、元のビデオの幅と高さを使用しました。 VideoCapture
幅、高さ、フレームの総数など、ビデオ自体に関するデータを含むインスタンス。
これで、任意の入力ビデオでメソッドを呼び出すことができます。
pose_estimation_video('../ice_skating.mp4')
これにより、OpenCV ウィンドウが開き、推論がリアルタイムで表示されます。 また、動画ファイルを yolov7
ディレクトリ( cd
'd に):
注: GPU がうまくいかない場合、またはこのようなモデルの結果を、ワークフローの重要な側面として遅延があるアプリケーションに埋め込みたい場合は、ビデオを小さくして、より小さいフレームで作業してください。 これはフル HD 1920×1080 ビデオで、ほとんどの家庭用システムで高速に実行できるはずですが、システムでうまく動作しない場合は、画像を小さくしてください。
まとめ
このガイドでは、YOLO メソッドである YOLOv7 と、YOLO とオブジェクト検出、姿勢推定、インスタンス セグメンテーションの関係について説明しました。 次に、プログラム API を使用して YOLOv7 を簡単にインストールして操作する方法を調べ、推論と結果の表示を容易にするいくつかの便利なメソッドを作成しました。
最後に、OpenCV を使用してビデオを開き、YOLOv7 で推論を実行し、リアルタイムでポーズ推定を実行する関数を作成し、結果のビデオをフル解像度および 30FPS でローカル ディスクに保存しました。
さらに先へ - コンピュータ ビジョンのための実用的な深層学習
あなたの好奇心旺盛な性質は、さらに先へ進みたいと思わせますか? 私たちは私たちをチェックアウトすることをお勧めします コース: 「Pythonによるコンピュータビジョンのための実践的な深層学習」.
別のコンピューター ビジョン コースですか?
MNIST 数字や MNIST ファッションの分類は行いません。 彼らはずっと前に彼らの役割を果たしました。 高度なブラックボックス アーキテクチャにパフォーマンスの負担を負わせる前に、あまりにも多くの学習リソースが基本的なデータセットと基本的なアーキテクチャに焦点を合わせています。
私たちが注目したいのは 謎解き, 実用性, 理解する, 直感 および 実際のプロジェクト. 学びたい の あなたは違いを生むことができますか? 私たちの脳が画像を処理する方法から、乳がんの研究レベルのディープ ラーニング分類器の作成、「幻覚」を起こすディープ ラーニング ネットワークまで、実際の作業を通じて原理と理論を教え、コンピュータビジョンを解決するためにディープラーニングを適用する専門家になるためのノウハウとツール。
内部には何がありますか?
- ビジョンの第一原理と、コンピューターに「見る」ことを教える方法
- コンピューター ビジョンのさまざまなタスクとアプリケーション
- あなたの仕事を楽にする貿易ツール
- コンピュータ ビジョンのためのデータセットの検索、作成、および利用
- 畳み込みニューラル ネットワークの理論と応用
- データセット内のドメイン シフト、共起、およびその他のバイアスの処理
- 転移学習と、他人のトレーニング時間と計算リソースを自分の利益のために利用する
- 最先端の乳がん分類器の構築とトレーニング
- 主流のアイデアに健全な懐疑心を適用し、広く採用されている手法の意味を理解する方法
- t-SNE と PCA を使用した ConvNet の「概念空間」の可視化
- 企業がコンピューター ビジョン技術を使用してより良い結果を達成する方法のケース スタディ
- 適切なモデル評価、潜在空間の可視化、モデルの注意の特定
- ドメイン調査の実施、独自のデータセットの処理、モデル テストの確立
- 最先端のアーキテクチャ、アイデアの進展、それらの独自性と実装方法
- KerasCV – 最先端のパイプラインとモデルを作成するための WIP ライブラリ
- 論文を解析して読み、自分で実装する方法
- 用途に応じた機種選定
- エンドツーエンドの機械学習パイプラインの作成
- Faster R-CNN、RetinaNet、SSD、YOLO を使用したオブジェクト検出のランドスケープと直感
- インスタンスとセマンティック セグメンテーション
- YOLOv5によるリアルタイム物体認識
- YOLOv5 オブジェクト検出器のトレーニング
- KerasNLP (業界で強力な WIP ライブラリ) を使用したトランスフォーマーの操作
- トランスフォーマーを ConvNets と統合して画像のキャプションを生成する
- DeepDream
- コンピューター ビジョンのためのディープ ラーニング モデルの最適化