g_return_val_if_fail (dim1[1] == 1, NULL);
max_detection = dim1[2];
g_return_val_if_fail (max_detection > 0, NULL);
+
+ /** @todo unused dimension value should be 0 */
for (i = 3; i < NNS_TENSOR_RANK_LIMIT; i++)
- g_return_val_if_fail (dim1[i] == 1, NULL);
+ g_return_val_if_fail (dim1[i] == 0 || dim1[i] == 1, NULL);
/* Check if the second tensor is compatible */
dim2 = config->info.info[1].dimension;
max_label, data->label_path, data->labeldata.total_labels);
g_return_val_if_fail (max_detection == dim2[1], NULL);
for (i = 2; i < NNS_TENSOR_RANK_LIMIT; i++)
- g_return_val_if_fail (dim2[i] == 1, NULL);
+ g_return_val_if_fail (dim2[i] == 0 || dim2[i] == 1, NULL);
/* Check consistency with max_detection */
if (!_set_max_detection (data, max_detection, MOBILENET_SSD_DETECTION_MAX)) {
dim1 = config->info.info[num_idx].dimension;
g_return_val_if_fail (dim1[0] == 1, NULL);
for (i = 1; i < NNS_TENSOR_RANK_LIMIT; ++i)
- g_return_val_if_fail (dim1[i] == 1, NULL);
+ g_return_val_if_fail (dim1[i] == 0 || dim1[i] == 1, NULL);
/* Check if the classes & scores tensors are compatible */
dim2 = config->info.info[classes_idx].dimension;
g_return_val_if_fail (dim3[0] == dim2[0], NULL);
max_detection = dim2[0];
for (i = 1; i < NNS_TENSOR_RANK_LIMIT; ++i) {
- g_return_val_if_fail (dim2[i] == 1, NULL);
- g_return_val_if_fail (dim3[i] == 1, NULL);
+ g_return_val_if_fail (dim2[i] == 0 || dim2[i] == 1, NULL);
+ g_return_val_if_fail (dim3[i] == 0 || dim3[i] == 1, NULL);
}
/* Check if the bbox locations tensor is compatible */
g_return_val_if_fail (BOX_SIZE == dim4[0], NULL);
g_return_val_if_fail (max_detection == dim4[1], NULL);
for (i = 2; i < NNS_TENSOR_RANK_LIMIT; ++i)
- g_return_val_if_fail (dim4[i] == 1, NULL);
+ g_return_val_if_fail (dim4[i] == 0 || dim4[i] == 1, NULL);
/* Check consistency with max_detection */
if (!_set_max_detection (data, max_detection,
NULL);
g_return_val_if_fail (dim[1] == OV_PERSON_DETECTION_MAX, NULL);
for (i = 2; i < NNS_TENSOR_RANK_LIMIT; ++i)
- g_return_val_if_fail (dim[i] == 1, NULL);
+ g_return_val_if_fail (dim[i] == 0 || dim[i] == 1, NULL);
} else if (data->mode == YOLOV5_BOUNDING_BOX) {
const guint *dim = config->info.info[0].dimension;
if (!_check_tensors (config, 1U))
g_return_val_if_fail (max_detection > 0, NULL);
g_return_val_if_fail (dim1[2] == 1, NULL);
for (i = 3; i < NNS_TENSOR_RANK_LIMIT; i++)
- g_return_val_if_fail (dim1[i] == 1, NULL);
+ g_return_val_if_fail (dim1[i] == 0 || dim1[i] == 1, NULL);
/* Check if the second tensor is compatible */
dim2 = config->info.info[1].dimension;
g_return_val_if_fail (dim2[0] == 1, NULL);
g_return_val_if_fail (max_detection == dim2[1], NULL);
for (i = 2; i < NNS_TENSOR_RANK_LIMIT; i++)
- g_return_val_if_fail (dim2[i] == 1, NULL);
+ g_return_val_if_fail (dim2[i] == 0 || dim2[i] == 1, NULL);
/* Check consistency with max_detection */
if (!_set_max_detection (data, max_detection, MP_PALM_DETECTION_DETECTION_MAX)) {
g_return_val_if_fail (dim1[1] == 1, NULL);\r
max_detection = dim1[2];\r
g_return_val_if_fail (max_detection > 0, NULL);\r
+ /** @todo unused dimension value should be 0 */\r
for (i = 3; i < NNS_TENSOR_RANK_LIMIT; i++)\r
- g_return_val_if_fail (dim1[i] == 1, NULL);\r
+ g_return_val_if_fail (dim1[i] == 0 || dim1[i] == 1, NULL);\r
\r
/**Check if the second tensor is compatible */\r
dim2 = config->info.info[1].dimension;\r
max_label, data->label_path, data->labeldata.total_labels);\r
g_return_val_if_fail (max_detection == dim2[1], NULL);\r
for (i = 2; i < NNS_TENSOR_RANK_LIMIT; i++)\r
- g_return_val_if_fail (dim2[i] == 1, NULL);\r
+ g_return_val_if_fail (dim2[i] == 0 || dim2[i] == 1, NULL);\r
\r
/**Check consistency with max_detection */\r
if (!_set_max_detection (data, max_detection, MOBILENET_SSD_DETECTION_MAX)) {\r
*
* @todo CRITICAL-TODO: Optimize the performance!
*/
- for (i = NNS_TENSOR_RANK_LIMIT - 1; i > to; i--)
+ for (i = NNS_TENSOR_RANK_LIMIT - 1; i > to; i--) {
+ if (toDim[i] == 0)
+ continue;
loopLimit *= toDim[i];
- for (i = 0; i < to; i++)
+ }
+
+ for (i = 0; i < to; i++) {
+ if (toDim[i] == 0)
+ break;
loopBlockSize *= toDim[i];
+ }
- for (i = 0; i < from; i++)
+ for (i = 0; i < from; i++) {
+ if (fromDim[i] == 0)
+ break;
copyblocksize *= fromDim[i];
- for (i = 0; i < to; i++)
+ }
+ for (i = 0; i < to; i++) {
+ if (toDim[i] == 0)
+ break;
copyblocklimit *= toDim[i];
+ }
for (i = 0; i < loopLimit; i++) {
/* [i1][i2][...][iN][b][...] i = i1 x i2 x ... x iN */
indexI = filter->data_transpose.trans_order[0];
indexJ = filter->data_transpose.trans_order[1];
- SL = fromDim[3], SI = fromDim[0], SJ = fromDim[1], SK = fromDim[2];
+ SL = fromDim[3] > 0 ? fromDim[3] : 1;
+ SI = fromDim[0] > 0 ? fromDim[0] : 1;
+ SJ = fromDim[1] > 0 ? fromDim[1] : 1;
+ SK = fromDim[2] > 0 ? fromDim[2] : 1;
switch (indexI) {
case 0:
for (i = 0; i < NNS_TENSOR_RANK_LIMIT; i++) {
/** @todo handle rank from info.dimension */
- if (info->dimension[i] > 0)
- meta->dimension[i] = info->dimension[i];
- else
- break;
+ meta->dimension[i] = info->dimension[i];
}
return TRUE;
guint
gst_tensor_info_get_rank (const GstTensorInfo * info)
{
- gint idx;
-
g_return_val_if_fail (info != NULL, 0);
- /** rank is at least 1 */
- for (idx = NNS_TENSOR_RANK_LIMIT - 1; idx > 0; idx--) {
- if (info->dimension[idx] != 1)
- break;
- }
- /** @todo use gst_tensor_dimension_get_rank (info->dimension) after 0-init dim is done */
- return idx + 1;
+ return gst_tensor_dimension_get_rank (info->dimension);
}
/**
rank = i + 1;
}
- /**
- * @todo remove below lines
- * (0-initialized before parsing the string, filled remained dimension with 0)
- */
- for (; i < NNS_TENSOR_RANK_LIMIT; i++)
- dim[i] = 1;
-
g_strfreev (strv);
g_free (dim_string);
return rank;
break;
}
- /** @todo handle rank from info.dimension (Fill 0, not 1) */
- info->dimension[i] = (meta->dimension[i] > 0) ? meta->dimension[i] : 1;
+ info->dimension[i] = meta->dimension[i];
}
return TRUE;