Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.22)
set(IKOMIA_VERSION 0.16.1)
set(IKOMIA_VERSION 0.17.0)
project(IkomiaCore VERSION ${IKOMIA_VERSION} LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
Expand Down
68 changes: 35 additions & 33 deletions Core/Main/CoreDefine.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,39 +56,41 @@ namespace Ikomia
*/
enum class IODataType : int
{
IMAGE, /**< Image data type */
VIDEO, /**< Video from file (AVI, MPEG...) */
VOLUME, /**< Volume data type */
LIVE_STREAM, /**< Video from stream (camera) */
INPUT_GRAPHICS, /**< Graphics data type: graphics layer with graphics items (ellipse, rectangle, text...) */
OUTPUT_GRAPHICS, /**< Graphics data type: graphics layer with graphics items (ellipse, rectangle, text...) */
BLOB_VALUES, /**< Numeric values from measure (surface, diameter...) computed on connected component */
NUMERIC_VALUES, /**< Generic numeric values */
DESCRIPTORS, /**< Image descriptors (used for classification, registration...) */
WIDGET, /**< User-defined widget */
PROJECT_FOLDER, /**< Ikomia project folder: may contain various data type */
FOLDER_PATH, /**< Folder path */
FILE_PATH, /**< File path */
DNN_DATASET, /**< Dataset used for deep learning, composed with image and annotations */
VOLUME_BINARY, /**< Binary volume data type: 8bits single channel */
VOLUME_LABEL, /**< Label volume data type: single channel, 1 graylevel per connected component */
IMAGE_BINARY, /**< Binary image data type: 8bits single channel */
IMAGE_LABEL, /**< Label image data type: single channel, 1 graylevel per connected component */
VIDEO_BINARY, /**< Binary video from file (AVI, MPEG...): 8bits single channel */
VIDEO_LABEL, /**< Label video from file (AVI, MPEG...): single channel, 1 graylevel per connected component */
LIVE_STREAM_BINARY, /**< Binary video from stream (camera): 8bits single channel */
LIVE_STREAM_LABEL, /**< Label video from stream (camera): single channel, 1 graylevel per connected component */
ARRAY, /**< Multi-dimensional array */
DATA_DICT, /**< Python-based IO where data are stored as dict */
OBJECT_DETECTION, /**< I/O for object detection management */
INSTANCE_SEGMENTATION, /**< I/O for instance segmentation management */
SEMANTIC_SEGMENTATION, /**< I/O for semantic segmentation management */
KEYPOINTS, /**< I/O for keypoints management */
TEXT, /**< I/O for text fields management */
POSITION, /**< Position image sequence */
JSON, /**< JSON data */
SCENE_3D, /**< I/O for 3d scenes (made up of images, shapes, vector fields, plots, text...) */
NONE /**< Unknown data type */
IMAGE = 0, /**< Image data type */
IMAGE_BINARY = 16, /**< Binary image data type: 8bits single channel */
IMAGE_LABEL = 17, /**< Label image data type: single channel, 1 graylevel per connected component */
VIDEO = 1, /**< Video from file (AVI, MPEG...) */
VIDEO_BINARY = 18, /**< Binary video from file (AVI, MPEG...): 8bits single channel */
VIDEO_LABEL = 19, /**< Label video from file (AVI, MPEG...): single channel, 1 graylevel per connected component */
VOLUME = 2, /**< Volume data type */
VOLUME_BINARY = 14, /**< Binary volume data type: 8bits single channel */
VOLUME_LABEL = 15, /**< Label volume data type: single channel, 1 graylevel per connected component */
LIVE_STREAM = 3, /**< Video from stream (camera) */
LIVE_STREAM_BINARY = 20, /**< Binary video from stream (camera): 8bits single channel */
LIVE_STREAM_LABEL = 21, /**< Label video from stream (camera): single channel, 1 graylevel per connected component */
INPUT_GRAPHICS = 4, /**< Graphics data type: graphics layer with graphics items (ellipse, rectangle, text...) */
OUTPUT_GRAPHICS = 5, /**< Graphics data type: graphics layer with graphics items (ellipse, rectangle, text...) */
BLOB_VALUES = 6, /**< Numeric values from measure (surface, diameter...) computed on connected component */
NUMERIC_VALUES = 7, /**< Generic numeric values */
DESCRIPTORS = 8, /**< Image descriptors (used for classification, registration...) */
WIDGET = 9, /**< User-defined widget */
PROJECT_FOLDER = 10, /**< Ikomia project folder: may contain various data type */
FOLDER_PATH = 11, /**< Folder path */
FILE_PATH = 12, /**< File path */
DNN_DATASET = 13, /**< Dataset used for deep learning, composed with image and annotations */
ARRAY = 22, /**< Multi-dimensional array */
DATA_DICT = 23, /**< Python-based IO where data are stored as dict */
OBJECT_DETECTION = 24, /**< I/O for object detection management */
INSTANCE_SEGMENTATION = 25, /**< I/O for instance segmentation management */
SEMANTIC_SEGMENTATION = 26, /**< I/O for semantic segmentation management */
KEYPOINTS = 27, /**< I/O for keypoints management */
TEXT = 28, /**< I/O for text fields management */
TEXT_STREAM = 33, /**< I/O for text stream management */
POSITION = 29, /**< Position image sequence */
JSON = 30, /**< JSON data */
SCENE_3D = 31, /**< I/O for 3d scenes (made up of images, shapes, vector fields, plots, text...) */
NONE = 32 /**< Unknown data type */
// NEXT VALUE = 34
};

// Enum class mandatory to avoir name conflict on Windows...
Expand Down
203 changes: 24 additions & 179 deletions Core/Main/CoreTools.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -354,54 +354,54 @@ namespace Ikomia
switch(dataType)
{
case IODataType::NONE:
return QObject::tr("none");
return QObject::tr("None");
case IODataType::IMAGE:
return QObject::tr("image");
return QObject::tr("Image");
case IODataType::IMAGE_BINARY:
return QObject::tr("binary image");
return QObject::tr("Binary image");
case IODataType::IMAGE_LABEL:
return QObject::tr("label image");
return QObject::tr("Label image");
case IODataType::VOLUME:
return QObject::tr("volume");
return QObject::tr("Volume");
case IODataType::VOLUME_BINARY:
return QObject::tr("binary volume");
return QObject::tr("Binary volume");
case IODataType::VOLUME_LABEL:
return QObject::tr("label volume");
return QObject::tr("Label volume");
case IODataType::POSITION:
return QObject::tr("position image sequence");
return QObject::tr("Position image sequence");
case IODataType::INPUT_GRAPHICS:
case IODataType::OUTPUT_GRAPHICS:
return QObject::tr("graphics");
return QObject::tr("Graphics");
case IODataType::BLOB_VALUES:
return QObject::tr("blob values");
return QObject::tr("Blob values");
case IODataType::NUMERIC_VALUES:
return QObject::tr("numeric values");
return QObject::tr("Numeric values");
case IODataType::VIDEO:
return QObject::tr("video");
return QObject::tr("Video");
case IODataType::VIDEO_BINARY:
return QObject::tr("binary video");
return QObject::tr("Binary video");
case IODataType::VIDEO_LABEL:
return QObject::tr("label Video");
return QObject::tr("Label Video");
case IODataType::LIVE_STREAM:
return QObject::tr("live stream");
return QObject::tr("Live stream");
case IODataType::LIVE_STREAM_BINARY:
return QObject::tr("binary live stream");
return QObject::tr("Binary live stream");
case IODataType::LIVE_STREAM_LABEL:
return QObject::tr("label live stream");
return QObject::tr("Label live stream");
case IODataType::WIDGET:
return QObject::tr("custom result view");
return QObject::tr("Custom result view");
case IODataType::DESCRIPTORS:
return QObject::tr("descriptors");
return QObject::tr("Descriptors");
case IODataType::PROJECT_FOLDER:
return QObject::tr("folder");
return QObject::tr("Folder");
case IODataType::FOLDER_PATH:
return QObject::tr("folder path");
return QObject::tr("Folder path");
case IODataType::FILE_PATH:
return QObject::tr("file path");
return QObject::tr("File path");
case IODataType::DNN_DATASET:
return QObject::tr("deep learning dataset");
return QObject::tr("Deep learning dataset");
case IODataType::ARRAY:
return QObject::tr("multi-dimensional array");
return QObject::tr("Multi-dimensional array");
case IODataType::DATA_DICT:
return QObject::tr("Generic Python dict");
case IODataType::OBJECT_DETECTION:
Expand Down Expand Up @@ -496,161 +496,6 @@ namespace Ikomia
}
return "";
}

inline bool isConvertibleIO(WorkflowTaskIOPtr from, WorkflowTaskIOPtr to)
{
if(from == nullptr || to == nullptr)
return true;

auto nameFrom = CWorkflowTaskIO::getClassName(from->getDataType());
auto nameTo = CWorkflowTaskIO::getClassName(to->getDataType());

return (nameFrom == nameTo ||
(nameFrom == "CImageIO" && nameTo == "CVideoIO") ||
(nameFrom == "CVideoIO" && nameTo == "CImageIO") ||
(nameFrom == "CImageIO" && nameTo == "CPathIO") ||
(nameFrom == "CVideoIO" && nameTo == "CPathIO"));
}

/**
* @brief Checks if two data types can be connected.
* @param srcData: source data type ::IODataType.
* @param targetData: target data type ::IODataType.
* @return True if connection is possible, False otherwise.
*/
inline bool isIODataCompatible(const IODataType &srcData, const IODataType &targetData)
{
if(srcData == IODataType::NONE || targetData == IODataType::NONE)
return false;
else if(srcData == targetData)
return true;
else if(srcData == IODataType::INPUT_GRAPHICS)
return targetData == IODataType::OUTPUT_GRAPHICS;
else if(srcData == IODataType::OUTPUT_GRAPHICS)
return targetData == IODataType::INPUT_GRAPHICS;
else if (srcData == IODataType::OBJECT_DETECTION)
return targetData == IODataType::INPUT_GRAPHICS || targetData == IODataType::BLOB_VALUES;
else if (srcData == IODataType::KEYPOINTS)
{
return targetData == IODataType::INPUT_GRAPHICS ||
targetData == IODataType::BLOB_VALUES ||
targetData == IODataType::NUMERIC_VALUES;
}
else if (srcData == IODataType::TEXT)
{
return targetData == IODataType::INPUT_GRAPHICS ||
targetData == IODataType::NUMERIC_VALUES;
}
else if (srcData == IODataType::INSTANCE_SEGMENTATION)
{
return targetData == IODataType::INPUT_GRAPHICS ||
targetData == IODataType::BLOB_VALUES ||
targetData == IODataType::OBJECT_DETECTION ||
targetData == IODataType::SEMANTIC_SEGMENTATION ||
targetData == IODataType::IMAGE ||
targetData == IODataType::IMAGE_LABEL ||
targetData == IODataType::IMAGE_BINARY;
}
else if (srcData == IODataType::SEMANTIC_SEGMENTATION)
{
return targetData == IODataType::IMAGE ||
targetData == IODataType::IMAGE_LABEL ||
targetData == IODataType::IMAGE_BINARY;
}
else if(srcData == IODataType::IMAGE_BINARY)
{
return (targetData == IODataType::IMAGE ||
targetData == IODataType::IMAGE_LABEL);
}
else if(srcData == IODataType::IMAGE_LABEL)
{
return targetData == IODataType::IMAGE;
}
else if(srcData == IODataType::VOLUME)
{
return targetData == IODataType::IMAGE;
}
else if(srcData == IODataType::VOLUME_BINARY)
{
return (targetData == IODataType::VOLUME ||
targetData == IODataType::VOLUME_LABEL ||
targetData == IODataType::IMAGE ||
targetData == IODataType::IMAGE_BINARY ||
targetData == IODataType::IMAGE_LABEL);
}
else if(srcData == IODataType::VOLUME_LABEL)
{
return (targetData == IODataType::IMAGE ||
targetData == IODataType::IMAGE_LABEL);
}
else if(srcData == IODataType::POSITION)
{
return targetData == IODataType::IMAGE;
}
else if(srcData == IODataType::VIDEO)
{
return targetData == IODataType::IMAGE;
}
else if(srcData == IODataType::VIDEO_BINARY)
{
return (targetData == IODataType::VIDEO ||
targetData == IODataType::VIDEO_LABEL ||
targetData == IODataType::IMAGE ||
targetData == IODataType::IMAGE_BINARY ||
targetData == IODataType::IMAGE_LABEL);
}
else if(srcData == IODataType::VIDEO_LABEL)
{
return (targetData == IODataType::VIDEO ||
targetData == IODataType::IMAGE ||
targetData == IODataType::IMAGE_LABEL);
}
else if(srcData == IODataType::LIVE_STREAM)
{
return (targetData == IODataType::IMAGE ||
targetData == IODataType::VIDEO);
}
else if(srcData == IODataType::LIVE_STREAM_BINARY)
{
return targetData == IODataType::LIVE_STREAM ||
targetData == IODataType::LIVE_STREAM_LABEL ||
targetData == IODataType::IMAGE ||
targetData == IODataType::IMAGE_BINARY ||
targetData == IODataType::IMAGE_LABEL ||
targetData == IODataType::VIDEO ||
targetData == IODataType::VIDEO_BINARY ||
targetData == IODataType::VIDEO_LABEL;
}
else if(srcData == IODataType::LIVE_STREAM_LABEL)
{
return (targetData == IODataType::LIVE_STREAM ||
targetData == IODataType::VIDEO ||
targetData == IODataType::VIDEO_LABEL ||
targetData == IODataType::IMAGE ||
targetData == IODataType::IMAGE_LABEL);
}
else if(srcData == IODataType::PROJECT_FOLDER)
{
return targetData == IODataType::IMAGE ||
targetData == IODataType::IMAGE_BINARY ||
targetData == IODataType::IMAGE_LABEL ||
targetData == IODataType::VIDEO ||
targetData == IODataType::VIDEO_BINARY ||
targetData == IODataType::VIDEO_LABEL ||
targetData == IODataType::PROJECT_FOLDER ||
targetData == IODataType::FOLDER_PATH;
}
else if (srcData == IODataType::JSON)
{
return targetData == IODataType::JSON;
}
else if (srcData == IODataType::SCENE_3D)
{
return targetData == IODataType::SCENE_3D;
}
else
return false;
}
}

namespace Image
Expand Down
9 changes: 7 additions & 2 deletions Core/Workflow/CWorkflowTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ void CWorkflowTask::setInput(const WorkflowTaskIOPtr &pInput, size_t index)
if(pInput == nullptr && m_inputs[index] != nullptr)
m_inputs[index]->clearData();

if(Utils::Workflow::isConvertibleIO(m_inputs[index], pInput))
if (m_inputs[index]->isAssignableTo(pInput->getDataType()))
{
//Just share pointer
CPyEnsureGIL gil;
Expand Down Expand Up @@ -401,6 +401,11 @@ void CWorkflowTask::setEnabled(bool bEnable)
m_bEnabled = bEnable;
}

void CWorkflowTask::setType(Type type)
{
m_type = type;
}

CWorkflowTask::Type CWorkflowTask::getType() const
{
return m_type;
Expand Down Expand Up @@ -898,7 +903,7 @@ void CWorkflowTask::run()
// Simply forward input to output if possible -> must be reimplemented in child classes
for (size_t i=0; i<m_inputs.size(); ++i)
{
if (i < m_outputs.size() && Utils::Workflow::isIODataCompatible(m_inputs[i]->getDataType(), m_outputs[i]->getDataType()))
if (i < m_outputs.size() && m_inputs[i]->isConnectableTo(m_outputs[i]->getDataType()))
m_outputs[i] = m_inputs[i];
}
}
Expand Down
Loading