# abandoned-object-detection-algo ## 基于双背景混合高斯建模的遗留物检测 ### 混合高斯建模 ##### 基本原理: 假设数据由多个高斯分布的线性组合生成; 在视频图像中,利用一定数量的帧图像,为每个像素初始化**由多个高斯分布线性组合的模型**; 对于每个新的检测帧,通过比对与初始化模型差异,判断是否属于**前景**,再根据策略进行**背景更新** ##### 双背景建模: 图中左边部分描述了双背景建模、前景检测以及遗留物提取的过程 长时间背景(Long-Term background):预设较慢的更新速度,使得大部分新增加的物体都会被认为是前景; 短时间背景(Short-Term background):预设较快的更新速度,使得短暂静止的物体不会被检测为前景; 两者之差就认为是遗留物 ![alt text](image.png) ##### 背景建模基本参数: ```cpp double short_term_rate = 0.01; // short-term 更新速度 int short_term_history = 200; // short-term history 初始化所采用的帧数 double long_term_rate = 0.0005; // long-term 更新速度 int long_term_history = 5000; // long-term history 初始化所采用的帧数 ``` ##### 遗留物判断逻辑: 将每一个从双背景消除中提取出来的前景物,绘制一个候选框 为每一个候选框构建以下结构体 ```cpp struct proposal{ int x, y, w, h; int life; // 生命周期,以帧为单位 int status; // 状态,用于处理 }; ``` 1. 初始化proposal list; 2. 出现新的proposal时,设定life=10, status=0; 3. 将该proposal与list中的每个候选框进行iou匹配: ​ if iou < iou_threshold: ​ set proposal.status = -1;认为有重复 ​ list[i].life++; list中重叠的候选框life+1,即重复出现一帧 ​ if list[i].status==2: ​ continue; 表明该框曾经被判定为遗留物,不需要再次检测 ​ else: set list[i].status = 1;表明该框处于活跃状态 if proposal.status==0; ​ list.push(proposal); 4. 遍历list: if list[i].status==1 and list[i].life > life_threshold: 认为该框存在一定时间,视为遗留物 ​ detect(list[i]); ​ list[i].status=2; else: ​ list[i].life-- ​ if list[i].life==0: 认为该框不活跃,即没有重复出现该候选框 ​ list.erase(i); 移除