mv_machine_learning: make sure to release previous data
authorInki Dae <inki.dae@samsung.com>
Tue, 22 Mar 2022 12:15:08 +0000 (21:15 +0900)
committerInki Dae <inki.dae@samsung.com>
Wed, 20 Jul 2022 05:16:40 +0000 (14:16 +0900)
[Version] : 0.17.3-0
[Issue type] : bug fix

mv_face_recognition_prepare function can be called several times
after mv_face_recognition_create function is called one time.
So make sure to drop previous data every time mv_face_recognition_prepare
function is called.

Change-Id: I9626c959d80f981562c4666b64503834ccdbfbbf
Signed-off-by: Inki Dae <inki.dae@samsung.com>
mv_machine_learning/face_recognition/include/face_recognition.h
mv_machine_learning/face_recognition/src/face_recognition.cpp
mv_machine_learning/inference/src/inference_engine_helper.cpp
packaging/capi-media-vision.spec
test/testsuites/machine_learning/face_recognition/test_face_recognition.cpp

index ef070fd..ec7fb2c 100644 (file)
@@ -49,6 +49,7 @@ private:
 
 protected:
        bool _initialized;
+       bool _prepared;
        std::unique_ptr<InferenceEngineHelper> _internal;
        std::unique_ptr<InferenceEngineHelper> _backbone;
        std::unique_ptr<FaceNetInfo> _face_net_info;
index 9558c6f..d7b461f 100644 (file)
@@ -38,8 +38,9 @@ using namespace TrainingEngineInterface::Common;
 using namespace Mediavision::MachineLearning::Exception;
 
 FaceRecognition::FaceRecognition() :
-               _initialized(), _internal(), _backbone(), _face_net_info(), _training_model(), _label_manager()
+               _initialized(true), _prepared(false), _internal(), _backbone(), _face_net_info(), _training_model(), _label_manager()
 {
+
 }
 
 FaceRecognition::~FaceRecognition()
@@ -173,12 +174,19 @@ void FaceRecognition::SetConfig(FaceRecognitionConfig& config)
 
 int FaceRecognition::Prepare()
 {
-       if (_initialized) {
-               LOGW("Already initialized.");
+       if (!_initialized) {
+               LOGE("Initialization not ready yet.");
                return MEDIA_VISION_ERROR_INVALID_OPERATION;
        }
 
        try {
+               // Prepare can be called several times after initialization is done so previous data should be dropped.
+               _face_net_info.reset();
+               _training_model.reset();
+               _label_manager.reset();
+               _backbone.reset();
+               _internal.reset();
+
                _face_net_info = make_unique<FaceNetInfo>(_config.backbone_model_file_path);
                _training_model = make_unique<SimpleShot>(_config.training_engine_backend_type, _config.internal_model_file_path);
                _label_manager = make_unique<LabelManager>(_config.label_file_path, _config.decision_threshold);
@@ -223,15 +231,15 @@ int FaceRecognition::Prepare()
                return e.getError();
        }
 
-       _initialized = true;
+       _prepared = true;
 
        return MEDIA_VISION_ERROR_NONE;
 }
 
 int FaceRecognition::RegisterNewFace(vector<float>& vec, string label_name)
 {
-       if (!_initialized) {
-               LOGE("Initialization not ready yet.");
+       if (!_prepared) {
+               LOGE("Preparation not ready yet.");
                return MEDIA_VISION_ERROR_INVALID_OPERATION;
        }
 
@@ -345,8 +353,8 @@ int FaceRecognition::GetAnswer(vector<float>& result_tensor, unsigned int *out_i
 
 int FaceRecognition::RecognizeFace(vector<float>& vec, vector<float>& out_vec, unsigned int *out_idx)
 {
-       if (!_initialized) {
-               LOGE("Initialization not ready yet.");
+       if (!_prepared) {
+               LOGE("Preparation not ready yet.");
                return MEDIA_VISION_ERROR_INVALID_OPERATION;
        }
 
index e115fd4..7b735eb 100644 (file)
@@ -30,6 +30,8 @@ static map<string, int> Model_Formats = {
 
 InferenceEngineHelper::InferenceEngineHelper(string backend_name, int target_device)
 {
+       _engine.reset();
+
        _engine = make_unique<InferenceEngineCommon>();
 
        inference_engine_config config = { backend_name, -1, target_device };
index ac12e73..3fa33c7 100644 (file)
@@ -1,6 +1,6 @@
 Name:        capi-media-vision
 Summary:     Media Vision library for Tizen Native API
-Version:     0.17.2
+Version:     0.17.3
 Release:     0
 Group:       Multimedia/Framework
 License:     Apache-2.0 and BSD-3-Clause
index 97f362e..c3c8392 100644 (file)
@@ -142,13 +142,12 @@ TEST(FaceRecognitionTest, FaceRecognitionClassWithEachLabelRemovalShouldBeOk)
                };
 
        unsigned int label_idx = 0;
+       mv_face_recognition_h handle;
 
-       for (auto& label : labels) {
-               mv_face_recognition_h handle;
-
-               int ret = mv_face_recognition_create(&handle);
-               ASSERT_EQ(ret, MEDIA_VISION_ERROR_NONE);
+       int ret = mv_face_recognition_create(&handle);
+       ASSERT_EQ(ret, MEDIA_VISION_ERROR_NONE);
 
+       for (auto& label : labels) {
                ret = mv_face_recognition_prepare(handle);
                ASSERT_EQ(ret, MEDIA_VISION_ERROR_NONE);
 
@@ -181,7 +180,7 @@ TEST(FaceRecognitionTest, FaceRecognitionClassWithEachLabelRemovalShouldBeOk)
                        const string image_path = string("/usr/share/capi-media-vision/face-recognition/images/test/") + image.first;
                        mv_source_h mv_source = NULL;
 
-                       int ret = mv_create_source(&mv_source);
+                       ret = mv_create_source(&mv_source);
                        ASSERT_EQ(ret, MEDIA_VISION_ERROR_NONE);
 
                        ret = ImageHelper::loadImageToSource(image_path.c_str(), mv_source);
@@ -202,10 +201,10 @@ TEST(FaceRecognitionTest, FaceRecognitionClassWithEachLabelRemovalShouldBeOk)
 
                        ASSERT_EQ(answer[image_idx++], string(result.label));
                }
-
-               ret = mv_face_recognition_destroy(handle);
-               ASSERT_EQ(ret, MEDIA_VISION_ERROR_NONE);
        }
+
+       ret = mv_face_recognition_destroy(handle);
+       ASSERT_EQ(ret, MEDIA_VISION_ERROR_NONE);
 }
 
 int main(int argc, char **argv)