|
@@ -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;
|