2019-09-30 21:35:38 qq_41413256 阅读数 37

目标检测(object detection)

目标检测的目的

目标检测是找到图像中感兴趣的目标(物体),确定他们的位置和大小。我的理解就是将目标图中的物体用算法(传统算法或则是基于深度学习的算法)实现,用一个个的框框框出来,然后识别框框中的物体是什么,也是为下一的目标识别做准备。
机器视觉中的图像处理有四大任务:

  1. 分类(classification):假定给定一幅图像或者一段视频,要判断里面有什么类别的目标。
  2. 定位(location):定位出目标的位置,一般用边框将物体圈出来。
  3. 检测(detection):定位出目标的位置并检测出目标是什么。

传统的目标检测方法

  1. Viola-Jones(VJ):采用积分图特征+AdaBoost方法进行人脸检测等。
  2. HOG+SVM用于行人检测,通过对行人目标候选区域提取HOG特征,结合SVM分类器进行判定。
  3. DPM:基于HOG特征检测的一个变种,该方法是非深度学习方法中检测效果最好,性能最优的。

基于深度学习的目标检测

  1. One-stageYOLO和SSD系列):直接回归初目标框位置,不用产生候选框。
  2. Two-stageFaster RCNN系列):利用RPN网络对候选框进行推荐。
    上面写了一大堆,其实我也不是很清楚要做什么,这只是一个概述,方便我今后学习用的。就酱
2018-04-18 20:02:11 Gentleman_Qin 阅读数 7597

高光谱图像处理之目标检测技术

一、高光谱图像处理之目标检测


1、高光谱图像目标检测的发展趋势和研究现状:

   20世纪80年代末,美国的一些研究机构开始利用高光谱图像数据进行目标检测方面的研究。自上世纪九十年代,国外出现了进行高光谱图像目标检测算法理论研究的研究组。由Reed和Yu提出了基于广义似然比检验的恒虚警RX 检测器(RXD)。Chang课题组提出了基于正交子空间投影的OSP检测方法, Harsanyi提出了基于约束能量最小化的CEM算法。未来高光谱目标检测的发展将会越来越重视实用性,算法的性能将会进一步提高,同时更也加适合使用FPGA硬件对其进行加速从而具有更高的实际应用价值。

2、高光谱目标检测技术的应用范围:

   高光谱目标检测具有较强的实用性,可应用于公共安全、环境检测、城市规划、食品卫生、地质岩矿的识别等众多方面。


                         图1.1 高光谱图像数据结构

3、高光谱图像数据的特点:

   高光谱图像数据“图谱合一”,具有丰富的光谱维信息。高光谱图像数据共有三个维度,如图2.1所示,其中,图像空间维信息x、y用于表示物体的实际空间分布,而光谱波段L用于表示每个像素的光谱属性。

4、高光谱图像目标检测原理:

   高光谱图像的各波段在成像范围内都是连续成像,因此高光谱的光谱曲线一般是平滑的、连续的曲线。高光谱图像的波段L中涵盖了物质的光谱信息,而每种物质的光谱信息都不一样,我们可以利用图像像素的光谱波段L所包含的特定的光谱信息来判断该像素所代表的特定的物质种类。

5、高光谱图像目标检测流程:


                    图1.2 高光谱图像目标检测流程图

   如图所示,对于拍摄得到的原始高光谱图像数据,需要先对数据进行预处理,包括数据格式化、无用数据剔除以及亮度到反射率的转化等。同时,对于遥感仪拍摄的高光谱图像还需要进行辐射校正,在目标检测前,应对数据进行调整,包括数据归一化等。最后根据已知的先验信息选择相应的目标检测算法进行检测。

6、现场可编程门阵列(FPGA)在高光谱图像处理中的应用:

   一个FPGA可以大致定义为一系列互连的逻辑块。这些器件的主要优点之一是,为了实现不同的组合或时序逻辑功能,可以根据需要多次重新配置逻辑块及其互连。这一特性为FPGA提供了软件和硬件系统的优势。因为FPGA具有比专用集成电路(ASIC)更多的灵活性和更短的开发时间,更接近GPU提供的性能,但同时功耗要比GPU低得多。FPGA供应商通过改进FPGA体系结构(包括优化的硬件模块)并利用最新的硅技术不断提升FPGA的功耗和能效。可重构性、低功耗的特点以及FPGA对空间电离辐射耐受性的提高,这些因素已经使得FPGA成为目前板载高光谱遥感的最佳选择之一。


二、算法分类、比较和选择:


1、方法分类:

   高光谱目标检测方法按照先验信息是否已知分为监督方法和非监督方法。前者用于目标光谱已知的情况下,利用目标光谱与图像像元光谱进行匹配,从而完成目标检测,比如CEM算法、OSP算法;后者多用于异常目标检测,一般不需要目标和背景的先验信息,根据高光谱图像数据获取目标检测所需要的数据,然后根据数据的大小来判断是否为异常目标,比如RXD算法。

2、CEM、OSP、RXD算法的区别:

(1)CEM(Constrained Energy Minimization)算法:

   CEM算法主要思想是设计一个FIR线性滤波器,使得在满足约束条件式的情况下滤波器的输出能量最小。该算法不需要图像的背景信息,只需要知道要检测的先验光谱信息(目标向量)即可,具体方法是通过高光谱图像数据和先验已知的待检测目标确定一个滤波向量,让图像经过该滤波向量即可得到检测结果,其中滤波向量的作用是滤除图像中的非目标像素,让感兴趣的目标能够通过,同时抑制由其他信号带来的滤波器输出能量。

(2)OSP(Orthogonal Subspace Projection)算法:

   OSP算法与CEM算法相比,最大区别在于不仅需要目标的先验知识,还需要图像中背景的先验知识,但在实际中中这些先验信息很难全部得到。在高光谱检测中我们一般用其来检测异常。该算法需要前提条件:图像信息、目标像元、非目标像元(异常目标)信息。

(3)RXD(Reed-XiaoliDetector)算法:

   RXD算法是异常目标检测领域中最基础的算法,不需要目标光谱的先验知识,而是基于背景服从多元正态分布的假设,通过检测与背景分布中心相比属于异常像元,并在这些感兴趣区域进一步查找可能存在的目标。该算法主要针对的是小目标检测问题。

(4)确定所采用的目标检测算法:

   由于我们的应用场景多为有特定目标的目标检测,CEM正是针对未知场景中可能存在的特定目标的检测,只需要知道目标的光谱信息即可,而RXD算法适应于对特定场景的异常(未知目标)检测,而OSP算法除了需要已知目标光谱还需要背景信息。综上,我决定采用CEM算法进行高光谱目标检测的实现。


三、CEM算法分析:


1、算法步骤

(1)对高光谱图像进行预处理,得到二维化和归一化后的数据r(L*N);

(2)根据图像数据r,求得图像的自相关矩阵:

               

(3)确定目标光谱向量dd大小为L*1);

(4)根据公式:


                                   

   设计FIR线性滤波器:


(5)将归一化后的数据经过FIR滤波器,得到输出信号y

           

2、问题分解:

   CEM算法的实现可分为三部分:自相关矩阵、矩阵求逆、线性FIR滤波器。


图 1.3 CEM算法分解流程图

   如图所示,首先根据高光谱图像r求得自相关矩阵,再利用矩阵求逆模块求得自相关矩阵的逆矩阵,结合从光谱库获取到的目标向量的先验信息求得FIR滤波器的滤波向量,最后将高光谱图像r通过FIR滤波器即可得到最终的检测结果。


四、CEM算法实现:


1、算法流程:

   在MATLAB和C语言中实现CEM算法的具体流程如图所示,因为语言特性是串行执行命令,所以在编写程序时与硬件设计比较更加直接明了。

图1.4 CEM算法流程图

2、数据预处理:

   对前期得到的高光谱图像在MATLAB平台上进行预处理。这一过程主要对原始的200*200*189大小的高光谱图像进行操作:

(1)二维化:通过调用MATLAB里面的reshape()函数实现。

(2)归一化:采用“min-max”方法。 具体步骤是先找到数据的最大值
(maxA)和最小值(minA), 通过 y = (x-minA) /(maxA-minA) 计算的 y 即为归一化后的数据。高光谱数据量大,也造成了数据的存储比较困难,数据在程序中的存储等处理

3、CEM算法的MATLAB实现:

   首先,根据 2 对高光谱图像数据进行预处理,而后求其自相关矩阵。高光谱图像数据的大小为200*200*189,其中200*200为像素数,189为波段数。

              

   首先用reshape()函数和transpose()函数将200*200*189的三维高光谱图像数据转为189*40000的二维矩阵,再用自己写的Normalize()函数对矩阵数据用“min-max”方法进行归一化,然后根据公式式利用MATLAB中的矩阵求转置函数transpose()和矩阵相乘操作得到一个189*189的矩阵,最后对189*189的矩阵除以像素数N即可得到自相关矩阵。

最后,根据先验已知的目标向量和自相关矩阵R的逆矩阵(在MATLAB中矩阵R求逆即为(1/R))求得FIR滤波器,将高光谱图像模拟数据通过FIR滤波器,即可得到最终的检测结果。(本次测试中选取的目标向量 d 是模拟图像中的 C 物质)

4、CEM算法的C语言实现:

   在Visual Studio平台上完成CEM算法C程序的编写。相比于MATLAB实现,CEM算法的C语言实现主要难点在于矩阵运算。因为在C语言中,矩阵的转置、相乘、求逆等操作均没有现有的函数,需要编写相应的函数。在实现矩阵基本运算过程中,通过动态分配内存运用二维指针传递参数,完成矩阵加减法运算、矩阵转置运算、矩阵相乘运算以及矩阵求逆运算,这样可以节省存储空间,使用完后释放空间即可。

CEM算法的C语言实现主要包括如下步骤:

(1)在MATLAB中,将归一化后的高光谱图像数据转为189*40000的二维形式,保存为CEM.mat;

(2)编写矩阵初始化、矩阵转置、矩阵相乘、矩阵求逆、内存释放函数;

(3)编写main函数,读CEM.mat,调用上述函数,求得FIR滤波器,进而获得输出信号y,将其写入CEM.txt;

(4)在MATLAB中显示CEM.txt中数据所代表的图像。

5、难点解决:

(1)矩阵转置

   矩阵转置函数的输入是大小为m*n的矩阵A,输出是大小n*m为的矩阵B。采用嵌套的for循环分别遍历矩阵的行和列,将输入的二维矩阵A按列读出,重新按行写入新矩阵B中,即可实现矩阵的转置。

(2)矩阵相乘

   矩阵相乘函数的输入是大小m*n为的矩阵A和n*k的矩阵B,输出是大小为m*k的矩阵C。采用嵌套的for循环分别遍历矩阵的行和列,首先将矩阵A按行读出,矩阵B按列读出,然后将读出的矩阵A的第i行和矩阵B的第j列对应位相乘求和,将计算的结果写入矩阵C第i行第j列元素中。

(3)矩阵求逆——QR分解求逆

   QR分解求逆的原理是:对于可逆矩阵A,首先利用QR分解将A矩阵分解为Q矩阵和R矩阵。即A=QR,其中Q是正交矩阵,R是上三角矩阵。然后将公式左右同时求逆,可以求得A的逆矩阵,其中Q矩阵的逆矩阵和转置矩阵相同,R求逆有特定的公式。QR分解求逆的运算较为简单,且数据稳定度较高,可以得到误差较小的求逆结果。

6、算法实现结果和对比分析:

1)MATLAB和C语言实现CEM算法的检测结果如图所示:

       

      (a)               (b)            (c)

图1.6 原图CEM算法检测结果:(a)原图(每一行是一种物质)(b)MATLAB检测C物质(c)C语言检测C物质

 

通过对MATLAB和C语言实现结果进行对比,发现二者均成功实现了CEM算法并完成了对目标的检测,观察检测结果基本无差异。

######### 转载请注明出处:https://blog.csdn.net/Gentleman_Qin/article/details/79992314 #########


2013-11-30 00:22:59 diaoguangqiang 阅读数 880


目录(?)
[+]

1、显著目标检测介绍


显著性检测最近几年成了研究热点,从计算机视觉三大会议(ICCV, CVPR, ECCV)上的文章数量就可以看出,大概每届会议都有10来篇的样子,一个这么小的topic,10来篇数量已经很多了。如果你看一看这些文章就会发现,显著目标检测的占了大部分,眼动点预测的很少,大概就一两篇。看到这,有些人也许还不明白显著目标检测和眼动点预测区别。其实,显著目标检测就类似于一个二值分割问题,只不过加了显著这个条件约束;而眼动点预测则是提取出人眼感兴趣的一些点,而不是提取出显著的整个目标区域,也就是说有些像素哪怕是在显著目标上,它也可能不吸引人的眼球。那么为什么显著目标检测文章最近几年这么多呢?究其原因,我个人认为首要就是这个topic简单,不需要太深的数学理论,而且不需要生理方面的研究基础(眼动点预测更侧重人脑的生理方面),容易出文章,谁都可以搞一搞;然后,显著目标检测的应用在计算机视觉上更直接一些,包括图像分割,也就是saliency作为prior,来指导segmentation,来实现unsupervised segmentation。然后,就是图像分类了,可以利用saliency来提高feature的discrimination,如利用saliency来指导sparse code等等吧;最后,就是大牛们itti和borji等的持续push,写了很多的benchmark文章,当然更多是在眼动点预测方面,也有ECCV12关于salient object detection的benchmark。现在的要发个top,最好要和ECCV12 benchmark上的top ranked算法在提到的几个database上比较一下。不过,一个topic持续的发热一段时间以后,很多人发现,显著目标检测也越来越难做了,没有idea了,能想到的,都被用了。那么,我接下来就来讲一讲怎样继续做显著目标检测的研究。


2、显著目标检测的研究思路


第一,借鉴其他相关问题的解决思路来做saliency


我先来介绍一下和salient object detection最相关的两个问题:


1、Segmentation
– Figure/ground segmentation or matting
– Image segmentation or clustering
– Semantic segmentation or image parsing

2、Object detection and recognition
– Class-independent object detection and recognition
– Class-specific object detection and recognition

接下来,我就举一些例子,来说明怎样从这些相关领域来得到启发


第一个例子就是MSRA的yichen wei等ECCV12 Geodesic saliency,这篇文章的主要是利用boundary prior和测地距离来进行显著性检测。而相似的思路也应用于segmentation中,如Geodesic Graph Cut for Interactive Image Segmentation, CVPR 10,就是利用和人为标记的一些先验区域的测地距离,来衡量像素属于目标或者背景可能性,当我们把人为标定的先验区域,用boundary prior替代,就可以实现bottom-up的saliency detection了。而boundary prior在Constrained Parametric Min-Cuts for Automatic Object Segmentation, CVPR 10,也已用到,就是利用boundary prior来指导分割的。


第二个例子就是CVPR13的Salient Object Detection: A Discriminative Regional Feature Integration Approach。相似的思路,也在Constrained Parametric Min-Cuts for Automatic Object Segmentation, CVPR 10中,用来进行segmentation。不同的是一个处理的是region,一个是binary segment。处理region的好处,就是可以加上center-surround等各种saliency的机制。


第三个例子CVPR13的 Saliency aggregation。文章主要是利用local learning的思想,就是说类内差异性,导致一个针对整幅图像库的model不可能对每个图像都好,所以他就对每个图像训练了一个local model。相似的思路,在Object recognition有很多,如Extracting Foreground Masks towards Object Recognition, ICCV 11. 另外, CVPR13 Looking beyond image saliency, 也采用了类似的idea。


第二,利用一些新的技术来进行显著性检测


我们可以借用machine learning方面一些技术,比如说,sparse code,pca,manifold learning,ranking,graph model等来做saliency。这些idea容易搞,就是把一些技术应用到saliency上来。举几个例子,CVPR13的 manifold ranking saliency, pca saliency等,ICCV13 的 Contextual Hypergraph Modelling for Salient Object Detection 等。


3、以后研究思路


我觉得以后的salient object detection可以沿着几个思路做一些。

第一,可以在速度方面做一些工作,毕竟salient object detection 自己几乎没啥用,就是做一些高级应用的pre-processing。


第二,可以做一些sparse code的saliency研究,貌似sparse code在很多方面都要火一阵,比如classification,tracking,super-resolution, denoise等等,是不是在saliency也要火一阵,貌似sparse code的效果还不太好。ICCV13 huchuan lu有一篇 sparse code,效果还不错。


第三,多用一些prior来做saliency。比如可以利用inter-image or out-image等的prior来把saliency这个ill-posed问题转化为well-posed。这是个很好的方向,比如我们可以学习统计的prior或者发现新的prior,相关的思路在segmentation也有了,比如CVPR 13Robust Region Grouping via Internal Patch Statistics 和 ACM MM10 的 Image segmentation with patch-pair density priors。

2018-05-24 14:03:19 qq_42152399 阅读数 569

一、填充轮廓

#_*_ encoding=utf-8 _*_
import numpy as np
import cv2

img=cv2.imread('leilei.jpg')
imggray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#二值化图片,将灰度图片中>127的像素修改为255(白色)
ret,thresh=cv2.threshold(imggray,127,255,0)
# cv2.imshow('thresh',thresh)
#在二值化图像中找轮廓,参数(输入图像,轮廓检索模式,轮廓近似方法),返回值(原图像,轮廓,轮廓的层析结构——轮廓之间的关系)
#具体返回值含义见https://blog.csdn.net/jjddss/article/details/73527990
image,contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# cv2.imshow("image",image)
# print("轮廓的数量:",np.size(contours))
# print("第一个轮廓的所有点的坐标:",contours[0])
# print("hierarchy",hierarchy)
contourlist=[]
#绘制轮廓
for contour in contours:
    if cv2.contourArea(contour)>200:
        contourlist.append(contour)
#根据最后的参数不同,可以选择填充轮廓,还是
img=cv2.drawContours(image,contourlist,3,(0,255,0),3)
cv2.imshow("img",img)
cv2.waitKey(0)

在这里只将轮廓大于200的进行填充,但效果不咋明显。

这里用到的opencv工具有:

cv2.threshold()

cv2.findContours()

#在二值化图像中找轮廓,参数(输入图像,轮廓检索模式,轮廓近似方法),返回值(原图像,轮廓,轮廓的层析结构——轮廓之间的关系)
#具体返回值含义见https://blog.csdn.net/jjddss/article/details/73527990

cv2.contourArea()

cv2.drawContours()

二、帧间差分法

python代码实现:

#_*_ encoding=utf-8 _*_
import cv2
import numpy as np

vedioFile=r"Fueling.mp4"

frame_x=720
frame_y=964

cap=cv2.VideoCapture(vedioFile)

frontFrame=np.zeros((frame_x,frame_y),np.uint8)
targetImage=np.zeros((frame_x,frame_y),np.uint8)

kernel=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))

while cap.isOpened():
    ret,frame=cap.read()
    frameGray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    # (x,y,w,h)=cv2.boundingRect(frameGray)
    # print('x:{},y:{},w:{},h:{}'.format(x,y,w,h))

    if frontFrame.sum()==0:
        frontFrame=frameGray
    else:
        #使用opencv的方法计算两帧相减并取绝对值
        targetImage=cv2.absdiff(frameGray,frontFrame)
        ret,targetImage=cv2.threshold(targetImage,127,255,cv2.THRESH_BINARY)
        targetImage=cv2.morphologyEx(targetImage,cv2.MORPH_OPEN,kernel)
        targetImage=cv2.morphologyEx(targetImage,cv2.MORPH_CLOSE,kernel)


        frontFrame=frameGray

    cv2.imshow("targetImage",targetImage)
    k=cv2.waitKey(35)&0xFF
    if k==ord("q"):
        break


目标检测前背景分离光流法

博文 来自: u010402786
没有更多推荐了,返回首页