Changelog
0.8.0
See the Migration guide for an action-oriented checklist.
-
General changes:
- New OCR Version: Added support for a new OCR version that uses a different decoding method.
- Faster Image Conversion: Image conversion into the internal format should be much faster than before, but uses a different call structure (see below).
- New
BoundingBoxClassFilternode: Filter detection results down to a configurable allow-list of class indices.- C:
denkflow_pipeline_add_bounding_box_class_filter_node - Python:
Pipeline.add_bounding_box_class_filter_node(...)
- C:
- Override the device of any node before initialization: Both exported
.denkflowgraphs and custom pipelines now supportset_node_device/denkflow_pipeline_set_node_deviceto redirect a single node to a different execution provider beforeinitialize()is called.
-
Breaking Changes:
-
Internal file format: Changes to
*.denkmodeland*.denkflowfiles. Old files need to be re-exported. -
C-API symbol prefix: All C-API functions, types, and global constants are now consistently namespaced to avoid collisions when integrating DENKflow alongside other shared libraries.
- Functions are prefixed with
denkflow_. For example,pipeline_newis nowdenkflow_pipeline_new,image_tensor_from_fileis nowdenkflow_image_tensor_from_file, and so on. - Types are prefixed with
Denkflow. For example,Pipelineis nowDenkflowPipeline,ImageTensoris nowDenkflowImageTensor,Pointis nowDenkflowPoint,Rectis nowDenkflowRect,Receiver_Tensoris nowDenkflowReceiverTensor, etc. Enum variants follow their type, e.g.DenkflowResizeMode_Stretch.DenkflowResultwas already prefixed and is unchanged. - Global constants:
ERROR_BUFFER_SIZEis nowDENKFLOW_ERROR_BUFFER_SIZE;NULL_BYTEhas been removed.
- Functions are prefixed with
-
Optional C-API string arguments now accept
NULL/nullptr: Functions that take an optional string (such asdenkflow_hub_license_source_from_pat'sendpoint) now follow the universal C convention and treat aNULLpointer as "argument absent". The previous workaround of passing a pointer to a single zero byte (NULL_BYTE) has been removed. -
Unified resize mode for image resize and image patches: A single resize-mode enum (with variants
CenterPadBlack,Stretch,CenterPadWhite) replaces the per-node enums in every binding. The new variantCenterPadWhitewas added in this release.- C:
DenkflowResizeModeis shared betweendenkflow_pipeline_add_image_resize_nodeanddenkflow_pipeline_add_image_patches_node. - Python:
Pipeline.add_image_resize_node,Pipeline.add_image_patches_node, andPipeline.change_image_patches_nodeall takeresize_modeas a string — one of"CenterPadBlack"(default),"Stretch", or"CenterPadWhite".
- C:
-
denkflow_pipeline_add_image_resize_nodesignature change: Thebool keep_aspect_ratioparameter was replaced byDenkflowResizeMode resize_mode. The previouskeep_aspect_ratio = truecorresponds toDenkflowResizeMode_CenterPadBlack;keep_aspect_ratio = falsecorresponds toDenkflowResizeMode_Stretch. -
Pipeline.add_image_resize_nodesignature change (Python): Thekeep_aspect_ratio: boolkeyword argument was removed and replaced byresize_mode: str = "CenterPadBlack". Migratekeep_aspect_ratio=True→resize_mode="CenterPadBlack"andkeep_aspect_ratio=False→resize_mode="Stretch". -
Python
device=keyword renamed toexecution_provider=: All Python pipeline methods that previously accepted adevice: strkeyword (add_image_resize_node,add_object_detection_node,add_image_classification_node,add_bounding_box_filter_node,add_bounding_box_class_filter_node,add_image_patches_node,add_ocr_node,add_image_segmentation_node,add_image_instance_segmentation_node,add_image_anomaly_detection_node) now acceptexecution_provider: strinstead, matching the C-API. The same applies toPipeline.set_node_device(node_name, execution_provider, device_id). Thedevice_idparameter is unchanged. Migratedevice="cuda"→execution_provider="cuda". -
denkflow_pipeline_add_image_patches_nodesignature change: Two parameters were added betweentarget_size_topicandexecution_provider:DenkflowResizeMode resize_mode(default in higher-level wrappers:CenterPadBlack)DenkflowImagePatchesNodeResizeMethod resize_method(default:Bilinear; valuesNearest,Bilinear,Bicubic,Area)
In Python,
Pipeline.add_image_patches_nodeandPipeline.change_image_patches_nodetakeresize_mode: str = "CenterPadBlack"(values"CenterPadBlack","Stretch","CenterPadWhite") andresize_method: str = "Bilinear"(values"Nearest","Bilinear","Bicubic","Area"). The Python wrapper additionally exposesbounding_box_extend_ratio: float = 0.0. -
New constructors for in-memory image tensors: The single old
image_tensor_from_image_data/from_numpyfamily was replaced by a triple of constructors that make the data-conversion contract explicit. See Creating ImageTensors for the details.- C:
denkflow_image_tensor_from_buffer— generic constructor that accepts arbitrary data type, memory layout, and channel layout, and converts to the canonical inference format internally.denkflow_image_tensor_from_buffer_raw— expects a buffer that is alreadyBGR / BCHW / float32, performs no conversion but copies the buffer internally.denkflow_image_tensor_from_buffer_unsafe— same input requirements as_raw, but does not copy the buffer; the caller must keep it alive (and untouched) until the pipeline run that consumes the tensor has returned.- The previous
denkflow_image_tensor_from_image_datano longer exists.
- Python:
ImageTensor.from_numpy— generic constructor that accepts arbitrary data type, memory layout, and channel layout, and converts to the canonical inference format internally.ImageTensor.from_numpy_raw— expects a buffer that is alreadyBGR / BCHW / float32, performs no conversion but copies the buffer internally.ImageTensor.from_numpy_unsafe— same input requirements as_raw, but does not copy the buffer; the caller must keep it alive (and untouched) until the pipeline run that consumes the tensor has returned.- The previous
ImageTensor.from_numpy_opencv(...)has been removed. Usefrom_numpy(..., memory_layout="HWC", channel_layout="BGR")instead.
- C:
-
0.7.0
- General changes:
- Super Sessions: Nodes are now automatically clustered by execution device in the background. This can improve performance in certain scenarios.
- Customizable Channel Size: This allows for the creation of input data queues by publishing multiple times to the same topic.
- Parallel Pipeline Runs: Added an alternative method to run a pipeline called
start. This allows running the pipeline and publishing data in separate threads. - Add Nodes via C-API: The C-API now fully supports the addition of nodes to a pipeline.
- Breaking Changes:
-
Subscribe / receive split: Previous versions had different
subscribe_*methods for each tensor type but a single genericreceivemethod. This was inverted: there is now a singlesubscribe(topic)method that returns a generic receiver, and the receiver exposes one typedreceive_*_tensor()method per tensor type:- Python:
receiver = pipeline.subscribe(topic)→receiver.receive_bounding_box_tensor(),receiver.receive_image_tensor(),receiver.receive_scalar_tensor(),receiver.receive_ocr_tensor(),receiver.receive_segmentation_mask_tensor(),receiver.receive_instance_segmentation_mask_tensor(). - C:
denkflow_initialized_pipeline_subscribe(&receiver, initialized, topic)→denkflow_receiver_receive_bounding_box_tensor(&tensor, receiver), etc.
Calls to the old
subscribe_bounding_box_tensor/subscribe_image_tensor/ etc. methods no longer compile. - Python:
-
The C-API function
denkflow_pipeline_from_denkflownow takes a single pointer to the license source instead of a double pointer.
-