精华内容
下载资源
问答
  • 行人识别
    千次阅读
    2022-03-26 14:53:58
    import cv2
    import os
    import numpy as np
    import hog_discriptor
    
    
    def get_path():
        print('loading data...')
        # 正样本文件夹路径
        PosImgPath = "D:\\A\\python\\opencv\\tests\\hog_pedestran_detect_python\\Positive"
        # 负样本
        NegImgPath = "D:\\A\\python\\opencv\\tests\\hog_pedestran_detect_python\\Negative"
        # 文件夹所有图片文件名
        PosImgList = os.listdir(PosImgPath)
        NegImgList = os.listdir(NegImgPath)
        print('Number of positive samples:', len(PosImgList))
        print('Number of negative samples:', len(NegImgList))
        # 合并数据路径 添加对应标签
        samplePath = []
        labels = []
        for f in PosImgList:
            samplePath.append('Positive\\' + f)
            labels.append(1)
        for f in NegImgList:
            samplePath.append('Negative\\' + f)
            labels.append(-1)
        labels = np.array(labels)
    
        return samplePath, labels
    
    
    def extract_hog(samplePath):
        print('extracting hog...')
        # hog参数
        winSize = (64, 128)     # 窗口大小
        blockSize = (16, 16)    # 块大小
        blockStride = (8, 8)    # 块滑动增量
        cellSize = (8, 8)       # 胞元大小
        Bin = 9                 # 梯度方向数
        # 创建hog
        hogDescriptor = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, Bin)
        # 获取正负样本hog特征
        hogFeature = []
        for f in samplePath:
            img = cv2.imread(f, cv2.IMREAD_GRAYSCALE)
            img = cv2.resize(img, (64, 128))
            discriptor = hogDescriptor.compute(img)
            hogFeature.append(discriptor)
        # 转为numpy数组
        hogFeature = np.array(hogFeature)
    
        return hogFeature
    
    
    def train_svm(hogFeature, labels):
        # 创建svm
        svm = cv2.ml.SVM_create()
        svm.setKernel(cv2.ml.SVM_LINEAR)    # 使用线性核
        svm.setP(0.01)       # 练习集中的特征向量和拟合出来的超平面的间隔须要小于p
        svm.setC(0.01)      # 异常值处罚因子 一般取10的n次幂 default=1.0 越接近0惩罚越大
        svm.setType(cv2.ml.SVM_EPS_SVR)     # SVM类型 SVR支持向量回归机
        # 训练
        print('training...')
        svm.train(hogFeature, cv2.ml.ROW_SAMPLE, labels)
        print('done.')
    
        return svm
    
    
    def get_svm_detecter(svm):
        # 获取支持向量
        SupportVector = svm.getSupportVectors()
        SupportVector = np.transpose(SupportVector)
        # rho-决策函数常数项b的相反数
        rho, alpha, _ = svm.getDecisionFunction(0)
        # 返回分类器
        return np.append(alpha * SupportVector, [[-rho]], 0)
    
    
    def detect(MyDecter):
        imageSrc = cv2.imread('TestData\\000001.jpg', cv2.IMREAD_COLOR)
    
        myHog = cv2.HOGDescriptor()
        myHog.setSVMDetector(MyDecter)
        # 设置步长和padding、每次的缩放比例
        objects, _ = myHog.detectMultiScale(imageSrc, winStride=(8, 8), padding=(16, 16), scale=1.04)
        for (x, y, w, h) in objects:
            cv2.rectangle(imageSrc, (x, y), (x+w, y+h), (255, 0, 0), 2)
    
        cv2.imshow('img', imageSrc)
        cv2.waitKey(0)
    
    
    if __name__ == '__main__':
        samplePath, labels = get_path()
        hogFeature = extract_hog(samplePath)
        svm = train_svm(hogFeature, labels)
        MyDecter = get_svm_detecter(svm)
        detect(MyDecter)
        
    
    
    
    更多相关内容
  • 可以实现手机摄像头进行行人识别,事先嵌入好openCV的库,调用后加入自己训练的行人识别算法,可以对行人进行识别。
  • 基于KDTree树和欧式聚类的越野环境下行人识别的研究.pdf
  • 基于python的行人识别系统.zip 计算机专业,软件工程专业,通信工程大学生课程设计 自己大三的时候写的 适合大家做课程设计,写毕业设计也可以参考 基于python的课程设计
  • 行人识别video资源

    2019-03-31 12:51:48
    一段行人识别的video,非常好的资源,适用于opencv做行人识别
  • 代码注解详细,适合初学者读懂,压缩包内含两部程序,请仔细研读,OPENCV HOG特征+SVM分类器行人识别(从训练到识别)
  • 这是一个行人工脸部识别,非常有用的程序。
  • 利用MATLAB实现了视频图像行人识别与检测,
  • 此代码用于行人识别中,采用lomo特征来描述行人,再利用度量学习的方法对行人进行重识别,可达到较高识别率。
  • 基于SVG和HOG的行人识别算法,是在matlab中实现,有完整的代码,解析,结题PPT。Optimize是多尺度变宽高比方法 MainCode就是固定宽高比多尺度方法 这两个是主函数,首次运行时,把第一行的TrainHogFeatureWithSVM...
  • 基于提取光流特征作为行人识别的依据,提高识别
  • 实现行人识别中的特征提取,距离匹配,从而判断是否为同一个行人
  • 本次实验使用opencv中的ml组件中的SVM做有无行人的判别,内涵完整代码和图片数据。
  • 基于YOLO V3的行人识别方法.docx基于YOLO V3的行人识别方法.docx基于YOLO V3的行人识别方法.docx基于YOLO V3的行人识别方法.docx基于YOLO V3的行人识别方法.docx基于YOLO V3的行人识别方法.docx基于YOLO V3的行人...
  • 基于YOLO V3的行人识别方法.pdf基于YOLO V3的行人识别方法.pdf基于YOLO V3的行人识别方法.pdf基于YOLO V3的行人识别方法.pdf基于YOLO V3的行人识别方法.pdf基于YOLO V3的行人识别方法.pdf基于YOLO V3的行人识别方法....
  • 行人识别 描述。 这样做的目的是在一个玩具示例上说明持久性同源性坐标不变性的好处。 使用他们口袋中携带的智能手机的加速度传感器记录了3个行人A,B和C的行走,从而在R3中产生了3个多元时间序列:每个时间序列...
  • 行人识别 步态能量图 文件处理 归一化 步态识别 基于模型
  • 基于transformer框架的车辆行人识别完整项目呈现,以及相关环境的配置和项目测试训练。

    背景:

    一位在读研究生通过我一个大学同学找我,让我花点时间帮他研究一下基于transformer模型的车辆行人识别,要求代码能够训练、加载模型测试、并要有适当的讲解解答。

    思路:

    具体思路很简答,需要搜集以下相关资料并研读,这花费了我不少时间:

    1.标注好的行人车辆数据集

    2.基于transformer模型的算法调试及相关文献研读

    3.相关的服务器环境搭建

    数据集:

    目前目标检测领域,大多数是以coco数据集或者VOC数据集为参考,这里最终选取了coco数据集。需要说明的是,coco数据集本身比较庞大,而且要划分的类别也比较多,需要对其进行筛选,达到自己的需求才可以。

    数据集下载网址如下:链接:https://pan.baidu.com/s/1OsO7b88_abuyaPn8frkzTw 
    提取码:ojyq

    数据集标注使用参考:https://www.jianshu.com/p/4a015f0b6fcf

    解压缩后目录如下:data-->coco---->

    data-->coco---->annotations:

    图片目录如下:

     该数据集中,训练集train2017图片2101张,验证集val2017图片450张,测试集test2017图片449张。

    算法:

    算法重点参考DETR和DAB-DETR。

    环境:

    ubuntu20.04+python3.8+cuda

    测试效果:

     

     

    展开全文
  • 运用KPCA方法在ORL人脸库上进行人脸识别,分类器为最近邻分类器。
  • 行人识别对于智能辅助驾驶和智能车辆至关重要.采用一种基于不变矩算法的行人特征提取和识别方法,通过利用不变矩在目标平移、旋转和缩放的不变性,在HU不变矩基础上添加3个表达式,使不变矩包含更多的细节特征,将其...
  • 通过智能手机内嵌传感器采集的运动特征并与心中的行人特征对比,系统可以在视频画面内的诸多行人中准确识别出持有智能手机的定位服务发起者,并报告实时的定位信息,定位平均误差可达到三十厘米以下。
  • yolov5行人识别 qt 鼠标检测 绘制区域 检测超界系统 视频:https://live.csdn.net/v/164262
  • Python如何实现行人识别-人体识别

    千次阅读 多人点赞 2020-01-03 11:35:35
    Python如何实现行人识别-人体识别 1.python有个图形识别库叫opencv 2.去百度查查如何安装这个库,会py的小伙伴们安装个库应该不是问题。 3.接下来就是直接上代码了 #!/usr/bin/python3 # -*- coding: utf-8 -*- ...

    Python如何实现行人识别-人体识别

    • 1.python有个图形识别库叫opencv
    • 2.去百度查查如何安装这个库,会py的小伙伴们安装个库应该不是问题。
    • 3.接下来就是直接上代码了
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    import cv2
    import sys,os
    class opencvs():
    
        def main(self):
            ints = 0
            cap = cv2.VideoCapture(0)
    
            #告诉OpenCV使用什么识别分类器
            classfier = cv2.CascadeClassifier("haarcascade_fullbody.xml")
    
            while cap.isOpened():
    
                #读取一帧数据
                ok, frame = cap.read()
                #显示方向
                frame = cv2.flip(frame,1)
    
                #将当前帧转换成灰度图像
                grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
                #检测结果
                faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.1, minNeighbors = 4, minSize = (50, 150))
    
                #第一个参数是灰度图像
                #第三个参数是人脸检测次数,设置越高,误检率越低,但是对于迷糊图片,我们设置越高,越不易检测出来
    
                if len(faceRects) > 0:
                    ints+=1
                    for faceRect in faceRects:
                        x, y, w, h = faceRect
                        cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), (0, 255, 0) , 1)
                        
                    if ints >= 3:
                        ints = 0
                        #警报
                        os.system("sudo aplay 4611.wav")
                
                  
                  
                #显示图像
                cv2.imshow(' ', frame)           
                #键盘Q键结束
                c = cv2.waitKey(10)
                if c & 0xFF == ord('q'):
                    break
    
            #释放摄像头并销毁所有窗口
            cap.release()
            cv2.destroyAllWindows()
    
    
    if __name__ == '__main__':
        opencvs().main()
    
    
    • 4.代码和模型我也上传到腾讯微云了,链接https://share.weiyun.com/5e4PiHx
      直接可以用 不过记得安装好Python3的opencv库
      在这里插入图片描述
    • 请继续关注收藏我!下篇文章我会介绍更多的人工智能技术文章。
    • 我们公司是国内做树莓派人工智能系统的
    • 系统介绍
      自美树莓派人工智能系统已经公布和开源了,还开发了一些配合这个系统的智能硬件,基于这个系统,可以开发
      python 代码应用插件,系统还提供人工智能api库,就不需要写语音识别,语音合成,语音唤醒,人脸识别,系统维护,系统架构,微信小
      程序这些基础代码了。你只需要想好触发词和写好插件功能代码即可。
      科艺创想www.16302.com QQ群751977302
      树莓派自美智能系统文档和下载地址:http://docs.16302.com
      树莓派img一键烧录使用,支持在线更新。

    在这里插入图片描述

    展开全文
  • Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,...
  • 基于matlab的简单行人识别行人识别
  • 车辆行人识别传统的方法有很多,我记得以前大家喜欢搞HOG+SVM、XGboost等方法,但是深度学习出来之后,其他基本上就销声匿迹,所以现在基本上是深度学习一家独大。 目前市面上成熟的物体检测的模型有:YOLO_V3、...

          车辆行人识别传统的方法有很多,我记得以前大家喜欢搞HOG+SVM、XGboost等方法,但是深度学习出来之后,其他基本上就销声匿迹,所以现在基本上是深度学习一家独大。

          目前市面上成熟的物体检测的模型有:YOLO_V3、SSD、R-FCN,这里详细整理出来,供大家学习。

    1. YOLO_V1

          传统CNN在识别阶段,需要用过滑动窗口的方式,遍历图片所有位置、大小的窗口,放入识别模型去识别,这无疑加大了识别的时间,YOLO很好的避免了这个问题,具体做法如下:

        设计理念                                                        

    1. Yolo的CNN网络将输入的图片分割成  网格,然后每个单元格负责去检测那些中心点落在该格子内的目标,如图所示,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。
    2. 每个单元格会预测  个边界框以及边界框的置信度。所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为  ,当该边界框是不包含目标时,此时  。而当该边界框包含目标时,  。主要这里包含任何类型物体的可能性。
    3. 边界框的准确度用预测框与实际框(ground truth)的IOU(交并比)来表征 。因此置信度为  。很多人可能将Yolo的置信度看成边界框是否含有目标的概率,但是其实它是两个因子的乘积,预测框的准确度也反映在里面。
    4. 边界框的大小与位置可以用4个值来表征:  ,其中 x,y 是边界框的中心坐标,而 w 和 h 是边界框的宽与高。中心坐标的预测值  是相对于每个单元格左上角坐标点的偏移值,并且相对于整个图片的宽与高的比例。而边界框的 w 和 h 预测值也是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在  范围。
    5. 这样,每个边界框的预测值实际上包含5个元素:  ,其中前4个表征边界框的大小与位置,而最后一个值是置信度。
    6. 对于每一个单元格其还要给出预测出 C 个类别概率值,其表征的是由该单元格负责预测的边界框其目标属于各个类别的概率。
    7. 值得注意的是,不管一个单元格预测多少个边界框,其只预测一组类别概率值,这是Yolo算法的一个缺点,在后来的改进版本中,Yolo9000是把类别概率预测值与边界框是绑定在一起的。我们可以计算出各个边界框类别置信度:

                                                                        

         网络设计

           Yolo采用卷积网络来提取特征,然后使用全连接层来得到预测值。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数:  。但是最后一层却采用线性激活函数。

                           

         对于每一个单元格,前20个元素是类别概率值,然后2个元素是边界框置信度,两者相乘可以得到类别置信度,最后8个元素是边界框的  。

         网络训练        

           YOLO采用迁移学习的方式,迁移ImageNet的前20个卷积层,然后添加3个CNN、两个pool层、2个全连接层,组成YOLO的网络模型。                 

                         

          训练损失函数的分析:Yolo算法将目标检测看成回归问题,所以采用的是均方差损失函数。但是对不同的部分采用了不同的权重值。首先区分定位误差和分类误差。对于定位误差,即边界框坐标预测误差,采用较大的权重  。然后区分不包含目标的边界框与含有目标的边界框的置信度,对于前者,采用较小的权重值  。其它权重值均设为1。然后采用均方误差,其同等对待大小不同的边界框,但是实际上较小的边界框的坐标误差应该要比较大的边界框要更敏感。为了保证这一点,将网络的边界框的宽与高预测改为对其平方根的预测,即预测值变为  。在训练时,如果该单元格内确实存在目标,那么只选择与ground truth的IOU最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标。这样设置的一个结果将会使一个单元格对应的边界框更加专业化,其可以分别适用不同大小,不同高宽比的目标,从而提升模型性能。

                                                   

          其中第一项是边界框中心坐标的误差项,  指的是第 i 个单元格存在目标,且该单元格中的第 j 个边界框负责预测该目标。第二项是边界框的高与宽的误差项。第三项是包含目标的边界框的置信度误差项。第四项是不包含目标的边界框的置信度误差项。而最后一项是包含目标的单元格的分类误差项,  指的是第 i 个单元格存在目标。这里特别说一下置信度的target值  ,如果是不存在目标,此时由于 ,那么  。如果存在目标,  ,此时需要确定  ,当然你希望最好的话,可以将IOU取1,这样  ,但是在YOLO实现中,使用了一个控制参数rescore(默认为1),当其为1时,IOU不是设置为1,而就是计算truth和pred之间的真实IOU。不过很多复现YOLO的项目还是取  ,这个差异应该不会太影响结果吧。

         网络预测

          在说明Yolo算法的预测过程之前,这里先介绍一下非极大值抑制算法,NMS算法主要解决的是一个目标被多次检测的问题,如图可以看到人脸被多次检测,但是其实我们希望最后仅仅输出其中一个最好的预测框,那么可以采用NMS算法来实现这样的效果:首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该框剔除;然后对剩余的检测框重复上述过程,直到处理完所有的检测框。

                              

          

          下面就来分析Yolo的预测过程,这里我们不考虑batch,认为只是预测一张输入图片。根据前面的分析,最终的网络输出是  ,但是我们可以将其分割成三个部分:类别概率部分为  ,置信度部分为  ,而边界框部分为  (对于这部分不要忘记根据原始图片计算出其真实值)。然后将前两项相乘(矩阵  乘以  可以各补一个维度来完成  )可以得到类别置信度值为  ,这里总共预测了  个边界框。

           所有的准备数据已经得到了,那么我们先说第一种策略来得到检测框的结果,我认为这是最正常与自然的处理。首先,对于每个预测框根据类别置信度选取置信度最大的那个类别作为其预测标签,经过这层处理我们得到各个预测框的预测类别及对应的置信度值,其大小都是  。一般情况下,会设置置信度阈值,就是将置信度小于该阈值的box过滤掉,所以经过这层处理,剩余的是置信度比较高的预测框。最后再对这些预测框使用NMS算法,最后留下来的就是检测结果。一个值得注意的点是NMS是对所有预测框一视同仁,还是区分每个类别,分别使用NMS。Ng在deeplearning.ai中讲应该区分每个类别分别使用NMS,但是看了很多实现,其实还是同等对待所有的框,我觉得可能是不同类别的目标出现在相同位置这种概率很低吧。

          上面的预测方法应该非常简单明了,但是对于Yolo算法,其却采用了另外一个不同的处理思路(至少从C源码看是这样的),其区别就是先使用NMS,然后再确定各个box的类别。其基本过程如图12所示。对于98个boxes,首先将小于置信度阈值的值归0,然后分类别地对置信度值采用NMS,这里NMS处理结果不是剔除,而是将其置信度值归为0。最后才是确定各个box的类别,当其置信度值不为0时才做出检测结果输出。这个策略不是很直接,但是貌似Yolo源码就是这样做的。Yolo论文里面说NMS算法对Yolo的性能是影响很大的,所以可能这种策略对Yolo更好。但是我测试了普通的图片检测,两种策略结果是一样的。

                               

    2. YOLO_V2

          YOLOv2在改进中遵循一个原则:保持检测速度,这也是YOLO模型的一大优势。改进策略如下:

        Batch Normalization

           Batch Normalization可以提升模型收敛速度,而且可以起到一定正则化效果,降低模型的过拟合。在YOLOv2中,每个卷积层后面都添加了Batch Normalization层,并且不再使用droput。使用Batch Normalization后,YOLOv2的mAP提升了2.4%。

        High Resolution Classifier

           目前大部分的检测模型都会在先在ImageNet分类数据集上预训练模型的主体部分(CNN特征提取器),由于历史原因,ImageNet分类模型基本采用大小为 224*224 的图片作为输入,分辨率相对较低,不利于检测模型。所以YOLOv1在采用 224*224 分类模型预训练后,将分辨率增加至 448*448 ,并使用这个高分辨率在检测数据集上finetune。但是直接切换分辨率,检测模型可能难以快速适应高分辨率。所以YOLOv2增加了在ImageNet数据集上使用 448*448 输入来finetune分类网络这一中间过程(10 epochs),这可以使得模型在检测数据集上finetune之前已经适用高分辨率输入。使用高分辨率分类器后,YOLOv2的mAP提升了约4%。

        Convolutional With Anchor Boxes

            在YOLOv1中,输入图片最终被划分为 7*7 网格,每个单元格预测2个边界框。YOLOv1最后采用的是全连接层直接对边界框进行预测,其中边界框的宽与高是相对整张图片大小的,而由于各个图片中存在不同尺度和长宽比(scales and ratios)的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOv1在精确定位方面表现较差。YOLOv2借鉴了Faster R-CNN中RPN网络的先验框(anchor boxes,prior boxes,SSD也采用了先验框)策略。RPN对CNN特征提取器得到的特征图(feature map)进行卷积来预测每个位置的边界框以及置信度(是否含有物体),并且各个位置设置不同尺度和比例的先验框,所以RPN预测的是边界框相对于先验框的offsets值(其实是transform值,详细见Faster R_CNN论文),采用先验框使得模型更容易学习。所以YOLOv2移除了YOLOv1中的全连接层而采用了卷积和anchor boxes来预测边界框。为了使检测所用的特征图分辨率更高,移除其中的一个pool层。在检测模型中,YOLOv2不是采用 448*448 图片作为输入,而是采用 416*416 大小。因为YOLOv2模型下采样的总步长为 32 ,对于 416*416 大小的图片,最终得到的特征图大小为 13*13 ,维度是奇数,这样特征图恰好只有一个中心位置。对于一些大物体,它们中心点往往落入图片中心位置,此时使用特征图的一个中心点去预测这些物体的边界框相对容易些。所以在YOLOv2设计中要保证最终的特征图有奇数个位置。对于YOLOv1,每个cell都预测2个boxes,每个boxes包含5个值:  ,前4个值是边界框位置与大小,最后一个值是置信度(confidence scores,包含两部分:含有物体的概率以及预测框与ground truth的IOU)。但是每个cell只预测一套分类概率值(class predictions,其实是置信度下的条件概率值),供2个boxes共享。YOLOv2使用了anchor boxes之后,每个位置的各个anchor box都单独预测一套分类概率值,这和SSD比较类似(但SSD没有预测置信度,而是把background作为一个类别来处理)。

           使用anchor boxes之后,YOLOv2的mAP有稍微下降(这里下降的原因,我猜想是YOLOv2虽然使用了anchor boxes,但是依然采用YOLOv1的训练方法)。YOLOv1只能预测98个边界框( 7*7*2 ),而YOLOv2使用anchor boxes之后可以预测上千个边界框(  )。所以使用anchor boxes之后,YOLOv2的召回率大大提升,由原来的81%升至88%。

        Dimension Clusters

           在Faster R-CNN和SSD中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标:

         New Network: Darknet-19

            YOLOv2采用了一个新的基础模型(特征提取器),称为Darknet-19,包括19个卷积层和5个maxpooling层,如图4所示。Darknet-19与VGG16模型设计原则是一致的,主要采用 3*3 卷积,采用 2*2 的maxpooling层之后,特征图维度降低2倍,而同时将特征图的channles增加两倍。与NIN(Network in Network)类似,Darknet-19最终采用global avgpooling做预测,并且在 3*3 卷积之间使用 1*1 卷积来压缩特征图channles以降低模型计算量和参数。Darknet-19每个卷积层后面同样使用了batch norm层以加快收敛速度,降低模型过拟合。在ImageNet分类数据集上,Darknet-19的top-1准确度为72.9%,top-5准确度为91.2%,但是模型参数相对小一些。使用Darknet-19之后,YOLOv2的mAP值没有显著提升,但是计算量却可以减少约33%。

         Direct location prediction

          前面讲到,YOLOv2借鉴RPN网络使用anchor boxes来预测边界框相对先验框的offsets。边界框的实际中心位置 (X,Y) ,需要根据预测的坐标偏移值  ,先验框的尺度  以及中心坐标  (特征图每个位置的中心点)来计算:

    ;但是上面的公式是无约束的,预测的边界框很容易向任何方向偏移,如当  时边界框将向右偏移先验框的一个宽度大小,而当  时边界框将向左偏移先验框的一个宽度大小,因此每个位置预测的边界框可以落在图片任何位置,这导致模型的不稳定性,在训练时需要很长时间来预测出正确的offsets。所以,YOLOv2弃用了这种预测方式,而是沿用YOLOv1的方法,就是预测边界框中心点相对于对应cell左上角位置的相对偏移值,为了将边界框中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)。总结来看,根据边界框预测的4个offsets ,可以按如下公式计算出边界框实际位置和大小:

                                                                     

            其中  为cell的左上角坐标,如图5所示,在计算时每个cell的尺度为1,所以当前cell的左上角坐标为 (1,1) 。由于sigmoid函数的处理,边界框的中心位置会约束在当前cell内部,防止偏移过多。而  和  是先验框的宽度与长度,前面说过它们的值也是相对于特征图大小的,在特征图中每个cell的长和宽均为1。这里记特征图的大小为  (在文中是  ),这样我们可以将边界框相对于整张图片的位置和大小计算出来(4个值均在0和1之间):

                                                          

           如果再将上面的4个值分别乘以图片的宽度和长度(像素点值)就可以得到边界框的最终位置和大小了。这就是YOLOv2边界框的整个解码过程。约束了边界框的位置预测值使得模型更容易稳定训练,结合聚类分析得到先验框与这种预测方法,YOLOv2的mAP值提升了约5%。

                                                                        

        Fine-Grained Features

             YOLOv2的输入图片大小为 416*416 ,经过5次maxpooling之后得到 13*13 大小的特征图,并以此特征图采用卷积做预测。 13*13 大小的特征图对检测大物体是足够了,但是对于小物体还需要更精细的特征图(Fine-Grained Features)。因此SSD使用了多尺度的特征图来分别检测不同大小的物体,前面更精细的特征图可以用来预测小物体。YOLOv2提出了一种passthrough层来利用更精细的特征图。YOLOv2所利用的Fine-Grained Features是 26*26大小的特征图(最后一个maxpooling层的输入),对于Darknet-19模型来说就是大小为 26*26*512 的特征图。passthrough层与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍,passthrough层抽取前面层的每个 2*2 的局部区域,然后将其转化为channel维度,对于 26*26*512 的特征图,经passthrough层处理之后就变成了 13*13*2048 的新特征图(特征图大小降低4倍,而channles增加4倍,图6为一个实例),这样就可以与后面的 13*13*1024 特征图连接在一起形成 13*13*3072 大小的特征图,然后在此特征图基础上卷积做预测。在YOLO的C源码中,passthrough层称为reorg layer

        Multi-Scale Training

            由于YOLOv2模型中只有卷积层和池化层,所以YOLOv2的输入可以不限于 416*416 大小的图片。为了增强模型的鲁棒性,YOLOv2采用了多尺度输入训练策略,具体来说就是在训练过程中每间隔一定的iterations之后改变模型的输入图片大小。由于YOLOv2的下采样总步长为32,输入图片大小选择一系列为32倍数的值:  ,输入图片最小为 320*320,此时对应的特征图大小为 10*10 (不是奇数了,确实有点尴尬),而输入图片最大为 608*608 ,对应的特征图大小为 19*19 。在训练过程,每隔10个iterations随机选择一种输入图片大小,然后只需要修改对最后检测层的处理就可以重新训练。

                                                    

           采用Multi-Scale Training策略,YOLOv2可以适应不同大小的图片,并且预测出很好的结果。在测试时,YOLOv2可以采用不同大小的图片作为输入,在VOC 2007数据集上的效果如下图所示。可以看到采用较小分辨率时,YOLOv2的mAP值略低,但是速度更快,而采用高分辨输入时,mAP值更高,但是速度略有下降,对于 544*544 ,mAP高达78.6%。注意,这只是测试时输入图片大小不同,而实际上用的是同一个模型(采用Multi-Scale Training训练)。

           总结来看,虽然YOLOv2做了很多改进,但是大部分都是借鉴其它论文的一些技巧,如Faster R-CNN的anchor boxes,YOLOv2采用anchor boxes和卷积做预测,这基本上与SSD模型(单尺度特征图的SSD)非常类似了,而且SSD也是借鉴了Faster R-CNN的RPN网络。从某种意义上来说,YOLOv2和SSD这两个one-stage模型与RPN网络本质上无异,只不过RPN不做类别的预测,只是简单地区分物体与背景。在two-stage方法中,RPN起到的作用是给出region proposals,其实就是作出粗糙的检测,所以另外增加了一个stage,即采用R-CNN网络来进一步提升检测的准确度(包括给出类别预测)。而对于one-stage方法,它们想要一步到位,直接采用“RPN”网络作出精确的预测,要因此要在网络设计上做很多的tricks。YOLOv2的一大创新是采用Multi-Scale Training策略,这样同一个模型其实就可以适应多种大小的图片了。

     

    展开全文
  • AB3DMOT 车辆 行人识别

    2021-07-22 20:10:18
    在results/pointrcnn_Pedestrian_val/trk_image_vis查看结果 效果评价 容易将长方体/柱状物识别成车辆/行人识别车辆时尤为明显,但这种误判一般发生在道路区域外,-且持续帧数很少; 可能将骑自行车的人判别为...
  • 行人识别

    千次阅读 2016-08-13 20:17:35
    行人识别这一块主要的研究是基于HoG特征+SVM分类器判断图像中是否存在行人。我们先给出行人识别的过程: 1. 数据训练(OpenCV 中有自带的已经训练好了的,设置参数为Default就是使用的默认的)。当然你可以自己根据...
  • 为了提高行人属性识别的准确率,提出了一种基于多尺度注意力网络的行人属性识别算法。为了提高算法的特征表达能力和属性判别能力,首先,在残差网络ResNet50的基础上,增加了自顶向下的特征金字塔和注意力模块,自顶向下...
  • 物联网-智慧交通-车辆避碰系统视觉传感型行人识别算法.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,725
精华内容 9,490
关键字:

行人识别