精华内容
下载资源
问答
  • 运动物体检测算法
    千次阅读
    更多相关内容
  • 主要为大家详细介绍了基于OpenCv的运动物体检测算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 基于机器学习的运动物体检测算法
  • Vibe算法是一种基于背景更新的前景检测算法,其原理是通过提取像素点(x, y)周围的像素值及以前的像素值建立像素点的样本集,然后再将另一帧(x,y)处的像素值与样本集中的像素值进行比较,如果其与样本集中的像素...
  • 运动目标的检测与跟踪已在众多的领域得到了广泛的应用,但是由于嵌入式处理器自身的速度限制,此类应用主要集中在PC机上,相对来说,成本较高而且灵活性和移动性能不够好。将此算法应用到嵌入式系统上能有效地降低...
  • 基于跟踪的运动物体检测
  • 运动物体检测

    千次阅读 2018-08-24 09:50:51
    ,在摄像机固定的情况下,背景的变化是缓慢的,而且大都是光照,风等等的影响,通过对背景建模,对一幅给定图像分离前景和背景,一般来说,前景就是运动物体,从而达到运动物体检测的目的。  单分布高斯背景模型 ...

    http://www.cnblogs.com/yingying0907/archive/2012/07/22/2603452.html

    混合高斯模型原理


        混合高斯模型跟高斯变量之和看起来有一点像, 注意不要把它们弄混淆了. 混合高斯模型给出的概率密度函数实际上是几个高斯概率密度函数的加权和:

    p(x) = /sum_{i=1}^n p_i N(x; /bar{x}_i, P_i)

    其中/sum_{i=1}^np_i = 1 . 定义事件A_i = /{x /sim N(/bar{x}_i, P_i)/} , 则/mathbb{P}/{A_i/} = p_i . 据此可以产生服从上述混合高斯概率密度分布的样本.

    混合分布的均值为

    /bar{x} = /sum_{i=1}^n p_i /bar{x}_i

    方差为

    /mathbb{E}((x - /bar{x})(x - /bar{x})') =  /sum_{i=1}^n p_i P_i + /sum_{i=1}^n p_i /bar{x}_i /bar{x}_i' -  /bar{x}/bar{x}'

    计算均值和方差的公式不仅适用于几个(多维)高斯分布混合的情况, 还适用于非高斯分布的情况.

    高斯变量之和就没什么好说的了, 几个高斯变量之和是一个新的高斯变量.

     

    高斯背景模型在 运动检测中的应用


         原理 : 高斯模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。
        对图像背景建立高斯模型的原理及过程:图像灰度直方图反映的是图像中某个灰度值出现的频次,也可以认为是图像灰度概率密度的估计。如果图像所包含的目标区域和背景区域相比比较大,且背景区域和目标区域在灰度上有一定的差异,那么该图像的灰度直方图呈现双峰-谷形状,其中一个峰对应于目标,另一个峰对应于背景的中心灰度。对于复杂的图像,尤其是医学图像,一般是多峰的。通过将直方图的多峰特性看作是多个高斯分布的叠加,可以解决图像的分割问题。

        在智能监控系统中,对于运动目标的检测是中心内容,而在运动目标检测提取中,背景目标对于目标的识别和跟踪至关重要。而建模正是背景目标提取的一个重要环节。

        我们首先要提起背景和前景的概念,前景是指在假设背景为静止的情况下,任何有意义的运动物体即为前景。建模的基本思想是从当前帧中提取前景,其目的是使背景更接近当前视频帧的背景。即利用当前帧和视频序列中的当前背景帧进行加权平均来更新背景,但是由于光照突变以及其他外界环境的影响,一般的建模后的背景并非十分干净清晰,而高斯混合模型是是建模最为成功的方法之一。

         混合高斯模型使用K(基本为3到5个)个高斯模型来表征图像中各个像素点的特征,在新一帧图像获得后更新混合高斯模型, 用当前图像中的每个像素点与混合高斯模型匹配,如果成功则判定该点为背景点, 否则为前景点。 通观整个高斯模型,主要是有方差和均值两个参数决定,对均值和方差的学习,采取不同的学习机制,将直接影响到模型的稳定性、精确性和收敛性 。由于我们是对运动目标的背景提取建模,因此需要对高斯模型中方差和均值两个参数实时更新。为提高模型的学习能力,改进方法对均值和方差的更新采用不同的学习率;为提高在繁忙的场景下,大而慢的运动目标的检测效果,引入权值均值的概念,建立背景图像并实时更新,然后结合权值、权值均值和背景图像对像素点进行前景和背景的分类。

           到这里为止,混合高斯模型的建模基本完成,我在归纳一下其中的流程,首先初始化预先定义的几个高斯模型,对高斯模型中的参数进行初始化,并求出之后将要用到的参数。其次,对于每一帧中的每一个像素进行处理,看其是否匹配某个模型,若匹配,则将其归入该模型中,并对该模型根据新的像素值进行更新,若不匹配,则以该像素建立一个高斯模型,初始化参数,代理原有模型中最不可能的模型。最后选择前面几个最有可能的模型作为背景模型,为背景目标提取做铺垫。

     

        方法: 目前,运动物体检测的问题主要分为两类,摄像机固定和摄像机运动。对于摄像机运动的运动物体检测问题,比较著名的解决方案是光流法,通过求解偏微分方程求的图像序列的光流场,从而预测摄像机的运动状态。对于摄像机固定的情形,当然也可以用光流法,但是由于光流法的复杂性,往往难以实时的计算,所以我采用高斯背景模型。因为,在摄像机固定的情况下,背景的变化是缓慢的,而且大都是光照,风等等的影响,通过对背景建模,对一幅给定图像分离前景和背景,一般来说,前景就是运动物体,从而达到运动物体检测的目的。
      单分布高斯背景模型
      单分布高斯背景模型认为,对一个背景图像,特定像素亮度的分布满足高斯分布,即对背景图像B, (x,y)点的亮度满足:
      IB (x,y) ~ N(u,d)
      这样我们的背景模型的每个象素属性包括两个参数:平均值u 和 方差d。
      对于一幅给定的图像G,如果 Exp(-(IG (x,y)-u(x,y))^2/(2*d^2)) > T,认为(x,y)是背景点,反之是前景点。
      同时,随着时间的变化,背景图像也会发生缓慢的变化,这时我们要不断更新每个象素点的参数
      u(t+1,x,y) = a*u(t,x,y) + (1-a)*I(x,y)
      这里,a称为更新参数,表示背景变化的速度,一般情况下,我们不更新d(实验中发现更不更新 d,效果变化不大)。

    openCV中高斯混合模型的应用

     

      高斯混合模型是用于背景提取的方法,OpenCV的cvaux中 cvbgfg_gaussmix.cpp文件根据文献"An improved adaptive background mixture model for real-time tracking with shadow"中提供的方法编写了高斯混合模型函数。其中定义了CvGaussBGModel类用于存放高斯混合模型的各个参数。我用OpenCV使用高斯混合模型函数分以下几步:
      1。需要用到 icvUpdateGaussianBGModel,icvReleaseGaussianBGModel两个函数,但是源程序中将这两个函数定义为内部函数,需要做一些修改,首先将cvbgfg_gaussmix.cpp中前面两个函数的声明static void CV_CDECL icvReleaseGaussianBGModel( CvGaussBGModel** bg_model );
    static int CV_CDECL icvUpdateGaussianBGModel( IplImage* curr_frame, CvGaussBGModel* bg_model );两行代码注释掉。然后在cvbgfg_gaussmix.cpp中间部分两个函数的定义部分,函数头static int和static void改成CV_IMPL int 和CV_IMPL void。最后在cvaux.h文件中CVAPI(CvBGStatModel*) cvCreateGaussianBGModel( IplImage* first_frame,
      CvGaussBGStatModelParams* parameters CV_DEFAULT(NULL));这句后面加上以下两句CVAPI(void) icvReleaseGaussianBGModel( CvGaussBGModel** bg_model );
      CVAPI(int) icvUpdateGaussianBGModel( IplImage* curr_frame, CvGaussBGModel* bg_model );
      程序修改完毕,点rebuild all,全部重新编译。
      2。在程序初始化部分定义高斯混合模型参数CvGaussBGModel* bg_model=NULL;在读取第一帧图像(背景图像)时,进行高斯背景建模bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(image, 0);image可以是灰度图象也可以是彩色图像。接下来再读取当前帧时,更新高斯模型
       regioncount=icvUpdateGaussianBGModel(currframe, bg_model );regioncount的含义我不确定,我理解是代表背景中不同颜色区域的个数,这个参数我没有用到,它只是 icvUpdateGaussianBGModel函数的返回值。
      3。现在bg_model已经保存了经过高斯混合模型分类后的结果,bg_model->background保存了背景图像,bg_model->foreground保存了前景图像。

    [cpp] view plaincopyprint?

      1.   include <stdio.h>  
      2.   #include <cv.h>  
      3.   #include <cxcore.h>  
      4.   #include <highgui.h>  
      5.   #include <cvaux.h>//必须引此头文件   
      6.   int main( int argc, char** argv )  
      7.   {  
      8.   IplImage* pFrame = NULL;    
      9.   IplImage* pFrImg = NULL;  
      10.   IplImage* pBkImg = NULL;    
      11.   CvCapture* pCapture = NULL;    
      12.   int nFrmNum = 0;  
      13.   cvNamedWindow("video", 1);  
      14.   cvNamedWindow("background",1);  
      15.   cvNamedWindow("foreground",1);    
      16.   cvMoveWindow("video", 30, 0);  
      17.   cvMoveWindow("background", 360, 0);  
      18.   cvMoveWindow("foreground", 690, 0);  
      19.   if( argc > 2 )    
      20.   {     
      21.   fprintf(stderr, "Usage: bkgrd [video_file_name]/n");     
      22.   return -1;    
      23.   }  
      24.   //打开视频文件   
      25.   if(argc == 2)    
      26.   if( !(pCapture = cvCaptureFromFile(argv[1])))     
      27.   {    
      28.   fprintf(stderr, "Can not open video file %s/n", argv[1]);    
      29.   return -2;     
      30.   }  
      31.   //打开摄像头   
      32.   if (argc == 1)    
      33.   if( !(pCapture = cvCaptureFromCAM(-1)))     
      34.   {    
      35.   fprintf(stderr, "Can not open camera./n");    
      36.   return -2;     
      37.   }    
      38.   //初始化高斯混合模型参数   
      39.   CvGaussBGModel* bg_model=NULL;  
      40.   while(pFrame = cvQueryFrame( pCapture ))    
      41.   {     
      42.   nFrmNum++;           
      43.   if(nFrmNum == 1)    
      44.   {     
      45.   pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,3);    
      46.   pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);     
      47.   //高斯背景建模,pFrame可以是多通道图像也可以是单通道图像   
      48.   //cvCreateGaussianBGModel函数返回值为 CvBGStatModel*,   
      49.   //需要强制转换成CvGaussBGModel*   
      50.   bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame, 0);  
      51.   }     
      52.   else  
      53.   {     
      54.   //更新高斯模型   
      55.   cvUpdateBGStatModel(pFrame, (CvBGStatModel *)bg_model );  
      56.   //pFrImg为前景图像,只能为单通道   
      57.   //pBkImg为背景图像,可以为单通道或与pFrame通道数相同   
      58.   cvCopy(bg_model->foreground,pFrImg,0);  
      59.   cvCopy(bg_model->background,pBkImg,0);  
      60.   //把图像正过来   
      61.   pBkImg->origin=1;  
      62.   pFrImg->origin=1;  
      63.   cvShowImage("video", pFrame);     
      64.   cvShowImage("background", pBkImg);     
      65.   cvShowImage("foreground", pFrImg);        
      66.   if( cvWaitKey(2) >= 0 )       
      67.   break;     
      68.   }     
      69.   }  
      70.   //释放高斯模型参数占用内存     
      71.    cvReleaseBGStatModel((CvBGStatModel**)&bg_model);  
      72.   cvDestroyWindow("video");  
      73.   cvDestroyWindow("background");  
      74.   cvDestroyWindow("foreground");    
      75.   cvReleaseImage(&pFrImg);  
      76.   cvReleaseImage(&pBkImg);    
      77.   cvReleaseCapture(&pCapture);    
      78.   return 0;  
      79.   }  
    展开全文
  • 运动物体检测以及追踪

    万次阅读 多人点赞 2018-02-23 23:34:48
    概括:运动物体检测是应用差分法实现,运动物体追踪是利用基于时间序列预测模型实现。 运动物体检测 常用的检测方法为背景减除法和帧差法,这两种方法原理基本上都是图片相减。两种方法各有优缺点: 帧差法适用...

    概括:运动物体检测是应用差分法实现,运动物体追踪是利用基于时间序列预测模型实现。
    ##运动物体检测
    常用的检测方法为背景减除法和帧差法,这两种方法原理基本上都是图片相减。两种方法各有优缺点:

    帧差法适用于更多场景,如:摄像头移动以及多目标运动场景,缺点就是检测的人物之间容易出现空洞。
    背景减除法,适用场景局限,只适用于第一帧是背景图的视频,但检测人物没有空洞。
    以上这两种方法均不能很好的处理光照过强以及阴影的运动物体视频。

    物体检测方法还有许多,有基于图像相减的三帧差法,还有对于电脑性能要求较高的光流法。


    效果

    背景减除法:(人物没有出现空洞现象,但对于光照过强区域效果不好)
    这里写图片描述
    帧差法:(人物出现空洞,对下一步处理造成影响)
    这里写图片描述

    运动物体追踪

    之前一直对每一帧检测的运动物体进行标志就以为达到了追踪,但实时检测标志并不是追踪,若在多目标运动物体中没有做到区分不同的目标,就不算是追踪。

    追踪思路

    这里写图片描述
    1.对每一帧进行运动目标检测
    2.对检测到的物体进行判断,判断是否是存在的运动目标,是则添加运动轨迹,不是则当作新的目标。
    3.画出运动轨迹等
    如何判断当前已检测到的目标是否是已经存在的运动目标?
    这里我刚开始选取的是简单的轮廓面积已经轮廓外接矩形等特征,因为轮廓获得的不稳定,显然效果不是很好。这里采用的是预测模型,在上一篇鼠标运动的预测中。简单来说就是用检测到的运动目标与预测的位置进行比较,若在一定误差内就算追踪成功。

    运动视频下载

    网上有很多的视频库,我下载视频库的链接

    代码

    头文件

    #pragma once
    #ifndef TrackObject
    #define TrackObject
    #include<opencv2\opencv.hpp>
    #include<iostream>
    using namespace std;
    using namespace cv;
    class Blob {
    public:
    	vector<Point>_contour;
    	vector<Point>centerPos;
    	Point preditNextCenter;
    	Point currentCenter;//first
    	Rect currentRect;//first
    	double currentArea;//first
    	double currentRate;//first
    	//bool isStillBeTracked;//是否还在被跟踪
    	//int FramesWithoutMatched;
    	Blob(vector<Point>con);
    	void Predit();
    	
    };
    #endif // !TrackObject
    
    

    Main

    //问题:由于光照的影响很不稳定(对于寻找的轮廓),光照补偿(解决阴影)和去除光照
    
    
    
    #include "ObjectTrack.h"
    double DistanceBetwwenPoint(Point p1,Point p2)
    {
    	int x =abs(p1.x - p2.x);
    	int y = abs(p1.y - p2.y);
    	double res = sqrt(pow(x, 2)) + sqrt(pow(y, 2));
    	//cout << "距离为:" << res << endl;
    	return res;
    	//sqrt(里面参数接受为double型)
    }
    vector<Blob>Blobs;
    int main()
    {
    	VideoCapture  cap("Walk1.mpeg");//这个视频有轻微抖动现象,利用高斯滤波
    	//int framenum = cap.get(CAP_PROP_POS_FRAMES);
    	
    	if (!cap.isOpened()) { cout << "读取视频错误" << endl; return 0; }
    	Mat cur, pre;
    	cap >> pre;
    	GaussianBlur(pre,pre,Size(3,3),0.8);
    	cvtColor(pre,pre,CV_BGR2GRAY);
    
    	while (1)
    	{
    		cap >> cur;
    
    		if (cur.empty()) { break; }//作用相当于判断是否到达视频最后一帧
    
    		GaussianBlur(cur,cur,Size(3,3),0.8);
    		cvtColor(cur,cur,CV_BGR2GRAY);
    
    		/*具体实现步骤*/
    		//1.背景减除法检测运动物体
    		Mat df;//difference frame
    		absdiff(cur, pre,df );
    		threshold(df,df,70,255,CV_THRESH_BINARY);
    		vector<vector<Point>>contours;//找到的轮廓均存在contours
    		findContours(df,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
    
    		vector<Blob>possibleBlobs;
    		
    		for (size_t i = 0; i < contours.size(); i++)
    		{//筛选出可能的目标对象,根据视频中的背景设置筛选条件
    			Blob tem(contours[i]);
    			//if (tem.currentArea > 60&&tem.currentRate<1.0) {
    			if (tem.currentArea > 100) {
    				possibleBlobs.push_back(tem);
    				
    			}
    		}
    		cout << "每次检测出来的possible个数" << possibleBlobs.size() << endl;
    
    		/*
    		2.跟踪队列为空则直接把possibleBlob全部放入跟踪队列
    		其他则进行判断,判断是已有的跟踪对象,则把中心点推入已有的跟踪对象,
    		若是新的跟踪对象直接放入跟踪队列里
    		*/
    		if (Blobs.size()==0) {//跟踪队列为空
    			for (auto &c : possibleBlobs)
    			{
    				Blobs.push_back(c);
    			}
    			cout << "目标队列为空时第一次加入目标队列追踪的个数"<<Blobs.size() << endl;
    		}
    		else {
    			for (auto &tem : Blobs)
    			{
    				tem.Predit();
    			}
    			/*
    			3.选作什么作为不同的跟踪目标之间的区分呢
    			首先尝试过直接利用已找到的轮廓作为区分,例如轮廓的面积和轮廓外界矩形特征等,但是区分效果很不好
    			这里利用的是鼠标运动检测中的预测目标点,若预测的目标点小于规定值则认为是同一个目标。
    
    			*/
    			for (auto &tem : possibleBlobs)
    			{
    				int flag = false;
    				for (auto &target : Blobs)
    				{
    					if (DistanceBetwwenPoint(tem.currentCenter, target.preditNextCenter) <50.0 )
    					{
    						target.centerPos.push_back(tem.currentCenter);
    						flag = true;
    						break;
    					}
    				}
    
    				if (flag == false)Blobs.push_back(tem);//作为新目标被跟踪
    			}
    		}
    		/*for (auto &tem : possibleBlobs)
    		{//不正确的写法
    		int flag = false;//匹配标志
    		for (auto &exist : Blobs)
    		{
    		if (abs(tem.currentArea - exist.currentArea) <= scale && abs(tem.currentRate - exist.currentRate) <= scale)
    		{
    		exist.centerPos.push_back(tem.currentCenter);
    		flag = true;
    		break;
    		}
    		}
    		if (flag == false)Blobs.push_back(tem);
    		}*/
    
    		
    		
    		cout <<"追踪对象有:"<< Blobs.size() << endl;
    		for (int i = 0; i < Blobs.size(); i++)
    		{
    			int size = Blobs[i].centerPos.size();
    			cout << "第" << i << "个追踪对象内的centerPos点数:" << size << endl;
    			
    			for (int k= 0;k < size; k++)
    			{
    				circle(cur, Blobs[i].centerPos[k],1,Scalar(255,0,0),1,8);
    			}
    			
    			if (size == 1)
    			{
    				rectangle(cur, Blobs[i].currentRect, Scalar(255, 0, 0), 1, 8);
    			}
    			else
    			{
    				Point p1;
    				p1.x = Blobs[i].centerPos[size - 1].x - Blobs[i].currentRect.width*0.5;
    				p1.y= Blobs[i].centerPos[size - 1].y - Blobs[i].currentRect.height*0.5;
    				Rect rect(p1.x,p1.y,Blobs[i].currentRect.width,Blobs[i].currentRect.height);
    				rectangle(cur, rect, Scalar(255, 0, 0), 1, 8);
    			}
    			
    		}
    		//drawContours(cur,contours,-1,Scalar(255,0,0),1,8);
    		imshow("df",df);
    		imshow("cur",cur);
    		//pre=cur;//加上这一句就是帧差法
    		if (waitKey(100) == 27)break;//或者当前的帧数是最后一帧,采用判断当前读取的帧数是否非空即可
    	}
    	cap.release();
    	destroyAllWindows();
    	system("pause");
    	return 0;
    }
    
    
    
    

    其中cpp文件里有初始化和预测函数,预测方法与鼠标移动预测类似,所以就不贴了。

    效果

    这里写图片描述

    展开全文
  • 大数据-算法-视频桩考系统中运动物体检测与跟踪算法研究.pdf
  • 复杂场景下运动物体检测与跟踪算法的研究.pdf
  • 基于Vibe算法运动物体检测(Visual Studio完整工程及仿真视频) Matlab前景目标提取(四个场景)1)静态背景、动态背景的前景目标提取,能在背景复杂化的条件下,将运动的目标;2)带抖动视频;3)静态背景下多...
  • YOLO,是目前速度更快的物体检测算法之一。虽然它不再是最准确的物体检测算法,但当您需要实时检测时,它是一个非常好的选择,而不会损失太多的准确性。 Darknet-53 YOLO v2 使用自定义的深度架构 darknet-19,这是...

    @Author:Runsen

    YOLO,是目前速度更快的物体检测算法之一。虽然它不再是最准确的物体检测算法,但当您需要实时检测时,它是一个非常好的选择,而不会损失太多的准确性。

    YOLO 框架

    在本篇博客中,我将介绍 YOLO 在给定图像中检测对象所经过的步骤。

    • YOLO 首先获取输入图像:

    然后框架将输入图像划分为网格(比如 3 X 3 网格):

    图像分类和定位分别应用于每个网格,然后 YOLO 预测边界框及其对应的对象类别概率。

    因此,下一步的方法是将标记数据传递给模型以对其进行训练。假设已将图像划分为大小为 3 X 3 的网格,并且存在有 3 个希望将对象分类的类。

    假设这些类分别是 Pedestrian行人、Car 和 Motorcycle摩托车。对于每个网格单元,标签 y 将是一个八维向量:

    • pc定义对象是否存在于网格中(这是概率)
    • bx , by , bh , bw指定边界框,如果有对象
    • c1、c2、c3表示类别。因此,如果对象是汽车,则 c2将为 1,c1 和 c3将为 0

    从上面的例子中选择了第一个网格:

    由于此网格中没有对象,因此 pc 将为零,此网格的 y 标签为

    这里, ‘?’ 是没有的意思。

    采用另一个网格,其中这里有一辆汽车 (c2 = 1):

    在我们为这个网格编写 y 标签之前,首先要知道 YOLO 如何确定网格中是否确实存在对象。在最上面图中,有两个对象(两辆车),因此 YOLO 将取这两个对象的中点,并将这些对象分配到包含这些对象中点的网格。上面的 y 标签将是:


    由于此网格中有一个对象,因此 p c 将等于 1。 bx、 by、 bh、 bw将相对于正在处理的特定网格单元。由于汽车是第二类,c2 = 1 且 c1和 c3 = 0。因此,对于9个网格中的每一个,将有一个八维输出向量。此输出的形状为 3 X 3 X 8。

    所以现在我们有一个输入图像,它是对应的目标向量。使用上面的例子(输入图像 – 100 X 100 X 3,输出 – 3 X 3 X 8),模型将训练如下:

    在测试阶段,我们将图像传递给模型并运行前向传播,直到我们得到输出 y。在这里使用 3 X 3 网格进行了解释,但通常在实际场景中采用更大的网格(一般是 19 X 19)。

    如何得到编码边界框?

    bx、 by、 bh和 bw是相对于正在处理的网格单元计算的。

    下面通过一个例子来理解这个概念。考虑包含汽车的中右网格:

    bx、 by、 bh和bw将仅相对于该网格进行计算。此网格的 y 标签将是:

    pc = 1 因为在这个网格中有一个物体并且它是一辆汽车,所以 c2 = 1。现在,看看怎么确定 bx、 by、 bh和 bw。在YOLO中,分配给所有网格的坐标是:

    bx , by是对象中点相对于该网格的 x 和 y 坐标。在这种情况下,它将是(大约)bx = 0.4 和 by = 0.3:

    bh 是边界框(上例中的红色框)的高度与相应网格单元的高度之比,在例子中约为 0.9。因此,bh = 0.9。bw是边界框的宽度与网格单元格的宽度之比。因此,大约bw = 0.5。此网格的 y 标签将是:

    请注意,bx和 by将始终介于 0 和 1 之间,因为中点始终位于网格内。而 bh和 bw可以大于 1,这样边界框的尺寸大于网格的尺寸。

    如何确定预测的边界框是否给了我们一个好的结果还是一个坏的结果)?判断的方法就是 Intersection over Union ,计算实际边界框和预测结合框的并集的交集。

    Intersection over Union

    在上图,红色框是实际的边界框,蓝色框是预测的边界框。我们如何确定它是否是一个好的预测?IoU ,全称 Intersection over Union,将计算这两个框的并集上的交集面积。该区域将是:

    IoU = 交集面积/并集面积,即 IoU = 黄框面积/绿框面积

    如果 IoU 大于 0.5,我们可以说预测足够好。0.5 是此处采用的任意阈值。

    还有一种技术可以显着提高 YOLO 的输出——Non-Max Suppression。

    因为对象检测算法中,有的对象可能会多次检测到一个对象,而不是只检测一次。比如下图:

    在这里,汽车被多次识别。Non-Max Suppression 技术对此进行了清理,以便我们对每个对象仅进行一次检测。

    Non-Max Suppression首先查看与每个检测相关的概率并取最大的一个。在上图中,0.9 是最高概率,因此将首先选择概率为 0.9 的框:


    现在,它查看图像中的所有其他框。与当前框具有高 IoU 的框被抑制。因此,在上面的图片中,概率为 0.6 和 0.7 的框将被抑制:

    在这些框被抑制后,它从所有具有最高概率的框中选择下一个框,在图片中为 0.8,不断重复这些步骤,直到所有的框都被选中或压缩,得到最终的边界框。

    这就是非最大抑制Intersection over Union。以最大概率取框并以非最大概率抑制附近的框。

    Anchor Boxes

    由于每个网格只能识别一个对象。但是如果一个网格中有多个对象呢?现实中经常是这样。这将我们引向了 Anchor Boxes锚盒的概念。考虑下图,分为 3 X 3 网格:

    取对象的中点并根据其位置将对象分配到相应的网格。在上面的例子中,两个对象的中点位于同一个网格中。

    我们只会得到两个盒子中的一个,要么是汽车,要么是人。但是如果我们使用锚框,可能可以同时输出两个框!

    首先,我们预先定义了两种不同的形状,称为锚盒。对于每个网格,我们将有两个输出,而不是一个输出。我们也可以随时增加锚框的数量。在这里拿了两个来使这个概念易于理解:

    这是没有锚框的 YOLO 的 y 标签的样子:

    如果有 2 个锚框,你认为 y 标签会是什么?我希望你在进一步阅读之前花点时间思考一下。知道了y 标签将是:

    前 8 行属于锚框 1,其余 8 行属于锚框 2。

    根据边界框和锚框形状的相似性将对象分配给锚框。

    由于anchor box 1的形状类似于personbounding box,后者将被分配给anchor box 1,car将被分配给anchor box 2。这种情况下的输出,而不是3 X 3 X 8 ,使用 3 X 3 网格和 3 个类将是 3 X 3 X 16(因为使用了 2 个锚点)。

    因此,对于每个网格,可以根据锚点的数量检测两个或多个对象。

    训练yolo模型的输入显然是图像及其相应的 y 标签。让我们看一个图像如何制作 y 标签:

    考虑使用 3 X 3 网格,每个网格有两个锚点,并且有 3 个不同的对象类。所以对应的 y 标签将有 3 X 3 X 16的形状。现在,假设我们每个网格使用 5 个锚框并且类的数量已经增加到 5。所以目标将是3 X 3 X 10 X 5 = 3 X 3 X 50

    在测试中,新图像将被划分为我们在训练期间选择的相同数量的网格。对于每个网格,模型将预测形状为 3 X 3 X 16 的输出,此预测中的 16 个值将采用与训练标签相同的格式。

    前 8 个值将对应于锚框 1,其中第一个值将是该网格中对象的概率。值 2-5 将是该对象的边界框坐标,最后三个值将告诉我们该对象属于哪个类。接下来的 8 个值将用于锚框 2 并且格式相同,即首先是概率,然后是边界框坐标,最后是类别。

    最后,非最大抑制Intersection over Union技术将应用于预测框以获得每个对象的单个预测。

    展开全文
  • 鉴于传统混合高斯模型背景更新的不足,融合边缘检测、帧间差分,提出一种背景自适应的运动目标检测算法。该算法利用Sobel算子提取图像的边缘信息,采用了三帧差分法把每帧图像分为背景区域、背景暴露区域以及目标...
  • 针对实时视频监控领域中传统的Camshift算法不能有效解决遮挡和高速运动等问题,提出一种改进的Camshift算法与卡尔曼滤波相结合的运动物体跟踪算法。首先,通过二次搜索来调整搜索窗口的位置和大小,保证Camshift跟踪...
  • 为了提升动态场景中视觉里程计的稳健性和精确度,提出一种基于运动物体检测的立体视觉里程计算法。首先,建立考虑相机位姿的场景流计算模型,用于表示物体的运动矢量。其次,提出构造虚拟地图点的方法,一方面结合...
  • 运动侦测算法概论及汇总

    千次阅读 2018-09-21 10:15:40
    运动目标检测是指在序列图像中检测出变化区域并将运动目标从背景图像中提取出来。通常情况下,目标分类、跟踪和行为理解等后处理过程仅仅考虑图像中对应于运动目标的像素区域,因此运动目标的正确检测与分割对于后期...
  • % 采用光流法进行运动物体检测的问题主要在于大多数光流法计算耗时,实时性和实用性都较差。 % 但是光流法的优点在于光流不仅携带了运动物体的运动信息,而且还携带了有关景物三维结构的丰富信息,它能够在不知道...
  • 研究改进的Camshift算法检测鱼眼图像中的运动物体
  • 通过度量背景复杂度更新距离阈值和背景模型更新率的方式,提出了一种基于改进ViBe算法的运动目标检测算法,能有效地降低动态背景对检测结果造成的影响。最后,利用全局运动补偿算法将改进的ViBe算法应用到摄像机运动...
  • 运动物体检测一般分为背景建模和运动物体分析两步。即构建不包含运动物体的背景模型。然后将新的视频帧和背景模型对比,找出其中的运动物体。目前比较好的背景建模算法有两种:1)文章(Zivkovic Z. (2004) Improved ...
  • 【opencv学习】【运动物体检测

    千次阅读 2022-02-14 22:28:32
    今天学习运动物体检测 一:帧差法 捕获摄像头的运动的手 import cv2 import numpy as np # 如果我们想捕获一些运动的物体,每一帧图像中,不动的部分称之为背景,运动的物体称之为前景 # 假如我们的视频捕捉窗口是...
  • 物体检测算法的历史发展脉络综述

    千次阅读 2019-05-14 16:50:05
    物体检测(或目标检测),是计算机视觉领域非常重要的应用,是许多项目的基础。在计算机视觉识别领域,主要有分类和检测两大主要任务,分类只需要把当前物体归属到特定类别,而检测除了需要分类外,还需要检测出物体...
  • 采用matlab的meanshift算法,引用pointgrey工业摄像机,可用于运动物体检测
  • 移动物体检测与跟踪算法的实现

    千次阅读 2020-12-24 12:10:39
    接下来我将介绍一下实现这个效果我们所采用的算法和程序的流程:一、算法1、基于灰度图像的检测算法为了完成实时目标检测,需要一系列的操作,所以就需要对目标的特征进行提取,包括目标的形状和颜...
  • 基于单个运动物体的目标检测追踪算法,米娟芳,冀小平,目标检测和追踪是计算机视频领域的重要研究对象之一,尤其是在实时监控和侦察上有广泛的应用前景。本文针对单个物体的在动态环境
  • 该方法首先通过基于帧差法的背景模型建立方法建立背景图像,再结合背景减除与带有权值的帧间差分检测运动目标,降低目标物体对速度和环境干扰的敏感性。最后通过形态学梯度运算操作消除外界噪声的影响。实验结果表明...
  • 为了克服这些缺点,提出了一种基于背景字典的运动目标检测算法。 该过程介绍如下。 首先,将每个帧图像均等地划分为几个图像片段,并且每个片段都是背景或运动对象。 然后,为每个片段建立背景字典。 最后,通过...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,069
精华内容 8,427
关键字:

运动物体检测算法