Changelog
0.9.0
See the Migration guide for an action-oriented checklist.
ConstTensorNoderemoved: Constant values are no longer provided by dedicated pipeline nodes. Set them on topics beforeinitialize()instead.- Python:
Pipeline.set_constant_value(topic, array)andPipeline.remove_constant_value(topic)— constant topics must use the/port_nameform (empty node name).Pipeline.get_constant_values()returns adict[str, np.ndarray]of default constant values before initialization. - C:
denkflow_pipeline_set_constant_value,denkflow_pipeline_remove_constant_value, anddenkflow_pipeline_get_constant_values(returnsDenkflowConstantValueArraywithtopic_name,tensor_type,shape, typeddatabuffer, andDenkflowArrayDataType; free withdenkflow_constant_value_array_free). - Removed:
Pipeline.add_const_tensor_node(...),denkflow_pipeline_add_const_tensor_node_int/uint/float,DenkflowConstTensorNodeReference.
- Python:
get_topics_for_pipeline_input/outputremoved: Replaced by a unified topic inspection API that returns rich metadata.- Python:
Pipeline.get_topics()→ list ofTopicDescriptionwithtopic_name,topic_type(ExternalInput,ExternalOutput,InternalConnection),tensor_type, andis_constant. - C:
denkflow_initialized_pipeline_get_topics→DenkflowTopicDescriptionArray. - Removed:
get_topics_for_pipeline_input(),get_topics_for_pipeline_output(), and their C-API equivalents.
- Python:
- Pipeline input and constant topic naming:
.denkflowfiles exported from version 0.9.0 onward use an emptynode_namefor boundary inputs and constants — for example/imageinstead ofcamera/image, and/image_sizeor/iou_thresholdfor graph constants. Older exports may still use the previousnode_name/port_nameform; callget_topics()afterinitialize()to discover the correct names. For more information, see this example on runtime parameters on exported pipelines. - C
data_typeis nowDenkflowArrayDataType:denkflow_base_tensor_from_bufferanddenkflow_image_tensor_from_buffertake aDenkflowArrayDataTypeenum instead of aconst char*dtype string. Build tensors with those helpers, then pass handles todenkflow_pipeline_set_constant_valueordenkflow_initialized_pipeline_publish_tensor. - C publish unified:
denkflow_initialized_pipeline_publish_image_tensorwas replaced bydenkflow_initialized_pipeline_publish_tensor, which accepts any tensor type via avoid**handle (cast typed pointers such asDenkflowImageTensor**). SegmentationObjectrenamed toSegmentation: Aligns with theBoundingBoxnaming pattern.- Python:
denkflow.SegmentationObject→denkflow.Segmentation - C:
DenkflowSegmentationObject→DenkflowSegmentation; onDenkflowSegmentationBatchElement,segmentation_objects→segmentations(and_length)
- Python:
PipelineWrapper: High-level inference on exported.denkflowgraphs. Returns structured results in absolute pixel coordinates without manual subscribe/receive or tensor decoding.- Python:
PipelineWrapper(pipeline),run(image_tensor, confidence_threshold=...) - C:
denkflow_pipeline_wrapper_new,denkflow_pipeline_wrapper_run,denkflow_inference_results_free - Optional overrides when the graph exposes the constants:
set_image_size,set_iou_threshold,set_score_threshold
- Python:
- Annotated images: Draw boxes, segmentations, and optional labels on the input image.
- Python:
ImageTensor.to_images_with_annotations(image_results, segmentation_fill_alpha=None, annotation_label_font_size=None, ...) - C:
denkflow_image_tensor_to_images_with_inference_results(free the buffer withdenkflow_image_buffer_free) segmentation_fill_alpha: PythonNoneor C0.0for outline segmentations; a value in(0, 1]fills at that opacityannotation_label_font_size: PythonNoneor C0.0to skip labels; otherwise a size relative to a 1080px-tall reference image- Example: Object detection with PipelineWrapper
- Python:
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.
-