Skip to content

Commit 399607a

Browse files
authored
ImageManip GPU backend (#1812)
* RVC4 FW: Use DmaHeapBuffer for resizers * Add GPU backend to ImageManip * WIP: refactor imagemanip * WIP: Simplified image manip Warp impl * Refactored ImageManip * Bugfixes * Add cast method to ConvertedOffsetMemory * Fix ConvertedOffsetMemory * RVC4 FW: Implement GPU backend for ImageManip * Set manip examples to use the GPU backend * PR fixes * clangformat * Add image manip GPU backend tests * PR fixes * Split offset memory from memory * Fix examples to only select GPU if available * Example fix * Add comments * Fix build * Clangformat * Update rvc4 fw * Guard ConvertedOffsetMemory from nullptr * RVC4 FW: Merge develop
1 parent 3790794 commit 399607a

15 files changed

Lines changed: 3177 additions & 2861 deletions

File tree

bindings/python/src/pipeline/node/ImageManipBindings.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ void bind_imagemanip(pybind11::module& m, void* pCallstack) {
2929
.value("LOW_POWER", ImageManip::PerformanceMode::LOW_POWER);
3030

3131
py::enum_<ImageManip::Backend> backend(imageManip, "Backend");
32-
backend.value("HW", ImageManip::Backend::HW).value("CPU", ImageManip::Backend::CPU);
32+
backend.value("HW", ImageManip::Backend::HW).value("CPU", ImageManip::Backend::CPU).value("GPU", ImageManip::Backend::GPU);
3333

3434
// ImageManip Node
3535
imageManip.def_readonly("inputConfig", &ImageManip::inputConfig, DOC(dai, node, ImageManip, inputConfig))

cmake/Depthai/DepthaiDeviceRVC4Config.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
set(DEPTHAI_DEVICE_RVC4_MATURITY "snapshot")
44

55
# "version if applicable"
6-
set(DEPTHAI_DEVICE_RVC4_VERSION "0.0.1+6e02a76617ed920eee465c4702fa07f06b6c191e")
6+
set(DEPTHAI_DEVICE_RVC4_VERSION "0.0.1+ffaaa351f971c291311f8ab5d8d0753f327799b3")

examples/cpp/ImageManip/image_manip_remap.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,20 @@ int main() {
4949
auto manip1 = pipeline.create<dai::node::ImageManip>();
5050
auto manip2 = pipeline.create<dai::node::ImageManip>();
5151

52+
// GPU is not available on RVC2 and some RVC4 devices
53+
auto backend = pipeline.getDefaultDevice()->hasGPU() ? dai::node::ImageManip::Backend::GPU : dai::node::ImageManip::Backend::CPU;
54+
manip1->setBackend(backend);
55+
manip2->setBackend(backend);
56+
5257
// Configure camera output
53-
auto camOut = cam->requestOutput(std::make_pair(640, 400), dai::ImgFrame::Type::BGR888i, dai::ImgResizeMode::LETTERBOX, 20, 20);
58+
auto* camOut = cam->requestOutput(std::make_pair(640, 400), dai::ImgFrame::Type::BGR888i, dai::ImgResizeMode::LETTERBOX, 20, 20);
5459

5560
// Configure image manipulators
5661
manip1->initialConfig->addRotateDeg(90);
5762
manip1->initialConfig->setOutputSize(200, 320);
5863

5964
manip2->initialConfig->addRotateDeg(90);
6065
manip2->initialConfig->setOutputSize(320, 200);
61-
manip2->setRunOnHost(true);
6266

6367
// Linking
6468
camOut->link(manip1->inputImage);
@@ -123,4 +127,4 @@ int main() {
123127
}
124128

125129
return 0;
126-
}
130+
}

examples/cpp/ImageManip/image_manip_resize.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ int main(int argc, char** argv) {
2727
auto camRgb = pipeline.create<dai::node::Camera>()->build(dai::CameraBoardSocket::CAM_A);
2828
auto manip = pipeline.create<dai::node::ImageManip>();
2929

30+
// GPU is not available on RVC2 and some RVC4 devices
31+
manip->setBackend(device->hasGPU() ? dai::node::ImageManip::Backend::GPU : dai::node::ImageManip::Backend::CPU);
32+
3033
// Resize to 400x400 and avoid stretching by cropping from the center
3134
manip->initialConfig->setOutputSize(400, 400, dai::ImageManipConfig::ResizeMode::CENTER_CROP);
3235
// Set output frame type

examples/python/ImageManip/image_manip_remap.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ def draw_rotated_rectangle(frame, center, size, angle, color, thickness=2):
3030
manip1 = pipeline.create(dai.node.ImageManip)
3131
manip2 = pipeline.create(dai.node.ImageManip)
3232

33+
# GPU is not available on RVC2 and some RVC4 devices
34+
backend = dai.node.ImageManip.Backend.GPU if pipeline.getDefaultDevice().hasGPU() else dai.node.ImageManip.Backend.CPU
35+
manip1.setBackend(backend)
36+
manip2.setBackend(backend)
37+
3338
camOut.link(manip1.inputImage)
3439
manip1.out.link(manip2.inputImage)
3540

@@ -38,7 +43,6 @@ def draw_rotated_rectangle(frame, center, size, angle, color, thickness=2):
3843

3944
manip2.initialConfig.addRotateDeg(90)
4045
manip2.initialConfig.setOutputSize(320, 200)
41-
manip2.setRunOnHost(True)
4246

4347
outQcam = camOut.createOutputQueue()
4448
outQ1 = manip1.out.createOutputQueue()

examples/python/ImageManip/image_manip_resize.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,15 @@
22
import cv2
33

44
pipeline = dai.Pipeline()
5+
device = pipeline.getDefaultDevice()
56

67
camRgb = pipeline.create(dai.node.Camera).build(dai.CameraBoardSocket.CAM_A)
78
manip = pipeline.create(dai.node.ImageManip)
89

10+
# GPU is not available on RVC2 and some RVC4 devices
11+
manip.setBackend(dai.node.ImageManip.Backend.GPU if device.hasGPU() else
12+
dai.node.ImageManip.Backend.CPU)
13+
914
manip.initialConfig.setOutputSize(300, 300, dai.ImageManipConfig.ResizeMode.STRETCH)
1015

1116
camOut = camRgb.requestOutput((1920, 1080))

include/depthai/properties/ImageManipProperties.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ struct ImageManipProperties : PropertiesSerializable<Properties, ImageManipPrope
1515
* This can cause some unexpected behavior when using multiple ImageManip nodes in series.
1616
* Currently, the only operation affected is downscaling.
1717
*/
18-
enum class Backend : uint8_t { CPU, HW };
18+
enum class Backend : uint8_t { CPU, HW, GPU };
1919
/**
2020
* Set performance mode for ImageManip with a tradeoff between performance and power consumption. Only applied on RVC4.
2121
* This only affects scaling NV12 and GRAY images.

0 commit comments

Comments
 (0)