https://blog.csdn.net/qq_28168421/article/details/53406659
https://www.cnblogs.com/YiXiaoZhou/p/6757165.html
测试获得六尺度的注意点 :
1、六个尺度是对原图像,就是一开始的图像未被变成256*256的改变。
2、在转换的过程中,需要得到仿射变换矩阵。
-------------------------------------------------------------------------------
-- Cropping-------这个函数也是多尺度测试会用到的
-------------------------------------------------------------------------------
function crop(img, center, scale, rot, res)
----------测试时
----------center:local center = a['center'][idxs[i]未被处理的真实图像
----------scale:缩放后的值 local original_scale = a['scale'][idxs[i]];scale = ----------original_scale*factor
-- Crop function tailored to the needs of our system. Provide a center
-- and scale value and the image will be cropped and resized to the output
-- resolution determined by res. 'rot' will also rotate the image as needed.
---------下面这个代码是获得从(0,0),(256,256)分别原图中应该所在的区域左上和左下坐标
local ul = transform({1,1}, center, scale, 0, res, true)
local br = transform({res,res}, center, scale, 0, res, true)
----------获得padding
local pad = math.floor(torch.norm((ul - br):float())/2 - (br[1]-ul[1])/2)
if rot ~= 0 then
ul = ul - pad
br = br + pad
end
local newDim,newImg,ht,wd
if img:size():size() > 2 then
----定义原图被框出来的大小尺寸
newDim = torch.IntTensor({img:size()[1], br[2] - ul[2], br[1] - ul[1]})
newImg = torch.zeros(newDim[1],newDim[2],newDim[3])
------原图的高和宽
ht = img:size()[2]
wd = img:size()[3]
else
newDim = torch.IntTensor({br[2] - ul[2], br[1] - ul[1]})
newImg = torch.zeros(newDim[1],newDim[2])
ht = img:size()[1]
wd = img:size()[2]
end
---------获取新图包含人的宽的左下角坐标和右下角的坐标;左上角和右上角的坐标。
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)})
if newDim:size()[1] > 2 then
---------将旧图中包含人的像素赋值给新图
------------------img:sub(dim1star=第一维开始的地址,dim1end=第一维结束的地址,dim2star,dim2end),
newImg:sub(1,newDim[1],newY[1],newY[2],newX[1],newX[2]):copy(img:sub(1,newDim[1],oldY[1],oldY[2],oldX[1],oldX[2]))
else
newImg:sub(newY[1],newY[2],newX[1],newX[2]):copy(img:sub(oldY[1],oldY[2],oldX[1],oldX[2]))
end
if rot ~= 0 then
newImg = image.rotate(newImg, rot * math.pi / 180, 'bilinear')
if newDim:size()[1] > 2 then
newImg = newImg:sub(1,newDim[1],pad,newDim[2]-pad,pad,newDim[3]-pad)
else
newImg = newImg:sub(pad,newDim[1]-pad,pad,newDim[2]-pad)
end
end
-----------裁剪新图newImg为res=256大小
newImg = image.scale(newImg,res,res)
return newImg
end