私は、セグメント化された画像を一意のラベル1 ... kの2次元マトリックスとして持っています。例:ラベル付き画像領域の重心を効率的に見つける
img =
[1 1 2 2 2 2 2 3 3]
[1 1 1 2 2 2 2 3 3]
[1 1 2 2 2 2 3 3 3]
[1 4 4 4 2 2 2 2 3]
[4 4 4 5 5 5 2 3 3]
[4 4 4 5 5 6 6 6 6]
[4 4 5 5 5 5 6 6 6]
リージョンの重心を特定しようとしています。つまり、ラベルごとに、重心のX、Y座標は?例えば、ラベル1の重心は(1.25,0.625)である。行番号((0 + 0 + 1 + 1 + 1 + 2 + 2 + 3)/8 = 1.25
)と列番号((0 + 0 + 0 + 0 + 1 + 1 + 1 + 2)/8 = 0.625
)を平均してください。
これを行う方法を知る唯一の方法は、1からkまでのforループを使用することです。 6)、各ラベルの点のインデックスを見つけ、画像のメッシュグリッドにインデックスを付けることによってそれらの座標を平均する。
しかし、私はGPUの計算に最適化された方法でこれを行うことを検討しています。したがって、forループの使用は理想的ではありません(数百のラベルのためにすばらしいGPUでイメージあたり約1秒かかる)。私はPyTorchを使用していますが、本当にどんなnumpyソリューションでも問題ありません。
このタスクのGPU効率的なソリューションはありますか?
これは私があまりにも思い付く最高の解決策です。データはすでにGPU上にあるので、私はそこでそれをやろうと思ったのです。 CPUの動きを見ていきます。これは確かに効率的です - すべてのピクセルが一度触れましたが、私はGPUでこれを並列化する方法があるのだろうかと思っています... – marcman
上記のアルゴリズムの純粋なGPU実装が遅すぎると、イメージ列ごとに配列 'n'、' sx'と 'sy'を作成し、後でそれらを一緒に追加することです。これにより、配列値のアトミック更新を行うのを待っているコアの数を減らすことができます。 –
グローバル配列内の単一の値を原子的に更新すると効率的ですか?あなたはGPU上で誤った共有の問題を抱えていますか? –