Skip to content

ImageManipV2 optimization and refactor #1290

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 52 commits into
base: v3_develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
77a52da
Refactor imagemanipv2 transform, optimize crop
asahtik Mar 13, 2025
bf8d61b
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Mar 20, 2025
fed4930
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Mar 25, 2025
7a2863c
WIP: ImageManipV2 opt
asahtik Mar 25, 2025
54088d5
Refactor ImageManipV2Impl + use shared data instead of span
asahtik Mar 25, 2025
ce48d48
Refactor ImageManipV2 again
asahtik Mar 31, 2025
dc6c491
Fix output size calculation for NV12
asahtik Apr 1, 2025
a9b57c3
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Apr 1, 2025
966e74d
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Apr 2, 2025
e373818
RVC4 FW: optimize common use cases in ImageManipV2 (crop, scale), fix…
asahtik Apr 2, 2025
9c9ffc2
Bugfixes, add test, WIP: test fails becouse of DsImgDispatcher issues
asahtik Apr 3, 2025
ec8a5b5
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Apr 7, 2025
cd7031c
Fixed test to check Eva downscaler
asahtik Apr 7, 2025
2f06077
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Apr 7, 2025
562d7e2
Add backend property to imagemanip [no ci]
asahtik Apr 7, 2025
6eb0d07
RVC4 FW: Fix ImageManipV2 optimization, add backend property, TODO: b…
asahtik Apr 7, 2025
6c8f3c7
Split test to RVC4 only part
asahtik Apr 8, 2025
cd6e306
Fix RVC2 ImageManipV2 rebuilding
asahtik Apr 8, 2025
ad2a88e
RVC2 FW: Fix ImageManipV2 rebuilding
asahtik Apr 8, 2025
a3e21af
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Apr 9, 2025
34cc54f
Merge branch 'imagemanipv2_optimization' of github.com:luxonis/deptha…
asahtik Apr 9, 2025
4c2a506
Fix image manip v2 rebuild test
asahtik Apr 9, 2025
b39d960
Fix failing tests
asahtik Apr 9, 2025
125458d
RVC4 FW: Fix failing tests
asahtik Apr 9, 2025
d61851c
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Apr 10, 2025
4cbb90b
Bump rvc4 fw
asahtik Apr 10, 2025
0607a20
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Apr 15, 2025
04566d9
RVC4 FW: Fix black frame when downscaling 8K frames
asahtik Apr 15, 2025
4fe8900
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Apr 16, 2025
810d4df
Fix test
asahtik Apr 18, 2025
771ae62
Merge branch 'imagemanipv2_optimization' of github.com:luxonis/deptha…
asahtik Apr 18, 2025
bce823a
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Apr 22, 2025
5e78ef4
Make test more reliable [no ci]
asahtik Apr 22, 2025
13fbd2e
Bump rvc4 fw
asahtik Apr 22, 2025
63dd08b
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Apr 23, 2025
957b62c
RVC4 FW: Fix edge case manipv2 bug
asahtik Apr 23, 2025
8a93c75
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Apr 24, 2025
8ddca89
Fix april tags example [no ci]
asahtik Apr 24, 2025
7423ef9
RVC4 FW: Fix ImageManipV2 crash
asahtik Apr 24, 2025
e310d6a
Add performance mode configuration option [no ci]
asahtik Apr 24, 2025
86e3978
Bump rvc4 fw [no ci]
asahtik Apr 24, 2025
60a4ef6
Bump rvc2 fw
asahtik Apr 24, 2025
2c615c6
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik Apr 30, 2025
55cace5
Add balanced option to manipv2 perf mode
asahtik Apr 30, 2025
55d3c02
Bump rvc4 fw
asahtik Apr 30, 2025
365ab0b
RVC4 FW: Added scale fallbacks
asahtik May 7, 2025
2fdcfcb
Merge branch 'v3_develop' of github.com:luxonis/depthai-core into ima…
asahtik May 7, 2025
c9fff3d
Use performance mode manip by default [no ci]
asahtik May 7, 2025
afb9b20
Bump rvc4 fw [no ci]
asahtik May 7, 2025
f2dc49c
Bump rvc2 fw
asahtik May 7, 2025
ad6bc8a
Fix build [no ci]
asahtik May 8, 2025
8bfe5f1
RVC4 FW: Fix build
asahtik May 8, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions bindings/python/src/pipeline/node/ImageManipV2Bindings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,20 @@ void bind_imagemanipv2(pybind11::module& m, void* pCallstack) {
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
py::enum_<ImageManipV2::PerformanceMode> perfMode(imageManip, "PerformanceMode");
perfMode.value("BALANCED", ImageManipV2::PerformanceMode::BALANCED)
.value("PERFORMANCE", ImageManipV2::PerformanceMode::PERFORMANCE)
.value("LOW_POWER", ImageManipV2::PerformanceMode::LOW_POWER);

// ImageManip Node
imageManip.def_readonly("inputConfig", &ImageManipV2::inputConfig, DOC(dai, node, ImageManipV2, inputConfig))
.def_readonly("inputImage", &ImageManipV2::inputImage, DOC(dai, node, ImageManipV2, inputImage))
.def_readonly("out", &ImageManipV2::out, DOC(dai, node, ImageManipV2, out))
.def_readonly("initialConfig", &ImageManipV2::initialConfig, DOC(dai, node, ImageManipV2, initialConfig))
.def("setRunOnHost", &ImageManipV2::setRunOnHost, DOC(dai, node, ImageManipV2, setRunOnHost))
.def("setBackendCPU", &ImageManipV2::setBackendCPU, DOC(dai, node, ImageManipV2, setBackendCPU))
.def("setBackendHW", &ImageManipV2::setBackendHW, DOC(dai, node, ImageManipV2, setBackendHW))
Comment on lines +37 to +38
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd go with just "setBackend()" and have an enum here.

.def("setPerformanceMode", &ImageManipV2::setPerformanceMode, DOC(dai, node, ImageManipV2, setPerformanceMode))
.def("setNumFramesPool", &ImageManipV2::setNumFramesPool, DOC(dai, node, ImageManipV2, setNumFramesPool))
.def("setMaxOutputFrameSize", &ImageManipV2::setMaxOutputFrameSize, DOC(dai, node, ImageManipV2, setMaxOutputFrameSize));
}
2 changes: 1 addition & 1 deletion cmake/Depthai/DepthaiDeviceRVC4Config.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ set(DEPTHAI_DEVICE_RVC4_MATURITY "snapshot")

# "version if applicable"
# set(DEPTHAI_DEVICE_RVC4_VERSION "0.0.1+93f7b75a885aa32f44c5e9f53b74470c49d2b1af")
set(DEPTHAI_DEVICE_RVC4_VERSION "0.0.1+e0e0596fead6a181e5dea4628058199c79ca892a")
set(DEPTHAI_DEVICE_RVC4_VERSION "0.0.1+94ad947b519d98aa005acb95def4e9d476bab2cc")
2 changes: 1 addition & 1 deletion cmake/Depthai/DepthaiDeviceSideConfig.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
set(DEPTHAI_DEVICE_SIDE_MATURITY "snapshot")

# "full commit hash of device side binary"
set(DEPTHAI_DEVICE_SIDE_COMMIT "4f0b0f3219b701b8e5408eea19648a8d0ec06fa7")
set(DEPTHAI_DEVICE_SIDE_COMMIT "5c2d9f46aa754bed02044e359469e46571724cf1")

# "version if applicable"
set(DEPTHAI_DEVICE_SIDE_VERSION "")
2 changes: 1 addition & 1 deletion examples/python/AprilTags/april_tags_12mp.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
# ATM, AprilTags don't contain timestamps, so we can't sync them with frames
manip = pipeline.create(dai.node.ImageManipV2)
manip.initialConfig.setOutputSize(PREVIEW_SIZE[0], PREVIEW_SIZE[1], dai.ImageManipConfigV2.ResizeMode.STRETCH)
manip.setMaxOutputFrameSize(2004096)
manip.setMaxOutputFrameSize(2162688)
outputCam.link(manip.inputImage)
frameQ = manip.out.createOutputQueue()

Expand Down
31 changes: 25 additions & 6 deletions include/depthai/pipeline/node/ImageManipV2.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ class ImageManipV2 : public DeviceNodeCRTP<DeviceNode, ImageManipV2, ImageManipP
public:
constexpr static const char* NAME = "ImageManipV2";
using DeviceNodeCRTP::DeviceNodeCRTP;
using Backend = ImageManipPropertiesV2::Backend;
using PerformanceMode = ImageManipPropertiesV2::PerformanceMode;

ImageManipV2() = default;
ImageManipV2(std::unique_ptr<Properties> props);

Expand Down Expand Up @@ -70,6 +73,22 @@ class ImageManipV2 : public DeviceNodeCRTP<DeviceNode, ImageManipV2, ImageManipP
*/
ImageManipV2& setRunOnHost(bool runOnHost = true);

/**
* Set CPU as backend preference
*/
ImageManipV2& setBackendCPU();

/**
* Set HW as backend preference
*/
ImageManipV2& setBackendHW();

Comment on lines +76 to +85
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setBackend(...) for consistency

/**
* Set performance mode
* @param performanceMode Performance mode
*/
ImageManipV2& setPerformanceMode(PerformanceMode performanceMode);

/**
* Check if the node is set to run on host
*/
Expand All @@ -82,8 +101,8 @@ class ImageManipV2 : public DeviceNodeCRTP<DeviceNode, ImageManipV2, ImageManipP
const ImageManipConfigV2& initialConfig,
std::shared_ptr<spdlog::async_logger> logger,
std::function<size_t(const ImageManipConfigV2&, const ImgFrame&)> build,
std::function<bool(std::shared_ptr<Memory>&, span<uint8_t>)> apply,
std::function<void(const ImageManipConfigV2&, const ImgFrame&, ImgFrame&)> getFrame);
std::function<bool(std::shared_ptr<Memory>&, std::shared_ptr<ImageManipData>)> apply,
std::function<void(const ImgFrame&, ImgFrame&)> getFrame);
};

} // namespace node
Expand All @@ -97,8 +116,8 @@ void ImageManipV2::loop(N& node,
const ImageManipConfigV2& initialConfig,
std::shared_ptr<spdlog::async_logger> logger,
std::function<size_t(const ImageManipConfigV2&, const ImgFrame&)> build,
std::function<bool(std::shared_ptr<Memory>&, span<uint8_t>)> apply,
std::function<void(const ImageManipConfigV2&, const ImgFrame&, ImgFrame&)> getFrame) {
std::function<bool(std::shared_ptr<Memory>&, std::shared_ptr<ImageManipData>)> apply,
std::function<void(const ImgFrame&, ImgFrame&)> getFrame) {
using namespace std::chrono;
auto config = initialConfig;

Expand Down Expand Up @@ -166,10 +185,10 @@ void ImageManipV2::loop(N& node,
bool success = true;
{
auto t3 = steady_clock::now();
success = apply(inImage->data, outImageData->getData());
success = apply(inImage->data, outImageData);
auto t4 = steady_clock::now();

getFrame(config, *inImage, *outImage);
getFrame(*inImage, *outImage);

logger->trace("Build time: {}us, Process time: {}us, Total time: {}us, image manip id: {}",
duration_cast<microseconds>(t2 - t1).count(),
Expand Down
9 changes: 8 additions & 1 deletion include/depthai/properties/ImageManipPropertiesV2.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ namespace dai {
* Specify properties for ImageManip
*/
struct ImageManipPropertiesV2 : PropertiesSerializable<Properties, ImageManipPropertiesV2> {
enum class Backend : uint8_t { CPU, HW };
enum class PerformanceMode : uint8_t { PERFORMANCE, BALANCED, LOW_POWER };

/// Initial configuration for ImageManip node
ImageManipConfigV2 initialConfig;

Expand All @@ -18,8 +21,12 @@ struct ImageManipPropertiesV2 : PropertiesSerializable<Properties, ImageManipPro

/// Num frames in output pool
int numFramesPool = 4;

/// Using HW backend can cause some unexpected behavior when using multiple ImageManipV2 nodes in series
Backend backend = Backend::CPU;
PerformanceMode performanceMode = PerformanceMode::PERFORMANCE;
};

DEPTHAI_SERIALIZE_EXT(ImageManipPropertiesV2, initialConfig, outputFrameSize, numFramesPool);
DEPTHAI_SERIALIZE_EXT(ImageManipPropertiesV2, initialConfig, outputFrameSize, numFramesPool, backend, performanceMode);

} // namespace dai
Loading
Loading