精华内容
下载资源
问答
  • 2015-08-13 22:52:48

    SIFT/SURF基于灰度图,

    一、首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点,再使用二次插值法得到精确特征点所在的层(尺度),即完成了尺度不变。

    二、在特征点选取一个与尺度相应的邻域,求出主方向,其中SIFT采用在一个正方形邻域内统计所有点的梯度方向,找到占80%以上的方向作为主方向;而SURF则选择圆形邻域,并且使用活动扇形的方法求出特征点主方向,以主方向对齐即完成旋转不变。

    三、以主方向为轴可以在每个特征点建立坐标,SIFT在特征点选择一块大小与尺度相应的方形区域,分成16块,统计每一块沿着八个方向占的比例,于是特征点形成了128维特征向量,对图像进行归一化则完成强度不变;而SURF分成64块,统计每一块的dx,dy,|dx|,|dy|的累积和,同样形成128维向量,再进行归一化则完成了对比度不变与强度不变。

     

    haar特征也是基于灰度图,

    首先通过大量的具有比较明显的haar特征(矩形)的物体图像用模式识别的方法训练出分类器,分类器是个级联的,每级都以大概相同的识别率保留进入下一级的具有物体特征的候选物体,而每一级的子分类器则由许多haar特征构成(由积分图像计算得到,并保存下位置),有水平的、竖直的、倾斜的,并且每个特征带一个阈值和两个分支值,每级子分类器带一个总的阈值。识别物体的时候,同样计算积分图像为后面计算haar特征做准备,然后采用与训练的时候有物体的窗口同样大小的窗口遍历整幅图像,以后逐渐放大窗口,同样做遍历搜索物体;每当窗口移动到一个位置,即计算该窗口内的haar特征,加权后与分类器中haar特征的阈值比较从而选择左或者右分支值,累加一个级的分支值与相应级的阈值比较,大于该阈值才可以通过进入下一轮筛选。当通过分类器所以级的时候说明这个物体以大概率被识别。

     

    广义hough变换同样基于灰度图,

    使用轮廓作为特征,融合了梯度信息,以投票的方式识别物体,在本blog的另一篇文章中有详细讨论,这里不再赘述。

     

     

    特点异同对比及其适用场合:

     

    三种算法都只是基于强度(灰度)信息,都是特征方法,但SIFT/SURF的特征是一种具有强烈方向性及亮度性的特征,这使得它适用于刚性形变,稍有透视形变的场合;haar特征识别方法带有一点人工智能的意味,对于像人脸这种有明显的、稳定结构的haar特征的物体最适用,只要结构相对固定即使发生扭曲等非线性形变依然可识别;广义hough变换完全是精确的匹配,可得到物体的位置方向等参数信息。前两种方法基本都是通过先获取局部特征然后再逐个匹配,只是局部特征的计算方法不同,SIFT/SURF比较复杂也相对稳定,haar方法比较简单,偏向一种统计的方法形成特征,这也使其具有一定的模糊弹性;广义hough变换则是一种全局的特征——轮廓梯度,但也可以看做整个轮廓的每一个点的位置和梯度都是特征,每个点都对识别有贡献,用直观的投票,看票数多少去确定是否识别出物体。

    转自:http://blog.csdn.net/cy513/article/details/4285579
    更多相关内容
  • 基于深度卷积神经网络的物体识别算法
  • 三种物体识别算法.pdf

    2022-06-18 01:37:10
    三种物体识别算法.pdf三种物体识别算法.pdf三种物体识别算法.pdf三种物体识别算法.pdf三种物体识别算法.pdf三种物体识别算法.pdf三种物体识别算法.pdf三种物体识别算法.pdf
  • 三种物体识别算法.docx三种物体识别算法.docx三种物体识别算法.docx三种物体识别算法.docx三种物体识别算法.docx三种物体识别算法.docx三种物体识别算法.docx三种物体识别算法.docx
  • 三种强大的物体识别算法.pdf三种强大的物体识别算法.pdf三种强大的物体识别算法.pdf三种强大的物体识别算法.pdf三种强大的物体识别算法.pdf三种强大的物体识别算法.pdf三种强大的物体识别算法.pdf三种强大的物体识别...
  • 三种强大的物体识别算法.docx三种强大的物体识别算法.docx三种强大的物体识别算法.docx三种强大的物体识别算法.docx三种强大的物体识别算法.docx三种强大的物体识别算法.docx三种强大的物体识别算法.docx三种强大的...
  • 大数据-算法-受生物启发的物体识别算法研究陆.pdf
  • 一个介绍物体识别算法的介绍,SIFTSURF、haar特征、广义hough变换的特性对比分析。
  • 对摄像机拍摄的子弹弹孔图片进行识别处理,以达到精确定位弹孔位置的目的。先对弹孔图像进行校正,再对图像进行识别,完成算法设计。
  • 人工智能-基于深度卷积神经网络的视觉物体识别算法.pdf
  • 主要为大家详细介绍了python+opencv实现动态物体识别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 基于深度卷积神经网络的物体识别算法.pdf
  • 为准确识别出三维物体,...在Coil-100(columbia object image library)图像数据库上,以100个物体的4、8、18、36个视角的样本为模板,用其他68、6 4、54和36个视角的样本进行测试,该算法识别率分别为95.75%、99.30%
  • 基于深度学习的RGB-D物体识别算法.pdf
  • 为了提高物体的识别正确率,提出一种基于证据理论融合多特征的物体识别算法。提取物体图像的颜色直方图和尺度不变特征,采用极限学习机建立相应的图像分类器,根据单一特征的识别结果构建概率分配函数,并采用证据...
  • 人工智能-图像处理-基于图理论的图像处理与物体识别算法的研究.pdf
  • 主要为大家详细介绍了基于OpenCv的运动物体检测算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 基于轮廓识别物体算法
  • YOLO v3 物体检测算法

    2019-11-03 18:56:48
    YOLO v3 物体检测算法 YOLO v3 物体检测算法 YOLO v3 物体检测算法
  • 物体识别基本原理及其Python实现

    千次阅读 2021-08-05 14:29:53
    物体识别将这两种任务结合起来,对图像中的一个或多个对象进行定位和分类,所以当人们提到物体检测或者目标检测时,其实指的是物体识别。 基于区域的卷积神经网络 (R-CNN) 是一系列卷积神经网络模型,专为目标检测而...

    概述

    物体识别(Object recognition)是一个通用术语,描述一组相关的计算机视觉任务,涉及识别图像中的物体。

    图像分类涉及预测图像中一个对象的类别,对象定位是指识别图像一个或多个对象的位置,并在其周围绘制边框。物体识别将这两种任务结合起来,对图像中的一个或多个对象进行定位和分类,所以当人们提到物体检测或者目标检测时,其实指的是物体识别。

    基于区域的卷积神经网络 (R-CNN) 是一系列卷积神经网络模型,专为目标检测而设计。R-CNN 是一种两阶段检测算法。第一阶段识别图像中可能包含对象的区域子集。第二阶段对每个区域中的对象进行分类。

    R-CNN系列模型有四种主要变体,分别是R-CNN、Fast R-CNN、Faster R-CNN、MaskR-CNN。每个变体都试图优化、加速或增强算法过程中的一个或多个的结果,但不管变体如何变化,其算法流程是基本如一的。使用 R-CNN 进行目标检测的基本过程过程如下
    在这里插入图片描述

    • 将图像作为输入并从图像中提取大约 2000 个region proposals(可能包含物体的边界框)。
    • 将每个region proposals扭曲(重塑)到固定大小,作为 CNN 的输入传递。
    • CNN 为每个region proposals提取一个固定长度的特征向量。
    • 这些特征用于使用特定于类别的线性 SVM,对region proposals进行分类

    CNN神经网络

    R-CNN基于CNN(卷积神经网络),线性回归,和支持向量机(SVM)等算法,实现目标检测技术。要弄清R-CNN的基本原理,就得弄清楚为何物。

    那么CNN为何物?要弄清楚这个问题,首先要清楚的是CNN为何出现,CNN的出现是为了解决BP神经网络处理图像时的缺陷。BP神经网络在处理图像时会把图像的每一个像素值作为特征输入到神经网络中,这势必会丢失掉图像的二维结构信息,在用BP神经网络对图像进行分类的时候,图像中的物体不能移动、不能变形,否则会带来识别时的错误。并且BP神经网络中的神经元都采用全连接的方式,这会造成权重矩阵过大,运算量大。因为这些原因,用BP神经网络处理图像时一度遇到了瓶颈,而CNN为了解决这一系列的问题横空出世。

    我们知道传统的BP神经网络是长这样的,如下图。

    image-20210707220229877

    那么CNN只是在BP神经网络上的基础上对网络层级的功能和形式做了一些改变,增加了一些在BP神经网络中没有的层级,我们可以把CNN理解为是BP神经网络的一种改进体。

    下图是CNN的典型结构,如图所示该CNN神经网络有7层,从左往右分别是:卷积层、池化层、卷积层、池化层、全连接层、全连接层、输出层。(请注意这里的输入特征并不算在网络的层级里)

    image-20210707220249198

    从上图我们可以看出,卷积层和池化层实际是在做特征提取的操作,再把提取到的特征输入给全连接层(传统的BP神经网络)。

    卷积层

    在CNN中的第一层卷积层,先选择一个局部区域(filter)去扫描整张图片,局部区域所圈起来的所有节点会和filter做乘法累加操作,再连接到下一层的一个节点上。假设要扫描的图片是一张灰度图片(也就是只有一个颜色通道),所有的filter也是个二维的矩阵,那个该卷积过程可以用如下动图表示。

    https://img-blog.csdnimg.cn/20200413223638467.gif#pic_center

    那假如卷积层要扫描的图片是张彩色图片(也就是该图片有RGB三个通道),那么图片的像素可以表示成三维结构,所选用的filter也是个三维结构,如图所示。

    image-20210707220621142

    也用一张动图表示一下该卷积过程。

    请注意一个filter卷积一张图片(无论图片是单通道还是多通道)只能得到一个面的信息,多个filter得到多个面(形象的理解可以这么理解),可以把filter扫描图片(卷积)的过程看做是提取特征的过程,一次卷积提取图片一类的特征(比如多次filter分别提取图片红通道、绿通道、蓝通道的像素特征)

    池化层

    如果输入是图像的话,那么池化层的最主要作用就是压缩图像。假如池化层夹在连续的卷积层中间, 那么就是用于压缩上一层卷积层卷积下来的数据(或者也可以理解为过滤),减小过拟合。

    池化层的工作过程同样也可以用一张动图简单表示。

    https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbG5vdGVib29rLmdpdGh1Yi5pby9pbWcvQ05OL3Bvb2xmaWcuZ2lm

    上图对于每个3 * 3的窗口选出最大的数作为输出矩阵的相应元素的值,比如输入矩阵第一个3 * 3窗口中最大的数是5,那么输出矩阵的第一个元素就是5,如此类推。请注意这里的窗口每次扫描过的像素不出现重复,避免重复过滤像素。

    全连接层

    通常全连接层在卷积神经网络尾部,跟传统的神经网络神经元的连接方式是一样的,全连接层把前面卷积层和池化层的输出作为特征值进行网络的训练,而利用反向传播算法修正全连接层的参数和阈值以及之前卷积层filter的权重等。

    image-20210707221153389

    综上所述,卷积神经网络(CNN)是BP神经网络的一种变体,它不再像BP神经网络那样把图片的像素值作为模型的特征进行训练,而是把图片的像素值经过一系列的处理后(卷积、池化)输出的值作为特征喂给模型训练。这种做法的好处是能保留图片的多维信息,提高模型分类的精度。

    查找图像中可能含有物体的边界框


    Region proposals 是可能包含物体的边界框,由(x,y,h,w)组成的元组表示。(x,y)是边界框中心的坐标,(h,w) 分别是边界框的高度和宽度。这些region proposals是通过被称为selective search算法计算的。对于一张图像,大约提取了2000个region proposals。

    从region proposals中提取CNN特征

    在这里插入图片描述

    为了训练 CNN 进行特征提取,使用来自imagenet数据的预训练权重初始化 VGG-16 等架构。具有 1000 个类的输出层被切断。所以当一个region proposals图像(,由于CNN中全连接层的限制,传递之前region proposals需调整成固定的大小,以满足CNN的输入限制)被传递到网络时,我们得到一个 4096 维的特征向量

    当提取所有region proposals(大约2000个region proposals)输入给CNN网络模型,最终会得到feature map(4096*2000)。得到feature map后下一步即可对每一个region进行分类,识别出每一个region里的物体是哪种物体。

    使用提取的特征对物体进行分类

    将feature map的每一个feature,也就是每一个region的feature都送入每一个SVM二分类器进行检测,输出属于该类的概率,假如有20个SVM二分类器,那么会得到2000*20的矩阵,该矩阵为region proposals属于每个类的概率。region proposals会被分配到获得最高概率的类别。因此,图像中的所有 2000 个region proposals都标有类标签和属于该类的概率。在这么多region proposals中,很多都是多余的和重叠的边界框,需要删除。为了实现这一点,使用了非最大抑制算法。
    在这里插入图片描述

    非极大值抑制是一种贪心算法。它选择使用 SVM 获得的最高概率的框。然后它计算属于该类的所有其他边界框的 IoU 分数。IoU 分数大于阈值(可自行定义阈值大小,一般来说阈值定义为0.7)的框被删除。换句话说,具有非常高重叠的边界框被移除。然后选择下一个得分最高的框,依此类推,直到删除该类的所有重叠边界框。对所有类都这样做以获得如上所示的结果。

    代码实现

    选用的进行物体识别的原图

    在这里插入图片描述

    这里我们选择用PyTorch中的 faster R-CNN目标检测器来进行物体识别,首先需要安装PyTorch。

    pip install torch
    

    开始编写代码,首先导入所需的包

    from PIL import Image
    import matplotlib.pyplot as plt
    import torch
    import torchvision.transforms as T
    import torchvision
    import numpy as np
    import cv2
    

    下载预训练的模型,Resnet50 Faster R-CNN,模型里面已带有训练好的权重参数。

    model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
    model.eval()
    

    在这里插入图片描述

    定义PyTorch官方文档给出的分类名称

    COCO_INSTANCE_CATEGORY_NAMES = [
        '__background__', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus',
        'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'N/A', 'stop sign',
        'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
        'elephant', 'bear', 'zebra', 'giraffe', 'N/A', 'backpack', 'umbrella', 'N/A', 'N/A',
        'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball',
        'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket',
        'bottle', 'N/A', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl',
        'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
        'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'N/A', 'dining table',
        'N/A', 'N/A', 'toilet', 'N/A', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
        'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'N/A', 'book',
        'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush'
    ]
    

    定义一个新函数get_prediction(),用于输入图像路径,对图像中的物体进行识别。首先从图像路径中获取图像,并将图像转为为图像张量,向模型传递图像张量以得到图像物体识别结果pred

    def get_prediction(img_path, threshold):
        img = Image.open(img_path)
      	transform = T.Compose([T.ToTensor()]) 
      	img = transform(img) 
        pred = model([img]) 
    

    从pred中提取图中每一个region proposal物体分类的类别pred_class、图中物体所在的坐标pred_boxes、图中物体所在分类的概率pred_score,进行阈值过滤之后(类别概率置信度低于阈值的region 过滤掉)再打印显示出来,最后把识别结果返回。

    	pred_class = [COCO_INSTANCE_CATEGORY_NAMES[i] for i in list(pred[0]['labels'].numpy())] 
        pred_boxes = [[(i[0], i[1]), (i[2], i[3])] for i in list(pred[0]['boxes'].detach().numpy())]
      	pred_score = list(pred[0]['scores'].detach().numpy())
        pred_t = [pred_score.index(x) for x in pred_score if x > threshold][-1] 
      	pred_boxes = pred_boxes[:pred_t+1]
      	pred_class = pred_class[:pred_t+1]
        print("pred_class:",pred_class)
        print("pred_boxes:",pred_boxes)
        return pred_boxes, pred_class
    

    定义一个新函数object_detection_api(),用于调用上面定义的函数get_prediction(),得到图像中的物体识别结果,并将识别结果绘制出来

    def object_detection_api(img_path, threshold=0.5, rect_th=3, text_size=3, text_th=3):
        boxes, pred_cls = get_prediction(img_path, threshold) 
      	img = cv2.imread(img_path)
      	img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
      	for i in range(len(boxes)):
        	cv2.rectangle(img, boxes[i][0], boxes[i][1],color=(0, 255, 0), thickness=rect_th)
        	cv2.putText(img,pred_cls[i], boxes[i][0],  cv2.FONT_HERSHEY_SIMPLEX, text_size, (0,255,0),thickness=text_th)
      	plt.imshow(img)
      	plt.show()
    

    最后调用object_detection_api()函数,传入要进行物体识别的图像路径,对图像进行物体识别

    if __name__ == '__main__':
    	object_detection_api(img_path="images/8433365521_9252889f9a_z.jpg")
        
    

    得到物体识别结果打印到控制台上,并使用matplotlib把它们绘制了出来

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 著作权归作者所有。...识别算法概述:SIFT/SURF基于灰度图,一、首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点,再使
    著作权归作者所有。
    商业转载请联系作者获得授权,非商业转载请注明出处。
    作者:cvvision
    链接:http://www.cvvision.cn/7780.html
    来源:CV视觉网

    识别算法概述:SIFT/SURF基于灰度图,一、首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点,再使用二次插值法得到精确特征点所在的层(尺度),即完成了尺度不变。二、在特征点选取一个与尺度相应的邻域,求出主方向,其中SIFT采用在一个正方形邻域内统计所有点的梯度方向,找到占80%以上的方向作为主方向;而SURF则选择圆形邻域,并且使用活动扇形的方法求出特征点主方向,以主方向对齐即完成旋转不变。三、以主方向为轴可以在每个特征点建立坐标,SIFT在特征点选择一块大小与尺度相应 的方形区域,分成16块,统计每一块沿着八个方向占的比例,于是特征点形成了128维特征向量,对图像进行归一化则完成强度不变;而SURF分成64块, 统计每一块的dx,dy,|dx|,|dy|的累积和,同样形成128维向量,再进行归一化则完成了对比度不变与强度不变。 Haar特征也是基于灰度图,首先通过大量的具有比较明显的haar特征(矩形)的物体图像用模式识别的方法训练出 分类器,分类器是个级联的,每级都以大概相同的识别率保留进入下一级的具有物体特征的候选物体,而每一级的子分类器则由许多haar特征构成(由积分图像 计算得到,并保存下位置),有水平的、竖直的、倾斜的,并且每个特征带一个阈值和两个分支值,每级子分类器带一个总的阈值。识别物体的时候,同样计算积分 图像为后面计算haar特征做准备,然后采用与训练的时候有物体的窗口同样大小的窗口遍历整幅图像,以后逐渐放大窗口,同样做遍历搜索物体;每当窗口移动 到一个位置,即计算该窗口内的haar特征,加权后与分类器中haar特征的阈值比较从而选择左或者右分支值,累加一个级的分支值与相应级的阈值比较,大 于该阈值才可以通过进入下一轮筛选。当通过分类器所以级的时候说明这个物体以大概率被识别。 广义hough变换同样基于灰度图,使用轮廓作为特征,融合了梯度信息,以投票的方式识别物体,在本blog的另一篇文章中有详细讨论,这里不再赘述。 特点异同对比及其适用场合:三种算法都只是基于强度(灰度)信息,都是特征方法,但SIFT/SURF的特征是一种具有强烈方向性及亮度性的特征,这使得它适用于刚性形变,稍有透视形变的场合;haar特征识别方法带有一点人工智能的 意味,对于像人脸这种有明显的、稳定结构的haar特征的物体最适用,只要结构相对固定即使发生扭曲等非线性形变依然可识别;广义hough变换完全是精 确的匹配,可得到物体的位置方向等参数信息。前两种方法基本都是通过先获取局部特征然后再逐个匹配,只是局部特征的计算方法不同,SIFT/SURF比较 复杂也相对稳定,haar方法比较简单,偏向一种统计的方法形成特征,这也使其具有一定的模糊弹性;广义hough变换则是一种全局的特征——轮廓梯度, 但也可以看做整个轮廓的每一个点的位置和梯度都是特征,每个点都对识别有贡献,用直观的投票,看票数多少去确定是否识别出物体。 SIFT/SURF算法的深入剖析——谈SIFT的精妙与不足SURF算法是SIFT算法的加速版,OpenCV的SURF算法在适中的条件下完成两幅图像中物体的匹配基本实现了实时处理,其快速的基础实际上只有一个——积分图像haar求导,对于它们其他方面的不同可以参考本blog的另外一篇关于SIFT的文章。不论科研还是应用上都希望可以和人类的视觉一样通过程序自动找出两幅图像里面相同的景物,并且建立它们之间的对应,前几年才被提出的SIFT(尺度不变特 征)算法提供了一种解决方法,通过这个算法可以使得满足一定条件下两幅图像中相同景物的某些点(后面提到的关键点)可以匹配起来,为什么不是每一点都匹配 呢?下面的论述将会提到。SIFT算法实现物体识别主要有三大工序,1、提取关键点;2、对关键点附加详细的信息(局部特征)也就是所谓的描述器;3、通过两方特征点(附带上特征向量的关键点)的两两比较找出相互匹配的若干对特征点,也就建立了景物间的对应关系。日常的应用中,多数情况是给出一幅包含物体的参考图像,然后在另外一幅同样含有该物体的图像中实现它们的匹配。两幅图像中的物体一般只是旋转和缩放的关 系,加上图像的亮度及对比度的不同,这些就是最常见的情形。基于这些条件下要实现物体之间的匹配,SIFT算法的先驱及其发明者想到只要找到多于三对物体 间的匹配点就可以通过射影几何的理论建立它们的一一对应。首先在形状上物体既有旋转又有缩小放大的变化,如何找到这样的对应点呢?于是他们的想法是首先找 到图像中的一些“稳定点”,这些点是一些十分突出的点不会因光照条件的改变而消失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点,既然两幅图像中有相 同的景物,那么使用某种方法分别提取各自的稳定点,这些点之间会有相互对应的匹配点,正是基于这样合理的假设,SIFT算法的基础是稳定点。SIFT算法 找稳定点的方法是找灰度图的局部最值,由于数字图像是离散的,想求导和求最值这些操作都是使用滤波器,而滤波器是有尺寸大小的,使用同一尺寸的滤波器对两 幅包含有不同尺寸的同一物体的图像求局部最值将有可能出现一方求得最值而另一方却没有的情况,但是容易知道假如物体的尺寸都一致的话它们的局部最值将会相 同。SIFT的精妙之处在于采用图像金字塔的方法解决这一问题,我们可以把两幅图像想象成是连续的,分别以它们作为底面作四棱锥,就像金字塔,那么每一个 截面与原图像相似,那么两个金字塔中必然会有包含大小一致的物体的无穷个截面,但应用只能是离散的,所以我们只能构造有限层,层数越多当然越好,但处理时 间会相应增加,层数太少不行,因为向下采样的截面中可能找不到尺寸大小一致的两个物体的图像。有了图像金字塔就可以对每一层求出局部最值,但是这样的稳定 点数目将会十分可观,所以需要使用某种方法抑制去除一部分点,但又使得同一尺度下的稳定点得以保存。有了稳定点之后如何去让程序明白它们之间是物体的同一 位置?研究者想到以该点为中心挖出一小块区域,然后找出区域内的某些特征,让这些特征附件在稳定点上,SIFT的又一个精妙之处在于稳定点附加上特征向量 之后就像一个根系发达的树根一样牢牢的抓住它的“土地”,使之成为更稳固的特征点,但是问题又来了,遇到旋转的情况怎么办?发明者的解决方法是找一个“主 方向”然后以它看齐,就可以知道两个物体的旋转夹角了。下面就讨论一下SIFT算法的缺陷。SIFT/SURT采用henssian矩阵获取图像局部最值还是十分稳定的,但是在求主方向阶段太过于依赖局部区域像素的梯度方向,有可能使得找到的主 方向不准确,后面的特征向量提取以及匹配都严重依赖于主方向,即使不大偏差角度也可以造成后面特征匹配的放大误差,从而匹配不成功;另外图像金字塔的层取 得不足够紧密也会使得尺度有误差,后面的特征向量提取同样依赖相应的尺度,发明者在这个问题上的折中解决方法是取适量的层然后进行插值。SIFT是一种只 利用到灰度性质的算法,忽略了色彩信息,后面又出现了几种据说比SIFT更稳定的描述器其中一些利用到了色彩信息,让我们拭目以待。最后要提一下,我们知道同样的景物在不同的照片中可能出现不同的形状、大小、角度、亮度,甚至扭曲;计算机视觉的知识表明通过光学镜头获取的图像,对于平 面形状的两个物体它们之间可以建立射影对应,对于像人脸这种曲面物体在不同角度距离不同相机参数下获取的两幅图像,它们之间不是一个线性对应关系,就是说 我们即使获得两张图像中的脸上若干匹配好的点对,还是无法从中推导出其他点的对应。
    展开全文
  • 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技术将应用于预测框以获得每个对象的单个预测。

    展开全文
  • unity c# 触摸屏物体识别算法

    千次阅读 2022-02-12 14:18:22
    我的想法是在识别时,1.先计算出所有的边的长度,并记录下坐标。2.然后对比配置文件中的长度,记录符合配置文件的长度。3.然后再对比配置文件中的角度值。 主要算法在OnFingerUpdate()中,Update()中按下W键,...
  • 基于python与yolov3的物体检测算法实现
  • 大家一起分享如何使用LabVIEW调用pb模型实现物体识别
  • 人类是如何识别一个物体的呢,当然要对面前的这个物体为何物要有一个概念,人类一生下来就开始通过视觉获取世间万物的信息,包括一种物体形状、颜色、成分等,以及通过学习认识到这种物体的其他信息比如物理的、化学...
  • 识别算法概述:   SIFT/SURF基于灰度图, 一、首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点,再使用二次...
  • 如何使用OpenCV对物体进行搜索检测与识别

    万次阅读 多人点赞 2019-09-20 10:33:33
    物体检测与物体识别 对象识别算法识别图像中存在哪些对象。它将整个图像作为输入,并输出该图像中存在的对象的类标签和类概率。例如,类标签可以是“狗”,相关的类概率可以是97%。 另一方面,对象检测算法不仅...
  • 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,071
精华内容 24,428
关键字:

物体识别算法