LabVIEWを使用してMask R-CNN画像インスタンスセグメンテーションを実装する方法を説明します

序文

画像分類とターゲット検出を実現するための LabVIEW ツールキットの使用について紹介しましたが、今日は LabVIEW を使用してマスク R-CNN 画像インスタンス セグメンテーションを実装する方法を見ていきます。


1. 画像インスタンスのセグメンテーションとは何ですか?

画像インスタンスのセグメンテーション (Instance Segmentation) は、オブジェクトの前景と背景を分離するセマンティック検出 (Semantic Segmentation) に基づいてさらに洗練され、ピクセル レベルでのオブジェクトの分離を実現します。画像のセマンティック セグメンテーションと画像のインスタンス セグメンテーションは 2 つの異なる概念です。セマンティック セグメンテーションは異なるカテゴリのオブジェクトのみを区別してセグメント化しますが、インスタンス セグメンテーションは同じクラス内の異なるインスタンスのオブジェクトをさらにセグメント化します。

コンピューター ビジョンにおけるいくつかの一般的なタスク (分類、検出、セマンティック セグメンテーション、インスタンス セグメンテーション)

ここに画像の説明を挿入

2.マスクR-CNNとは

ここに画像の説明を挿入

マスクR-CNNは、「ターゲットの検出」、「ターゲットのインスタンスのセグメンテーション」、「ターゲットのキーポイントの検出」に使用できるインスタンスセグメンテーション(インスタンスセグメンテーション)アルゴリズムです。マスク R-CNN アルゴリズムのステップ:

  • まず、処理したい画像を入力し、対応する前処理操作、または前処理された画像を実行します。

  • それを事前にトレーニングされたニューラル ネットワーク (ResNeXt など) に入力して、対応する特徴マップを取得します。

  • 複数の候補 ROI を取得するには、特徴マップ内の各点に所定の ROI を設定します。

  • これらの候補 ROI を RPN ネットワークに送信してバイナリ分類 (前景または背景) と BB 回帰を行い、いくつかの候補 ROI をフィルタリングします。

  • 次に、残りの ROI に対して ROIAlign 操作を実行します (つまり、最初に元の画像を特徴マップのピクセルと照合し、次に

  • 特徴マップは固定特徴に対応します)。

  • 最後に、これらの ROI を分類 (N カテゴリ分類)、BB 回帰、MASK 生成 (ROI ごとに FCN 演算を実行)

3. LabVIEWはMask R-CNN画像インスタンスセグメンテーションモデルを呼び出します

1. マスク R-CNN モデルの取得と変換

  • pytorch と torchvision をインストールする

  • torchvision でモデルを取得します (事前トレーニングされたモデルを取得します)。

モデル = models.detection.maskrcnn_resnet50_fpn(事前トレーニング = True)
  • Nxをオンにする

1 def get_pytorch_onnx_model(original_model): 
 2 model=original_model 
 3 # さらに変換されたモデルを保存するためのディレクトリを定義します
 4 onnx_model_path = dirname 
 5      
 6 # さらに変換されたモデルの名前を定義します
 7 onnx_model_name = "maskrcnn_resnet50.onnx" 
 8 
 9 # ディレクトリを作成しますさらに変換されたモデル
10 os.makedirs(onnx_model_path,exist_ok=True) 
11 
12 # 変換されたモデルへのフルパスを取得
13 full_model_path = os.path.join(onnx_model_path, onnx_model_name) 
14 model.eval() 
15 
16 x = torch .rand(1, 3, 640, 640) 
17 # ONNX 形式へのモデルのエクスポート
18 torch.onnx.export(
19 original_model、
20 x、
21 full_model_path、
22 input_names=["input"]、
23 Output_names=["boxes"、"labels"、"scores"、"masks"]、
24 Dynamic_axes={"input": [0, 1, 2, 3],「ボックス」: [0, 1],「ラベル」: [0],「スコア」: [0],「マスク」: [0, 1, 2, 3]}、25
冗長=True,opset_version=11 
26 ) 
27 
28 return full_model_path

完全な取得とモデル変換のための Python コードは次のとおりです。

1 os をインポート
 2 torch をインポート
 3 torch.onnx をインポート
 4 torch.autograd からインポート変数
 5 torchvision からモデルをインポート
 6 
 7 dirname, filename = os.path.split(os.path.abspath(__file__)) 
 8 print(dirname) 
 9 
10 def get_pytorch_onnx_model(original_model): 
11 model=original_model 
12 # さらに変換されたモデルを保存するためのディレクトリを定義します
13 onnx_model_path = dirname 
14      
15 # さらに変換されたモデルの名前を定義します
16 onnx_model_name = "maskrcnn_resnet50.onnx" 
17 
18 # createさらに変換されたモデルのディレクトリ
19 os.makedirs(onnx_model_path,exist_ok=True)
20 
37 full_model_path を返す
21 # 変換されたモデルへのフルパスを取得します
22 full_model_path = os.path.join(onnx_model_path, onnx_model_name) 
23 model.eval() 
24 
25 x = torch.rand(1, 3, 640, 640) 
26 # モデルのエクスポート先ONNX 形式
27 torch.onnx.export( 
28 original_model, 
29 x, 
30 full_model_path, 
31 input_names=["input"], 32 
Output_names=["boxes", "labels", "scores", "masks"], 
33 Dynamic_axes ={"入力": [0, 1, 2, 3],"ボックス": [0, 1],"ラベル": [0],"スコア": [0],"マスク": [0, 1 , 2, 3]}, 
34 冗長=True,opset_version=11 
35 ) 
36 
38 
39
40モデル = models.detection.maskrcnn_resnet50_fpn(pretrained=True) 
41 print(get_pytorch_onnx_model(model))

2. LabVIEWはマスクR-CNN(マスクrcnn.vi)を呼び出します。

注: マスク R-CNN モデルは、一部の演算子がサポートしていないため、OpenCV dnn を使用してロードすることはできません。そのため、主に LabVIEW オープン ニューラル ネットワーク インタラクティブ ツールキット (ONNX) を使用して推論モデルをロードします。

  • onnxruntime は onnx モデルを呼び出し、アクセラレーション方法を選択します

ここに画像の説明を挿入

  • 画像の前処理

    ここに画像の説明を挿入

  • 推論の実行 使用するモデルは、maskrcnn_resnet50_fpn で、その出力には 4 つのレイヤー (ボックス、ラベル、スコア、マスク) があり、データ型は次のとおりです。

ここに画像の説明を挿入

  • ラベルのタイプが INT64 であることがわかります。そのため、ソース コードには「Get_Rresult_int64.vi、インデックスは 1、ラベルは 2 番目の層、つまり添字が 1 であるため、インデックスは 1」が必要です。

ここに画像の説明を挿入

  • 他の3つの出力はfloat32で取得でき、マスクのデータ型はuint8ですが、実際に操作してみると正規化されており、float32も利用できることが分かりました。

ここに画像の説明を挿入

  • 後処理とインスタンスセグメンテーションの実装後処理の内容が多数あるため、サブVIのmask_rcnn_post_process.viに直接カプセル化されています。ソースコードは次のとおりです。

ここに画像の説明を挿入

  • プログラムの全体的な枠組みは次のとおりです。

ここに画像の説明を挿入

ここに画像の説明を挿入

  • インスタンスのセグメンテーションの結果は次のとおりですが、モデルの実行に以前よりも時間がかかっていることがわかります。各オブジェクトの面積を取得するだけでなく、その領域の輪郭を枠で囲む必要があるため、5 人とバスケットボールがすべて異なる色を使用して枠で区切られていることがわかります。

ここに画像の説明を挿入

3. LabVIEWはMask R-CNNを呼び出してリアルタイムの画像セグメンテーションを実現します(マスクrcnn_camera.vi)

全体的なアイデアは上記の画像検出の強度セグメンテーションと似ていますが、カメラが使用され、オブジェクトの各フレームに対して強度セグメンテーションを実行するループが追加されています。3080 シリーズ グラフィック カードは、推論を高速化するために TensorRT を選択でき、セグメンテーションよりスムーズになります。このモデルは実際に検出数をテストしているため、人物のみをセグメント化する場合は、よりきれいな背景を選択でき、全体的な検出速度が大幅に向上することがわかりました。 ここに画像の説明を挿入ここに画像の説明を挿入

4. Mask-RCNN は独自のデータセットをトレーニングします (歩行者の検出)

1. 準備

  • トレーニングには jupyterlab 環境が必要です。インストールしていない学生は、pip install jupyterlab を通じてインストールする必要があります。

  • jupyterlab環境が解決できない場合は、colabまたはkaggleが提供する無料のGPU環境をトレーニングに使用できます

  • トレーニングソースコード:mask-rcnn.ipynb

2. トレーニングを開始する

  • プロンプトに従ってこのコードを実行し、依存ファイル データセットを自動または手動でダウンロードし、データセット解析クラスを作成します。

ここに画像の説明を挿入

  • シングルラウンドトレーニングの機能を定義します。ネットワーク構造はトーチビジョンの既存のものを直接採用し、再定義されません。

ここに画像の説明を挿入

  • 次の出力は、トレーニングが進行中であることを示します。

ここに画像の説明を挿入

  • このファイル名を変更し、独自の画像名に変更して実行し、トレーニング効果を確認します。

ここに画像の説明を挿入

3. トレーニング効果

ここに画像の説明を挿入

4.ONNX のエクスポート

ここに画像の説明を挿入


要約する

以上が今日皆さんにお伝えしたいことです。WeChat 公開アカウント VIRoboticsをフォローし、キーワード「R-CNN 画像インスタンス セグメンテーション ソース コードをマスクする」に返信すると  、完全なプロジェクト ソース コードとこの共有コンテンツのモデルを取得できます。

おすすめ

転載: blog.csdn.net/weixin_47367099/article/details/127655901