mv_machine_learning: code cleanup to face recognition
authorInki Dae <inki.dae@samsung.com>
Tue, 9 Aug 2022 07:57:11 +0000 (16:57 +0900)
committerInki Dae <inki.dae@samsung.com>
Fri, 2 Sep 2022 08:09:25 +0000 (17:09 +0900)
[Issue type]: code cleanup

Cleaned up face recognition framework by doing,
- use override keyword for virtual functions.
- call functions of base class instead of derived one.
- drop unused declaration.

Change-Id: I0fc528e85d7248b01fd9a12d4b00ca16b1209697
Signed-off-by: Inki Dae <inki.dae@samsung.com>
mv_machine_learning/face_recognition/include/backbone_model_info.h
mv_machine_learning/face_recognition/include/face_net_info.h
mv_machine_learning/face_recognition/include/face_recognition.h
mv_machine_learning/face_recognition/include/face_recognition_adapter.h
mv_machine_learning/face_recognition/include/simple_shot.h
mv_machine_learning/face_recognition/src/face_net_info.cpp
mv_machine_learning/face_recognition/src/face_recognition.cpp
mv_machine_learning/face_recognition/src/simple_shot.cpp

index 9756449..b2164ff 100644 (file)
@@ -24,13 +24,13 @@ typedef struct {
        inference_engine_tensor_info tensor_info;
 } model_layer_info;
 
-class BackboneModelInfo {
+class IBackboneModelInfo {
 public:
-       BackboneModelInfo(std::string model_file_path) { }
-       virtual ~BackboneModelInfo() { }
+       virtual ~IBackboneModelInfo() { }
 
-       virtual std::vector<model_layer_info>& GetInputLayerInfo() { return GetInputLayerInfo(); }
-       virtual std::vector<model_layer_info>& GetOutputLayerInfo() { return GetOutputLayerInfo(); }
+       virtual std::vector<model_layer_info>& GetInputLayerInfo() = 0;
+       virtual std::vector<model_layer_info>& GetOutputLayerInfo() = 0;
+       virtual std::string GetModelFilePath() = 0;
 };
 
 #endif
\ No newline at end of file
index ee27ee1..e2cf317 100644 (file)
@@ -19,7 +19,7 @@
 
 #include "backbone_model_info.h"
 
-class FaceNetInfo : public BackboneModelInfo {
+class FaceNetInfo : public IBackboneModelInfo {
 private:
        std::vector<model_layer_info> _input_layer_info;
        std::vector<model_layer_info> _output_layer_info;
@@ -29,9 +29,9 @@ public:
        FaceNetInfo(std::string model_file_path);
        ~FaceNetInfo();
 
-       std::string GetModelFilePath();
-       std::vector<model_layer_info>& GetInputLayerInfo();
-       std::vector<model_layer_info>& GetOutputLayerInfo();
+       std::vector<model_layer_info>& GetInputLayerInfo() override;
+       std::vector<model_layer_info>& GetOutputLayerInfo() override;
+       std::string GetModelFilePath() override;
 };
 
 #endif
\ No newline at end of file
index a239471..47e7530 100644 (file)
@@ -26,7 +26,7 @@
 #include "inference_engine_common_impl.h"
 #include "Inference.h"
 #include "label_manager.h"
-#include "face_net_info.h"
+#include "backbone_model_info.h"
 #include "simple_shot.h"
 #include "data_augment_default.h"
 #include "data_augment_flip.h"
@@ -95,9 +95,16 @@ typedef struct {
 
 class FaceRecognition {
 private:
+       unsigned int _status;
+       std::unique_ptr<mediavision::inference::Inference> _internal;
+       std::unique_ptr<mediavision::inference::Inference> _backbone;
+       std::unique_ptr<IBackboneModelInfo> _backbone_model_info;
+       std::unique_ptr<TrainingModel> _training_model;
+       std::unique_ptr<LabelManager> _label_manager;
        FaceRecognitionConfig _config;
-       std::vector<std::unique_ptr<DataAugment>> _data_augments;
        mv_face_recognition_result_s _result;
+       std::vector<std::unique_ptr<DataAugment>> _data_augments;
+
 
        // FYI. This function should be called every time a new face is registered.
        void ImportLabel();
@@ -110,14 +117,6 @@ private:
        std::vector<model_layer_info>& GetBackboneInputLayerInfo();
        int GetVecFromMvSource(mv_source_h img_src, std::vector<float>& out_vec);
 
-protected:
-       unsigned int _status;
-       std::unique_ptr<mediavision::inference::Inference> _internal;
-       std::unique_ptr<mediavision::inference::Inference> _backbone;
-       std::unique_ptr<FaceNetInfo> _face_net_info;
-       std::unique_ptr<TrainingModel> _training_model;
-       std::unique_ptr<LabelManager> _label_manager;
-
 public:
        FaceRecognition();
        ~ FaceRecognition();
index b4ab9fa..97cebbf 100644 (file)
@@ -77,11 +77,11 @@ public:
                return _config;
        }
 
-       void configure();
-       void prepare();
-       void setInput(T& t);
-       void perform();
-       V& getOutput();
+       void configure() override;
+       void prepare() override;
+       void setInput(T& t) override;
+       void perform() override;
+       V& getOutput() override;
 };
 
 } // machine_learning
index 145ac15..d2e025d 100644 (file)
@@ -24,8 +24,8 @@ class SimpleShot : public TrainingModel {
 private:
        TrainingEngineBackendInfo _engine_info;
 private:
-       void SaveModel(const std::string file_path);
-       void RemoveModel(const std::string file_path);
+       void SaveModel(const std::string file_path) override;
+       void RemoveModel(const std::string file_path) override;
 public:
        SimpleShot(const mv_inference_backend_type_e backend_type = MV_INFERENCE_BACKEND_NNTRAINER,
                           const mv_inference_target_device_e target_type = MV_INFERENCE_TARGET_DEVICE_CPU,
@@ -33,9 +33,8 @@ public:
        ~SimpleShot();
 
        // Configure layers for SimpleShot learning.
-       void ConfigureModel(int num_of_class);
-
-       TrainingEngineBackendInfo& GetTrainingEngineInfo() { return _engine_info; }
+       void ConfigureModel(int num_of_class) override;
+       TrainingEngineBackendInfo& GetTrainingEngineInfo() override;
 };
 
 #endif
\ No newline at end of file
index 2059af2..8224787 100644 (file)
@@ -18,7 +18,7 @@
 
 using namespace std;
 
-FaceNetInfo::FaceNetInfo(string model_file_path) : BackboneModelInfo(model_file_path)
+FaceNetInfo::FaceNetInfo(string model_file_path)
 {
        _model_file_path = model_file_path;
 
index 8a6505c..5f21116 100644 (file)
@@ -31,6 +31,7 @@
 #include "face_recognition.h"
 #include "nntrainer_fvm.h"
 #include "nntrainer_dsm.h"
+#include "face_net_info.h"
 #include "file_util.h"
 
 using namespace std;
@@ -45,7 +46,7 @@ namespace machine_learning
 {
 
 FaceRecognition::FaceRecognition() :
-               _status(NONE), _internal(), _backbone(), _face_net_info(), _training_model(), _label_manager()
+               _status(NONE), _internal(), _backbone(), _backbone_model_info(), _training_model(), _label_manager(), _config(), _result()
 {
        _data_augments.push_back(std::make_unique<DataAugmentDefault>());
        /* Add other data argument classes. */
@@ -193,7 +194,7 @@ void FaceRecognition::SetConfig(FaceRecognitionConfig& config)
 
 std::vector<model_layer_info>& FaceRecognition::GetBackboneInputLayerInfo()
 {
-       return _face_net_info->GetInputLayerInfo();
+       return _backbone_model_info->GetInputLayerInfo();
 }
 
 int FaceRecognition::GetVecFromMvSource(mv_source_h img_src, std::vector<float>& out_vec)
@@ -229,14 +230,14 @@ int FaceRecognition::GetVecFromMvSource(mv_source_h img_src, std::vector<float>&
 
 int FaceRecognition::Initialize()
 {
-       _face_net_info = make_unique<FaceNetInfo>(_config.backbone_model_file_path);
+       _backbone_model_info = make_unique<FaceNetInfo>(_config.backbone_model_file_path);
 
-       if (_face_net_info->GetInputLayerInfo().empty() || _face_net_info->GetInputLayerInfo().size() > 1) {
+       if (_backbone_model_info->GetInputLayerInfo().empty() || _backbone_model_info->GetInputLayerInfo().size() > 1) {
                LOGE("Invalid input layer size - input layer size should be 1.");
                return MEDIA_VISION_ERROR_INVALID_PARAMETER;
        }
 
-       if (_face_net_info->GetOutputLayerInfo().empty() || _face_net_info->GetOutputLayerInfo().size() > 1) {
+       if (_backbone_model_info->GetOutputLayerInfo().empty() || _backbone_model_info->GetOutputLayerInfo().size() > 1) {
                LOGE("Invalid output layer size - output layer size should be 1.");
                return MEDIA_VISION_ERROR_INVALID_PARAMETER;
        }
@@ -244,12 +245,12 @@ int FaceRecognition::Initialize()
        vector<string> input_layer_names, output_layer_names;
        vector<inference_engine_tensor_info> input_tensor_info, output_tensor_info;
 
-       for (auto& input : _face_net_info->GetInputLayerInfo()) {
+       for (auto& input : _backbone_model_info->GetInputLayerInfo()) {
                input_layer_names.push_back(input.layer_name);
                input_tensor_info.push_back(input.tensor_info);
        }
 
-       for (auto& output : _face_net_info->GetOutputLayerInfo()) {
+       for (auto& output : _backbone_model_info->GetOutputLayerInfo()) {
                output_layer_names.push_back(output.layer_name);
                output_tensor_info.push_back(output.tensor_info);
        }
@@ -269,7 +270,7 @@ int FaceRecognition::Initialize()
 
        _backbone->ConfigureInputInfo(width, height, 1, ch, 127.5f, 127.5f, MV_INFERENCE_DATA_FLOAT32, input_layer_names);
        _backbone->ConfigureOutputInfo(output_layer_names, output_tensor_info);
-       _backbone->ConfigureModelFiles("", _face_net_info->GetModelFilePath(), "");
+       _backbone->ConfigureModelFiles("", _backbone_model_info->GetModelFilePath(), "");
 
        ret = _backbone->Load();
        if (ret != MEDIA_VISION_ERROR_NONE)
@@ -310,7 +311,7 @@ void FaceRecognition::ImportLabel()
 
 int FaceRecognition::RegisterNewFace(mv_source_h img_src, string label_name)
 {
-       vector<model_layer_info>& output_layer_info = _face_net_info->GetOutputLayerInfo();
+       vector<model_layer_info>& output_layer_info = _backbone_model_info->GetOutputLayerInfo();
 
        if (_status < INITIALIZED) {
                LOGE("Initialization not ready yet. (%u)", _status);
@@ -445,12 +446,12 @@ int FaceRecognition::RecognizeFace(mv_source_h img_src)
                // Import label data from a label file.
                ImportLabel();
 
-               if (_face_net_info->GetInputLayerInfo().empty() || _face_net_info->GetInputLayerInfo().size() > 1) {
+               if (_backbone_model_info->GetInputLayerInfo().empty() || _backbone_model_info->GetInputLayerInfo().size() > 1) {
                        LOGE("Invalid input layer size - input layer size should be 1.");
                        return MEDIA_VISION_ERROR_INVALID_PARAMETER;
                }
 
-               if (_face_net_info->GetOutputLayerInfo().empty() || _face_net_info->GetOutputLayerInfo().size() > 1) {
+               if (_backbone_model_info->GetOutputLayerInfo().empty() || _backbone_model_info->GetOutputLayerInfo().size() > 1) {
                        LOGE("Invalid output layer size - output layer size should be 1.");
                        return MEDIA_VISION_ERROR_INVALID_PARAMETER;
                }
@@ -466,7 +467,7 @@ int FaceRecognition::RecognizeFace(mv_source_h img_src)
                }
 
                // Get output layer info for facenet model.
-               vector<model_layer_info>& output_layer_info = _face_net_info->GetOutputLayerInfo();
+               vector<model_layer_info>& output_layer_info = _backbone_model_info->GetOutputLayerInfo();
                // Get output tensor buffer to the output layer.
                inference_engine_tensor_buffer *backbone_output_buffer = _backbone->GetOutputTensorBuffer(output_layer_info[0].layer_name);
                if (!backbone_output_buffer) {
index c3a5ff8..d460364 100644 (file)
@@ -118,6 +118,11 @@ void SimpleShot::ConfigureModel(int num_of_class)
                throw InvalidOperation("Fail to add knn layer.");
 }
 
+TrainingEngineBackendInfo& SimpleShot::GetTrainingEngineInfo()
+{
+       return _engine_info;
+}
+
 void SimpleShot::SaveModel(const string file_path)
 {
        string bin_file_path = file_path.substr(0, file_path.find('.')) + ".bin";