竞赛选题 目标检测-行人车辆检测流量计数

文章目录

  • 前言
  • 1\. 目标检测概况
    • 1.1 什么是目标检测?
    • 1.2 发展阶段
  • 2\. 行人检测
    • 2.1 行人检测简介
    • 2.2 行人检测技术难点
    • 2.3 行人检测实现效果
    • 2.4 关键代码-训练过程
  • 最后

前言

🔥 优质竞赛项目系列,今天要分享的是

行人车辆目标检测计数系统

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1. 目标检测概况

1.1 什么是目标检测?

目标检测,粗略来说就是:输入图片/视频,经过处理,得到:目标的位置信息(比如左上角和右下角的坐标)、目标的预测类别、目标的预测置信度(confidence)。

1.2 发展阶段

  1. 手工特征提取算法,如VJ、HOG、DPM

  2. R-CNN算法(2014),最早的基于深度学习的目标检测器之一,其结构是两级网络:

  • 1)首先需要诸如选择性搜索之类的算法来提出可能包含对象的候选边界框;
  • 2)然后将这些区域传递到CNN算法进行分类;
  1. R-CNN算法存在的问题是其仿真很慢,并且不是完整的端到端的目标检测器。

  2. Fast R-CNN算法(2014末),对原始R-CNN进行了相当大的改进:提高准确度,并减少执行正向传递所花费的时间。
    是,该模型仍然依赖于外部区域搜索算法。

  3. faster R-CNN算法(2015),真正的端到端深度学习目标检测器。删除了选择性搜索的要求,而是依赖于

  • (1)完全卷积的区域提议网络(RPN, Region Purpose Network),可以预测对象边界框和“对象”分数(量化它是一个区域的可能性的分数)。
  • (2)然后将RPN的输出传递到R-CNN组件以进行最终分类和标记。
  1. R-CNN系列算法,都采取了two-stage策略。特点是:虽然检测结果一般都非常准确,但仿真速度非常慢,即使是在GPU上也仅获得5 FPS。

  2. one-stage方法有:yolo(2015)、SSD(2015末),以及在这两个算法基础上改进的各论文提出的算法。这些算法的基本思路是:均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归。
    整个过程只需要一步,所以其优势是速度快,但是训练比较困难。

  3. yolov3(2018)是yolo作者提出的第三个版本(之前还提过yolov2和它们的tinny版本,tinny版本经过压缩更快但是也降低了准确率)。

2. 行人检测

这里学长以行人检测作为例子来讲解目标检测。

2.1 行人检测简介

行人检测( Pedestrian Detection)一直是计算机视觉研究中的热点和难点。行人检测要解决的问题是:找出图像或视频帧

行人检测技术有很强的使用价值,它可以与行人跟踪,行人重识别等技术结合,应用于汽车无人驾驶系统(ADAS),智能机器人,智能视频监控,人体行为分析,客流统计系统,智能交通等领域。

2.2 行人检测技术难点

由于人体具有相当的柔性,因此会有各种姿态和形状,其外观受穿着,姿态,视角等影响非常大,另外还面临着遮挡
、光照等因素的影响,这使得行人检测成为计算机视觉领域中一个极具挑战性的课题。行人检测要解决的主要难题是:

  • 外观差异大:包括视角,姿态,服饰和附着物,光照,成像距离等。从不同的角度看过去,行人的外观是很不一样的。处于不同姿态的行人,外观差异也很大。由于人穿的衣服不同,以及打伞、戴帽子、戴围巾、提行李等附着物的影响,外观差异也非常大。光照的差异也导致了一些困难。远距离的人体和近距离的人体,在外观上差别也非常大。

  • 遮挡问题: 在很多应用场景中,行人非常密集,存在严重的遮挡,我们只能看到人体的一部分,这对检测算法带来了严重的挑战。

  • 背景复杂:无论是室内还是室外,行人检测一般面临的背景都非常复杂,有些物体的外观和形状、颜色、纹理很像人体,导致算法无法准确的区分。

  • 检测速度:行人检测一般采用了复杂的模型,运算量相当大,要达到实时非常困难,一般需要大量的优化。

2.3 行人检测实现效果

在这里插入图片描述

检测到行人后还可以做流量分析:

在这里插入图片描述

2.4 关键代码-训练过程



    import cv2
    import numpy as np
    import random


    def load_images(dirname, amout = 9999):
        img_list = []
        file = open(dirname)
        img_name = file.readline()
        while img_name != '':  # 文件尾
            img_name = dirname.rsplit(r'/', 1)[0] + r'/' + img_name.split('/', 1)[1].strip('\n')
            img_list.append(cv2.imread(img_name))
            img_name = file.readline()
            amout -= 1
            if amout <= 0: # 控制读取图片的数量
                break
        return img_list


    # 从每一张没有人的原始图片中随机裁出10张64*128的图片作为负样本
    def sample_neg(full_neg_lst, neg_list, size):
        random.seed(1)
        width, height = size[1], size[0]
        for i in range(len(full_neg_lst)):
            for j in range(10):
                y = int(random.random() * (len(full_neg_lst[i]) - height))
                x = int(random.random() * (len(full_neg_lst[i][0]) - width))
                neg_list.append(full_neg_lst[i][y:y + height, x:x + width])
        return neg_list


    # wsize: 处理图片大小,通常64*128; 输入图片尺寸>= wsize
    def computeHOGs(img_lst, gradient_lst, wsize=(128, 64)):
        hog = cv2.HOGDescriptor()
        # hog.winSize = wsize
        for i in range(len(img_lst)):
            if img_lst[i].shape[1] >= wsize[1] and img_lst[i].shape[0] >= wsize[0]:
                roi = img_lst[i][(img_lst[i].shape[0] - wsize[0]) // 2: (img_lst[i].shape[0] - wsize[0]) // 2 + wsize[0], \
                      (img_lst[i].shape[1] - wsize[1]) // 2: (img_lst[i].shape[1] - wsize[1]) // 2 + wsize[1]]
                gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
                gradient_lst.append(hog.compute(gray))
        # return gradient_lst


    def get_svm_detector(svm):
        sv = svm.getSupportVectors()
        rho, _, _ = svm.getDecisionFunction(0)
        sv = np.transpose(sv)
        return np.append(sv, [[-rho]], 0)


    # 主程序
    # 第一步:计算HOG特征
    neg_list = []
    pos_list = []
    gradient_lst = []
    labels = []
    hard_neg_list = []
    svm = cv2.ml.SVM_create()
    pos_list = load_images(r'G:/python_project/INRIAPerson/96X160H96/Train/pos.lst')
    full_neg_lst = load_images(r'G:/python_project/INRIAPerson/train_64x128_H96/neg.lst')
    sample_neg(full_neg_lst, neg_list, [128, 64])
    print(len(neg_list))
    computeHOGs(pos_list, gradient_lst)
    [labels.append(+1) for _ in range(len(pos_list))]
    computeHOGs(neg_list, gradient_lst)
    [labels.append(-1) for _ in range(len(neg_list))]
     
    # 第二步:训练SVM
    svm.setCoef0(0)
    svm.setCoef0(0.0)
    svm.setDegree(3)
    criteria = (cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, 1000, 1e-3)
    svm.setTermCriteria(criteria)
    svm.setGamma(0)
    svm.setKernel(cv2.ml.SVM_LINEAR)
    svm.setNu(0.5)
    svm.setP(0.1)  # for EPSILON_SVR, epsilon in loss function?
    svm.setC(0.01)  # From paper, soft classifier
    svm.setType(cv2.ml.SVM_EPS_SVR)  # C_SVC # EPSILON_SVR # may be also NU_SVR # do regression task
    svm.train(np.array(gradient_lst), cv2.ml.ROW_SAMPLE, np.array(labels))
     
    # 第三步:加入识别错误的样本,进行第二轮训练
    # 参考 http://masikkk.com/article/SVM-HOG-HardExample/
    hog = cv2.HOGDescriptor()
    hard_neg_list.clear()
    hog.setSVMDetector(get_svm_detector(svm))
    for i in range(len(full_neg_lst)):
        rects, wei = hog.detectMultiScale(full_neg_lst[i], winStride=(4, 4),padding=(8, 8), scale=1.05)
        for (x,y,w,h) in rects:
            hardExample = full_neg_lst[i][y:y+h, x:x+w]
            hard_neg_list.append(cv2.resize(hardExample,(64,128)))
    computeHOGs(hard_neg_list, gradient_lst)
    [labels.append(-1) for _ in range(len(hard_neg_list))]
    svm.train(np.array(gradient_lst), cv2.ml.ROW_SAMPLE, np.array(labels))


    # 第四步:保存训练结果
    hog.setSVMDetector(get_svm_detector(svm))
    hog.save('myHogDector.bin')


最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/167710.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据中心标签的重要性

布线标签的实施是为了为用户今后的维护和管理带来最大的 便利&#xff0c;提高其管理水平和工作效率&#xff0c;减少网络配置时间&#xff0c;标签标识系统包括三个方面:标识分类及定义,标签和建立文档。 标签、标识的分类有哪些? 数据中心内的每一电缆、光缆、配线设备、端…

拼多多API接口,百亿补贴商品详情接口系列

随着互联网的快速发展&#xff0c;电子商务在日常生活中扮演着越来越重要的角色。拼多多&#xff0c;作为中国领先的社交电商巨头&#xff0c;以其独特的商业模式和创新的API接口&#xff0c;为广大开发者提供了一个全新的电商生态系统。本文将详细介绍拼多多的API接口及其应用…

基于SSM的高校毕业设计选题管理系统(有报告)。Javaee项目。

演示视频&#xff1a; 基于SSM的高校毕业设计选题管理系统&#xff08;有报告&#xff09;。Javaee项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring S…

8年资深测试,自动化测试常见问题总结,惊险避坑...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、自动化测试简介…

大模型真的会让软件测试人员下岗吗?

在今年3月写过一篇文章&#xff1a;又一次被震惊&#xff1a;从生成和细化需求到应用各种方法设计测试用例 &#xff0c;展示了chatGPT生成测试用例&#xff0c;而且可以用不同的方法生成测试用例&#xff0c;在我们的引导下它还能补充测试用例、完善测试用例。半年之后&#x…

华为昇腾阿木实验室FMT,开展无人飞艇开发者线下体验活动!

活动背景 气球机器人是一种利用气球作为飞行平台的可编程飞行器&#xff0c;它利用浮力作为主要升力&#xff0c;在灵活性、稳定性和安全性方面展示了巨大的潜力。近年来&#xff0c;这些机器人已在航拍、气象观测、水文学、侦察和特勤等领域发挥了重要作用。 气球机器人是未来…

使用契约的链上限价订单

我们开发了链上限价订单。 它基于一种称为契约的智能合约&#xff0c;只有在花费输出的交易满足特定条件时才可以花费输出。 为了演示其工作原理&#xff0c;我们实施了以比特币支付的 Ordinals 代币买卖限价订单&#xff0c;无需托管人。 它可以运行在任何比特币协议链上&…

List 函数排序操作,用对方法事半功倍!

作为一名程序员&#xff0c;以下这些场景你肯定不陌生&#xff0c; 1.数据分析和处理&#xff1a;在处理大量数据时&#xff0c;需要对数据进行排序以进行进一步的分析和处理。例如&#xff0c;在市场调研中&#xff0c;可能需要按照客户的购买频率对客户列表进行排序&#xf…

53. 最大子数组和 : 图解从 O(n) 的常规理解到 O(n) 的分治做法

题目描述 这是 LeetCode 上的 「53. 最大子数组和」 &#xff0c;难度为 「中等」。 Tag : 「前缀和」、「区间求和问题」、「线性 DP」、「分治」 给你一个整数数组 nums&#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#…

刚果(布)市场开发攻略,收藏一篇就够了

刚果&#xff08;布&#xff09;是非洲西部的一个国家&#xff0c;中国是刚果布第一大出口国&#xff0c;第二个进口国&#xff0c;经济联系比较紧密&#xff0c;从中国进口产品主要机械配件、建材、电机、针织或钩编的服装及衣着附件、蔬菜、水果等。本身国内治安良好&#xf…

抖音直播招聘报白又叫报抖音的白名单要不然就会封禁直播间

抖音直播招聘报白&#xff0c;又叫报抖音的白名单&#xff0c;只有进了抖音白名单里才能在直播间说招聘或者找工作等相关词&#xff0c;要不然就会封禁直播间&#xff0c;小视频也不会给推流&#xff0c;还会限流&#xff0c;但是如果做了抖音报白&#xff0c;官方也会给一部分…

学习教授LLM逻辑推理11.19

学习教授LLM逻辑推理 摘要1 引言2前言2.1事件关系提取2.2 演绎推理 3 揭示逻辑推理中的LLMS3.1 LLM如何执行任务3.1.1数据源3.1.2实验装置3.1.3 分析 3.2 LLM如何执行抽象多跳推理&#xff1f;3.2.1数据来源3.2.2 实验装置。3.2.3 分析。 4 逻辑推理教学4.1 LLM的上下文学习4.2…

学生作业管理系统的设计与实现-计算机毕业设计源码20912

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于学生作业管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了学生作业管理系统&#xff0c;它彻底改变了过…

vue如何开启gzip压缩

什么是gzip&#xff1a; Gzip 是一种压缩算法&#xff0c;在网络传输中使用非常普遍。 需要注意的是&#xff0c;Gzip 压缩仅对于文本类型的资源有明显提示&#xff0c;压缩后的体积大约是压缩前的 1/3。 但是对于图片&#xff0c;音视频等媒体资源&#xff0c;本身就采用了…

lvm操作和扩容根分区

扩展逻辑卷 [rootlocalhost ~]# pvcreate /dev/sdb1 vgextend vg1 /dev/sdb1&#xff08;表示将/dev/sdb1扩展到centos卷组&#xff0c;扩展卷组就是将其它分好的区加入卷组&#xff09; [rootlocalhost ~]# vgextend centos /dev/sdb1[rootlocalhost ~]# lvextend -L 50G /…

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】MobileNets_V2模型算法详解

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】MobileNets_V2模型算法详解 文章目录 【图像分类】【深度学习】【轻量级网络】【Pytorch版本】MobileNets_V2模型算法详解前言MobleNet_V2讲解反向残差结构(Inverted Residuals)兴趣流形(Manifold of interest)线性瓶颈层…

德思特分享丨一文带你了解ADC测试参数有哪些?

来源&#xff1a;德思特测量测试 德思特分享丨一文带你了解ADC测试参数有哪些&#xff1f; 一文带你了解ADC测试参数有哪些 模数转换器&#xff08;ADC&#xff09;是数字电子系统中重要组成部分&#xff0c;用于捕获外部世界的模拟信号&#xff0c;如声音、图像、温度、压力…

修改bat文件默认编辑软件

Windows默认编辑bat文件的软件是自带的文本编辑器。无法高亮显示bat中的命令。 修改方式一&#xff1a; 打开注册表文件&#xff0c;变更键值 HKEY_CLASSES_ROOT\batfile\shell\edit\command 对应软件地址 修改方式二&#xff1a; 制作批处理文件&#xff0c;代码如下&#x…

【Highway-env】IntersectionEnv代码阅读

文章目录 主要完成任务代码结构1.action space2.default_config3.reward_agent_rewards_agent_reward_reward_rewards小结 4.terminated & truncated5.reset_make_road_make_vehicles_spawn_vehicle 6.step 主要完成任务 IntersectionEnv继承自AbstractEnv,主要完成以下4个…

Oracle数据库透明加密 安当加密

安当TDE透明加密组件是一种用于数据保护的解决方案&#xff0c;它对数据进行加密&#xff0c;以防止未经授权的访问和数据泄露。 以下是安当TDE透明加密组件的主要功能介绍&#xff1a; 数据保护&#xff1a;安当TDE透明加密组件可以对数据库中的敏感数据进行加密&#xff0c;…