From bdaaf2eca400f6394c80619677fd937d73f543db Mon Sep 17 00:00:00 2001 From: "Mr.V" Date: Wed, 27 Nov 2024 20:38:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BE=A7=E8=BE=B9=E5=8F=B3?= =?UTF-8?q?=E5=90=91=E8=A1=8C=E8=BD=A6=E6=91=84=E5=83=8F=E5=A4=B4=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=AE=B1=E8=A7=92=E8=BF=9B=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 | 1 + ai_matrix/Config/Config.h | 2 + common/AppCommon.h | 4 +- common/CommonStruct.h | 2 + config/config.yaml | 6 + engine/ControlEngine/ControlEngine.cpp | 12 +- .../ContainerDivideEngine.cpp | 2 +- .../ContainerDivideEngine.h | 2 +- .../SaveDebugImageEngine.cpp | 110 +++++++++--------- .../SaveDebugImageEngine.h | 2 +- .../ContainerStep2InferenceEngine.cpp | 2 +- 11 files changed, 76 insertions(+), 69 deletions(-) diff --git a/ai_matrix/Config/Config.cpp b/ai_matrix/Config/Config.cpp index 42039b9..e78d867 100644 --- a/ai_matrix/Config/Config.cpp +++ b/ai_matrix/Config/Config.cpp @@ -56,6 +56,7 @@ namespace ai_matrix dataSourceConfig.iSkipInterval = it["skip_interval"].as(); dataSourceConfig.vecIdentifyAreas = it["identify_areas"].as>(); dataSourceConfig.strDivideModel = it["divide_mode"].as(); + dataSourceConfig.strRunDirection = it["run_direction"].as(); this->vecDataSourceConfig_.emplace_back(dataSourceConfig); } diff --git a/ai_matrix/Config/Config.h b/ai_matrix/Config/Config.h index 7ef5ab8..0f6858c 100644 --- a/ai_matrix/Config/Config.h +++ b/ai_matrix/Config/Config.h @@ -64,6 +64,8 @@ namespace ai_matrix std::vector vecIdentifyAreas; // 切箱方式 std::string strDivideModel; + // 汽车行进方向 + std::string strRunDirection; }; // 识别参数 diff --git a/common/AppCommon.h b/common/AppCommon.h index c294843..ec27711 100644 --- a/common/AppCommon.h +++ b/common/AppCommon.h @@ -137,8 +137,8 @@ using namespace nvcaffeparser1; #define STEP1_CLASS_NUM 19 //step1 7分类 #define STEP1_CLEAR_NUM 21 //step1 21个清晰度 -#define STEP1_INPUT_H 960 //step1 输入图像高 -#define STEP1_INPUT_W 960 //step1 输入图像宽 +#define STEP1_INPUT_H 640 //step1 输入图像高 +#define STEP1_INPUT_W 640 //step1 输入图像宽 #define STEP1_BATCH_SIZE 1 #define STEP1_OUTPUT_HISTOGRAM_N 5 //不能超过139167 diff --git a/common/CommonStruct.h b/common/CommonStruct.h index 9b77cd2..dbf747d 100644 --- a/common/CommonStruct.h +++ b/common/CommonStruct.h @@ -330,6 +330,8 @@ typedef struct Step2ResultData step2ResultData; // 箱角大框 std::vector vecCornerResultData; + // 图片 + cv::Mat cvImage; // 是否最后一节 bool bIsEnd = false; } VStep2OutputData; diff --git a/config/config.yaml b/config/config.yaml index 50a79d3..d0b5b93 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -32,6 +32,8 @@ data_source: identify_areas: [120, 0, 1800, 1080] # 切箱方式 divide_mode: "corner" #[corner, pixel] + # 汽车行进方向 + run_direction: "down" #[up, down, left, right] - # 侧部摄像头 url: "./videos/buertai2.mp4" # 跳帧数 @@ -40,6 +42,8 @@ data_source: identify_areas: [ 120, 0, 1800, 1080 ] # 切箱方式 divide_mode: "pixel" #[corner, pixel] + # 汽车行进方向 + run_direction: "right" #[up, down, left, right] - # 侧边摄像头 url: "./videos/buertai2.mp4" # 跳帧数 @@ -48,6 +52,8 @@ data_source: identify_areas: [ 120, 0, 1800, 1080 ] # 切箱方式 divide_mode: "pixel" #[corner, pixel] + # 汽车行进方向 + run_direction: "left" #[up, down, left, right] # 识别参数 identify: diff --git a/engine/ControlEngine/ControlEngine.cpp b/engine/ControlEngine/ControlEngine.cpp index a5d07d5..100589c 100644 --- a/engine/ControlEngine/ControlEngine.cpp +++ b/engine/ControlEngine/ControlEngine.cpp @@ -245,12 +245,12 @@ APP_ERROR ControlEngine::Process() outputQueMap_[strPort3_]->push(std::static_pointer_cast(pVDetectInfo), true); // 存图 - std::shared_ptr pSaveImgData = std::make_shared(); - pSaveImgData->strFilePath = strFilePath; - pSaveImgData->strFileName = std::to_string(this->mapDetectNO_[pProcessData->iDataSource]) + "_" + std::to_string(pProcessData->iDataSource) + ".jpg"; - pSaveImgData->cvImage = image; - pSaveImgData->bIsEnd = pProcessData->bIsEnd; - outputQueMap_[strPort4_]->push(std::static_pointer_cast(pSaveImgData), true); +// std::shared_ptr pSaveImgData = std::make_shared(); +// pSaveImgData->strFilePath = strFilePath; +// pSaveImgData->strFileName = std::to_string(this->mapDetectNO_[pProcessData->iDataSource]) + "_" + std::to_string(pProcessData->iDataSource) + ".jpg"; +// pSaveImgData->cvImage = image; +// pSaveImgData->bIsEnd = pProcessData->bIsEnd; +// outputQueMap_[strPort4_]->push(std::static_pointer_cast(pSaveImgData), true); this->mapDetectNO_[pProcessData->iDataSource]++; } diff --git a/engine/DetectDivideEngine/ContainerDivideEngine.cpp b/engine/DetectDivideEngine/ContainerDivideEngine.cpp index ea34338..39d2c39 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"; 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 +#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); } } } } bool 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 { if (this->vecContainerFail_.empty()) return false; // 汇总下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(); } return true; } /** * 依据箱角切分 * @param pVStep2OutputData */ void ContainerDivideEngine::divideByCornerInfo(std::shared_ptr pVStep2OutputData) { Step2ResultData step2ResultData = pVStep2OutputData->step2ResultData; if (pVStep2OutputData->vecCornerResultData.size() > 1 && this->iContainerIndex < 1) { if (pVStep2OutputData->vecCornerResultData.size() > 2) { LogWarn << "帧:" << pVStep2OutputData->iFrameId << " 数据源:" << pVStep2OutputData->iDataSource << " ---- >>> 检测到超过2个箱角,疑似画面过滤倾斜或模型训练不足!"; return; } LogInfo << "帧:" << pVStep2OutputData->iFrameId << " 数据源:" << pVStep2OutputData->iDataSource << " ---- >>> 检测到多个箱角,准备切分"; if (pVStep2OutputData->iDataSource == 0 || this->dataSourceConfig_.strRunDirection == "right") { if (this->vecContainerFail_.empty()) { VSelectBestData selectBestData; selectBestData.strDetectDate = pVStep2OutputData->strDetectDate; selectBestData.strDetectTime = pVStep2OutputData->strDetectTime; selectBestData.iDataSource = pVStep2OutputData->iDataSource; selectBestData.iFrameId = 1; selectBestData.strNumResult = "invalid-?"; selectBestData.iContainerIndex = this->iContainerIndex; selectBestData.bHaveTwoContainer = true; this->vecContainerFail_.emplace_back(selectBestData); } this->setectBestByCorner(); VSelectBestData selectBestData; this->makeResult(pVStep2OutputData, selectBestData); if (step2ResultData.transInfo.bIsChkFlag) { this->vecContainer_.emplace_back(selectBestData); } else { this->vecContainerFail_.emplace_back(selectBestData); } return; } if (this->dataSourceConfig_.strRunDirection == "left") { LogWarn << "向左行驶的一侧暂不支持箱角识别,请及时修改参数 divide_mode: \"pixel\""; return; } } 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") { if (!this->vecContainerFail_.empty() || !this->vecContainer_.empty()) { 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 833a261..3756177 100644 --- a/engine/DetectDivideEngine/ContainerDivideEngine.h +++ b/engine/DetectDivideEngine/ContainerDivideEngine.h @@ -25,7 +25,7 @@ private: void divideInfo(std::shared_ptr pVStep2OutputData); void divideByPixelInfo(std::shared_ptr pVStep2OutputData); void divideByCornerInfo(std::shared_ptr pVStep2OutputData); - void setectBestByCorner(); + bool setectBestByCorner(); void sendBestData(const VSelectBestData& selectBestData); void makeResult(const std::shared_ptr& pVStep2OutputData, VSelectBestData & selectBestData) const; diff --git a/engine/SaveDebugImageEngine/SaveDebugImageEngine.cpp b/engine/SaveDebugImageEngine/SaveDebugImageEngine.cpp index b77f724..160366c 100644 --- a/engine/SaveDebugImageEngine/SaveDebugImageEngine.cpp +++ b/engine/SaveDebugImageEngine/SaveDebugImageEngine.cpp @@ -42,16 +42,8 @@ APP_ERROR SaveDebugImageEngine::Process() continue; } - if (!this->baseConfig_.bTestModel) - { - usleep(1000); - continue; - } - - std::shared_ptr pVStep2OutputData = std::static_pointer_cast(pvoidd); - std::string strDataDir = this->baseConfig_.strDebugResultPath + "/" + pVStep2OutputData->strDetectDate + "/" + StringUtil::getins()->replace_all_distinct(pVStep2OutputData->strDetectTime, ":", "-") @@ -72,70 +64,74 @@ APP_ERROR SaveDebugImageEngine::Process() continue; } - cv::Mat image = cv::imread(strImagePath); +// cv::Mat image = cv::imread(strImagePath); - if (image.empty()) + if (pVStep2OutputData->cvImage.empty()) { - LogWarn << "图像未找到:" << strImagePath; + LogWarn << " 帧:" << pVStep2OutputData->iFrameId << " 数据源:" << pVStep2OutputData->iDataSource << " debug图像未找到"; continue; } - std::stringstream ss; - std::vector vecTitle; - vecTitle.emplace_back("FrameID:" + to_string(pVStep2OutputData->iFrameId)); - vecTitle.emplace_back("TimeStamp:" + jvFrameInfo["timeStamp"].asString()); - - int base_line = 0; - cv::Point text_org(15, 45); // 文本起始点 - for (const auto & i : vecTitle) + if (this->baseConfig_.bTestModel) { - cv::Size text_size = cv::getTextSize(i, cv::FONT_HERSHEY_SIMPLEX, 1, 2, 0); - cv::Point baseline_loc(text_org); - baseline_loc.y += base_line + text_size.height; - cv::putText(image, i, baseline_loc, cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 0, 255), 2); - // 手动调整x位置,为下一个单词留出空间 - text_org.x += text_size.width + 10; - text_org.x = text_org.x > IMAGE_WIDTH ? 15 : text_org.x; - base_line++; - } +// std::stringstream ss; + std::vector vecTitle; + vecTitle.emplace_back("FrameID:" + to_string(pVStep2OutputData->iFrameId)); + vecTitle.emplace_back("TimeStamp:" + jvFrameInfo["timeStamp"].asString()); - cv::Scalar cvScalar = {0, 255, 0, 255}; + int base_line = 0; + cv::Point text_org(15, 45); // 文本起始点 + for (const auto & i : vecTitle) + { + cv::Size text_size = cv::getTextSize(i, cv::FONT_HERSHEY_SIMPLEX, 1, 2, 0); + cv::Point baseline_loc(text_org); + baseline_loc.y += base_line + text_size.height; + cv::putText(pVStep2OutputData->cvImage, i, baseline_loc, cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 0, 255), 2); + // 手动调整x位置,为下一个单词留出空间 + text_org.x += text_size.width + 10; + text_org.x = text_org.x > IMAGE_WIDTH ? 15 : text_org.x; + base_line++; + } - float centerX = pVStep2OutputData->step2ResultData.fLTX + (pVStep2OutputData->step2ResultData.fRBX - pVStep2OutputData->step2ResultData.fLTX)/2; - float centerY = pVStep2OutputData->step2ResultData.fLTY + (pVStep2OutputData->step2ResultData.fRBY - pVStep2OutputData->step2ResultData.fLTY)/2; + cv::Scalar cvScalar = {0, 255, 0, 255}; + + float centerX = pVStep2OutputData->step2ResultData.fLTX + (pVStep2OutputData->step2ResultData.fRBX - pVStep2OutputData->step2ResultData.fLTX)/2; + float centerY = pVStep2OutputData->step2ResultData.fLTY + (pVStep2OutputData->step2ResultData.fRBY - pVStep2OutputData->step2ResultData.fLTY)/2; // auto start = std::chrono::system_clock::now(); //计时开始 - cv::rectangle(image, - cv::Point(pVStep2OutputData->step2ResultData.fLTX, pVStep2OutputData->step2ResultData.fLTY), - cv::Point(pVStep2OutputData->step2ResultData.fRBX, pVStep2OutputData->step2ResultData.fRBY), - cvScalar, 2); - cv::line(image, - cv::Point(centerX, pVStep2OutputData->step2ResultData.fLTY-30), cv::Point(centerX, pVStep2OutputData->step2ResultData.fRBY+30), - cvScalar, 1); - - cv::Size text_size = cv::getTextSize(pVStep2OutputData->step2ResultData.transInfo.strTmpResult, cv::FONT_HERSHEY_SIMPLEX, 1, 2, 0); - cv::Point linePoint(pVStep2OutputData->step2ResultData.fLTX, pVStep2OutputData->step2ResultData.fRBY + text_size.height + 5); - cv::putText(image, - pVStep2OutputData->step2ResultData.transInfo.strTmpResult, - linePoint, - cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 0, 180), 2); - - - for (const auto &step2ResultData : pVStep2OutputData->vecCornerResultData) - { - cvScalar = {0, 255, 255, 255}; - float centerX_corner = step2ResultData.fLTX + (step2ResultData.fRBX - step2ResultData.fLTX)/2; - cv::rectangle(image, - cv::Point(step2ResultData.fLTX, step2ResultData.fLTY), - cv::Point(step2ResultData.fRBX, step2ResultData.fRBY), + cv::rectangle(pVStep2OutputData->cvImage, + cv::Point(pVStep2OutputData->step2ResultData.fLTX, pVStep2OutputData->step2ResultData.fLTY), + cv::Point(pVStep2OutputData->step2ResultData.fRBX, pVStep2OutputData->step2ResultData.fRBY), cvScalar, 2); - cv::line(image, - cv::Point(centerX_corner, step2ResultData.fLTY-30), cv::Point(centerX_corner, step2ResultData.fRBY+30), + cv::line(pVStep2OutputData->cvImage, + cv::Point(centerX, pVStep2OutputData->step2ResultData.fLTY-30), cv::Point(centerX, pVStep2OutputData->step2ResultData.fRBY+30), cvScalar, 1); + + cv::Size text_size = cv::getTextSize(pVStep2OutputData->step2ResultData.transInfo.strTmpResult, cv::FONT_HERSHEY_SIMPLEX, 1, 2, 0); + cv::Point linePoint(pVStep2OutputData->step2ResultData.fLTX, pVStep2OutputData->step2ResultData.fRBY + text_size.height + 5); + cv::putText(pVStep2OutputData->cvImage, + pVStep2OutputData->step2ResultData.transInfo.strTmpResult, + linePoint, + cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 0, 180), 2); + + + for (const auto &step2ResultData : pVStep2OutputData->vecCornerResultData) + { + cvScalar = {0, 255, 255, 255}; + float centerX_corner = step2ResultData.fLTX + (step2ResultData.fRBX - step2ResultData.fLTX)/2; + cv::rectangle(pVStep2OutputData->cvImage, + cv::Point(step2ResultData.fLTX, step2ResultData.fLTY), + cv::Point(step2ResultData.fRBX, step2ResultData.fRBY), + cvScalar, 2); + cv::line(pVStep2OutputData->cvImage, + cv::Point(centerX_corner, step2ResultData.fLTY-30), cv::Point(centerX_corner, step2ResultData.fRBY+30), + cvScalar, 1); + } } + // auto end = std::chrono::system_clock::now(); // LogDebug << "图片存储用时: " << std::chrono::duration_cast(end - start).count() << "ms " << strImagePath; - if (!cv::imwrite(strImagePath, image, this->vecCompressionParams_)) + if (!cv::imwrite(strImagePath, pVStep2OutputData->cvImage, this->vecCompressionParams_)) { LogError << "图片存储失败:" << strImagePath; } diff --git a/engine/SaveDebugImageEngine/SaveDebugImageEngine.h b/engine/SaveDebugImageEngine/SaveDebugImageEngine.h index feb499d..bfb36a3 100644 --- a/engine/SaveDebugImageEngine/SaveDebugImageEngine.h +++ b/engine/SaveDebugImageEngine/SaveDebugImageEngine.h @@ -24,7 +24,7 @@ private: ai_matrix::BaseConfig baseConfig_; std::string strPort0_; - int iPicQuality_ = 80; + int iPicQuality_ = 100; std::vector vecCompressionParams_; }; diff --git a/engine/Step2InferenceEngine/ContainerStep2InferenceEngine.cpp b/engine/Step2InferenceEngine/ContainerStep2InferenceEngine.cpp index bf6eac9..f6f7d68 100644 --- a/engine/Step2InferenceEngine/ContainerStep2InferenceEngine.cpp +++ b/engine/Step2InferenceEngine/ContainerStep2InferenceEngine.cpp @@ -1 +1 @@ -#include "ContainerStep2InferenceEngine.h" #include #include "myqueue.h" using namespace ai_matrix; ContainerStep2InferenceEngine::ContainerStep2InferenceEngine() {} ContainerStep2InferenceEngine::~ContainerStep2InferenceEngine() {} APP_ERROR ContainerStep2InferenceEngine::Init() { strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0"; this->modelConfig_ = Config::getins()->getModelByContainerStep2Config(); //读取模型信息 int iFolderExist = access(modelConfig_.strModelPath.c_str(), R_OK); if (iFolderExist == -1) { LogError << "模型:" << modelConfig_.strModelPath << " 不存在!"; return false; } class_num = this->modelConfig_.vecClass.size(); score_threshold = this->modelConfig_.fScoreThreshold; input_size = GET_INPUT_SIZE(model_width , model_height); output_size = GET_OUTPUT_SIZE(model_width, model_height, clear_num, class_num); det_size = clear_num + class_num + 5; int ret = initModel(); if (ret != APP_ERR_OK) { LogError << "Failed to read model info, ret = " << ret; return ret; } LogInfo << "ContainerStep2InferenceEngine Init ok"; return APP_ERR_OK; } APP_ERROR ContainerStep2InferenceEngine::initModel() { modelinfo.yolov5ClearityModelParam.uiClassNum = class_num; modelinfo.yolov5ClearityModelParam.uiClearNum = clear_num; modelinfo.yolov5ClearityModelParam.uiDetSize = det_size; modelinfo.yolov5ClearityModelParam.fScoreThreshold = score_threshold; modelinfo.yolov5ClearityModelParam.fNmsThreshold = nms_threshold; modelinfo.modelCommonInfo.uiModelWidth = model_width; modelinfo.modelCommonInfo.uiModelHeight = model_height; modelinfo.modelCommonInfo.uiInputSize = input_size; modelinfo.modelCommonInfo.uiOutputSize = output_size; modelinfo.modelCommonInfo.uiChannel = INPUT_CHANNEL; modelinfo.modelCommonInfo.uiBatchSize = batch_size; modelinfo.modelCommonInfo.strInputBlobName = INPUT_BLOB_NAME; modelinfo.modelCommonInfo.strOutputBlobName = OUTPUT_BLOB_NAME; string strModelName; int nRet = yolov5model.YoloV5ClearityInferenceInit(&modelinfo, strModelName, this->modelConfig_.strModelPath); if (nRet != 0) { LogInfo << "YoloV5ClassifyInferenceInit nRet:" << nRet; return APP_ERR_COMM_READ_FAIL; } return APP_ERR_OK; } APP_ERROR ContainerStep2InferenceEngine::DeInit() { yolov5model.YoloV5ClearityInferenceDeinit(); LogInfo << "ContainerStep2InferenceEngine DeInit ok"; return APP_ERR_OK; } void ContainerStep2InferenceEngine::resetLocation(SingleData &singleData, SingleData &step1SingleData, float fResizeRatio) { singleData.fLTX = singleData.fLTX * fResizeRatio + step1SingleData.fLTX; singleData.fLTY = singleData.fLTY * fResizeRatio + step1SingleData.fLTY; singleData.fRBX = singleData.fRBX * fResizeRatio + step1SingleData.fLTX; singleData.fRBY = singleData.fRBY * fResizeRatio + step1SingleData.fLTY; singleData.fLTX = (singleData.fLTX < IMAGE_WIDTH) ? singleData.fLTX : IMAGE_WIDTH; singleData.fLTY = (singleData.fLTY < IMAGE_HEIGHT) ? singleData.fLTY : IMAGE_HEIGHT; singleData.fRBX = (singleData.fRBX < IMAGE_WIDTH) ? singleData.fRBX : IMAGE_WIDTH; singleData.fRBY = (singleData.fRBY < IMAGE_HEIGHT) ? singleData.fRBY : IMAGE_HEIGHT; } APP_ERROR ContainerStep2InferenceEngine::Process() { int iRet = APP_ERR_OK; while (!isStop_) { std::shared_ptr pVoidData0 = nullptr; inputQueMap_[strPort0_]->pop(pVoidData0); if (nullptr == pVoidData0) { usleep(1000); //1ms continue; } std::shared_ptr pInferenceResultData = std::static_pointer_cast(pVoidData0); std::shared_ptr pVStep2OutputData = std::make_shared(); pVStep2OutputData->iDataSource = pInferenceResultData->iDataSource; pVStep2OutputData->bIsEnd = pInferenceResultData->bIsEnd; pVStep2OutputData->strDetectDate = pInferenceResultData->strDetectDate; pVStep2OutputData->strDetectTime = pInferenceResultData->strDetectTime; if (pInferenceResultData->bIsEnd) { outputQueMap_[strPort0_]->push(std::static_pointer_cast(pVStep2OutputData), true); continue; } pVStep2OutputData->strDetectDate = pInferenceResultData->strDetectDate; pVStep2OutputData->strDetectTime = pInferenceResultData->strDetectTime; pVStep2OutputData->iFrameId = pInferenceResultData->iFrameId; // LogWarn << "-- 0 -->" << pVStep2InputData->vecSingleData.size(); for (auto & single : pInferenceResultData->vecSingleData) { Step2ResultData step2ResultData; step2ResultData.fLTX = single.fLTX; step2ResultData.fLTY = single.fLTY; step2ResultData.fRBX = single.fRBX; step2ResultData.fRBY = single.fRBY; step2ResultData.iClassId = single.iClassId; step2ResultData.fScore = single.fScore; step2ResultData.iTrainIndex = single.iTrainIndex; if (single.iTargetType == CORNER) { pVStep2OutputData->vecCornerResultData.emplace_back(step2ResultData); continue; }; } if (pInferenceResultData->singleData.fScore > 0.0f) { pVStep2OutputData->step2ResultData.fLTX = pInferenceResultData->singleData.fLTX; pVStep2OutputData->step2ResultData.fLTY = pInferenceResultData->singleData.fLTY; pVStep2OutputData->step2ResultData.fRBX = pInferenceResultData->singleData.fRBX; pVStep2OutputData->step2ResultData.fRBY = pInferenceResultData->singleData.fRBY; pVStep2OutputData->step2ResultData.iClassId = pInferenceResultData->singleData.iClassId; pVStep2OutputData->step2ResultData.fScore = pInferenceResultData->singleData.fScore; pVStep2OutputData->step2ResultData.iTrainIndex = pInferenceResultData->singleData.iTrainIndex; cv::Rect rect(cv::Point(pInferenceResultData->singleData.fLTX, pInferenceResultData->singleData.fLTY), cv::Point(pInferenceResultData->singleData.fRBX, pInferenceResultData->singleData.fRBY)); cv::Mat image = pInferenceResultData->cvImage(rect).clone(); //进行推理 std::vector vecInferenceResult; auto start = std::chrono::system_clock::now(); // 计时开始 yolov5model.YoloV5ClearityInferenceModel(image, vecInferenceResult, 2); auto end = std::chrono::system_clock::now(); for (const auto & j : vecInferenceResult) { if (j.class_conf < STEP2_SCORE_THRESH) { continue; } SingleData singledata; singledata.iLine = j.clear_id; singledata.iClassId = j.class_id; singledata.fScore = j.class_conf; singledata.fLTX = j.bbox[0]; singledata.fLTY = j.bbox[1]; singledata.fRBX = j.bbox[2]; singledata.fRBY = j.bbox[3]; this->resetLocation(singledata, pInferenceResultData->singleData); pVStep2OutputData->step2ResultData.vecSingleData.emplace_back(singledata); // LogDebug << "frameId:" << pVStep2OutputData->iFrameId // << " --iClassId:" << singledata.iClassId // << " iLine:" << singledata.iLine // << " score=" << singledata.fScore // << " [" // << singledata.fLTX << "," << singledata.fLTY // << "],[" // << singledata.fRBX << "," << singledata.fRBY // << "]"; } } outputQueMap_[strPort0_]->push(std::static_pointer_cast(pVStep2OutputData), true); } return APP_ERR_OK; } \ No newline at end of file +#include "ContainerStep2InferenceEngine.h" #include #include "myqueue.h" using namespace ai_matrix; ContainerStep2InferenceEngine::ContainerStep2InferenceEngine() {} ContainerStep2InferenceEngine::~ContainerStep2InferenceEngine() {} APP_ERROR ContainerStep2InferenceEngine::Init() { strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0"; this->modelConfig_ = Config::getins()->getModelByContainerStep2Config(); //读取模型信息 int iFolderExist = access(modelConfig_.strModelPath.c_str(), R_OK); if (iFolderExist == -1) { LogError << "模型:" << modelConfig_.strModelPath << " 不存在!"; return false; } class_num = this->modelConfig_.vecClass.size(); score_threshold = this->modelConfig_.fScoreThreshold; input_size = GET_INPUT_SIZE(model_width , model_height); output_size = GET_OUTPUT_SIZE(model_width, model_height, clear_num, class_num); det_size = clear_num + class_num + 5; int ret = initModel(); if (ret != APP_ERR_OK) { LogError << "Failed to read model info, ret = " << ret; return ret; } LogInfo << "ContainerStep2InferenceEngine Init ok"; return APP_ERR_OK; } APP_ERROR ContainerStep2InferenceEngine::initModel() { modelinfo.yolov5ClearityModelParam.uiClassNum = class_num; modelinfo.yolov5ClearityModelParam.uiClearNum = clear_num; modelinfo.yolov5ClearityModelParam.uiDetSize = det_size; modelinfo.yolov5ClearityModelParam.fScoreThreshold = score_threshold; modelinfo.yolov5ClearityModelParam.fNmsThreshold = nms_threshold; modelinfo.modelCommonInfo.uiModelWidth = model_width; modelinfo.modelCommonInfo.uiModelHeight = model_height; modelinfo.modelCommonInfo.uiInputSize = input_size; modelinfo.modelCommonInfo.uiOutputSize = output_size; modelinfo.modelCommonInfo.uiChannel = INPUT_CHANNEL; modelinfo.modelCommonInfo.uiBatchSize = batch_size; modelinfo.modelCommonInfo.strInputBlobName = INPUT_BLOB_NAME; modelinfo.modelCommonInfo.strOutputBlobName = OUTPUT_BLOB_NAME; string strModelName; int nRet = yolov5model.YoloV5ClearityInferenceInit(&modelinfo, strModelName, this->modelConfig_.strModelPath); if (nRet != 0) { LogInfo << "YoloV5ClassifyInferenceInit nRet:" << nRet; return APP_ERR_COMM_READ_FAIL; } return APP_ERR_OK; } APP_ERROR ContainerStep2InferenceEngine::DeInit() { yolov5model.YoloV5ClearityInferenceDeinit(); LogInfo << "ContainerStep2InferenceEngine DeInit ok"; return APP_ERR_OK; } void ContainerStep2InferenceEngine::resetLocation(SingleData &singleData, SingleData &step1SingleData, float fResizeRatio) { singleData.fLTX = singleData.fLTX * fResizeRatio + step1SingleData.fLTX; singleData.fLTY = singleData.fLTY * fResizeRatio + step1SingleData.fLTY; singleData.fRBX = singleData.fRBX * fResizeRatio + step1SingleData.fLTX; singleData.fRBY = singleData.fRBY * fResizeRatio + step1SingleData.fLTY; singleData.fLTX = (singleData.fLTX < IMAGE_WIDTH) ? singleData.fLTX : IMAGE_WIDTH; singleData.fLTY = (singleData.fLTY < IMAGE_HEIGHT) ? singleData.fLTY : IMAGE_HEIGHT; singleData.fRBX = (singleData.fRBX < IMAGE_WIDTH) ? singleData.fRBX : IMAGE_WIDTH; singleData.fRBY = (singleData.fRBY < IMAGE_HEIGHT) ? singleData.fRBY : IMAGE_HEIGHT; } APP_ERROR ContainerStep2InferenceEngine::Process() { int iRet = APP_ERR_OK; while (!isStop_) { std::shared_ptr pVoidData0 = nullptr; inputQueMap_[strPort0_]->pop(pVoidData0); if (nullptr == pVoidData0) { usleep(1000); //1ms continue; } std::shared_ptr pInferenceResultData = std::static_pointer_cast(pVoidData0); std::shared_ptr pVStep2OutputData = std::make_shared(); pVStep2OutputData->iDataSource = pInferenceResultData->iDataSource; pVStep2OutputData->bIsEnd = pInferenceResultData->bIsEnd; pVStep2OutputData->strDetectDate = pInferenceResultData->strDetectDate; pVStep2OutputData->strDetectTime = pInferenceResultData->strDetectTime; pVStep2OutputData->cvImage = pInferenceResultData->cvImage; if (pInferenceResultData->bIsEnd) { outputQueMap_[strPort0_]->push(std::static_pointer_cast(pVStep2OutputData), true); continue; } pVStep2OutputData->strDetectDate = pInferenceResultData->strDetectDate; pVStep2OutputData->strDetectTime = pInferenceResultData->strDetectTime; pVStep2OutputData->iFrameId = pInferenceResultData->iFrameId; // LogWarn << "-- 0 -->" << pVStep2InputData->vecSingleData.size(); for (auto & single : pInferenceResultData->vecSingleData) { Step2ResultData step2ResultData; step2ResultData.fLTX = single.fLTX; step2ResultData.fLTY = single.fLTY; step2ResultData.fRBX = single.fRBX; step2ResultData.fRBY = single.fRBY; step2ResultData.iClassId = single.iClassId; step2ResultData.fScore = single.fScore; step2ResultData.iTrainIndex = single.iTrainIndex; if (single.iTargetType == CORNER) { pVStep2OutputData->vecCornerResultData.emplace_back(step2ResultData); continue; }; } if (pInferenceResultData->singleData.fScore > 0.0f) { pVStep2OutputData->step2ResultData.fLTX = pInferenceResultData->singleData.fLTX; pVStep2OutputData->step2ResultData.fLTY = pInferenceResultData->singleData.fLTY; pVStep2OutputData->step2ResultData.fRBX = pInferenceResultData->singleData.fRBX; pVStep2OutputData->step2ResultData.fRBY = pInferenceResultData->singleData.fRBY; pVStep2OutputData->step2ResultData.iClassId = pInferenceResultData->singleData.iClassId; pVStep2OutputData->step2ResultData.fScore = pInferenceResultData->singleData.fScore; pVStep2OutputData->step2ResultData.iTrainIndex = pInferenceResultData->singleData.iTrainIndex; cv::Rect rect(cv::Point(pInferenceResultData->singleData.fLTX, pInferenceResultData->singleData.fLTY), cv::Point(pInferenceResultData->singleData.fRBX, pInferenceResultData->singleData.fRBY)); cv::Mat image = pInferenceResultData->cvImage(rect).clone(); //进行推理 std::vector vecInferenceResult; auto start = std::chrono::system_clock::now(); // 计时开始 yolov5model.YoloV5ClearityInferenceModel(image, vecInferenceResult, 2); auto end = std::chrono::system_clock::now(); for (const auto & j : vecInferenceResult) { if (j.class_conf < STEP2_SCORE_THRESH) { continue; } SingleData singledata; singledata.iLine = j.clear_id; singledata.iClassId = j.class_id; singledata.fScore = j.class_conf; singledata.fLTX = j.bbox[0]; singledata.fLTY = j.bbox[1]; singledata.fRBX = j.bbox[2]; singledata.fRBY = j.bbox[3]; this->resetLocation(singledata, pInferenceResultData->singleData); pVStep2OutputData->step2ResultData.vecSingleData.emplace_back(singledata); // LogDebug << "frameId:" << pVStep2OutputData->iFrameId // << " --iClassId:" << singledata.iClassId // << " iLine:" << singledata.iLine // << " score=" << singledata.fScore // << " [" // << singledata.fLTX << "," << singledata.fLTY // << "],[" // << singledata.fRBX << "," << singledata.fRBY // << "]"; } } outputQueMap_[strPort0_]->push(std::static_pointer_cast(pVStep2OutputData), true); } return APP_ERR_OK; } \ No newline at end of file