PyraNetデータ処理(二)--テスト

3479 ワード

1、
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