瀏覽代碼

修改: lib/libgsd_modules.so
修改: modules/InfineFilter/src/InfineFilter.cpp
修复相似库引发段错误的bug

Your Name 2 年之前
父節點
當前提交
2de506a80a
共有 2 個文件被更改,包括 102 次插入12 次删除
  1. 二進制
      lib/libgsd_modules.so
  2. 102 12
      modules/InfineFilter/src/InfineFilter.cpp

二進制
lib/libgsd_modules.so


+ 102 - 12
modules/InfineFilter/src/InfineFilter.cpp

@@ -4,7 +4,7 @@
  * @Autor: lishengyin
  * @Autor: lishengyin
  * @Date: 2022-03-09 10:58:34
  * @Date: 2022-03-09 10:58:34
  * @LastEditors: lishengyin
  * @LastEditors: lishengyin
- * @LastEditTime: 2022-09-09 15:25:51
+ * @LastEditTime: 2022-09-09 17:07:34
  */
  */
 #include "InfineFilter.hpp"
 #include "InfineFilter.hpp"
 
 
@@ -32,7 +32,7 @@ namespace gsd
         // 过滤小目标
         // 过滤小目标
         MinBBoxFilter(cnStreamInferData);
         MinBBoxFilter(cnStreamInferData);
 
 
-        switch (sensitivity)
+        switch (filterLevel)
         {
         {
         case 0:
         case 0:
             result = OK;
             result = OK;
@@ -46,7 +46,7 @@ namespace gsd
         case 3:
         case 3:
             result = this->LastOneJudgment(cnStreamInferData);
             result = this->LastOneJudgment(cnStreamInferData);
             if(result == ERR) break;
             if(result == ERR) break;
-            result = this->HistoricalJudgment(cnStreamInferData);
+            this->SimilarityJudgment(cnStreamInferData);
             break;
             break;
         default:
         default:
             break;
             break;
@@ -90,7 +90,8 @@ namespace gsd
         // if(difference > 10) return ERR;
         // if(difference > 10) return ERR;
         // difference = fabs(infer1.BBox.h  - infer2.BBox.h );
         // difference = fabs(infer1.BBox.h  - infer2.BBox.h );
         // if(difference > 10) return ERR;
         // if(difference > 10) return ERR;
-        if(this->getIou(infer1, infer2, cnStreamInferData) < 0.5) return ERR;
+        auto result = this->getIou(infer1, infer2, cnStreamInferData);
+        if(result < 0.5) return ERR;
         return OK;
         return OK;
     }
     }
 
 
@@ -223,7 +224,7 @@ namespace gsd
      * @return {*}
      * @return {*}
      */
      */
     void InfineFilter::HistoricalCheck(){
     void InfineFilter::HistoricalCheck(){
-        if(sensitivity != 3) return;
+        if(filterLevel != 3) return;
         vector<vector<HistoryData>::iterator> ret;
         vector<vector<HistoryData>::iterator> ret;
         for(auto iter = this->HistoryDatas.begin(); iter != this->HistoryDatas.end(); iter++){
         for(auto iter = this->HistoryDatas.begin(); iter != this->HistoryDatas.end(); iter++){
             if(iter->ticker != nullptr && iter->ticker->elapsedTime() > TimeOut){
             if(iter->ticker != nullptr && iter->ticker->elapsedTime() > TimeOut){
@@ -237,21 +238,110 @@ namespace gsd
     }
     }
 
 
     /**
     /**
+     * @description: 相似度对比
+     * @return {*}
+     */        
+    int8_t InfineFilter::SimilarityJudgment(std::shared_ptr<CNStreamInferData>& cnStreamInferData){
+        //this->SimilarityCheck();
+        auto task = [&](){
+            HistoryData historyData;
+            historyData.CnStreamInferData = std::make_shared<CNStreamInferData>();
+            historyData.CnStreamInferData->StreamName = cnStreamInferData->StreamName;
+            historyData.CnStreamInferData->FrameCount = cnStreamInferData->FrameCount;
+            historyData.CnStreamInferData->width = cnStreamInferData->width;
+            historyData.CnStreamInferData->height = cnStreamInferData->height;
+            historyData.CnStreamInferData->Objects = cnStreamInferData->Objects;
+            historyData.CnStreamInferData->videoPath = cnStreamInferData->videoPath;
+            LatestDatas.push(historyData);
+            if(LatestDatas.size() >= 3) LatestDatas.pop();
+        };
+        if(LatestDatas.empty()){
+            task();
+            return OK;
+        }
+        auto iter_front = LatestDatas.front();
+        vector<vector<InferInfo>::iterator> result;
+        bool IsResult = false;
+        // 对比前两帧
+        for(auto iter = cnStreamInferData->Objects.begin(); iter != cnStreamInferData->Objects.end(); iter++){
+            IsResult = false;
+            for(auto iter1 : iter_front.CnStreamInferData->Objects){
+                if(CalculateSimilarity(*iter, iter1, cnStreamInferData) == OK){
+                    SimilarityData data;
+                    data.ticker = std::make_shared<Ticker>();
+                    data.info = *iter;
+                    this->SimilarityDatas.push_back(data);
+                    result.push_back(iter);
+                    IsResult = true;
+                    break;
+                }
+            }
+            if(IsResult) continue;
+            if(LatestDatas.size() <= 1) continue;
+            auto iter_back = LatestDatas.back();
+            for(auto iter1 : iter_back.CnStreamInferData->Objects){
+                if(CalculateSimilarity(*iter, iter1, cnStreamInferData) == OK){
+                    SimilarityData data;
+                    data.ticker = std::make_shared<Ticker>();
+                    data.info = *iter;
+                    this->SimilarityDatas.push_back(data);
+                    result.push_back(iter);
+                    break;
+                }
+            }
+        }
+        for(auto iter = result.begin(); iter != result.end(); iter++){
+            cnStreamInferData->Objects.erase(*iter);
+        }
+        result.clear();
+
+        // 对比相似库
+        for(auto iter = cnStreamInferData->Objects.begin(); iter != cnStreamInferData->Objects.end(); iter++){
+            for(auto iter1 = this->SimilarityDatas.begin(); iter1 != this->SimilarityDatas.end(); iter1++){
+                if(CalculateSimilarity(*iter, iter1->info, cnStreamInferData) == OK){
+                    iter1->info = *iter;
+                    iter1->ticker->resetTime();
+                    result.push_back(iter);
+                    break;
+                }
+            }
+        }
+        // clear
+        for(auto iter = result.begin(); iter != result.end(); iter++){
+            cnStreamInferData->Objects.erase(*iter);
+        }
+        task();
+        return OK;
+    }
+
+    /**
+     * @description: 时间对比
+     * @return {*}
+     */        
+    void InfineFilter::SimilarityCheck(){
+        if(filterLevel != 3) return;
+        for(auto iter = this->SimilarityDatas.begin(); iter != this->SimilarityDatas.end();){
+            if(iter->ticker != nullptr && iter->ticker->elapsedTime() > TimeOut){
+                iter = this->SimilarityDatas.erase(iter);
+            }else iter++;
+        }
+    }
+
+    /**
      * @description: 获取Iou
      * @description: 获取Iou
      * @return {*}
      * @return {*}
      */
      */
     float InfineFilter::getIou(InferInfo infer1, InferInfo infer2,std::shared_ptr<CNStreamInferData>& cnStreamInferData){
     float InfineFilter::getIou(InferInfo infer1, InferInfo infer2,std::shared_ptr<CNStreamInferData>& cnStreamInferData){
-        
-        int max_x = std::max(infer1.BBox.x, infer2.BBox.x);
-        int min_x = std::min(infer1.BBox.x + infer1.BBox.w, infer2.BBox.x + infer2.BBox.w);
-        int max_y = std::max(infer1.BBox.y, infer2.BBox.y);
-        int min_y = std::min(infer1.BBox.y + infer1.BBox.h, infer2.BBox.y + infer2.BBox.h);
+        int max_x = std::max(infer1.BBox.x * cnStreamInferData->width, infer2.BBox.x * cnStreamInferData->width);
+        int min_x = std::min((infer1.BBox.x  + infer1.BBox.w) * cnStreamInferData->width , (infer2.BBox.x + infer2.BBox.w) * cnStreamInferData->width);
+        int max_y = std::max(infer1.BBox.y * cnStreamInferData->height, infer2.BBox.y * cnStreamInferData->height);
+        int min_y = std::min((infer1.BBox.y + infer1.BBox.h) * cnStreamInferData->height, (infer2.BBox.y + infer2.BBox.h) * cnStreamInferData->height);
         if(min_x <= max_x || min_y <= max_y) return 0;
         if(min_x <= max_x || min_y <= max_y) return 0;
 
 
         float over_area = (min_x - max_x) * (min_y - max_y);  // 计算重叠面积
         float over_area = (min_x - max_x) * (min_y - max_y);  // 计算重叠面积
         
         
-        float area_a = (infer1.BBox.w) * (infer1.BBox.h);
-        float area_b = (infer2.BBox.w) * (infer2.BBox.h);
+        float area_a = (infer1.BBox.w * cnStreamInferData->width) * (infer1.BBox.h * cnStreamInferData->height);
+        float area_b = (infer2.BBox.w * cnStreamInferData->width) * (infer2.BBox.h * cnStreamInferData->height);
 
 
         float iou = over_area / (area_a + area_b - over_area);
         float iou = over_area / (area_a + area_b - over_area);
         return iou;
         return iou;