236 lines
8.3 KiB
C++
236 lines
8.3 KiB
C++
#include "MyYaml.h"
|
|
|
|
namespace ai_matrix
|
|
{
|
|
MyYaml *MyYaml::pInstance_ = nullptr;
|
|
MyYaml::GarbageCollector MyYaml::gc_;
|
|
std::mutex MyYaml::mx_;
|
|
|
|
MyYaml *MyYaml::GetIns()
|
|
{
|
|
//双层锁,确保线程安全
|
|
if (pInstance_ == nullptr)
|
|
{
|
|
std::lock_guard<std::mutex> guard(mx_); //防止异常发生不能解锁
|
|
if (pInstance_ == nullptr)
|
|
{
|
|
pInstance_ = new MyYaml();
|
|
}
|
|
}
|
|
return pInstance_;
|
|
}
|
|
|
|
int MyYaml::ReadYaml(std::string &strPath)
|
|
{
|
|
try
|
|
{
|
|
strConfigYamlPath_ = strPath;
|
|
config_ = YAML::LoadFile(strPath);
|
|
//退出程序
|
|
if (config_.IsNull())
|
|
{
|
|
printf("config.yaml no find");
|
|
return -1;
|
|
}
|
|
|
|
//数据源参数
|
|
std::string strDataSource = GetStringValue("gc_data_source");
|
|
if (config_[strDataSource.c_str()].IsDefined())
|
|
{
|
|
int iDataSourceId = 0;
|
|
for (YAML::const_iterator it = config_[strDataSource.c_str()].begin(); it != config_[strDataSource.c_str()].end(); it++)
|
|
{
|
|
YAML::Node configTemp = it->second;
|
|
|
|
DataSourceConfig dataSourceConfig;
|
|
dataSourceConfig.bUse = GetBoolValue("use", &configTemp);
|
|
dataSourceConfig.strUrl = GetStringValue("url", &configTemp);
|
|
dataSourceConfig.iSkipInterval = GetIntValue("skipInterval", &configTemp);
|
|
dataSourceConfig.strTarget = GetStringValue("target", &configTemp);
|
|
dataSourceConfig.iDirection = GetIntValue("direction", &configTemp);
|
|
dataSourceConfig.iLeftFirst = GetIntValue("left_first", &configTemp);
|
|
dataSourceConfig.iRightFirst = GetIntValue("right_first", &configTemp);
|
|
std::vector<std::string> vecAreas;
|
|
std::stringstream strStream(GetStringValue("identify_areas", &configTemp));
|
|
std::string strItem;
|
|
while (std::getline(strStream, strItem, ','))
|
|
{
|
|
vecAreas.push_back(strItem);
|
|
}
|
|
if (vecAreas.size() == 4)
|
|
{
|
|
dataSourceConfig.fIdentifyAreasLTX = atof(vecAreas[0].c_str());
|
|
dataSourceConfig.fIdentifyAreasLTY = atof(vecAreas[1].c_str());
|
|
dataSourceConfig.fIdentifyAreasRBX = atof(vecAreas[2].c_str());
|
|
dataSourceConfig.fIdentifyAreasRBY = atof(vecAreas[3].c_str());
|
|
}
|
|
|
|
dataSourceConfig.iRotate = 0;
|
|
if (configTemp["rotate"].IsDefined())
|
|
{
|
|
dataSourceConfig.iRotate = GetIntValue("rotate", &configTemp);
|
|
}
|
|
|
|
//框最小高度参数设置,过滤远股道识别到的信息
|
|
if (configTemp["classid_minheight"].IsDefined())
|
|
{
|
|
std::stringstream strStream(GetStringValue("classid_minheight", &configTemp));
|
|
std::string strItem;
|
|
while (std::getline(strStream, strItem, ','))
|
|
{
|
|
size_t iPos = strItem.find(":");
|
|
if (iPos != std::string::npos)
|
|
{
|
|
dataSourceConfig.mapClassMinH.insert(std::make_pair(atoi(strItem.substr(0, iPos).c_str()), atoi(strItem.substr(iPos + 1).c_str())));
|
|
}
|
|
}
|
|
}
|
|
|
|
mapDataSourceConfig_[iDataSourceId] = dataSourceConfig;
|
|
if (dataSourceConfig.bUse)
|
|
{
|
|
mapUseDataSourceConfig_[iDataSourceId] = dataSourceConfig;
|
|
}
|
|
iDataSourceId++;
|
|
}
|
|
printf("data source:[%s], allcount:[%d], usecount[%d]\n",
|
|
strDataSource.c_str(), mapDataSourceConfig_.size(), mapUseDataSourceConfig_.size());
|
|
}
|
|
//模型参数
|
|
if (config_["model"].IsDefined())
|
|
{
|
|
for (YAML::const_iterator it = config_["model"].begin(); it != config_["model"].end(); it++)
|
|
{
|
|
YAML::Node configTemp = it->second;
|
|
std::string strModelName = it->first.as<std::string>();
|
|
mapModelConfig_[strModelName].strOmPath = GetStringValue("om_path", &configTemp);
|
|
mapModelConfig_[strModelName].strModelInfoPath = GetStringValue("modelinfo_path", &configTemp);
|
|
mapModelConfig_[strModelName].strModelType = GetStringValue("model_type", &configTemp);
|
|
mapModelConfig_[strModelName].fScoreThreshold = GetFloatValue("score_threshold", &configTemp);
|
|
mapModelConfig_[strModelName].fNMSTreshold = GetFloatValue("nms_threshold", &configTemp);
|
|
}
|
|
}
|
|
}
|
|
catch (std::exception& strex) //捕获所有异常
|
|
{
|
|
printf(strex.what());
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int MyYaml::WriteYaml()
|
|
{
|
|
try
|
|
{
|
|
std::ofstream of(strConfigYamlPath_);
|
|
of << config_;
|
|
of.close();
|
|
}
|
|
catch (...) //捕获所有异常
|
|
{
|
|
printf("yaml文件不存在\n");
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
std::string MyYaml::GetStringValue(const char *pszKey, const YAML::Node *pConfig/*=nullptr*/) const
|
|
{
|
|
if(nullptr == pConfig)
|
|
{
|
|
pConfig = &config_;
|
|
}
|
|
if (!(*pConfig)[pszKey].IsDefined())
|
|
{
|
|
printf("string key:[%s] not exist!\n", pszKey);
|
|
}
|
|
return (*pConfig)[pszKey].as<std::string>();
|
|
}
|
|
|
|
int MyYaml::GetIntValue(const char *pszKey, const YAML::Node *pConfig/*=nullptr*/) const
|
|
{
|
|
if (nullptr == pConfig)
|
|
{
|
|
pConfig = &config_;
|
|
}
|
|
if (!(*pConfig)[pszKey].IsDefined())
|
|
{
|
|
printf("int key:[%s] not exist!\n", pszKey);
|
|
}
|
|
return (*pConfig)[pszKey].as<int>();
|
|
}
|
|
|
|
bool MyYaml::GetBoolValue(const char *pszKey, const YAML::Node *pConfig/*=nullptr*/) const
|
|
{
|
|
if (nullptr == pConfig)
|
|
{
|
|
pConfig = &config_;
|
|
}
|
|
if (!(*pConfig)[pszKey].IsDefined())
|
|
{
|
|
printf("bool key:[%s] not exist!\n", pszKey);
|
|
}
|
|
return (*pConfig)[pszKey].as<bool>();
|
|
}
|
|
|
|
float MyYaml::GetFloatValue(const char *pszKey, const YAML::Node *pConfig/*=nullptr*/) const
|
|
{
|
|
if (nullptr == pConfig)
|
|
{
|
|
pConfig = &config_;
|
|
}
|
|
if (!(*pConfig)[pszKey].IsDefined())
|
|
{
|
|
printf("float key:[%s] not exist!\n", pszKey);
|
|
}
|
|
return (*pConfig)[pszKey].as<float>();
|
|
}
|
|
|
|
std::string MyYaml::GetPathValue(const char *pszKey, const YAML::Node *pConfig /*=nullptr*/) const
|
|
{
|
|
if (nullptr == pConfig)
|
|
{
|
|
pConfig = &config_;
|
|
}
|
|
if (!(*pConfig)[pszKey].IsDefined())
|
|
{
|
|
printf("path key:[%s] not exist!\n", pszKey);
|
|
}
|
|
std::string strTmp = (*pConfig)[pszKey].as<std::string>();
|
|
if (strTmp.back() != '/')
|
|
{
|
|
strTmp += "/";
|
|
}
|
|
return strTmp;
|
|
}
|
|
|
|
ModelConfig MyYaml::GetModelConfig(const std::string &strModleName) const
|
|
{
|
|
if(mapModelConfig_.find(strModleName) == mapModelConfig_.end())
|
|
{
|
|
printf("model key:[%s] not exist!\n", strModleName.c_str());
|
|
}
|
|
return mapModelConfig_.at(strModleName);
|
|
}
|
|
|
|
size_t MyYaml::GetDataSourceCount() const
|
|
{
|
|
return mapDataSourceConfig_.size();
|
|
}
|
|
|
|
DataSourceConfig MyYaml::GetDataSourceConfigById(int iEngineId) const
|
|
{
|
|
if (mapDataSourceConfig_.find(iEngineId) == mapDataSourceConfig_.end())
|
|
{
|
|
printf("GetDataSourceConfigById engineId:[%d] Err\n", iEngineId);
|
|
}
|
|
return mapDataSourceConfig_.at(iEngineId);
|
|
}
|
|
|
|
std::map<int, DataSourceConfig> MyYaml::GetUseDataSourceConfig() const
|
|
{
|
|
return mapUseDataSourceConfig_;
|
|
}
|
|
}
|