Skip to content

Why using opencv cuda wrapper mess up all my tensors? #175

Description

@yxchng

After using cuda to scale my img in function scale, i could not print the tensor anymore (note all the print statements in the code)

require 'paths'
paths.dofile('/home/iim/pose-hg-train/src/ref.lua')
paths.dofile('/home/iim/pose-hg-train/src/model.lua')

-- local cv = require 'cv'
require 'cutorch'
cv = require 'cv'
require 'cv.cudawarping'
require 'cv.highgui'
require 'cv.imgcodecs'

require 'cv.highgui' -- GUI
require 'cv.videoio' -- Video stream
require 'cv.imgproc' -- Image processing (resize, crop, draw text, ...)
require 'nn'

local function scale(input, size)
    local h, w = input:size(1), input:size(2)

    -- if (w <= h and w == size) or (h <= w and h == size) then
    --    return input
    -- end
    local inputCUDA = input:float():cuda() / 255
    if w < h then
        return cv.cuda.resize{inputCUDA, {w/h * size, size}}:float()
     else
        return cv.cuda.resize{inputCUDA, {size, h/w * size}}:float()
     end
end

local function padWithZeros(input, size)
    local output = torch.FloatTensor(size, size, 3)
    local w, h = input:size(2), input:size(1)
    local x, y = math.ceil((size-h)/2), math.ceil((size-w)/2)
    output:sub(x+1,x+h,y+1,y+w,1,3):copy(input:float())
    print(output)
    return output
end

local function getBoundingBox(bbox, rawImage)
    -- print(bbox)
    local boundingBox = rawImage:sub(bbox[2], bbox[2]+bbox[4], bbox[1], bbox[1]+bbox[3])
    return boundingBox

end

local function transformKpts(bbox, kpts)
    kpts:select(2,1):add(bbox[1])
    kpts:select(2,2):add(bbox[2])
    return kpts
end

local function detect_pose(bbox, rawImage)


    input = getBoundingBox(bbox, rawImage)
    input = scale(input, 256)
    input = padWithZeros(input, 256)
    input = input:reshape(3, 256, 256)
    print(input:size())
    -- print(input:size())
    -- print(input:float())
    -- print(input[0])
    print(input)
    if opt.GPU ~= -1 then
        -- Convert to CUDA
        cudaImg = applyFn(function (x) return x:cuda() end, input)
    end

    print(cudaImg:float())
    print ("foward")
    local hms = model:forward(cudaImg)[8][1]

    print("DONE INFERENCING")
    hms = hms:float()
    _, x = hms:max(2):max(3)
    MAX, y = hms:max(3):max(2)
    kpts = x:float():cat(y:float()):view(16,2):div(64):mul(256)
    score = MAX:float():view(16)

    print("DRAWING")
    imgWithSkeleton = drawSkeleton(rawImage:clone(), transformKpts(bbox, kpts), score)

    -- local hmImg
    -- local nOut,res = hms:size(1),hms:size(3)

    -- -- Repeat input image, and darken it to overlay heatmaps
    -- tmpInp = image.scale(img, res):mul(1)

    -- hmImg = tmpInp:repeatTensor(nOut,1,1,1)
    -- -- Copy ground truth heatmaps to red channel

    -- hmImg:sub(1,-1,1,1):add(hms:mul(1.3))
    -- -- -- Rescale so it is a little easier to see
    -- hmImg = image.scale(hmImg:view(nOut*3,res,res),256):view(nOut,3,256,256)
    return imgWithSkeleton

end


local capture = cv.VideoCapture{'/home/iim/pose-hg-train/src/test/data/test_video.avi'}
-- local capture = cv.VideoCapture{"/Users/yxchng/Desktop/pose_detection/test.mp4"}
local f = io.open('/home/iim/pose-hg-train/src/test/data/box.txt')

-- while true do
--     local ret, frame = capture:read{}
    
--     -- if not ret then
--     -- 	break 
--     -- end

--     local s = f:read()

--     -- print(frame)
--     -- if s ==  "" then
--     -- 	break
--     -- end
--     s = s:split(" ")
--     -- print(s)
--     -- print(x)
--     local x, y, w, h = tonumber(s[1]), tonumber(s[2]), tonumber(s[3]), tonumber(s[4])
--     -- local boundingBox = getBoundingBox({x,y,w,h}, frame)
--     local pose = detect_pose({x,y,w,h}, frame)
--     cv.Rect{tonumber(s[1]), tonumber(s[2]), tonumber(s[3]), tonumber(s[4])}
--     cv.rectangle{frame, {x, y}, {x+w, y+h}, color={255,0,255,0}}
--     cv.namedWindow{"video_img", 0}
--     -- cv.resizeWindow{"video_img", 500, 500};
--     cv.imshow{'video_img', pose}
--     cv.waitKey{1}
-- end


local ret, frame = capture:read{}

-- if not ret then
--  break 
-- end

local s = f:read()

-- print(frame)
-- if s ==  "" then
--  break
-- end
s = s:split(" ")
-- print(s)
-- print(x)
local x, y, w, h = tonumber(s[1]), tonumber(s[2]), tonumber(s[3]), tonumber(s[4])
-- local boundingBox = getBoundingBox({x,y,w,h}, frame)
local pose = detect_pose({x,y,w,h}, frame)
cv.Rect{tonumber(s[1]), tonumber(s[2]), tonumber(s[3]), tonumber(s[4])}
cv.rectangle{frame, {x, y}, {x+w, y+h}, color={255,0,255,0}}
cv.namedWindow{"video_img", 0}
-- cv.resizeWindow{"video_img", 500, 500};
cv.imshow{'video_img', pose}
cv.waitKey{1}

After using cuda to scale my img in function scale, i could not print the tensor anymore (not all the print statements in the code)

It gives the following error

THCudaCheck FAIL file=/home/iim/torch/extra/cutorch/lib/THC/generic/THCStorage.c line=182 error=17 : invalid device pointer
/home/iim/torch/install/bin/luajit: cuda runtime error (17) : invalid device pointer at /home/iim/torch/extra/cutorch/lib/THC/generic/THCStorage.c:182

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions