mv_machine_learning: memory optimization in loading dataset
authorVibhav Aggarwal <v.aggarwal@samsung.com>
Tue, 9 Jan 2024 12:06:47 +0000 (21:06 +0900)
committerInki Dae <inki.dae@samsung.com>
Tue, 23 Jan 2024 04:00:54 +0000 (13:00 +0900)
[Issue type] code optimization

This patch alters the FaceRecognitionDSM::loadDataSet()
function to minimize memory copy. A small optimization
is also made in addDataSet() function.

Change-Id: I9ac18e38ba3201ff0c122b831904229f524eb4c3
Signed-off-by: Vibhav Aggarwal <v.aggarwal@samsung.com>
mv_machine_learning/face_recognition/src/FaceRecognitionDSM.cpp

index 91170a6..a13a998 100644 (file)
@@ -57,12 +57,8 @@ void FaceRecognitionDSM::addDataSet(std::vector<float> &feature_vec, unsigned in
        _label_index.push_back(label_idx);
        _fv_cnt_per_label[label_idx]++;
 
-       vector<float> oneHotEncoding;
-
-       for (size_t num = 0; num < label_cnt; ++num)
-               oneHotEncoding.push_back(label_idx == num ? 1.0f : 0.0f);
-
-       _labels.push_back(oneHotEncoding);
+       _labels.emplace_back(label_cnt);
+       _labels.back()[label_idx] = 1.0f;
        _feature_vector_size = feature_vec.size();
        _label_count = label_cnt;
 }
@@ -92,33 +88,29 @@ void FaceRecognitionDSM::loadDataSet(const string &file_name, unsigned int new_l
        * |feature vector|label index|
        * ----------------------------
        */
-       size_t line_size_in_bytes = fvh.feature_size * sizeof(float) + sizeof(unsigned int);
-
        _feature_vector_size = fvh.feature_size;
        _label_count = fvh.label_cnt;
 
-       vector<float> line_data(fvh.feature_size + 1);
+       _data.resize(fvh.data_set_cnt, vector<float>(_feature_vector_size));
+       _labels.resize(fvh.data_set_cnt, vector<float>(new_label_cnt));
+       _label_index.resize(fvh.data_set_cnt);
 
        for (size_t idx = 0; idx < fvh.data_set_cnt; ++idx) {
-               inFile.read(reinterpret_cast<char *>(line_data.data()), static_cast<streamsize>(line_size_in_bytes));
-
-               vector<float> data;
-
-               copy_n(line_data.begin(), _feature_vector_size, back_inserter(data));
-               _data.push_back(data);
+               inFile.read(reinterpret_cast<char *>(_data[idx].data()),
+                                       static_cast<streamsize>(_feature_vector_size * sizeof(float)));
 
                unsigned int label_idx;
+               inFile.read(reinterpret_cast<char *>(&label_idx), static_cast<streamsize>(sizeof(unsigned int)));
 
-               memcpy(&label_idx, reinterpret_cast<void *>(line_data.data() + _feature_vector_size), sizeof(unsigned int));
-
-               vector<float> label;
+               if (label_idx >= new_label_cnt) {
+                       LOGE("Invalid label index");
+                       throw MEDIA_VISION_ERROR_INVALID_OPERATION;
+               }
 
                // max label count may be changed so update one hot encoding table.
-               for (size_t num = 0; num < new_label_cnt; ++num)
-                       label.push_back(label_idx == num ? 1.0f : 0.0f);
+               _labels[idx][label_idx] = 1.0f;
 
-               _labels.push_back(label);
-               _label_index.push_back(label_idx);
+               _label_index[idx] = label_idx;
 
                _fv_cnt_per_label[label_idx]++;
        }