我正在處理一個尺寸為512x512的影像。使用einops將該影像劃分為補丁,補丁大小為32。補丁的數量是256,換句話說,我們得到一個尺寸為256x1024的新 "影像"。
因為這個影像實際上是一個分割問題的掩碼,所以這個影像實際上只由4個值(4個類)組成。0為背景,1為第一類,2為第二類,3為第三類。
我的目標是采取每一個補丁,并為每一類C計算以下內容:
這個補丁中的像素數/標記為C的像素數。
這將給我一個大小為4的陣列,其中第一個條目是補丁中的像素總數(1024)超過背景像素數(標記為0),第二、第三和第四個條目是相同的,但對應的類別。
在理論上,我知道我需要遍歷每一個補丁,然后計算每個類別有多少像素存在于當前補丁中,然后除以1024。這樣做256得到的結果正是我想要的。問題是,我有一個(非常)大量的圖片需要這樣做,而512的大小只是一個例子,使問題更簡單,因此for回圈是不可能的。
我知道我可以用numpy得到我想要的結果。我試過這兩種方法。numpy.apply_over_axes和numpy.apply_along_axis,但是我不知道哪一個更適合這個任務,另外還有numpy.where,我不知道它在這里如何應用。
以下是我所做的:
from einops import rearrange
import numpy as np
labn = np.random.randint(4,size= (512, 512) # 這個影像中的每個像素的值都是:0,1,2,3。
to_patch = rearrange(labn, "(h p1) (w p2) -> (h w) (p1 p2)"/span>, p1=32, p2=32)
print(to_patch.shape) # (256,1024)
c0 = np.full(1024, 0)
c1 = np.full(1024, 1)
c2 = np.full(1024, 2)
c3 = np.full(1024, 3)
def f(a)。
_c0 = a == c0
_c1 = a == c2
_c2 = a == c2
_c3 = a == c3
pr = np.array([np.sum(_c0), np.sum(_c1), np. sum(_c2), np.sum(_c3)]) / 1024。
return pr
resf = np.apply_along_axis(f, 1, to_patch)
print(resf.shape) # (256, 4, 1024)/span>
兩件事:
- 我希望輸出為
256x4,其中沿第二軸的每個陣列的總和為1。 - 有沒有更快的/更好的/更簡單的方法來做這個,最好是矢量的?
編輯:我忘了加總,所以現在我確實得到了256x4。
uj5u.com熱心網友回復:
有一個內置的函式來計算出現的次數,叫做torch.histc,它類似于Python的collections.Counter。
torch.histc(input, bins=100, min=0, max=0, *, out=None) → Tensor
計算一個張量的柱狀圖。元素被排序到
min和max之間的等寬bin。如果min和max都是零,則使用資料的最小和最大值。 使用。低于
min和高于max的元素被忽略。
你需要指定bins的數量,這里是指類的數量C。以及用于排序的min和max值。此外,它不會對多維張量起作用,因為這樣產生的張量將包含輸入張量的全域統計,而不考慮維度。作為一個可能的解決方法,你可以遍歷你的補丁,每次都呼叫torch.histc,然后將結果堆疊起來并歸一化:
resf = torch.stack([torch. histc(patch, C, min=0, max=C-1) for patch in x] ) / x.size(1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/320320.html
標籤:
