From a582dfb23b9101592b1451fb7aa6c6ce67f59b21 Mon Sep 17 00:00:00 2001 From: "Mr.V" Date: Tue, 26 Nov 2024 21:16:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A1=B6=E9=83=A8=E6=91=84?= =?UTF-8?q?=E5=83=8F=E5=A4=B4=E4=BD=BF=E7=94=A8=E7=AE=B1=E8=A7=92=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E5=88=87=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ai_matrix/Config/Config.cpp | 2 +- ai_matrix/Config/Config.h | 4 ++-- config/config.yaml | 10 ++++++++-- engine/DataUploadEngine/ToMinioSrvEngine.cpp | 2 +- .../ContainerDivideEngine.cpp | 2 +- .../ContainerDivideEngine.h | 7 +++++++ .../ContainerStep1InferenceEngine.cpp | 20 +++++++++---------- 7 files changed, 30 insertions(+), 17 deletions(-) diff --git a/ai_matrix/Config/Config.cpp b/ai_matrix/Config/Config.cpp index 4cafbcf..42039b9 100644 --- a/ai_matrix/Config/Config.cpp +++ b/ai_matrix/Config/Config.cpp @@ -55,11 +55,11 @@ namespace ai_matrix dataSourceConfig.strUrl = it["url"].as(); dataSourceConfig.iSkipInterval = it["skip_interval"].as(); dataSourceConfig.vecIdentifyAreas = it["identify_areas"].as>(); + dataSourceConfig.strDivideModel = it["divide_mode"].as(); this->vecDataSourceConfig_.emplace_back(dataSourceConfig); } // 识别参数 - this->identifyConfig_.strRunModel = config_["identify"]["run_mode"].as(); this->identifyConfig_.iPartitionFrameSpan = config_["identify"]["partition_frame_span"].as(); this->identifyConfig_.iTop_Y_SplitSpanPx = config_["identify"]["top_y_split_span_px"].as(); this->identifyConfig_.iSide_X_SplitSpanPx = config_["identify"]["side_x_split_span_px"].as(); diff --git a/ai_matrix/Config/Config.h b/ai_matrix/Config/Config.h index 15be859..7ef5ab8 100644 --- a/ai_matrix/Config/Config.h +++ b/ai_matrix/Config/Config.h @@ -62,12 +62,12 @@ namespace ai_matrix int iSkipInterval; // 识别区域 std::vector vecIdentifyAreas; + // 切箱方式 + std::string strDivideModel; }; // 识别参数 struct IdentifyConfig { - // 运行方式 - std::string strRunModel; // 大框帧跨度(比一个大框从出现到消失的跨度稍大一点, 跟跳帧有关系) int iPartitionFrameSpan; // 顶部Y轴大框帧跨度的位置像素差异 diff --git a/config/config.yaml b/config/config.yaml index fab1076..50a79d3 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -30,23 +30,29 @@ data_source: skip_interval: 3 # 识别区域 identify_areas: [120, 0, 1800, 1080] + # 切箱方式 + divide_mode: "corner" #[corner, pixel] - # 侧部摄像头 url: "./videos/buertai2.mp4" # 跳帧数 skip_interval: 3 # 识别区域 identify_areas: [ 120, 0, 1800, 1080 ] + # 切箱方式 + divide_mode: "pixel" #[corner, pixel] - # 侧边摄像头 url: "./videos/buertai2.mp4" # 跳帧数 skip_interval: 3 # 识别区域 identify_areas: [ 120, 0, 1800, 1080 ] + # 切箱方式 + divide_mode: "pixel" #[corner, pixel] # 识别参数 identify: - # 运行方式 - run_mode: "command" #[always; command] + # 切箱方式 + divide_mode: "corner" #[corner, pixel] # 大框帧跨度(比一个大框从出现到消失的跨度稍大一点, 跟跳帧有关系) partition_frame_span: 0 # 顶部Y轴大框帧跨度的位置像素差异 diff --git a/engine/DataUploadEngine/ToMinioSrvEngine.cpp b/engine/DataUploadEngine/ToMinioSrvEngine.cpp index 659bb5e..065d531 100644 --- a/engine/DataUploadEngine/ToMinioSrvEngine.cpp +++ b/engine/DataUploadEngine/ToMinioSrvEngine.cpp @@ -171,7 +171,7 @@ APP_ERROR ToMinioSrvEngine::Process() else { LogInfo << "数据上传MinIO 成功!!" - << this->minioConfig_.strBucket + strMinIoPath + << this->minioConfig_.strBucket + "/" + strMinIoPath << " -->" << strLocalPath; } diff --git a/engine/DetectDivideEngine/ContainerDivideEngine.cpp b/engine/DetectDivideEngine/ContainerDivideEngine.cpp index 4194676..ea34338 100644 --- a/engine/DetectDivideEngine/ContainerDivideEngine.cpp +++ b/engine/DetectDivideEngine/ContainerDivideEngine.cpp @@ -1 +1 @@ -#include "ContainerDivideEngine.h" #include using namespace ai_matrix; ContainerDivideEngine::ContainerDivideEngine() {} ContainerDivideEngine::~ContainerDivideEngine() {} APP_ERROR ContainerDivideEngine::Init() { strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0"; strPort1_ = engineName_ + "_" + std::to_string(engineId_) + "_1"; std::vector vecDataSourceConfig = Config::getins()->getAllDataSourceConfig(); if (vecDataSourceConfig.size() <= this->engineId_) { LogWarn << " -- " << engineName_ << "_" << engineId_ << " dataSource no set, Engine DeInit"; return APP_ERR_OK; } this->dataSourceConfig_ = vecDataSourceConfig.at(engineId_); this->baseConfig_ = Config::getins()->getBaseConfig(); this->identifyConfig_ = Config::getins()->getIdentifyConfig(); this->initParam(); LogInfo << "DetectDivideEngine Init ok"; return APP_ERR_OK; } APP_ERROR ContainerDivideEngine::DeInit() { LogInfo << "DetectDivideEngine DeInit ok"; return APP_ERR_OK; } /** * 初始化参数信息 * inParam : N/A * outParam: N/A * return : N/A */ void ContainerDivideEngine::initParam() { this->iContainerIndex = 0; this->vecContainerFail_.clear(); } void ContainerDivideEngine::sendBestData(const VSelectBestData& selectBestData) { // 直接发送第一个箱子的箱号 std::shared_ptr pVSelectBestData = std::make_shared(); *pVSelectBestData = selectBestData; outputQueMap_[strPort0_]->push(std::static_pointer_cast(pVSelectBestData), true); LogInfo << " 数据源:" << selectBestData.iDataSource << " 帧:" << selectBestData.iFrameId << " 节:" << selectBestData.iContainerIndex << " 发送识别结果 " << selectBestData.strNumResult; this->stdContainerResult_ = selectBestData.strNumResult; this->iContainerIndex++; } void ContainerDivideEngine::makeResult(const std::shared_ptr& pVStep2OutputData, VSelectBestData & selectBestData) const { selectBestData.strDetectDate = pVStep2OutputData->strDetectDate; selectBestData.strDetectTime = pVStep2OutputData->strDetectTime; selectBestData.iDataSource = pVStep2OutputData->iDataSource; selectBestData.iFrameId = pVStep2OutputData->iFrameId; selectBestData.strNumResult = pVStep2OutputData->step2ResultData.transInfo.strTmpResult; selectBestData.bIsChkFlag = pVStep2OutputData->step2ResultData.transInfo.bIsChkFlag; selectBestData.fSumScore = pVStep2OutputData->step2ResultData.fSubScoreSum; selectBestData.iContainerIndex = this->iContainerIndex; selectBestData.bHaveTwoContainer = pVStep2OutputData->vecCornerResultData.size() > 2; } /** * 处理车厢间隔 * inParam : N/A * outParam: N/A * return : N/A */ void ContainerDivideEngine::divideInfo(std::shared_ptr pVStep2OutputData) { auto vCompare = [](std::string a, std::string b) { if (a.size() != b.size()) return 999; int count = 0; for (int i = 0; i < a.size(); ++i) { if (a[i] != b[i]) { ++count; } } return count; }; if (!this->pVStep2OutputDataPre_) return; Step2ResultData step2ResultData_pre = this->pVStep2OutputDataPre_->step2ResultData; Step2ResultData step2ResultData = pVStep2OutputData->step2ResultData; float fCenterX = (step2ResultData.fRBX + step2ResultData.fLTX)/2; float fCenterY = (step2ResultData.fRBY + step2ResultData.fLTY)/2; float fCenterX_Pre = (step2ResultData_pre.fRBX + step2ResultData_pre.fLTX)/2; float fCenterY_Pre = (step2ResultData_pre.fRBY + step2ResultData_pre.fLTY)/2; if (this->iContainerIndex > 1) return; LogDebug << "-- 数据源:" << pVStep2OutputData->iDataSource << " 帧:" << pVStep2OutputData->iFrameId << " Y差值:" << std::abs(fCenterY - fCenterY_Pre) << " X差值:" << std::abs(fCenterX - fCenterX_Pre); if ((pVStep2OutputData->iDataSource == 0 && std::abs(fCenterY - fCenterY_Pre) > this->identifyConfig_.iTop_Y_SplitSpanPx) || (pVStep2OutputData->iDataSource != 0 && std::abs(fCenterX - fCenterX_Pre) > this->identifyConfig_.iSide_X_SplitSpanPx)) { if (step2ResultData.transInfo.bIsChkFlag) { if (stdContainerResult_ != step2ResultData.transInfo.strTmpResult) { if (stdContainerResult_.empty()) { // 筛选不满足校验的部分 取最长的发送 int iSize = 0, iIndex = 0; std::string strContainer_tmp; for (int i = 0; i < this->vecContainerFail_.size(); i++) { this->vecContainerFail_[i]; if (iSize < this->vecContainerFail_[i].strNumResult.size()) { iSize = this->vecContainerFail_[i].strNumResult.size(); iIndex = i; strContainer_tmp = this->vecContainerFail_[i].strNumResult; } } sendBestData(this->vecContainerFail_[iIndex]); } // 记录第二箱子 this->vecContainerFail_.clear(); VSelectBestData selectBestData; this->makeResult(pVStep2OutputData, selectBestData); this->sendBestData(selectBestData); } } else { // 筛选不满足校验的部分 取最长的发送 int iSize = 0, iIndex = 0; std::string strContainer_tmp; for (int i = 0; i < this->vecContainerFail_.size(); i++) { this->vecContainerFail_[i]; if (iSize < this->vecContainerFail_[i].strNumResult.size()) { iSize = this->vecContainerFail_[i].strNumResult.size(); iIndex = i; strContainer_tmp = this->vecContainerFail_[i].strNumResult; } } if (this->vecContainerFail_.size() > 0 && this->iContainerIndex < 1) { sendBestData(this->vecContainerFail_[iIndex]); } // 把之前的清理掉再存新箱子的 (有风险,有可能切分错) this->vecContainerFail_.clear(); VSelectBestData selectBestData; this->makeResult(pVStep2OutputData, selectBestData); this->vecContainerFail_.emplace_back(selectBestData); } } else {// 不满足像素差 if (!this->stdContainerResult_.empty()) { if (step2ResultData.transInfo.bIsChkFlag) { if (this->stdContainerResult_ != step2ResultData.transInfo.strTmpResult) { // if (vCompare(this->stdContainerResult_, step2ResultData.transInfo.strTmpResult) > 2) // { this->vecContainerFail_.clear(); VSelectBestData selectBestData; this->makeResult(pVStep2OutputData, selectBestData); this->sendBestData(selectBestData); // } } } } else { if (step2ResultData.transInfo.bIsChkFlag) { this->stdContainerResult_ = step2ResultData.transInfo.strTmpResult; this->vecContainerFail_.clear(); VSelectBestData selectBestData; this->makeResult(pVStep2OutputData, selectBestData); this->sendBestData(selectBestData); } else { VSelectBestData selectBestData; this->makeResult(pVStep2OutputData, selectBestData); this->vecContainerFail_.emplace_back(selectBestData); } } } } APP_ERROR ContainerDivideEngine::Process() { int iRet = APP_ERR_OK; while (!isStop_) { //pop端口0 std::shared_ptr pVoidData0 = nullptr; iRet = inputQueMap_[strPort0_]->pop(pVoidData0); if (nullptr == pVoidData0) { usleep(1000); continue; } std::shared_ptr pVStep2OutputData = std::static_pointer_cast(pVoidData0); if (pVStep2OutputData->bIsEnd) { std::shared_ptr pVSelectBestData = std::make_shared(); pVSelectBestData->bIsEnd = true; pVSelectBestData->iDataSource = pVStep2OutputData->iDataSource; pVSelectBestData->strDetectDate = pVStep2OutputData->strDetectDate; pVSelectBestData->strDetectTime = pVStep2OutputData->strDetectTime; if (this->iContainerIndex < 2 && this->vecContainerFail_.size() > 0) { // 筛选不满足校验的部分 取最长的发送 int iSize = 0, iIndex = 0; std::string strContainer_tmp; for (int i = 0; i < this->vecContainerFail_.size(); i++) { this->vecContainerFail_[i]; if (iSize < this->vecContainerFail_[i].strNumResult.size()) { iSize = this->vecContainerFail_[i].strNumResult.size(); iIndex = i; strContainer_tmp = this->vecContainerFail_[i].strNumResult; } } this->vecContainerFail_[iIndex].bIsEnd = true; sendBestData(this->vecContainerFail_[iIndex]); this->initParam(); continue; } outputQueMap_[strPort0_]->push(std::static_pointer_cast(pVSelectBestData), true); this->initParam(); continue; } std::string strFilePath ; strFilePath = this->baseConfig_.strDebugResultPath + "/" + pVStep2OutputData->strDetectDate + "/" + StringUtil::getins()->replace_all_distinct(pVStep2OutputData->strDetectTime, ":", "-") + "/" + std::to_string(pVStep2OutputData->iFrameId) + "_" + std::to_string(pVStep2OutputData->iDataSource) + ".json"; // 先读取文本内容,追加新的信息后再写入 Json::Value jvFrameInfo; if (!FileUtil::getins()->readJsonInfo(jvFrameInfo, strFilePath)) { LogError << "read fail:" << strFilePath; } // jvFrameInfo["isEnd"] = (pVStep2OutputData->bIsEnd || jvFrameInfo["isEnd"].asBool()); // 识别结果存储 float fCenter = pVStep2OutputData->step2ResultData.fLTX + (pVStep2OutputData->step2ResultData.fRBX - pVStep2OutputData->step2ResultData.fLTX) / 2; // this->mapContainerCenterInfo_.insert(std::make_pair(pVStep2OutputData->iFrameId, fCenter)); Json::Value jvInfo; jvInfo["classid"] = pVStep2OutputData->step2ResultData.iClassId; jvInfo["score"] = pVStep2OutputData->step2ResultData.fScore; jvInfo["ltx"] = pVStep2OutputData->step2ResultData.fLTX; jvInfo["lty"] = pVStep2OutputData->step2ResultData.fLTY; jvInfo["rbx"] = pVStep2OutputData->step2ResultData.fRBX; jvInfo["rby"] = pVStep2OutputData->step2ResultData.fRBY; jvFrameInfo["step1"].append(jvInfo); for (auto &step2ResultData : pVStep2OutputData->vecCornerResultData) { float fCenter = step2ResultData.fLTX + (step2ResultData.fRBX - step2ResultData.fLTX) / 2; // this->mapContainerCenterInfo_.insert(std::make_pair(pVStep2OutputData->iFrameId, fCenter)); Json::Value jvInfo; jvInfo["classid"] = step2ResultData.iClassId; jvInfo["score"] = step2ResultData.fScore; jvInfo["ltx"] = step2ResultData.fLTX; jvInfo["lty"] = step2ResultData.fLTY; jvInfo["rbx"] = step2ResultData.fRBX; jvInfo["rby"] = step2ResultData.fRBY; jvFrameInfo["step1"].append(jvInfo); } FileUtil::getins()->writeJsonInfo(jvFrameInfo, strFilePath); if (pVStep2OutputData->step2ResultData.fScore == 0.0f) continue; LogDebug << "数据源:" << pVStep2OutputData->iDataSource << " 帧:" << pVStep2OutputData->iFrameId << " - "<< pVStep2OutputData->step2ResultData.transInfo.strTmpResult; this->divideInfo(pVStep2OutputData); this->pVStep2OutputDataPre_ = pVStep2OutputData; } return APP_ERR_OK; } \ No newline at end of file +#include "ContainerDivideEngine.h" #include using namespace ai_matrix; ContainerDivideEngine::ContainerDivideEngine() {} ContainerDivideEngine::~ContainerDivideEngine() {} APP_ERROR ContainerDivideEngine::Init() { strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0"; strPort1_ = engineName_ + "_" + std::to_string(engineId_) + "_1"; this->vecDataSourceConfig_ = Config::getins()->getAllDataSourceConfig(); if (this->vecDataSourceConfig_.size() <= this->engineId_) { LogWarn << " -- " << engineName_ << "_" << engineId_ << " dataSource no set, Engine DeInit"; return APP_ERR_OK; } this->dataSourceConfig_ = this->vecDataSourceConfig_.at(engineId_); this->baseConfig_ = Config::getins()->getBaseConfig(); this->identifyConfig_ = Config::getins()->getIdentifyConfig(); this->initParam(); LogInfo << "DetectDivideEngine Init ok"; return APP_ERR_OK; } APP_ERROR ContainerDivideEngine::DeInit() { LogInfo << "DetectDivideEngine DeInit ok"; return APP_ERR_OK; } /** * 初始化参数信息 * inParam : N/A * outParam: N/A * return : N/A */ void ContainerDivideEngine::initParam() { this->iContainerIndex = 0; this->vecContainerFail_.clear(); } void ContainerDivideEngine::sendBestData(const VSelectBestData& selectBestData) { // 直接发送第一个箱子的箱号 std::shared_ptr pVSelectBestData = std::make_shared(); *pVSelectBestData = selectBestData; outputQueMap_[strPort0_]->push(std::static_pointer_cast(pVSelectBestData), true); LogInfo << " 帧:" << selectBestData.iFrameId << " 数据源:" << selectBestData.iDataSource << " 节:" << selectBestData.iContainerIndex << " 发送识别结果 " << selectBestData.strNumResult; this->stdContainerResult_ = selectBestData.strNumResult; this->iContainerIndex++; } void ContainerDivideEngine::makeResult(const std::shared_ptr& pVStep2OutputData, VSelectBestData & selectBestData) const { selectBestData.strDetectDate = pVStep2OutputData->strDetectDate; selectBestData.strDetectTime = pVStep2OutputData->strDetectTime; selectBestData.iDataSource = pVStep2OutputData->iDataSource; selectBestData.iFrameId = pVStep2OutputData->iFrameId; selectBestData.strNumResult = pVStep2OutputData->step2ResultData.transInfo.strTmpResult; selectBestData.bIsChkFlag = pVStep2OutputData->step2ResultData.transInfo.bIsChkFlag; selectBestData.fSumScore = pVStep2OutputData->step2ResultData.fSubScoreSum; selectBestData.iContainerIndex = this->iContainerIndex; selectBestData.bHaveTwoContainer = pVStep2OutputData->vecCornerResultData.size() > 2; } /** * 依据像素进行集装箱切分 * @param pVStep2OutputData */ void ContainerDivideEngine::divideByPixelInfo(std::shared_ptr pVStep2OutputData) { auto vCompare = [](std::string a, std::string b) { if (a.size() != b.size()) return 999; int count = 0; for (int i = 0; i < a.size(); ++i) { if (a[i] != b[i]) { ++count; } } return count; }; Step2ResultData step2ResultData_pre = this->pVStep2OutputDataPre_->step2ResultData; Step2ResultData step2ResultData = pVStep2OutputData->step2ResultData; float fCenterX = (step2ResultData.fRBX + step2ResultData.fLTX)/2; float fCenterY = (step2ResultData.fRBY + step2ResultData.fLTY)/2; float fCenterX_Pre = (step2ResultData_pre.fRBX + step2ResultData_pre.fLTX)/2; float fCenterY_Pre = (step2ResultData_pre.fRBY + step2ResultData_pre.fLTY)/2; LogDebug << " 帧:" << pVStep2OutputData->iFrameId << " 数据源:" << pVStep2OutputData->iDataSource << " Y差值:" << std::abs(fCenterY - fCenterY_Pre) << " X差值:" << std::abs(fCenterX - fCenterX_Pre); if ((pVStep2OutputData->iDataSource == 0 && std::abs(fCenterY - fCenterY_Pre) > this->identifyConfig_.iTop_Y_SplitSpanPx) || (pVStep2OutputData->iDataSource != 0 && std::abs(fCenterX - fCenterX_Pre) > this->identifyConfig_.iSide_X_SplitSpanPx)) { if (step2ResultData.transInfo.bIsChkFlag) { if (stdContainerResult_ != step2ResultData.transInfo.strTmpResult) { if (stdContainerResult_.empty()) { // 筛选不满足校验的部分 取最长的发送 int iSize = 0, iIndex = 0; std::string strContainer_tmp; for (int i = 0; i < this->vecContainerFail_.size(); i++) { this->vecContainerFail_[i]; if (iSize < this->vecContainerFail_[i].strNumResult.size()) { iSize = this->vecContainerFail_[i].strNumResult.size(); iIndex = i; strContainer_tmp = this->vecContainerFail_[i].strNumResult; } } sendBestData(this->vecContainerFail_[iIndex]); } // 记录第二箱子 this->vecContainerFail_.clear(); VSelectBestData selectBestData; this->makeResult(pVStep2OutputData, selectBestData); this->sendBestData(selectBestData); } } else { // 筛选不满足校验的部分 取最长的发送 int iSize = 0, iIndex = 0; std::string strContainer_tmp; for (int i = 0; i < this->vecContainerFail_.size(); i++) { this->vecContainerFail_[i]; if (iSize < this->vecContainerFail_[i].strNumResult.size()) { iSize = this->vecContainerFail_[i].strNumResult.size(); iIndex = i; strContainer_tmp = this->vecContainerFail_[i].strNumResult; } } if (this->vecContainerFail_.size() > 0 && this->iContainerIndex < 1) { sendBestData(this->vecContainerFail_[iIndex]); } // 把之前的清理掉再存新箱子的 (有风险,有可能切分错) this->vecContainerFail_.clear(); VSelectBestData selectBestData; this->makeResult(pVStep2OutputData, selectBestData); this->vecContainerFail_.emplace_back(selectBestData); } } else {// 不满足像素差 if (!this->stdContainerResult_.empty()) { if (step2ResultData.transInfo.bIsChkFlag) { if (this->stdContainerResult_ != step2ResultData.transInfo.strTmpResult) { // if (vCompare(this->stdContainerResult_, step2ResultData.transInfo.strTmpResult) > 2) // { this->vecContainerFail_.clear(); VSelectBestData selectBestData; this->makeResult(pVStep2OutputData, selectBestData); this->sendBestData(selectBestData); // } } } } else { if (step2ResultData.transInfo.bIsChkFlag) { this->stdContainerResult_ = step2ResultData.transInfo.strTmpResult; this->vecContainerFail_.clear(); VSelectBestData selectBestData; this->makeResult(pVStep2OutputData, selectBestData); this->sendBestData(selectBestData); } else { VSelectBestData selectBestData; this->makeResult(pVStep2OutputData, selectBestData); this->vecContainerFail_.emplace_back(selectBestData); } } } } void ContainerDivideEngine::setectBestByCorner() { if (!this->vecContainer_.empty()) { // 汇总下vecContainer中,有几种正确的识别结果,选出识别次数最多的 std::map mapContainer_count; std::map mapContainer_index; int i = 0; for (auto &container: this->vecContainer_) { mapContainer_count[container.strNumResult]++; mapContainer_index[container.strNumResult] = i; ++i; } std::string strBestContainer; int count = 0; // 取出现次数最高的 且与第一个箱子不一样的 for (auto &it_max: mapContainer_count) { if (it_max.first.empty()) continue; if (it_max.second >= count) { count = it_max.second; strBestContainer = it_max.first; } } this->sendBestData(this->vecContainer_[mapContainer_index[strBestContainer]]); this->vecContainer_.clear(); this->vecContainerFail_.clear(); } else { // 汇总下vecContainer中,有几种正确的识别结果,选出识别次数最多的 int iMaxSize = 0, iIndex = 0; std::map mapContainer_index; int i = 0; for (auto &container: this->vecContainerFail_) { if (container.strNumResult.size() > iMaxSize) { iMaxSize = container.strNumResult.size(); iIndex = i; } ++i; } this->sendBestData(this->vecContainerFail_[iIndex]); this->vecContainer_.clear(); this->vecContainerFail_.clear(); } } /** * 依据箱角切分 * @param pVStep2OutputData */ void ContainerDivideEngine::divideByCornerInfo(std::shared_ptr pVStep2OutputData) { Step2ResultData step2ResultData = pVStep2OutputData->step2ResultData; if (pVStep2OutputData->vecCornerResultData.size() > 1 && this->iContainerIndex < 1) { LogInfo << "帧:" << pVStep2OutputData->iFrameId << " 数据源:" << pVStep2OutputData->iDataSource << " ---- >>> 检测到多个箱角,准备切分"; if (pVStep2OutputData->iDataSource == 0) // 顶部摄像头 { this->setectBestByCorner(); } } else { VSelectBestData selectBestData; this->makeResult(pVStep2OutputData, selectBestData); if (step2ResultData.transInfo.bIsChkFlag) { this->vecContainer_.emplace_back(selectBestData); } else { this->vecContainerFail_.emplace_back(selectBestData); } } } /** * 切分车厢 * @param pVStep2OutputData */ void ContainerDivideEngine::divideInfo(std::shared_ptr pVStep2OutputData) { if (!this->pVStep2OutputDataPre_) return; if (this->iContainerIndex > 1) return; if (this->vecDataSourceConfig_[pVStep2OutputData->iDataSource].strDivideModel == "corner") { this->divideByCornerInfo(pVStep2OutputData); } else { this->divideByPixelInfo(pVStep2OutputData); } } APP_ERROR ContainerDivideEngine::Process() { int iRet = APP_ERR_OK; while (!isStop_) { //pop端口0 std::shared_ptr pVoidData0 = nullptr; iRet = inputQueMap_[strPort0_]->pop(pVoidData0); if (nullptr == pVoidData0) { usleep(1000); continue; } std::shared_ptr pVStep2OutputData = std::static_pointer_cast(pVoidData0); if (pVStep2OutputData->bIsEnd) { std::shared_ptr pVSelectBestData = std::make_shared(); pVSelectBestData->bIsEnd = true; pVSelectBestData->iDataSource = pVStep2OutputData->iDataSource; pVSelectBestData->strDetectDate = pVStep2OutputData->strDetectDate; pVSelectBestData->strDetectTime = pVStep2OutputData->strDetectTime; if (this->iContainerIndex > 1) { outputQueMap_[strPort0_]->push(std::static_pointer_cast(pVSelectBestData), true); this->initParam(); continue; } if (this->vecDataSourceConfig_[pVStep2OutputData->iDataSource].strDivideModel == "corner") { this->setectBestByCorner(); } else { if (!this->vecContainerFail_.empty()) { // 筛选不满足校验的部分 取最长的发送 int iSize = 0, iIndex = 0; std::string strContainer_tmp; for (int i = 0; i < this->vecContainerFail_.size(); i++) { this->vecContainerFail_[i]; if (iSize < this->vecContainerFail_[i].strNumResult.size()) { iSize = this->vecContainerFail_[i].strNumResult.size(); iIndex = i; strContainer_tmp = this->vecContainerFail_[i].strNumResult; } } this->vecContainerFail_[iIndex].bIsEnd = true; sendBestData(this->vecContainerFail_[iIndex]); this->initParam(); continue; } } outputQueMap_[strPort0_]->push(std::static_pointer_cast(pVSelectBestData), true); this->initParam(); continue; } std::string strFilePath ; strFilePath = this->baseConfig_.strDebugResultPath + "/" + pVStep2OutputData->strDetectDate + "/" + StringUtil::getins()->replace_all_distinct(pVStep2OutputData->strDetectTime, ":", "-") + "/" + std::to_string(pVStep2OutputData->iFrameId) + "_" + std::to_string(pVStep2OutputData->iDataSource) + ".json"; // 先读取文本内容,追加新的信息后再写入 Json::Value jvFrameInfo; if (!FileUtil::getins()->readJsonInfo(jvFrameInfo, strFilePath)) { LogError << "read fail:" << strFilePath; } // jvFrameInfo["isEnd"] = (pVStep2OutputData->bIsEnd || jvFrameInfo["isEnd"].asBool()); // 识别结果存储 float fCenter = pVStep2OutputData->step2ResultData.fLTX + (pVStep2OutputData->step2ResultData.fRBX - pVStep2OutputData->step2ResultData.fLTX) / 2; // this->mapContainerCenterInfo_.insert(std::make_pair(pVStep2OutputData->iFrameId, fCenter)); Json::Value jvInfo; jvInfo["classid"] = pVStep2OutputData->step2ResultData.iClassId; jvInfo["score"] = pVStep2OutputData->step2ResultData.fScore; jvInfo["ltx"] = pVStep2OutputData->step2ResultData.fLTX; jvInfo["lty"] = pVStep2OutputData->step2ResultData.fLTY; jvInfo["rbx"] = pVStep2OutputData->step2ResultData.fRBX; jvInfo["rby"] = pVStep2OutputData->step2ResultData.fRBY; jvFrameInfo["step1"].append(jvInfo); for (auto &step2ResultData : pVStep2OutputData->vecCornerResultData) { float fCenter = step2ResultData.fLTX + (step2ResultData.fRBX - step2ResultData.fLTX) / 2; // this->mapContainerCenterInfo_.insert(std::make_pair(pVStep2OutputData->iFrameId, fCenter)); Json::Value jvInfo; jvInfo["classid"] = step2ResultData.iClassId; jvInfo["score"] = step2ResultData.fScore; jvInfo["ltx"] = step2ResultData.fLTX; jvInfo["lty"] = step2ResultData.fLTY; jvInfo["rbx"] = step2ResultData.fRBX; jvInfo["rby"] = step2ResultData.fRBY; jvFrameInfo["step1"].append(jvInfo); } FileUtil::getins()->writeJsonInfo(jvFrameInfo, strFilePath); if (pVStep2OutputData->step2ResultData.fScore == 0.0f) { LogDebug << " 帧:" << pVStep2OutputData->iFrameId << " 数据源:" << pVStep2OutputData->iDataSource << " - "<< pVStep2OutputData->step2ResultData.transInfo.strTmpResult; } this->divideInfo(pVStep2OutputData); this->pVStep2OutputDataPre_ = pVStep2OutputData; } return APP_ERR_OK; } \ No newline at end of file diff --git a/engine/DetectDivideEngine/ContainerDivideEngine.h b/engine/DetectDivideEngine/ContainerDivideEngine.h index e39c861..833a261 100644 --- a/engine/DetectDivideEngine/ContainerDivideEngine.h +++ b/engine/DetectDivideEngine/ContainerDivideEngine.h @@ -23,6 +23,9 @@ public: private: void initParam(); void divideInfo(std::shared_ptr pVStep2OutputData); + void divideByPixelInfo(std::shared_ptr pVStep2OutputData); + void divideByCornerInfo(std::shared_ptr pVStep2OutputData); + void setectBestByCorner(); void sendBestData(const VSelectBestData& selectBestData); void makeResult(const std::shared_ptr& pVStep2OutputData, VSelectBestData & selectBestData) const; @@ -33,6 +36,7 @@ private: ai_matrix::BaseConfig baseConfig_; ai_matrix::IdentifyConfig identifyConfig_; ai_matrix::DataSourceConfig dataSourceConfig_; + std::vector vecDataSourceConfig_; std::shared_ptr pVStep2OutputDataPre_ = nullptr; @@ -43,7 +47,10 @@ private: // 临时存储的正确结果 std::string stdContainerResult_; + // 存储识别到的不满足校验规则的箱号数据 std::vector vecContainerFail_; + // 存储识别到的满足校验规则的箱号数据 + std::vector vecContainer_; }; ENGINE_REGIST(ContainerDivideEngine) diff --git a/engine/Step1InferenceEngine/ContainerStep1InferenceEngine.cpp b/engine/Step1InferenceEngine/ContainerStep1InferenceEngine.cpp index d7bf862..09c0ca1 100644 --- a/engine/Step1InferenceEngine/ContainerStep1InferenceEngine.cpp +++ b/engine/Step1InferenceEngine/ContainerStep1InferenceEngine.cpp @@ -180,8 +180,8 @@ void ContainerStep1InferenceEngine::filterInvalidInfo(std::vector & it->bbox[2] <= this->dataSourceConfig_.vecIdentifyAreas[2] && it->bbox[3] <= this->dataSourceConfig_.vecIdentifyAreas[3])) { - LogDebug << " 数据源:" << pVDetectInfo->iDataSource - << " frameId:" << pVDetectInfo->iFrameId + LogDebug << " 帧:" << pVDetectInfo->iFrameId + << " 数据源:" << pVDetectInfo->iDataSource << " 类别:" << it->class_id << " 坐标:[" << it->bbox[0] << "," << it->bbox[1] @@ -200,8 +200,8 @@ void ContainerStep1InferenceEngine::filterInvalidInfo(std::vector & // 剔出反向集装箱 if (it->class_id == MIRROR_CONTAINER) { -// LogDebug << " 数据源:" << pVDetectInfo->iDataSource -// << " frameId:" << pVDetectInfo->iFrameId +// LogDebug << " 帧:" << pVDetectInfo->iFrameId +// << " 数据源:" << pVDetectInfo->iDataSource // << " bigclassid:" << it->class_id << " 过滤 剔出反向集装箱"; it = vecInferenceResult.erase(it); continue; @@ -210,8 +210,8 @@ void ContainerStep1InferenceEngine::filterInvalidInfo(std::vector & // 剔除高度小于最低限制的大框 if ((it->bbox[3] - it->bbox[1]) < this->identifyConfig_.iTargetMinHeight && pVDetectInfo->iDataSource != 0) { -// LogDebug << " 数据源:" << pVDetectInfo->iDataSource -// << " frameId:" << pVDetectInfo->iFrameId +// LogDebug << " 帧:" << pVDetectInfo->iFrameId +// << " 数据源:" << pVDetectInfo->iDataSource // << " bigclassid:" << it->class_id << " 过滤 大框高度小于最小值,疑似非目标区域"; it = vecInferenceResult.erase(it); continue; @@ -219,8 +219,8 @@ void ContainerStep1InferenceEngine::filterInvalidInfo(std::vector & // 剔除宽度小于最低限制的大框 if ((it->bbox[2] - it->bbox[0]) < this->identifyConfig_.iTargetMinWidth) { -// LogDebug << " 数据源:" << pVDetectInfo->iDataSource -// << " frameId:" << pVDetectInfo->iFrameId +// LogDebug << " 帧:" << pVDetectInfo->iFrameId +// << " 数据源:" << pVDetectInfo->iDataSource // << " bigclassid:" << it->class_id << " 过滤 大框宽度小于最小值,疑似非目标区域"; it = vecInferenceResult.erase(it); continue; @@ -229,8 +229,8 @@ void ContainerStep1InferenceEngine::filterInvalidInfo(std::vector & // 剔出左上角坐标在XXX以下的 if (pVDetectInfo->iDataSource != 0 && it->bbox[1] > this->identifyConfig_.iTargetMinY) { -// LogDebug << " 数据源:" << pVDetectInfo->iDataSource -// << " frameId:" << pVDetectInfo->iFrameId +// LogDebug << " 帧:" << pVDetectInfo->iFrameId +// << " 数据源:" << pVDetectInfo->iDataSource // << " bigclassid:" << it->class_id << " 过滤 大框低于指定Y轴坐标,疑似误识别非目标"; it = vecInferenceResult.erase(it); continue;