diff options
author | Kwanghoon Son <k.son@samsung.com> | 2022-09-06 01:41:02 -0400 |
---|---|---|
committer | kwang son <k.son@samsung.com> | 2022-09-07 05:10:55 +0000 |
commit | a89af65d65fea1de9fc38c0f7056cc047a0c3ae3 (patch) | |
tree | 380a62c014dec882ab01623e5c3c7904dcf12aa3 | |
parent | 0b4a1a80ad898cb0f5bb46a7fdd2781fafd66016 (diff) | |
download | mediavision-a89af65d65fea1de9fc38c0f7056cc047a0c3ae3.tar.gz mediavision-a89af65d65fea1de9fc38c0f7056cc047a0c3ae3.tar.bz2 mediavision-a89af65d65fea1de9fc38c0f7056cc047a0c3ae3.zip |
Refactoring Metadata
[Issue type] refactoring
- split long header implementation
- class initialization
- remove unused function
Change-Id: I049c3ebdf64980e9737d66e8afc122bc1b6cc395
Signed-off-by: Kwanghoon Son <k.son@samsung.com>
-rw-r--r-- | mv_machine_learning/inference/include/Metadata.h | 4 | ||||
-rw-r--r-- | mv_machine_learning/inference/include/OutputMetadata.h | 14 | ||||
-rw-r--r-- | mv_machine_learning/inference/src/DecodeInfo.cpp | 365 | ||||
-rw-r--r-- | mv_machine_learning/inference/src/OutputMetadata.cpp | 353 |
4 files changed, 370 insertions, 366 deletions
diff --git a/mv_machine_learning/inference/include/Metadata.h b/mv_machine_learning/inference/include/Metadata.h index 6ff9c390..b12fc75e 100644 --- a/mv_machine_learning/inference/include/Metadata.h +++ b/mv_machine_learning/inference/include/Metadata.h @@ -74,10 +74,6 @@ public: OutputMetadata &GetOutputMeta(); private: - int ParseInputMeta(JsonObject *object); - int ParseOutputMeta(JsonObject *object); - -private: std::string mMetafile; InputMetadata mInputMeta; diff --git a/mv_machine_learning/inference/include/OutputMetadata.h b/mv_machine_learning/inference/include/OutputMetadata.h index a19ef599..72f51fef 100644 --- a/mv_machine_learning/inference/include/OutputMetadata.h +++ b/mv_machine_learning/inference/include/OutputMetadata.h @@ -49,12 +49,15 @@ namespace inference class OutputMetadata { private: - bool parsed; + bool parsed = false; ScoreInfo score; box::BoxInfo box; Landmark landmark; OffsetVec offsetVec; - std::map<std::string, inference_tensor_shape_type_e> mSupportedShapeType; + std::map<std::string, inference_tensor_shape_type_e> mSupportedShapeType = { + { "NCHW", INFERENCE_TENSOR_SHAPE_NCHW }, + { "NHWC", INFERENCE_TENSOR_SHAPE_NHWC } + }; int ParseScore(JsonObject *root); int ParseBox(JsonObject *root); @@ -63,13 +66,6 @@ private: public: /** - * @brief Creates an OutputMetadata class instance. - * - * @since_tizen 6.5 - */ - OutputMetadata(); - - /** * @brief Destroys an OutputMetadata class instance including * its all resources. * diff --git a/mv_machine_learning/inference/src/DecodeInfo.cpp b/mv_machine_learning/inference/src/DecodeInfo.cpp new file mode 100644 index 00000000..fd5ed842 --- /dev/null +++ b/mv_machine_learning/inference/src/DecodeInfo.cpp @@ -0,0 +1,365 @@ +/** + * Copyright (c) 2022 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <DecodeInfo.h> + +using namespace mediavision::inference; +using namespace mediavision::inference::box; + +void DecodeInfo::AddAnchorBox(cv::Rect2f &anchor) +{ + anchorBoxes.push_back(anchor); +} + +void DecodeInfo::ClearAnchorBox() +{ + anchorBoxes.clear(); +} + +std::vector<cv::Rect2f> &DecodeInfo::GetAnchorBoxAll() +{ + return anchorBoxes; +} + +bool DecodeInfo::IsAnchorBoxEmpty() +{ + return anchorBoxes.empty(); +} + +int DecodeInfo::ParseAnchorParam(JsonObject *root) +{ + JsonObject *object = json_object_get_object_member(root, "anchor"); + + anchorParam.mode = static_cast<int>(json_object_get_int_member(object, "mode")); + + anchorParam.numLayers = static_cast<int>(json_object_get_int_member(object, "num_layers")); + anchorParam.minScale = static_cast<float>(json_object_get_double_member(object, "min_scale")); + anchorParam.maxScale = static_cast<float>(json_object_get_double_member(object, "max_scale")); + anchorParam.inputSizeHeight = static_cast<int>(json_object_get_int_member(object, "input_size_height")); + anchorParam.inputSizeWidth = static_cast<int>(json_object_get_int_member(object, "input_size_width")); + anchorParam.anchorOffsetX = static_cast<float>(json_object_get_double_member(object, "anchor_offset_x")); + anchorParam.anchorOffsetY = static_cast<float>(json_object_get_double_member(object, "anchor_offset_y")); + anchorParam.isReduceBoxedInLowestLayer = + static_cast<bool>(json_object_get_boolean_member(object, "reduce_boxed_in_lowest_layer")); + anchorParam.interpolatedScaleAspectRatio = + static_cast<float>(json_object_get_double_member(object, "interpolated_scale_aspect_ratio")); + anchorParam.isFixedAnchorSize = static_cast<bool>(json_object_get_boolean_member(object, "fixed_anchor_size")); + anchorParam.isExponentialBoxScale = + static_cast<bool>(json_object_get_boolean_member(object, "exponential_box_scale")); + + anchorParam.xScale = static_cast<float>(json_object_get_double_member(object, "x_scale")); + anchorParam.yScale = static_cast<float>(json_object_get_double_member(object, "y_scale")); + anchorParam.wScale = static_cast<float>(json_object_get_double_member(object, "w_scale")); + anchorParam.hScale = static_cast<float>(json_object_get_double_member(object, "h_scale")); + + JsonArray *array = json_object_get_array_member(object, "strides"); + unsigned int elements2 = json_array_get_length(array); + for (unsigned int elem2 = 0; elem2 < elements2; ++elem2) { + auto stride = static_cast<int>(json_array_get_int_element(array, elem2)); + anchorParam.strides.push_back(stride); + LOGI("stride: %d", stride); + } + + array = json_object_get_array_member(object, "aspect_ratios"); + elements2 = json_array_get_length(array); + for (unsigned int elem2 = 0; elem2 < elements2; ++elem2) { + auto aspectRatio = static_cast<float>(json_array_get_double_element(array, elem2)); + anchorParam.aspectRatios.push_back(aspectRatio); + LOGI("aspectRatio: %.4f", aspectRatio); + } + + return MEDIA_VISION_ERROR_NONE; +} + +int DecodeInfo::ParseCellParam(JsonObject *root) +{ + JsonObject *object = json_object_get_object_member(root, "cell"); + + cellParam.numScales = static_cast<int>(json_object_get_int_member(object, "num_scales")); + + JsonArray *array = json_object_get_array_member(object, "scales"); + unsigned int elements2 = json_array_get_length(array); + for (unsigned int elem2 = 0; elem2 < elements2; ++elem2) { + auto scale = static_cast<int>(json_array_get_int_element(array, elem2)); + cellParam.scales.push_back(scale); + LOGI("scale: %d", scale); + } + + cellParam.offsetScales = static_cast<int>(json_object_get_int_member(object, "offset_scales")); + try { + cellParam.type = GetSupportedType(object, "type", cellParam.supportedCellType); + } catch (const std::exception &e) { + LOGE("Invalid %s", e.what()); + return MEDIA_VISION_ERROR_INVALID_OPERATION; + } + + return MEDIA_VISION_ERROR_NONE; +} + +std::vector<int> &DecodeInfo::GetCellScalesAll() +{ + return cellParam.scales; +} + +int DecodeInfo::GetCellNumScales() +{ + return cellParam.numScales; +} + +int DecodeInfo::GetCellOffsetScales() +{ + return cellParam.offsetScales; +} + +inference_score_type_e DecodeInfo::GetCellType() +{ + return cellParam.type; +} + +float DecodeInfo::CalculateScale(float min, float max, int index, int maxStride) +{ + return min + (max - min) * 1.0 * index / (maxStride - 1.0f); +} + +bool DecodeInfo::IsFixedAnchorSize() +{ + return anchorParam.isFixedAnchorSize; +} + +bool DecodeInfo::IsExponentialBoxScale() +{ + return anchorParam.isExponentialBoxScale; +} + +float DecodeInfo::GetAnchorXscale() +{ + return anchorParam.xScale; +} + +float DecodeInfo::GetAnchorYscale() +{ + return anchorParam.yScale; +} + +float DecodeInfo::GetAnchorWscale() +{ + return anchorParam.wScale; +} + +float DecodeInfo::GetAnchorHscale() +{ + return anchorParam.hScale; +} + +int DecodeInfo::GenerateAnchor() +{ + if (anchorParam.strides.empty() || anchorParam.aspectRatios.empty()) { + LOGE("Invalid anchor parameters"); + return MEDIA_VISION_ERROR_INVALID_OPERATION; + } + + int layerId = 0; + ClearAnchorBox(); + while (layerId < anchorParam.numLayers) { + std::vector<float> anchorHeight; + std::vector<float> anchorWidth; + std::vector<float> aspectRatios; + std::vector<float> scales; + + int lastSameStrideLayer = layerId; + std::vector<float>::iterator iter1, iter2; + while ((lastSameStrideLayer < anchorParam.numLayers) && + (anchorParam.strides[lastSameStrideLayer] == anchorParam.strides[layerId])) { + const float scale = CalculateScale(anchorParam.minScale, anchorParam.maxScale, lastSameStrideLayer, + anchorParam.strides.size()); + + if (lastSameStrideLayer == 0 && anchorParam.isReduceBoxedInLowestLayer) { + aspectRatios.push_back(1.0); + aspectRatios.push_back(2.0); + aspectRatios.push_back(0.5); + scales.push_back(0.1); + scales.push_back(scale); + scales.push_back(scale); + } else { + for (iter1 = anchorParam.aspectRatios.begin(); iter1 != anchorParam.aspectRatios.end(); ++iter1) { + aspectRatios.push_back((*iter1)); + scales.push_back(scale); + } + if (anchorParam.interpolatedScaleAspectRatio > 0.0f) { + const float scaleNext = lastSameStrideLayer == static_cast<int>(anchorParam.strides.size()) - 1 ? + 1.0f : + CalculateScale(anchorParam.minScale, anchorParam.maxScale, + lastSameStrideLayer + 1, anchorParam.strides.size()); + scales.push_back(std::sqrt(scale * scaleNext)); + aspectRatios.push_back(anchorParam.interpolatedScaleAspectRatio); + } + } + lastSameStrideLayer++; + } + + for (iter1 = aspectRatios.begin(), iter2 = scales.begin(); + (iter1 != aspectRatios.end() && iter2 != scales.end()); ++iter1, ++iter2) { + const float ratioSqrts = std::sqrt((*iter1)); + anchorHeight.push_back((*iter2) / ratioSqrts); + anchorWidth.push_back((*iter2) * ratioSqrts); + } + + const int stride = anchorParam.strides[layerId]; + int featureMapHeight = std::ceil(1.0f * anchorParam.inputSizeHeight / stride); + int featureMapWidth = std::ceil(1.0f * anchorParam.inputSizeWidth / stride); + + for (int y = 0; y < featureMapHeight; ++y) { + for (int x = 0; x < featureMapWidth; ++x) { + for (int anchorId = 0; anchorId < (int) anchorHeight.size(); ++anchorId) { + cv::Rect2f anchor = { cv::Point2f { (x + anchorParam.anchorOffsetX) * 1.0f / featureMapWidth, + (y + anchorParam.anchorOffsetY) * 1.0f / featureMapHeight }, + anchorParam.isFixedAnchorSize ? + cv::Size2f { 1.0f, 1.0f } : + cv::Size2f { anchorWidth[anchorId], anchorWidth[anchorId] } }; + AddAnchorBox(anchor); + } + } + } + layerId = lastSameStrideLayer; + } + + if (IsAnchorBoxEmpty()) { + LOGE("Anchor boxes are empty"); + return MEDIA_VISION_ERROR_INVALID_OPERATION; + } + + return MEDIA_VISION_ERROR_NONE; +} + +int DecodeInfo::ParseNms(JsonObject *root) +{ + if (!json_object_has_member(root, "nms")) { + LOGI("nms is empty. skip it"); + return MEDIA_VISION_ERROR_NONE; + } + + JsonObject *object = json_object_get_object_member(root, "nms"); + try { + nmsParam.mode = GetSupportedType(object, "mode", nmsParam.supportedBoxNmsTypes); + } catch (const std::exception &e) { + LOGE("Invalid %s", e.what()); + return MEDIA_VISION_ERROR_INVALID_OPERATION; + } + + nmsParam.iouThreshold = static_cast<float>(json_object_get_double_member(object, "iou_threshold")); + + return MEDIA_VISION_ERROR_NONE; +} + +int DecodeInfo::GetNmsMode() +{ + return nmsParam.mode; +} + +float DecodeInfo::GetNmsIouThreshold() +{ + return nmsParam.iouThreshold; +} + +int DecodeInfo::ParseRotate(JsonObject *root) +{ + if (!json_object_has_member(root, "rotate")) { + LOGI("rotate is empty. skip it"); + return MEDIA_VISION_ERROR_NONE; + } + + JsonObject *object = json_object_get_object_member(root, "rotate"); + rotParam.baseAngle = static_cast<float>(json_object_get_double_member(object, "base_angle")); + rotParam.startPointIndex = static_cast<int>(json_object_get_int_member(object, "start_point_index")); + rotParam.endPointIndex = static_cast<int>(json_object_get_int_member(object, "end_point_index")); + + return MEDIA_VISION_ERROR_NONE; +} + +int DecodeInfo::GetRotStartPointIndex() +{ + return rotParam.startPointIndex; +} + +int DecodeInfo::GetRotEndPointIndex() +{ + return rotParam.endPointIndex; +} + +float DecodeInfo::GetBaseAngle() +{ + return rotParam.baseAngle; +} + +int DecodeInfo::GetRoiMode() +{ + return roiOptParam.mode; +} + +int DecodeInfo::GetRoiStartPointIndex() +{ + return roiOptParam.startPointIndex; +} + +int DecodeInfo::GetRoiEndPointIndex() +{ + return roiOptParam.endPointIndex; +} + +int DecodeInfo::GetRoiCenterPointIndex() +{ + return roiOptParam.centerPointIndex; +} + +float DecodeInfo::GetShiftX() +{ + return roiOptParam.shiftX; +} + +float DecodeInfo::GetShiftY() +{ + return roiOptParam.shiftY; +} + +float DecodeInfo::GetScaleX() +{ + return roiOptParam.scaleX; +} + +float DecodeInfo::GetScaleY() +{ + return roiOptParam.scaleY; +} + +int DecodeInfo::ParseRoiOption(JsonObject *root) +{ + if (!json_object_has_member(root, "roi")) { + LOGI("roi is empty. skip it"); + return MEDIA_VISION_ERROR_NONE; + } + + JsonObject *object = json_object_get_object_member(root, "roi"); + roiOptParam.startPointIndex = static_cast<int>(json_object_get_int_member(object, "start_point_index")); + roiOptParam.endPointIndex = static_cast<int>(json_object_get_int_member(object, "end_point_index")); + roiOptParam.centerPointIndex = static_cast<int>(json_object_get_int_member(object, "center_point_index")); + roiOptParam.shiftX = static_cast<float>(json_object_get_double_member(object, "shift_x")); + roiOptParam.shiftY = static_cast<float>(json_object_get_double_member(object, "shift_y")); + roiOptParam.scaleX = static_cast<float>(json_object_get_double_member(object, "scale_x")); + roiOptParam.scaleY = static_cast<float>(json_object_get_double_member(object, "scale_y")); + roiOptParam.mode = static_cast<int>(json_object_get_int_member(object, "scale_mode")); + + return MEDIA_VISION_ERROR_NONE; +} diff --git a/mv_machine_learning/inference/src/OutputMetadata.cpp b/mv_machine_learning/inference/src/OutputMetadata.cpp index 2fb49e2d..bdcbce4a 100644 --- a/mv_machine_learning/inference/src/OutputMetadata.cpp +++ b/mv_machine_learning/inference/src/OutputMetadata.cpp @@ -31,13 +31,6 @@ namespace mediavision { namespace inference { -OutputMetadata::OutputMetadata() : parsed(false), score(), box(), landmark(), offsetVec() -{ - // shape_type - mSupportedShapeType.insert({ "NCHW", INFERENCE_TENSOR_SHAPE_NCHW }); - mSupportedShapeType.insert({ "NHWC", INFERENCE_TENSOR_SHAPE_NHWC }); -} - int OutputMetadata::ParseScore(JsonObject *root) { if (!json_object_has_member(root, "score")) { @@ -48,26 +41,6 @@ int OutputMetadata::ParseScore(JsonObject *root) return score.ParseScore(root); } -void DecodeInfo::AddAnchorBox(cv::Rect2f &anchor) -{ - anchorBoxes.push_back(anchor); -} - -void DecodeInfo::ClearAnchorBox() -{ - anchorBoxes.clear(); -} - -std::vector<cv::Rect2f> &DecodeInfo::GetAnchorBoxAll() -{ - return anchorBoxes; -} - -bool DecodeInfo::IsAnchorBoxEmpty() -{ - return anchorBoxes.empty(); -} - int OutputMetadata::ParseBox(JsonObject *root) { if (!json_object_has_member(root, "box")) { @@ -78,332 +51,6 @@ int OutputMetadata::ParseBox(JsonObject *root) return box.ParseBox(root); } -int DecodeInfo::ParseAnchorParam(JsonObject *root) -{ - JsonObject *object = json_object_get_object_member(root, "anchor"); - - anchorParam.mode = static_cast<int>(json_object_get_int_member(object, "mode")); - - anchorParam.numLayers = static_cast<int>(json_object_get_int_member(object, "num_layers")); - anchorParam.minScale = static_cast<float>(json_object_get_double_member(object, "min_scale")); - anchorParam.maxScale = static_cast<float>(json_object_get_double_member(object, "max_scale")); - anchorParam.inputSizeHeight = static_cast<int>(json_object_get_int_member(object, "input_size_height")); - anchorParam.inputSizeWidth = static_cast<int>(json_object_get_int_member(object, "input_size_width")); - anchorParam.anchorOffsetX = static_cast<float>(json_object_get_double_member(object, "anchor_offset_x")); - anchorParam.anchorOffsetY = static_cast<float>(json_object_get_double_member(object, "anchor_offset_y")); - anchorParam.isReduceBoxedInLowestLayer = - static_cast<bool>(json_object_get_boolean_member(object, "reduce_boxed_in_lowest_layer")); - anchorParam.interpolatedScaleAspectRatio = - static_cast<float>(json_object_get_double_member(object, "interpolated_scale_aspect_ratio")); - anchorParam.isFixedAnchorSize = static_cast<bool>(json_object_get_boolean_member(object, "fixed_anchor_size")); - anchorParam.isExponentialBoxScale = - static_cast<bool>(json_object_get_boolean_member(object, "exponential_box_scale")); - - anchorParam.xScale = static_cast<float>(json_object_get_double_member(object, "x_scale")); - anchorParam.yScale = static_cast<float>(json_object_get_double_member(object, "y_scale")); - anchorParam.wScale = static_cast<float>(json_object_get_double_member(object, "w_scale")); - anchorParam.hScale = static_cast<float>(json_object_get_double_member(object, "h_scale")); - - JsonArray *array = json_object_get_array_member(object, "strides"); - unsigned int elements2 = json_array_get_length(array); - for (unsigned int elem2 = 0; elem2 < elements2; ++elem2) { - auto stride = static_cast<int>(json_array_get_int_element(array, elem2)); - anchorParam.strides.push_back(stride); - LOGI("stride: %d", stride); - } - - array = json_object_get_array_member(object, "aspect_ratios"); - elements2 = json_array_get_length(array); - for (unsigned int elem2 = 0; elem2 < elements2; ++elem2) { - auto aspectRatio = static_cast<float>(json_array_get_double_element(array, elem2)); - anchorParam.aspectRatios.push_back(aspectRatio); - LOGI("aspectRatio: %.4f", aspectRatio); - } - - return MEDIA_VISION_ERROR_NONE; -} - -int DecodeInfo::ParseCellParam(JsonObject *root) -{ - JsonObject *object = json_object_get_object_member(root, "cell"); - - cellParam.numScales = static_cast<int>(json_object_get_int_member(object, "num_scales")); - - JsonArray *array = json_object_get_array_member(object, "scales"); - unsigned int elements2 = json_array_get_length(array); - for (unsigned int elem2 = 0; elem2 < elements2; ++elem2) { - auto scale = static_cast<int>(json_array_get_int_element(array, elem2)); - cellParam.scales.push_back(scale); - LOGI("scale: %d", scale); - } - - cellParam.offsetScales = static_cast<int>(json_object_get_int_member(object, "offset_scales")); - try { - cellParam.type = GetSupportedType(object, "type", cellParam.supportedCellType); - } catch (const std::exception &e) { - LOGE("Invalid %s", e.what()); - return MEDIA_VISION_ERROR_INVALID_OPERATION; - } - - return MEDIA_VISION_ERROR_NONE; -} - -std::vector<int> &DecodeInfo::GetCellScalesAll() -{ - return cellParam.scales; -} - -int DecodeInfo::GetCellNumScales() -{ - return cellParam.numScales; -} - -int DecodeInfo::GetCellOffsetScales() -{ - return cellParam.offsetScales; -} - -inference_score_type_e DecodeInfo::GetCellType() -{ - return cellParam.type; -} - -float DecodeInfo::CalculateScale(float min, float max, int index, int maxStride) -{ - return min + (max - min) * 1.0 * index / (maxStride - 1.0f); -} - -bool DecodeInfo::IsFixedAnchorSize() -{ - return anchorParam.isFixedAnchorSize; - ; -} - -bool DecodeInfo::IsExponentialBoxScale() -{ - return anchorParam.isExponentialBoxScale; -} - -float DecodeInfo::GetAnchorXscale() -{ - return anchorParam.xScale; -} - -float DecodeInfo::GetAnchorYscale() -{ - return anchorParam.yScale; -} - -float DecodeInfo::GetAnchorWscale() -{ - return anchorParam.wScale; -} - -float DecodeInfo::GetAnchorHscale() -{ - return anchorParam.hScale; -} - -int DecodeInfo::GenerateAnchor() -{ - if (anchorParam.strides.empty() || anchorParam.aspectRatios.empty()) { - LOGE("Invalid anchor parameters"); - return MEDIA_VISION_ERROR_INVALID_OPERATION; - } - - int layerId = 0; - ClearAnchorBox(); - while (layerId < anchorParam.numLayers) { - std::vector<float> anchorHeight; - std::vector<float> anchorWidth; - std::vector<float> aspectRatios; - std::vector<float> scales; - - int lastSameStrideLayer = layerId; - std::vector<float>::iterator iter1, iter2; - while ((lastSameStrideLayer < anchorParam.numLayers) && - (anchorParam.strides[lastSameStrideLayer] == anchorParam.strides[layerId])) { - const float scale = CalculateScale(anchorParam.minScale, anchorParam.maxScale, lastSameStrideLayer, - anchorParam.strides.size()); - - if (lastSameStrideLayer == 0 && anchorParam.isReduceBoxedInLowestLayer) { - aspectRatios.push_back(1.0); - aspectRatios.push_back(2.0); - aspectRatios.push_back(0.5); - scales.push_back(0.1); - scales.push_back(scale); - scales.push_back(scale); - } else { - for (iter1 = anchorParam.aspectRatios.begin(); iter1 != anchorParam.aspectRatios.end(); ++iter1) { - aspectRatios.push_back((*iter1)); - scales.push_back(scale); - } - if (anchorParam.interpolatedScaleAspectRatio > 0.0f) { - const float scaleNext = lastSameStrideLayer == static_cast<int>(anchorParam.strides.size()) - 1 ? - 1.0f : - CalculateScale(anchorParam.minScale, anchorParam.maxScale, - lastSameStrideLayer + 1, anchorParam.strides.size()); - scales.push_back(std::sqrt(scale * scaleNext)); - aspectRatios.push_back(anchorParam.interpolatedScaleAspectRatio); - } - } - lastSameStrideLayer++; - } - - for (iter1 = aspectRatios.begin(), iter2 = scales.begin(); - (iter1 != aspectRatios.end() && iter2 != scales.end()); ++iter1, ++iter2) { - const float ratioSqrts = std::sqrt((*iter1)); - anchorHeight.push_back((*iter2) / ratioSqrts); - anchorWidth.push_back((*iter2) * ratioSqrts); - } - - const int stride = anchorParam.strides[layerId]; - int featureMapHeight = std::ceil(1.0f * anchorParam.inputSizeHeight / stride); - int featureMapWidth = std::ceil(1.0f * anchorParam.inputSizeWidth / stride); - - for (int y = 0; y < featureMapHeight; ++y) { - for (int x = 0; x < featureMapWidth; ++x) { - for (int anchorId = 0; anchorId < (int) anchorHeight.size(); ++anchorId) { - cv::Rect2f anchor = { cv::Point2f { (x + anchorParam.anchorOffsetX) * 1.0f / featureMapWidth, - (y + anchorParam.anchorOffsetY) * 1.0f / featureMapHeight }, - anchorParam.isFixedAnchorSize ? - cv::Size2f { 1.0f, 1.0f } : - cv::Size2f { anchorWidth[anchorId], anchorWidth[anchorId] } }; - AddAnchorBox(anchor); - } - } - } - layerId = lastSameStrideLayer; - } - - if (IsAnchorBoxEmpty()) { - LOGE("Anchor boxes are empty"); - return MEDIA_VISION_ERROR_INVALID_OPERATION; - } - - return MEDIA_VISION_ERROR_NONE; -} - -int DecodeInfo::ParseNms(JsonObject *root) -{ - if (!json_object_has_member(root, "nms")) { - LOGI("nms is empty. skip it"); - return MEDIA_VISION_ERROR_NONE; - } - - JsonObject *object = json_object_get_object_member(root, "nms"); - try { - nmsParam.mode = GetSupportedType(object, "mode", nmsParam.supportedBoxNmsTypes); - } catch (const std::exception &e) { - LOGE("Invalid %s", e.what()); - return MEDIA_VISION_ERROR_INVALID_OPERATION; - } - - nmsParam.iouThreshold = static_cast<float>(json_object_get_double_member(object, "iou_threshold")); - - return MEDIA_VISION_ERROR_NONE; -} - -int DecodeInfo::GetNmsMode() -{ - return nmsParam.mode; -} - -float DecodeInfo::GetNmsIouThreshold() -{ - return nmsParam.iouThreshold; -} - -int DecodeInfo::ParseRotate(JsonObject *root) -{ - if (!json_object_has_member(root, "rotate")) { - LOGI("rotate is empty. skip it"); - return MEDIA_VISION_ERROR_NONE; - } - - JsonObject *object = json_object_get_object_member(root, "rotate"); - rotParam.baseAngle = static_cast<float>(json_object_get_double_member(object, "base_angle")); - rotParam.startPointIndex = static_cast<int>(json_object_get_int_member(object, "start_point_index")); - rotParam.endPointIndex = static_cast<int>(json_object_get_int_member(object, "end_point_index")); - - return MEDIA_VISION_ERROR_NONE; -} - -int DecodeInfo::GetRotStartPointIndex() -{ - return rotParam.startPointIndex; -} - -int DecodeInfo::GetRotEndPointIndex() -{ - return rotParam.endPointIndex; -} - -float DecodeInfo::GetBaseAngle() -{ - return rotParam.baseAngle; -} - -int DecodeInfo::GetRoiMode() -{ - return roiOptParam.mode; -} - -int DecodeInfo::GetRoiStartPointIndex() -{ - return roiOptParam.startPointIndex; -} - -int DecodeInfo::GetRoiEndPointIndex() -{ - return roiOptParam.endPointIndex; -} - -int DecodeInfo::GetRoiCenterPointIndex() -{ - return roiOptParam.centerPointIndex; -} - -float DecodeInfo::GetShiftX() -{ - return roiOptParam.shiftX; -} - -float DecodeInfo::GetShiftY() -{ - return roiOptParam.shiftY; -} - -float DecodeInfo::GetScaleX() -{ - return roiOptParam.scaleX; -} - -float DecodeInfo::GetScaleY() -{ - return roiOptParam.scaleY; -} - -int DecodeInfo::ParseRoiOption(JsonObject *root) -{ - if (!json_object_has_member(root, "roi")) { - LOGI("roi is empty. skip it"); - return MEDIA_VISION_ERROR_NONE; - } - - JsonObject *object = json_object_get_object_member(root, "roi"); - roiOptParam.startPointIndex = static_cast<int>(json_object_get_int_member(object, "start_point_index")); - roiOptParam.endPointIndex = static_cast<int>(json_object_get_int_member(object, "end_point_index")); - roiOptParam.centerPointIndex = static_cast<int>(json_object_get_int_member(object, "center_point_index")); - roiOptParam.shiftX = static_cast<float>(json_object_get_double_member(object, "shift_x")); - roiOptParam.shiftY = static_cast<float>(json_object_get_double_member(object, "shift_y")); - roiOptParam.scaleX = static_cast<float>(json_object_get_double_member(object, "scale_x")); - roiOptParam.scaleY = static_cast<float>(json_object_get_double_member(object, "scale_y")); - roiOptParam.mode = static_cast<int>(json_object_get_int_member(object, "scale_mode")); - - return MEDIA_VISION_ERROR_NONE; -} - int OutputMetadata::ParseLandmark(JsonObject *root) { LOGI("ENTER"); |