mv_machine_learning: revise FeatureVectorManager class
authorSeungbae Shin <seungbae.shin@samsung.com>
Fri, 6 May 2022 10:26:10 +0000 (19:26 +0900)
committerInki Dae <inki.dae@samsung.com>
Wed, 20 Jul 2022 05:16:40 +0000 (14:16 +0900)
[Version] 0.19.4-0
[Issue type] refactoring

- Remove unnecessary include from header files
- Make FeatureVectorManager as a abstract class
- Renaming for file stream object
- Use an initialization constructor for fstream
- Apply some useful keyword to help readability
- Remove unnecessary fstream manual closing due to RAII

Change-Id: I0793fb1fd186a3a11bf3fe67b7806e1b8b3ca3da

mv_machine_learning/face_recognition/include/nntrainer_dsm.h
mv_machine_learning/face_recognition/include/nntrainer_fvm.h
mv_machine_learning/face_recognition/src/nntrainer_dsm.cpp
mv_machine_learning/face_recognition/src/nntrainer_fvm.cpp
mv_machine_learning/training/include/feature_vector_manager.h
mv_machine_learning/training/src/feature_vector_manager.cpp
packaging/capi-media-vision.spec

index 73be5ddeb82f4bb3943e674f042e814787b38a00..fda9cc208b376e459579716c182e56e22a9aad54 100644 (file)
@@ -17,9 +17,8 @@
 #ifndef __NNTRAINER_DSM_H__
 #define __NNTRAINER_DSM_H__
 
-#include <iostream>
-#include <fstream>
-#include <vector>
+
+#include <string>
 
 #include "feature_vector_manager.h"
 #include "data_set_manager.h"
@@ -30,9 +29,9 @@ private:
 
 public:
        NNTrainerDSM();
-       ~NNTrainerDSM();
+       ~NNTrainerDSM() = default;
 
-       void LoadDataSet(const std::string file_name);
+       void LoadDataSet(const std::string file_name) override;
 };
 
 #endif
\ No newline at end of file
index a4076e49970a96b00e287cdfaf72e7878af0c5bf..f157840aaa7f276fa8394c8214b3f6914d52ba8c 100644 (file)
 #define __NNTRAINER_FVM_H__
 
 #include <string.h>
-#include <iostream>
-#include <fstream>
-#include <istream>
-#include <algorithm>
 #include <vector>
-#include <map>
 
 #include "feature_vector_manager.h"
 #include "file_util.h"
 class NNTrainerFVM : public FeatureVectorManager {
 public:
        NNTrainerFVM(const std::string feature_vector_file = "feature_vector_file.dat");
-       ~NNTrainerFVM();
+       ~NNTrainerFVM() = default;
 
-       void WriteHeader(size_t feature_size, size_t one_hot_table_size, unsigned int  data_set_cnt);
-       void ReadHeader(FeaVecHeader& header);
-       void WriteFeatureVec(std::vector<float>& feature_vec, const int max_label, const int label_index);
+       void WriteHeader(size_t feature_size, size_t one_hot_table_size, unsigned int  data_set_cnt) override;
+       void ReadHeader(FeaVecHeader& header) override;
+       void WriteFeatureVec(std::vector<float>& feature_vec, const int max_label, const int label_index) override;
 };
 
 #endif
\ No newline at end of file
index d686312089663894409cd1a23b2021a20150d7f9..1a95cdf7159db75f4f24ad996b88ca2b1a962aae 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <dlog.h>
 #include <mv_private.h>
+#include <algorithm>
 
 #include "machine_learning_exception.h"
 #include "nntrainer_dsm.h"
@@ -31,45 +32,38 @@ void NNTrainerDSM::PrintHeader(FeaVecHeader& fvh)
        LOGD("data set count = %u", fvh.data_set_cnt);
 }
 
-NNTrainerDSM::NNTrainerDSM() : DataSetManager()
-{
-
-}
-
-NNTrainerDSM::~NNTrainerDSM()
+NNTrainerDSM::NNTrainerDSM()
+       : DataSetManager()
 {
 
 }
 
 void NNTrainerDSM::LoadDataSet(const string file_name)
 {
-       std::ifstream openFile(file_name);
+       std::ifstream inFile(file_name);
 
-       if (!openFile.is_open())
+       if (!inFile.is_open())
                throw InvalidOperation("fail to open a file.");
 
        // Feature vector file header is written at the end of the data file
        // So read feature vector header from the end of the file.
-       openFile.seekg(static_cast<int>(sizeof(FeaVecHeader)) * -1, ios::end);
+       inFile.seekg(static_cast<int>(sizeof(FeaVecHeader)) * -1, ios::end);
 
        FeaVecHeader fvh;
 
-       openFile.read((char *)&fvh, sizeof(FeaVecHeader));
-       if (openFile.gcount() != sizeof(FeaVecHeader)) {
-               openFile.close();
+       inFile.read((char *)&fvh, sizeof(FeaVecHeader));
+       if (inFile.gcount() != sizeof(FeaVecHeader))
                throw InvalidOperation("Invalid feature vector file.");
-       }
 
-       openFile.seekg(0, ios::beg);
+       inFile.seekg(0, ios::beg);
 
        PrintHeader(fvh);
 
-       if (feature_vector_signature != fvh.signature) {
-               openFile.close();
+       if (FeatureVectorManager::feature_vector_signature != fvh.signature)
                throw InvalidOperation("Wrong feature vector header.");
-       }
 
-       size_t line_size_in_bytes = fvh.feature_size * 4 + fvh.one_hot_table_size * 4;
+       size_t line_size_in_bytes = fvh.feature_size * sizeof(float) +
+                                                               fvh.one_hot_table_size * sizeof(float);
 
        _feature_vector_size = fvh.feature_size;
        _label_size = fvh.one_hot_table_size;
@@ -78,7 +72,7 @@ void NNTrainerDSM::LoadDataSet(const string file_name)
        vector<float> line_data(fvh.feature_size + fvh.one_hot_table_size);
 
        for (size_t idx = 0; idx < fvh.data_set_cnt; ++idx) {
-               openFile.read((char *)line_data.data(), line_size_in_bytes);
+               inFile.read((char *)line_data.data(), line_size_in_bytes);
 
                vector<float> data;
                copy_n(line_data.begin(), _feature_vector_size, back_inserter(data));
@@ -97,6 +91,4 @@ void NNTrainerDSM::LoadDataSet(const string file_name)
                _labels.push_back(label);
                _label_index.push_back(label_idx);
        }
-
-       openFile.close();
 }
\ No newline at end of file
index 1f67dfb06b661f8da534470e464cb7d5b8b3919e..c140596b56f9d78497b26fe9dd56c6b1285202b2 100644 (file)
  * limitations under the License.
  */
 
+#include <fstream>
+
 #include "machine_learning_exception.h"
 #include "nntrainer_fvm.h"
 
 using namespace std;
 using namespace Mediavision::MachineLearning::Exception;
 
-NNTrainerFVM::NNTrainerFVM(const string feature_vector_file) : FeatureVectorManager(feature_vector_file)
-{
-
-}
-
-NNTrainerFVM::~NNTrainerFVM()
+NNTrainerFVM::NNTrainerFVM(const string feature_vector_file)
+       : FeatureVectorManager(feature_vector_file)
 {
 
 }
 
 void NNTrainerFVM::WriteHeader(size_t feature_size, size_t one_hot_table_size, unsigned int  data_set_cnt)
 {
-       ofstream writeFile;
+       ofstream outFile {
+               _feature_vector_file,
+               ios::out | ios::binary | ios::app
+       };
 
-       writeFile.open(_feature_vector_file.c_str(), ios::out | ios::binary | ios::app);
-       if (!writeFile.is_open())
+       if (!outFile.is_open())
                throw InvalidOperation("fail to open a file");
 
-       FeaVecHeader header = { feature_vector_signature, feature_size, one_hot_table_size, data_set_cnt };
-
-       writeFile.write((char *)&header, sizeof(FeaVecHeader));
+       FeaVecHeader fvHeader {
+               FeatureVectorManager::feature_vector_signature,
+               feature_size,
+               one_hot_table_size,
+               data_set_cnt
+       };
 
-       writeFile.close();
+       outFile.write((char *)&fvHeader, sizeof(FeaVecHeader));
 }
 
 void NNTrainerFVM::ReadHeader(FeaVecHeader& header)
 {
-       ifstream openFile(_feature_vector_file.c_str(), ios::in | ios::binary);
+       ifstream inFile {
+               _feature_vector_file,
+               ios::in | ios::binary
+       };
 
-       if (!openFile.is_open())
+       if (!inFile.is_open())
                throw InvalidOperation("fail to open a file.");
 
-       openFile.seekg(static_cast<int>(sizeof(FeaVecHeader) * -1), ios::end);
+       inFile.seekg(static_cast<int>(sizeof(FeaVecHeader) * -1), ios::end);
 
-       openFile.read((char *)&header, sizeof(FeaVecHeader));
-       if (openFile.gcount() != sizeof(FeaVecHeader)) {
-               openFile.close();
+       inFile.read((char *)&header, sizeof(FeaVecHeader));
+       if (inFile.gcount() != sizeof(FeaVecHeader))
                throw InvalidOperation("Invalid feature vector file.");
-       }
 
-       openFile.close();
-
-       if (header.signature != feature_vector_signature)
+       if (header.signature != FeatureVectorManager::feature_vector_signature)
                throw InvalidParameter("wrong feature vector file header.");
 }
 
 void NNTrainerFVM::WriteFeatureVec(vector<float>& feature_vec, const int max_label, const int label_index)
 {
-       ofstream writeFile;
-
-       writeFile.open(_feature_vector_file.c_str(), ios::out | ios::binary | ios::app);
+       ofstream outFile {
+               _feature_vector_file,
+               ios::out | ios::binary | ios::app
+       };
 
-       if (!writeFile.is_open())
+       if (!outFile.is_open())
                throw InvalidOperation("fail to open a file.");
 
-       size_t img_size = feature_vec.size() * 4;
-       vector<char> pBuffer(img_size);
-
-       memcpy(pBuffer.data(), feature_vec.data(), img_size);
-       writeFile.write(pBuffer.data(), img_size);
+       vector<char> byteBuffer(feature_vec.size() * sizeof(float));
+       memcpy(byteBuffer.data(), feature_vec.data(), byteBuffer.size());
+       outFile.write(byteBuffer.data(), byteBuffer.size());
 
        for (int idx = 0; idx < max_label; ++idx) {
-               float one_hot_table = 0.0f;
-
-               if (label_index == idx)
-                       one_hot_table = 1.0f;
-
-               writeFile.write((char *)&one_hot_table, sizeof(float));
+               float oneHotTable = (label_index == idx) ? 1.0f : 0.0f;
+               outFile.write((char *)&oneHotTable, sizeof(float));
        }
-
-       writeFile.close();
 }
index de006cb74ae4835fc6814f3c783d588f832c1df7..457d14ef1d9382a0e3d0b212ff41d31e4a84edb9 100644 (file)
 #ifndef __FEATURE_VECTOR_MANAGER_H__
 #define __FEATURE_VECTOR_MANAGER_H__
 
-#include <string.h>
-#include <iostream>
-#include <fstream>
-#include <istream>
-#include <algorithm>
+#include <string>
 #include <vector>
-#include <map>
 
 #include <opencv2/opencv.hpp>
 #include <opencv2/imgproc/imgproc.hpp>
 
 #include "file_util.h"
 
-static const unsigned int feature_vector_signature = 0xFEA09841;
-
 typedef struct {
        unsigned int signature;
        size_t feature_size;
@@ -45,18 +38,21 @@ protected:
 
 public:
        FeatureVectorManager(const std::string feature_vector_file = "feature_vector_file.dat");
-       virtual ~FeatureVectorManager();
+       virtual ~FeatureVectorManager() = default;
 
        const std::string& GetFileName();
+
        static void GetVecFromImg(const std::string image_file, std::vector<float>& vec, int width, int height);
        static void GetVecFromRGB(unsigned char *in_data, std::vector<float>& vec, int width, int height,
                                                          int re_width, int re_height);
        static void GetVecFromXRGB(unsigned char *in_data, std::vector<float>& vec,
                                                           int in_width, int in_height, int re_width, int re_height);
 
-       virtual void WriteHeader(size_t feature_size, size_t one_hot_table_size, unsigned int  data_set_cnt);
-       virtual void ReadHeader(FeaVecHeader& header);
-       virtual void WriteFeatureVec(std::vector<float>& feature_vec, const int max_label, const int label_index);
+       virtual void WriteHeader(size_t feature_size, size_t one_hot_table_size, unsigned int  data_set_cnt) = 0;
+       virtual void ReadHeader(FeaVecHeader& header) = 0;
+       virtual void WriteFeatureVec(std::vector<float>& feature_vec, const int max_label, const int label_index) = 0;
+
+       static constexpr unsigned int feature_vector_signature = 0xFEA09841;
 };
 
 #endif
\ No newline at end of file
index 1427c6fb160a4ecf8d65a7179c7e56b318229ef9..519e662d667b886deeb2b6a62980089d9423acfd 100644 (file)
 using namespace std;
 using namespace Mediavision::MachineLearning::Exception;
 
-FeatureVectorManager::FeatureVectorManager(const string feature_vector_file) : _feature_vector_file(feature_vector_file)
+FeatureVectorManager::FeatureVectorManager(const string feature_vector_file)
+       : _feature_vector_file(feature_vector_file)
 {
-
 }
 
-FeatureVectorManager::~FeatureVectorManager()
+const string& FeatureVectorManager::GetFileName()
 {
-
-}
-
-const string& FeatureVectorManager::GetFileName() {
        return _feature_vector_file;
 }
 
@@ -116,19 +112,4 @@ void FeatureVectorManager::GetVecFromXRGB(unsigned char *in_data, vector<float>&
        dst /= 127.5f;
 
        vec.assign((float *)dst.data, (float *)dst.data + dst.total() * dst.channels());
-}
-
-void FeatureVectorManager::WriteHeader(size_t feature_size, size_t one_hot_table_size, unsigned int  data_set_cnt)
-{
-       WriteHeader(feature_size, one_hot_table_size, data_set_cnt);
-}
-
-void FeatureVectorManager::ReadHeader(FeaVecHeader& header)
-{
-       ReadHeader(header);
-}
-
-void FeatureVectorManager::WriteFeatureVec(vector<float>& feature_vec, const int max_label, const int label_index)
-{
-       WriteFeatureVec(feature_vec, max_label, label_index);
 }
\ No newline at end of file
index e484813354150efea4ca78c3ff2a78769aaa43ee..1037b7b9cc3b3a1fb675b7f5b338e56d58a35140 100644 (file)
@@ -1,6 +1,6 @@
 Name:        capi-media-vision
 Summary:     Media Vision library for Tizen Native API
-Version:     0.19.3
+Version:     0.19.4
 Release:     0
 Group:       Multimedia/Framework
 License:     Apache-2.0 and BSD-3-Clause