この記事は、の一部として公開されました データサイエンスブログソン.
概要
非常に重大で現実的な問題を解決します。
詳細に進む前に、この記事で取り上げる内容をリストアップしましょう。
- ポーズ検出の概要
- 問題の説明を理解する:COCOキーポイント検出
- 独自のポーズ検出モデルをゼロから構築する
-
- 依存関係のインストール
- データセットをロードして前処理する
-
- 列車モデル
- パフォーマンスを評価する
- 事前にトレーニングされたモデルを使用してポーズ検出モデルを構築する
- 依存関係のインストール
-
- データセットをロードして前処理する
- 列車モデル
- パフォーマンスを評価する
さぁ、始めよう!
ポーズ検出の概要
ポーズ検出は、人または物体の軌跡と位置を予測するコンピュータビジョン技術です。 これは、特定の人物またはオブジェクトのポーズと向きの組み合わせを確認することによって行われます。
したがって、特定の画像について、最初に画像内の人物または関連するオブジェクトを特定する必要があります。次に、特定された人物またはオブジェクトから特定の重要なポイントを特定します。
人にとって、これらの重要なポイントは肘の膝などです。 これらの重要なポイントを組み合わせることで、人のポーズを特定できます。
そのため、最初に画像から人物の位置を特定し、次に人物の要点を検出し、最後にこれらを組み合わせてポーズを決定します。
現在、画像またはビデオ内のXNUMXつまたは複数のオブジェクトの検出には違いがあります。 したがって、これらXNUMXつのアプローチは、単一および複数のポーズ検出と呼ぶことができます。
単一のポーズ検出アプローチは、XNUMX人の人物またはオブジェクトを検出および追跡し、複数の検出アプローチは、ポーズ検出を使用して画像内の複数の人物またはオブジェクトの選択を検出します。
実世界の空間にある物体や人物を、信じられないほどきめ細かいレベルで追跡することができます。 この強力な機能により、さまざまなアプリケーションも可能になります。
ポーズ検出のこれらの興味深いアプリケーションのいくつかを見てみましょう。 さまざまなオンラインアプリケーションがあります バーチャルヨガのトレーナーとコーチを使用して、個人の動きを分析します とポーズ。 したがって、ポーズ検出を使用して、姿勢が正しいかどうかを判断できます。
それはで広く使用されています ゲーム業界 同じように。 これらのシステムは、ユーザーがゲーム内でアバターをレンダリングするのを追跡します。 ジェスチャ認識やユーザーがゲームを操作できるようにするなどのタスクを実行することに加えて。
ポーズ検出は、 選手の動きを追跡するスポーツ分析 理学療法後の患者の姿勢を監視するために医療業界で使用できます。
したがって、これらはポーズ検出のユースケースとアプリケーションの一部です。
問題ステートメントを理解する:COCOキーポイント検出
前のセクションでは、検出をもたらすオブジェクト検出の興味深いユースケースについて説明しました。 ポーズ検出とは何か、そしてそのアプリケーションのいくつかを理解しました。
このセクションでは、ポーズ検出プロジェクトで選択した問題ステートメントを理解します。 この記事では、画像からキーポイントを決定することを目的としたココキーポイントチャレンジに取り組んでいきます。
このセクションでは、画像を入力として受け取り、XNUMXつのことを予測するモデルを作成します。-
1.画像に存在する人物の周囲のバウンディングボックス
2.人にとっての要点。
出典:-著者
これがモデルの入力画像である場合、ここに示すように出力が得られるはずの別の例を次に示します。
出典:-著者
したがって、画像内のすべての人物が特定され、その要点が予測されます。 このようなモデルをトレーニングするために、ココポイントデータセットを使用します。
データセットの概要を見てみましょう。 このデータセットには、トレーニングセットと検証セットに分けられた約59000枚の画像があります。
これらの画像には、合計約156000万のキーポイントを含む約1.7の注釈付きの人々が含まれています。
鼻、左目、右目、左耳、右耳など、画像に存在する可能性のある17種類のキーポイントがあります。
出典:-著者
画像内の各人物は、最大17のキーポイントを持つことができます。 各キーポイントは、これらの値xyおよびvを使用して表されます。ここで、xおよびyはポイントのピクセル位置を表し、vはその特定のキーポイントの可視性を表します。
vが0に等しい場合は、キーポイントにラベルが付いていないか、この特定のキーポイントが画像に存在しないことを意味します。
vが1に等しい場合は、キーポイントにラベルが付けられているが、画像には表示されていないことを意味します。
vが2に等しい場合は、キーポイントにラベルが付けられて表示されていることを意味します。
つまり、これは、ポーズ検出モデルを構築するために使用するデータセットに関するものです。
モデルを作成するために、カカオデータセット全体を使用することはありません。 データセット全体でモデルをトレーニングするには、膨大な量の計算リソースが必要になります。 したがって、データセットの小さなサンプルを取得します。
すでにサンプルを作成しており、以下のリンクから使用するデータセットをダウンロードできます。
ポーズ検出モデルを構築するために、detectoron2ライブラリを使用します。 これは、最先端のオブジェクト検出モデルを実装するためのより簡単な方法を提供するためです。
ポーズ検出モデルを構築するために実行される手順を見てみましょう。
1.detecton2ライブラリなどの依存関係とその前提条件をインストールする
2.データセットを読み込んで前処理します
3.モデルを定義し、トレーニングします。
4.モデルのパフォーマンスを評価します
それでは、次のセクションに進み、独自のポーズ検出モデルを最初から作成しましょう。
独自のポーズ検出モデルをゼロから構築する
これまで、ポーズ検出の問題とそのアプリケーションについて理解してきました。 また、ポーズ検出モデルの構築に使用するcocoキーポイントデータセットについても少し調べました。
最後に、このモデルを構築するために実行するいくつかの手順と、上記のセクションで説明したいくつかの手順を確認しました。
それでは、始めましょう
1.依存関係のインストール
まず、5.1バージョンの「pyml」 detectron2をスムーズに実行するために必要なライブラリ。
ここでは、detectoron2ライブラリをインストールしています。
!pip install pyyaml == 5.1#detectron2をインストールします:!pip install detectron2 == 0.1.3 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu101/torch1.5/index.html
2.データセットをロードして前処理する
データセットはドライブにアップロードされます。最初にドライブをマウントする必要があります。
ドライブをマウントしたら、unzipコマンドを使用してトレインイメージと検証イメージの両方を抽出できます。
#google.colabからドライブをマウントするimport drive drive.mount( 'drive /')
トレーニングセットと検証セットに存在する画像を読み込んでいます。
#ファイルを抽出します!unzip 'ドライブ/マイドライブ/pose_dataset/training_images.zip'!unzip'ドライブ/マイドライブ/pose_dataset/validation_images.zip '
私たちは 地球 ここにあるライブラリは、フォルダ内のすべての画像の名前を提供します。 したがって、最初にglobをインポートします。 ここで空のリスト名を作成するのはtrain_imagesで、これはトレーニング画像を保存するために使用されます。
その後、「for」ループを実行すると、トレーニングセットに存在するすべての画像が読み取られ、トレイン画像リストに追加されます。 同様に、検証セットの画像をValimagesという名前のリストに保存しています。
from glob import glob#画像を処理するためにimport cv2#リストを作成train_images = [] #glob( 'content / train2017 / *。jpg')のiの各画像:img = cv2.imread(i)#画像を追加するlist train_images.append(img)#リストを作成val_images = [] #glob( 'content / val2017 / *。jpg')のiの各画像:img = cv2.imread(i)#画像をリストval_images.appendに追加(img)
データセットの準備ができたら、次のステップはモデルを定義し、最後にそれをトレーニングすることです。 したがって、detectron2でデータセットを使用するためにリコールする場合は、最初にこのデータセットを登録する必要があります。 したがって、ここではトレーニングデータセットをtrain_dataとして登録しています。 また、トレーニングセットの注釈ファイルの場所と画像のパスを渡します。
fromdetectron2.data.datasets import register_coco_instances register_coco_instances( "train_data"、{}、 'drive / My Drive /pose_dataset/person_keypoints_train2017.json'、 "content / train2017 /")
また、データセットにはキーポイントの一部しかないため、ここでメタデータを登録し、クラスを人物として指定しています。
からdetectron2.dataインポートMetadataCatalog、DatasetCatalogpose_metadata = MetadataCatalog.get( "train_data")。set(thing_classes = ["person"])
これで、データセットが登録されました。 次のセクションコードでモデルを定義します。
3.トレインモデル
トレーニング画像を使用して、ポーズ検出モデルを最初からトレーニングします。 そこで、detectron2で利用可能なキーポイント検出タスクのRCNNアーキテクチャを採用し、ゼロからトレーニングします。
ここでは、detectron2ライブラリからいくつかの関数をインポートして、モデルの構築とトレーニングに役立てています。 このモデルは、モデルのアーキテクチャをロードするために使用されます。 デフォルトのトレーナーを使用してモデルをトレーニングし、get_cfgを使用してモデルの構成ファイルを取得します。
したがって、まず、構成インスタンスを次のように定義します。 cfg 次に、構成ファイルでデータセットを定義します。
トレーニングデータはtrain_dataとして登録されます。 ここではそれを使用し、次はテストデータセットを空のままにします。 私たちは、detectron2で利用可能なRCNNモデルのアーキテクチャをロードしています。
最後に、検出のしきい値を0.7に設定しています。 バウンディングボックスも検出するので。
#detectron2からいくつかの一般的なdetectron2ユーティリティをインポートします。detectron2.engineからmodel_zooをインポートします。detectron2.configからDefaultTrainerをインポートします。importget_cfg#configure instance cfg = get_cfg()cfg.DATASETS.TRAIN =( "train_data"、)cfg.DATASETS.TEST =( )#Detectron2の公式configs /ディレクトリの下にある相対パスで指定されたモデルを取得します。 cfg.merge_from_file(model_zoo.get_config_file( "COCO-Keypoints / keypoint_rcnn_X_101_32x8d_FPN_3x.yaml"))#このモデルのしきい値を設定するcfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7
次に、makedirectory関数が使用されるモデルの重みを格納するディレクトリを作成しています。 最後に、モデルのいくつかのハイパーパラメータを定義します。
import os#重みを保存するディレクトリを作成しますos.makedirs(cfg.OUTPUT_DIR、exist_ok = True)
したがって、バッチあたりの画像数は2、学習率は0.001、反復回数は2000、クラス数は1に設定されます。
# いいえ。 バッチあたりの画像数cfg.SOLVER.IMS_PER_BATCH = 2#基本学習率を設定cfg.SOLVER.BASE_LR = 0.001#いいえ。 反復回数cfg.SOLVER.MAX_ITER = 2000#クラス(人)は1つだけcfg.MODEL.ROI_HEADS.NUM_CLASSES = XNUMX
クラスにはXNUMX人しかいないので、これでモデルアーキテクチャが完成します。
detectron2にはいくつかの要件があります。 すべての画像と注釈が、という名前のフォルダに存在する必要があることを前提としています ココ。 したがって、すべての画像は別のフォルダにあり、注釈は別のフォルダにある必要があります。 これらのフォルダは、 mkdir 指図。 作成しました
フォルダデータセットとその中に、cocoという名前のフォルダを作成しました。
すべての画像を移動し、cocoフォルダー内に注釈フォルダーを作成しました。 ここに注釈を保存します。
!mkdirデータセット!mkdirデータセット/ coco!mkdirデータセット/ coco / annotations
したがって、ここでは、cpコマンドを使用してトレーニングセットと検証セットの両方の注釈ファイルをコピーしています。 したがって、最初にコピーするファイルの場所を渡し、次にそのファイルをコピーする場所を渡す必要があります。
!cp 'ドライブ/マイドライブ/pose_dataset/person_keypoints_train2017.json' 'データセット/ coco / annotations /'!cp 'ドライブ/マイドライブ/pose_dataset/person_keypoints_val2017.json' 'データセット/ coco / annotations /'
次に、train2017フォルダー全体をcocoフォルダーにコピーします。
!cp -avr content / train2017データセット/ coco /
出典:-著者
同様に、val2017フォルダーもコピーします。
!cp -avr content / val2017データセット/ coco /
出典:-著者
これでモデルの準備が整い、detectron2の要件に従ってデータセットが正しいフォルダーに配置されました。 したがって、ここでは、以前にインポートしたデフォルトのトレーナーを使用してトレーナーを定義し、 cfg その中のファイル。
#トレーナートレーナーを作成= DefaultTrainer(cfg)
出力は次のとおりです。-
出典:-著者
これが私たちのモデルのアーキテクチャであり、私たちのモデルはトレーニングデータセットで3690人のインスタンスを検出しました。
次に、モデルをトレーニングし、トレーニングを最初から開始するため、履歴書をfalseに設定します。 したがって、ドットトレイン機能を使用してモデルをトレーニングしています。
trainer.resume_or_load(resume = False)#モデルをトレーニングするtrainer.train()
出力は次のとおりです。-
出典:-著者
ここでは、トレーニングプロセスの最初の損失は約9.6であり、トレーニングが進むにつれて損失は5.6に減少します。
このモデルは、2000回の反復のトレーニングにXNUMX時間かかりました。 これでモデルがトレーニングされました。 次のセクションでは、パフォーマンスを評価します。
4.パフォーマンスを評価する
検証セットのパフォーマンスを評価しましょう。 そのため、最初に検証データセットをvalidation_dataおよび同様のメタデータとして登録します。 トレーニングデータの登録方法。
register_coco_instances( "validation_data"、{}、 'drive / My Drive /pose_dataset/person_keypoints_val2017.json'、 "content / val2017 /")pose_metadata = MetadataCatalog.get( "validation_data")。set(thing_classes = ["person"])
ここで、トレーニング中に保存された重みを定義しています。 ここでは、しきい値を0.5のままにしています。 構成ファイルでテストセットをvalidation_dataとして定義しています。
#最終的な重みをロードするcfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR、 "model_final.pth")#このモデルのテストしきい値を設定するcfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5#データセット名のリスト検証用。 DatasetCatalogに登録する必要がありますcfg.DATASETS.TEST =( "validation_data"、)
次に、detectron2のデフォルトの予測子を定義し、予測を取得するために使用される構成ファイルを渡します。
#detectron2.engineから予測子を設定しますimport DefaultPredictor#単一の入力イメージに対して単一のデバイスで実行される#指定された構成で単純なエンドツーエンドの予測子を作成します。 予測子= DefaultPredictor(cfg)
その後、データからいくつかの画像を視覚化するために、ビジュアライザーライブラリを使用します。 したがって、ランダムを使用して、視覚化する画像をランダムに選択します。
予測を視覚化するために、detectron2のビジュアライザー機能が使用されます。 cv2_imshowは、画像を表示するために使用されます。
ここで、forループを使用して、列車セットからランダムに画像を取得し、予測子を使用してこれらの画像の予測を行います。 すでに定義済みです。
ここで、ビジュアライザーを定義し、draw_instance_predictionsを使用して、これらの画像に予測を描画しています。
最後に、ここで出力を視覚化します。 したがって、ここに私たちのモデルによるいくつかの予測があります。
import random#detectron2.utils.visualizerから画像に予測を描画するためにimport Visualizer#google.colab.patchesから画像を表示するにはimport cv2_imshow#random.sample(train_images、5)でimgの画像をランダムに選択する:#予測出力を作成する= predictor(img)# `Visualizer`を使用して画像に予測を描画します。 v = Visualizer(img [:、:、::-1]、metadata = pose_metadata、scale = 1)#画像の予測を描画v = v.draw_instance_predictions(outputs ["instances"]。to( "cpu"))#画像を表示cv2_imshow(v.get_image()[:、:、::-1])
最初の画像では、モデルは人物と要点を特定しています。 同様に、他の画像については、モデルがこれらの出力の人物とキーポイントを正確に識別していることがわかります。
出典:-著者
次に、検証セットでのモデルの全体的なパフォーマンスを見てみましょう。 そのため、いくつかのヘルパー関数をインポートしています。 ここでこれは、パフォーマンスを評価するのに役立ちます。 まず、予測子を定義し、次にcoco evaluator関数を使用して評価器を定義し、検証画像をロードします。 build_detection_test_loaderを使用してデータローダーを定義しています。 最後に、データセット関数の推論を使用して検証セットの推論を行います。
#detectron2.dataからのテスト評価import build_detection_test_loader from detectron2.evaluation import COCOEvaluator、inference_on_datasetpredictor = DefaultPredictor(cfg)evaluator = COCOEvaluator( "validation_data"、cfg、False、output_dir = "./ output /")val_loader = build_detection_test_loader "validation_data")inference_on_dataset(trainer.model、val_loader、evaluator)
そしてここに結果があります。
出典:-著者
したがって、バウンディングボックスとキーポイントの両方のパフォーマンスが得られます。iou0.5での平均精度は、キーポイントで約38です。 このパフォーマンスはかなり低くなります。 これには主にXNUMXつの理由があります:-
1.まず、モデルをトレーニングするためにトレーニングデータセット全体を取得しませんでした。 ここでは、2000回の反復でモデルを再トレーニングしただけです。
2.トレーニング画像と反復の数を増やすことができ、パフォーマンスも向上させることができます。
したがって、次のセクションでは、非常に多くの反復でcocoキーポイントデータセットのトレーニングセット全体でトレーニングされた事前トレーニング済みモデルを使用し、それによってモデルのパフォーマンスが向上するかどうかを確認します。
事前トレーニング済みモデルを使用してポーズ検出モデルを構築する
前のセクションでは、detectoron2ライブラリを使用して、ポーズ検出モデルを最初からトレーニングしました。
このセクションでは、大量のデータセットでトレーニングされた事前トレーニング済みモデルを使用し、モデルのパフォーマンスを確認するために、より多くの反復を行います。
1.依存関係のインストール
まず、依存関係を読み込んでいるので、5.1バージョンの ピムル 図書館。 また、detectron2ライブラリもインストールしました。
!pip install pyyaml == 5.1#detectron2をインストールします:!pip install detectron2 == 0.1.3 -f https://dl.fbaipublicfiles.com/detectron2 /wheels/cu101/torch1.5/index.html
2.データセットをロードして前処理する
これで、ドライブからデータセットを読み込んでいます。 したがって、最初にドライブをマウントしてから、ドライブからファイルを抽出する必要があります。
#google.colabからドライブをマウントするimport drive drive.mount( 'drive /')
モデルをトレーニングしたくないので、検証画像のみを抽出しています。
#ファイルを抽出します!unzip 'ドライブ/マイドライブ/pose_dataset/validation_images.zip'
画像を読み取って保存するために、globライブラリとcv2を使用して画像を読み取って視覚化します。 したがって、最初にglobを使用して、すべての画像名をリストに格納します。
すべての画像名が保存されたら、 未読 これらの画像をXNUMXつずつ読み取り、リストに保存するために機能します。
from glob import glob#画像を処理するためにimport cv2#リストを作成images = [] #glob( 'content / val2017 / *。jpg')のiの各画像:img = cv2.imread(i)#画像を追加するリストimages.append(img)
ここでは、detectoron2ライブラリを使用して、事前にトレーニングされたモデルをロードしています。 まず、事前にトレーニングされたモデルを持つモデル動物園を使用します。 その後、検証セットで予測を行うためにデフォルトの予測子を使用し、デフォルトの構成ファイルをロードするためにcfgを取得します。
したがって、ここでは最初に次のクラスインスタンスを作成しました cfg 次に、cocoキーポイントデータセットでトレーニングされたRCNNモデルとなる選択されたモデルを取得し、このモデルをロードします。
3.トレインモデル
次に、事前にトレーニングされたモデルを使用します。 また、ウェイトをロードし、このモデルのウェイトとしてウェイトを定義します。
ここでは、しきい値を設定してから、デフォルトの予測子を使用して予測子を作成し、それをcfgファイルに渡しました。
#いくつかの一般的なdetectron2ユーティリティをインポートします#detectron2から事前トレーニング済みモデルを取得しますimport model_zoo#detectron2.engineから予測子を設定しますimport DefaultPredictor#detectron2.configからconfigを設定しますimport get_cfg#configure instance cfg = get_cfg()を設定します#relativeによって指定されたモデルを取得しますDetectron2の公式configs /ディレクトリの下のパス。 cfg.merge_from_file(model_zoo.get_config_file( "COCO-Keypoints / keypoint_rcnn_R_101_FPN_3x.yaml"))#事前トレーニング済みモデルをダウンロードcfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url( "COCO-Keypoints / keypoint_rcnn_R_101_FPN_3x .MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.8
#predictorpredictorを作成= DefaultPredictor(cfg)
先に進む前に、データセットを登録する必要があるため、ここで検証データを登録してから、メタデータカタログも定義します。 ここで、人であるクラスを定義する必要があります。
fromdetectron2.data.datasets import register_coco_instances register_coco_instances( "validation_data"、{}、 'drive / My Drive / pose_dataset /validation_annotation.json'、 "content / val2017 /")
からdetectron2.dataインポートMetadataCatalogpose_metadata = MetadataCatalog.get( "validation_data")。set(thing_classes = ["person"])
ランダムに選択された画像のモデルを使用して予測を行い、画像に予測をプロットするか、画像に予測を描画してから画像を表示します。
import random#detectron2.utils.visualizerから画像に予測を描画するためimport Visualizer#detectron2.dataからメタデータを取得するimport MetadataCatalog#google.colab.patchesから画像を表示するimport cv2_imshow#random.sample(でimgの画像をランダムに選択するimages、5):#予測出力を作成= predictor(img)# `Visualizer`を使用して画像に予測を描画します。 v = Visualizer(img [:、:、::-1]、metadata = pose_metadata、scale = 1)#画像の予測を描画v = v.draw_instance_predictions(outputs ["instances"]。to( "cpu"))#画像を表示cv2_imshow(v.get_image()[:、:、::-1])cv2_imshow(img)
したがって、ここでは、画像内の部分が正しく識別または配置されており、これらすべての画像の要点もマークされていることがわかります。 これが予測画像であり、これが元の画像でした。 同様に、さらにいくつかの例を見ることができるので、これは予測された画像と元の画像です。
出典:-著者
4.パフォーマンスを評価する
ここで、detectoron2を使用する前に見たように、モデルを評価するために。 ココ評価者を評価してインポートします。 したがって、最初にデフォルトの予測子を使用して予測を行い、検証データの予測を評価するためにcocoエバリュエーターを使用します。これが推論です。
#detectron2.dataからのテスト評価importbuild_detection_test_loader fromdetectron2.evaluationインポートCOCOEvaluator、inference_on_datasetpredictor = DefaultPredictor(cfg)evaluator = COCOEvaluator( "validation_data"、cfg、False、output_dir = "./ output /")val_loader = build_detection_test_loader "validation_data")inference_on_dataset(predictor.model、val_loader、evaluator)
出典:-著者
したがって、上の画像で、 0.5RUUの平均精度 キーポイントは87です。これは 私たちが訓練したモデルよりもはるかに優れています。 主に このモデルは膨大なデータセットでトレーニングされているため、 多数の反復に対して。 したがって、モデルのパフォーマンスが大幅に向上していることがわかります。
まとめ
画像データの理論と基礎を理解することは、ビジネス上の課題を解決し、必要なモデルを開発するために重要です。 画像データの操作に関して最も難しい作業は、モデルに適用できる画像からポーズを検出する方法を見つけることです。
この記事が、画像データの処理方法、ポーズ検出モデルの構築方法を理解するのに役立つことを願っています。この手法を使用して、スポーツ分析ドメインに適用します。
したがって、スポーツの画像を分類するためにポーズ検出を使用します。次の記事に進みましょう。これについては、次の記事で詳しく説明します。
ありがとうございました。
著者について
こんにちは、カジャル・クマリです。 コンピュータサイエンス&エンジニアリングのIIT(ISM)ダンバードで修士号を取得しました。 現在、私はハイデラバードで機械学習エンジニアとして働いています。 これが私の LinkedIn あなたが私とつながりたいのなら。
エンドノート
読んでくれてありがとう!
この記事を楽しんでいただけたでしょうか。 あなたがそれを好きなら、あなたの友人にもそれを共有してください。 言及されていないこと、またはあなたの考えを共有したいことはありますか? 以下にコメントしてください。折り返しご連絡いたします。
私の以前のブログを読みたい場合は、以前のDJodhpurataサイエンスブログの投稿を読むことができます。 こちら.
この記事に示されているメディアは Analytics Vidhya が所有するものではなく、著者の裁量で使用されています。