Add NMS decoding to Postprocess Parser 22/321322/2
authorBhuvan Reddy Gangula <bhu1.gangula@samsung.com>
Tue, 18 Mar 2025 10:37:08 +0000 (19:37 +0900)
committerBhuvan Reddy Gangula <bhu1.gangula@samsung.com>
Wed, 19 Mar 2025 07:41:21 +0000 (16:41 +0900)
Add NMS parameter decoding suppport to Postprocess Parser for NMS only decoding case,
instead of using a specialized parser for the task

Change-Id: I92f3009dc48ec8bed021279b186441e79b9330ca
Signed-off-by: Bhuvan Reddy Gangula <bhu1.gangula@samsung.com>
mv_machine_learning/meta/src/PostprocessParser.cpp

index fb4effac3945d6e34a359a67c38135cae69935de..3c6fcb0361c00f7134234020911797390f5aad6b 100644 (file)
@@ -35,10 +35,14 @@ std::map<std::string, BoxType> gSupportedBoxTypes = { { "ORIGIN_LEFTTOP", BoxTyp
 std::map<std::string, BoxCoordinateType> gSupportedBoxCoordinateTypes = { { "RATIO", BoxCoordinateType::RATIO },
                                                                                                                                                  { "PIXEL", BoxCoordinateType::PIXEL } };
 
-std::map<std::string, BoxDecodingType> gSupportedBoxDecodingTypes = { { "BYPASS", BoxDecodingType::BYPASS },
-                                                                                                                                         { "SSD_ANCHOR", BoxDecodingType::SSD_ANCHOR },
-                                                                                                                                         { "YOLO_ANCHOR", BoxDecodingType::YOLO_ANCHOR },
-                                                                                                                                         { "3D", BoxDecodingType::BBOX_3D } };
+std::map<std::string, BoxDecodingType> gSupportedBoxDecodingTypes = {
+       { "BYPASS", BoxDecodingType::BYPASS },
+       { "SSD_ANCHOR", BoxDecodingType::SSD_ANCHOR },
+       { "YOLO_ANCHOR", BoxDecodingType::YOLO_ANCHOR },
+       { "3D", BoxDecodingType::BBOX_3D },
+       { "NMS", BoxDecodingType::NMS },
+};
+std::map<std::string, BoxNmsMode> gSupportedBoxNmsModes = { { "STANDARD", BoxNmsMode::STANDARD } };
 std::map<std::string, ScoreType> gSupportedScoreTypes = { { "NORMAL", ScoreType::NORMAL },
                                                                                                                  { "SIGMOID", ScoreType::SIGMOID } };
 std::map<std::string, LandmarkType> gSupportedLandmarkTypes = { { "2D_SINGLE", LandmarkType::SINGLE_2D },
@@ -121,7 +125,8 @@ void PostprocessParser::parseBox(shared_ptr<MetaInfo> metaInfo, JsonObject *root
 
        JsonObject *decoding_info_obj = json_object_get_object_member(object, "decoding_info");
 
-       if (decodingBox->decodingType == BoxDecodingType::BBOX_3D) {
+       switch (decodingBox->decodingType) {
+       case BoxDecodingType::BBOX_3D: {
                JsonArray *array = json_object_get_array_member(decoding_info_obj, "edges");
                unsigned int elements = json_array_get_length(array);
 
@@ -130,9 +135,8 @@ void PostprocessParser::parseBox(shared_ptr<MetaInfo> metaInfo, JsonObject *root
                        decodingBox->edges.push_back(val);
                        LOGI("%d", val);
                }
-       }
-
-       if (decodingBox->decodingType == BoxDecodingType::SSD_ANCHOR) {
+       } break;
+       case BoxDecodingType::SSD_ANCHOR: {
                if (!json_object_has_member(decoding_info_obj, "anchor"))
                        throw InvalidOperation("anchor node is needed.");
 
@@ -144,6 +148,25 @@ void PostprocessParser::parseBox(shared_ptr<MetaInfo> metaInfo, JsonObject *root
 
                JsonObject *nms_object = json_object_get_object_member(decoding_info_obj, "nms");
                _anchorParser->ParseNmsParam(decodingBox, nms_object);
+       } break;
+       case BoxDecodingType::NMS: {
+               if (!json_object_has_member(decoding_info_obj, "nms"))
+                       throw InvalidOperation("nms node is needed.");
+
+               JsonObject *nms_object = json_object_get_object_member(decoding_info_obj, "nms");
+               shared_ptr<BoxNmsParam> boxNmsParam = make_shared<BoxNmsParam>();
+
+               boxNmsParam->mode =
+                               GetSupportedType<BoxNmsMode, map<string, BoxNmsMode> >(nms_object, "mode", gSupportedBoxNmsModes);
+               LOGI("nms mode : %d", static_cast<int>(boxNmsParam->mode));
+
+               boxNmsParam->iouThreshold = static_cast<float>(json_object_get_double_member(nms_object, "iou_threshold"));
+               LOGI("nms iou_threshold : %.2f", boxNmsParam->iouThreshold);
+
+               decodingBox->decodingInfoMap[BoxDecodingType::NMS] = boxNmsParam;
+       } break;
+       default:
+               break;
        }
 
        LOGI("LEAVE");