PyraNetデータ処理(二)--テスト
3479 ワード
1、
PyraNeteテストで座標を元の画像にどのように対応させたのでしょうか???
newHmに戻る
Multitestのメインプログラムに入ります
異なる尺度で裁断された領域が異なるのではないかと心配されますが、平均的には合理的ではありませんか?いいえ、センターとscaleも相応に変化するので、このような問題はありません.最後に加算できます.
ではhourglassはtest予測をする際にどのように実現したのでしょうか??
PyraNeteテストで座標を元の画像にどのように対応させたのでしょうか???
local function getHeatmaps(imHeight, imWidth, center, scale, rot, res, hm)
local ul = t.transform({1,1}, center, scale, 0, res, true)
local br = t.transform({res,res}, center, scale, 0, res, true)
newDim = torch.IntTensor({3, br[2] - ul[2], br[1] - ul[1]}) -- ,
ht = imHeight
wd = imWidth
local newX = torch.Tensor({math.max(1, -ul[1]+1), math.min(br[1], wd) - ul[1]})
local newY = torch.Tensor({math.max(1, -ul[2]+1), math.min(br[2], ht) - ul[2]})
local oldX = torch.Tensor({math.max(1, ul[1]+1), math.min(br[1], wd)})
local oldY = torch.Tensor({math.max(1, ul[2]+1), math.min(br[2], ht)}) -- ,
local newHm = torch.zeros(hm:size(1), ht, wd) --newHm
hm = image.scale(hm:float(), newDim[3], newDim[2]) --hm 64*64 featuremap
newHm:sub(1, hm:size(1), oldY[1],oldY[2],oldX[1],oldX[2]):copy(hm:sub(1,hm:size(1),newY[1],newY[2],newX[1],newX[2])) newHm
newHmに戻る
Multitestのメインプログラムに入ります
finalPredsHms = output[#output]
fuseHm = torch.zeros(self.opt.nClasses, imHeight, imWidth)
for pyra = 1, #scales do
local hm_img = getHeatmaps(imHeight, imWidth, sample.center[pyra], sample.scale[pyra], 0, 256, finalPredsHms[pyra])
fuseHm = fuseHm + hm_img
end
fuseHm = fuseHm/#scales
上のこのプログラムは予測されたfeaturemapを元の図にマッピングし、そのまま元の図の中で最大最小値を取るのが予測を要求する座標値です.異なる尺度で裁断された領域が異なるのではないかと心配されますが、平均的には合理的ではありませんか?いいえ、センターとscaleも相応に変化するので、このような問題はありません.最後に加算できます.
ではhourglassはtest予測をする際にどのように実現したのでしょうか??
saved.idxs:sub(tmpIdx, tmpIdx+bs-1):copy(indices)
saved.preds:sub(tmpIdx, tmpIdx+bs-1):copy(postprocess(set,indices,output))
ポイントはpostprocessという関数ですfunction postprocess(set, idx, output)
local tmpOutput
if type(output) == 'table' then tmpOutput = output[#output]
else tmpOutput = output end
local p = getPreds(tmpOutput) -- bxcx2
local scores = torch.zeros(p:size(1),p:size(2),1) --
-- Very simple post-processing step to improve performance at tight PCK thresholds
for i = 1,p:size(1) do
for j = 1,p:size(2) do
local hm = tmpOutput[i][j]
local pX,pY = p[i][j][1], p[i][j][2]
scores[i][j] = hm[pY][pX]
if pX > 1 and pX < opt.outputRes and pY > 1 and pY < opt.outputRes then
local diff = torch.Tensor({hm[pY][pX+1]-hm[pY][pX-1], hm[pY+1][pX]-hm[pY-1][pX]})
p[i][j]:add(diff:sign():mul(.25))
end
end
end
p:add(0.5) --
-- Transform predictions back to original coordinate space
local p_tf = torch.zeros(p:size())
for i = 1,p:size(1) do
_,c,s = dataset:getPartInfo(idx[i])
p_tf[i]:copy(transformPreds(p[i], c, s, opt.outputRes)) --
end
return p_tf:cat(p,3):cat(scores,3)
end
function transformPreds(coords, center, scale, res)
local origDims = coords:size()
coords = coords:view(-1,2)
local newCoords = coords:clone()
for i = 1,coords:size(1) do
newCoords[i] = transform(coords[i], center, scale, 0, res, 1) -- c,s ,
end
return newCoords:view(origDims)
end