基于YOLOv5的人群密度检测系统设计与实现

大家好,本文将介绍基于改进后的YOLOv5目标检测模型,设计并实现人群密度检测系统。

使用YOLOv5的源代码,在此基础上修改和训练模型, 数据集选用crowdhuman数据集。对yolov5源码中的文件进行修改,更换主干网络、改进损失函数。系统的前后端代码则体现在sever.py、detect_web.py和head-detect-web 文件夹中,主要基于Flask实现。

文件下载:基于YOLOv5的人群密度检测系统设计与实现

1.FasterNet实现

利用PyTorch深度学习框架实现FasterNet主干网络,FasterNet是一种高效的主干网络,专门设计用于目标检测任务,并针对速度和精度进行优化。在目标检测领域,主干网络的选择对于算法性能至关重要,因为它直接影响着特征的提取和表达能力。FasterNet以其卓越的性能和高效的设计,在目标检测算法中得到广泛应用。

FasterNet的网络结构由基础网络模块、快速特征融合模块和高效上采样模块三个主要部分组成。基础网络模块是FasterNet的基本组成单元,它包括卷积层、批归一化层和激活函数层。这些层在深度学习中经常被使用,用于对图像进行特征提取和非线性激活。

快速特征融合模块是FasterNet的关键模块之一,它负责将来自不同层级的特征进行融合。特征融合是目标检测算法中的重要步骤,它可以帮助算法捕获不同尺度和复杂度的目标信息。

高效上采样模块用于实现特征图的上采样,以实现目标位置的精确定位。在目标检测算法中,上采样操作通常用于恢复高分辨率的特征图,从而实现目标位置的准确定位。FasterNet采用了一种高效的上采样方法,能够在保持速度的同时,提高定位精度。

代码如下:

class PConv(nn.Module):# PConv Blockdef __init__(self, dim, n_div, forward="split_cat", kernel_size=3):super().__init__()self.dim_conv = dim // n_divself.dim_untouched = dim - self.dim_convself.conv = nn.Conv2d(self.dim_conv,self.dim_conv,kernel_size,stride=1,padding=(kernel_size - 1) // 2,bias=False)if forward == "slicing":self.forward = self.forward_slicingelif forward == "split_cat":self.forward = self.forward_split_catelse:raise NotImplementedErrordef forward_slicing(self, x):x[:, :self.dim_conv, :, :] = self.conv(x[:, :self.dim_conv, :, :])return xdef forward_split_cat(self, x):x1, x2 = torch.split(x, [self.dim_conv, self.dim_untouched], dim=1)x1 = self.conv(x1)x = torch.cat((x1, x2), 1)return x
class FasterNetBlock(nn.Module):# FasterNetBlock Blockdef __init__(self, c1, c2, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, shortcut, groups, expansionsuper().__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = PConv(c1, 2, "split_cat", 3)self.cv2 = Conv(c1, c_, 1, 1)self.cv3 = Conv(c_, c2, 1, 1, g=g)self.add = shortcutdef forward(self, x):return x + self.cv3(self.cv2(self.cv1(x))) if self.add else self.cv3(self.cv2(self.cv1(x)))
class FasterNeXt(nn.Module):# FasterNeXt Bottleneckdef __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansionsuper().__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c1, c_, 1, 1)self.cv3 = Conv(2 * c_, c2, 1)  # act=FReLU(c2)self.m = nn.Sequential(*(FasterNetBlock(c_, c_, shortcut, g, e=1.0) for _ in range(n)))def forward(self, x):return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1))

2.更换主干网络

在将FasterNet集成到YOLOv5中时,需要对网络结构进行修改和参数进行调整,以确保两者能够充分发挥优势。修改YOLOv5的主干网络部分,将默认的主干网络替换为FasterNet:

elif m in [FasterNeXt]:c1, c2 = ch[f], args[0]if c2 != no:  # if not outputc2 = make_divisible(c2 * gw, 8)args = [c1, c2, *args[1:]]if m in [FasterNeXt]:args.insert(2, n)  # number of repeatsn = 1

3.模型配置文件

完成以FasterNet为主干网络的YOLOv5模型配置,网络大小相比yolov5s参数量降低, 范围介于yolov5s和yolov5x之间,具体代码见yolov5-fasternet.yaml。

backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2[-1, 1, Conv, [128, 3, 2]],  # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]],  # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]],  # 5-P4/16[-1, 9, FasterNeXt, [512]],[-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32[-1, 3, FasterNeXt, [1024]], # 改进示例,也可以修改其他位置[-1, 1, SPPF, [1024, 5]],  # 9]

4.改进损失函数

基于最优传输分配(OTA)方法,改进损失函数ComputeLoss为ComputeLossOTA。 该方法提出了一种基于优化策略的标签分配方式,将 gt 看做 label 供应商,anchor 看做 label 需求方。 对于正样本,将分类和回归的 loss 加权和作为传输花费,对于负样本,传输花费就为分类 loss,通过最小化该花费,让网络自己学习最优的标签分配方式。 免去了手工选定参数的方式来实现标签分配,让网络自己选择每个 gt 对应的 anchor 数量, 而非提前设定,也能够较好的解决模棱两可的 anchor 分配问题,提高网络对这部分 anchor 的处理效果。

class ComputeLossOTA:# Compute lossesdef __init__(self, model, autobalance=False):super(ComputeLossOTA, self).__init__()device = next(model.parameters()).device  # get model deviceh = model.hyp  # hyperparameters# Define criteriaBCEcls = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h['cls_pw']], device=device))BCEobj = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h['obj_pw']], device=device))# Class label smoothing https://arxiv.org/pdf/1902.04103.pdf eqn 3self.cp, self.cn = smooth_BCE(eps=h.get('label_smoothing', 0.0))  # positive, negative BCE targets# Focal lossg = h['fl_gamma']  # focal loss gammaif g > 0:BCEcls, BCEobj = FocalLoss(BCEcls, g), FocalLoss(BCEobj, g)

5.添加Soft-NMS方法

将原torchvision.ops.nms方法用soft_nms替换。 该方法能够帮助模型在检测阶段,消除多余的检测框,找到最佳的物体检测位置,提高物体检测框标注的准确性。

def box_iou_for_nms(box1, box2, GIoU=False, DIoU=False, CIoU=False, EIou=False, eps=1e-7):# Returns Intersection over Union (IoU) of box1(1,4) to box2(n,4)b1_x1, b1_y1, b1_x2, b1_y2 = box1.chunk(4, -1)b2_x1, b2_y1, b2_x2, b2_y2 = box2.chunk(4, -1)w1, h1 = b1_x2 - b1_x1, (b1_y2 - b1_y1).clamp(eps)w2, h2 = b2_x2 - b2_x1, (b2_y2 - b2_y1).clamp(eps)# Intersection areainter = (b1_x2.minimum(b2_x2) - b1_x1.maximum(b2_x1)).clamp(0) * \(b1_y2.minimum(b2_y2) - b1_y1.maximum(b2_y1)).clamp(0)# Union Areaunion = w1 * h1 + w2 * h2 - inter + eps

6 网页端部署

目前实现了基于Flask在网页端部署原YOLOv5模型,并调用电脑摄像头进行实时检测,服务器端代码见sever.py,前端代码见templates/show_web.html,后端代码见detect_web.py。基于Flask实现的服务器端代码:

import flask
from flask import *
import flask_cors
import cv2
import logging as rel_log
from datetime import timedelta
from detect_web import VideoCameraapp = Flask(__name__)
cors = flask_cors.CORS(app, resources={r"/getMsg": {"origins": "*"}})  #解决跨域问题,vue请求数据时能用上

7.模型训练

模型训练时loss的收敛过程和曲线等均保存在results文件夹中:

图片无法展示,具体见showimages文件夹

模型一共训练200个epoch,在训练集和验证集上的效果图保存在exp文件夹中;模型训练的权重保存在weights文件夹中。下图为标签和模型预测图的示例:

图片无法展示,具体见showimages文件夹

图片无法展示,具体见showimages文件夹

8.系统实现

最终,设计实现系统原型设计中图片/视频检测、摄像头检测的核心功能,web前后端代码体现在sever.py、detect_web.py和head-detect-web文件夹中,主要基于Flask实现,改进后的模型效果得到很大的提升。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙入门——ArkUI 自定义组件间的父子双向同步状态装饰器@Link语法(四)

文章大纲 引言一、组件间状态装饰器Link 父子双向同步1、使用规则2、支持的观察变化的场景和ArkUI 刷新UI3、Link变量值初始化和更新机制3.1、初始渲染:执行父组件的build()函数后将创建子组件的新实例。3.2、Link的数据源的更新:即父组件中状态变量更新…

【Android、IOS、Flutter、鸿蒙、ReactNative 】启动页

Android 设置启动页 自定义 splash.xml 通过themes.xml配置启动页背景图 IOS 设置启动页 LaunchScreen.storyboard 设置为启动页 storyboard页面绘制 Assets.xcassets 目录下导入图片 AppLogo Flutter 设置启动页 Flutter Android 设置启动页 自定义 launch_background.xm…

[SaaS] 数禾科技 AIGC生成营销素材

https://zhuanlan.zhihu.com/p/923637935https://zhuanlan.zhihu.com/p/923637935

前端开发中常用的包管理器(npm、yarn、pnpm、bower、parcel)

文章目录 1. npm (Node Package Manager)2. Yarn (Yarn Package Manager)3. pnpm4. Bower5. Parcel总结 前端开发中常用的包管理器主要有以下几个: 1. npm (Node Package Manager) 简介: npm 是 Node.js 的默认包管理器,也是最广泛使用的包…

【go从零单排】Random Numbers、Number Parsing

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 这里是引用 💻代码 Random Numbers package mainimport ("fmt…

qt移植到arm报错动态库找不到

error while loading shared libraries: libAlterManager.so.1: cannot open shared object file: No such file or directory 通过设置环境变量 LD_LIBRARY_PATH就行了。 LD_LIBRARY_PATH是一个用于指定动态链接器在运行时搜索共享库的路径的环境变量。 例如: 前…

GoogleMIT:多智能体医疗决策框架MDAgents

|记昨日与国内某Top 1&2 医院科室老师及团队探讨技术、医学、信仰与责任而有感而发。 生成式基础大模型正在成为临床辅助甚至医学探索领域的宝贵工具。尽管我们在国内看到了很多企业或实验室联合医疗机构在如医疗记录生成、临床表型辅助诊疗、医疗知识问答交互、医院管理决…

【数据库】深入解析慢 SQL 的识别与优化策略

文章目录 什么是慢 SQL?慢 SQL 的危害如何检测分析慢 SQL使用 MySQL 慢查询日志利用 EXPLAIN 分析执行计划通过 Profiling 获取详细执行信息借助慢 SQL 收集分析平台 实际案例解析:600秒的慢 SQL 优化之旅问题描述初步分析优化步骤1. 优化 SQL 语句结构2…

高校大数据人工智能教学沙盘分享

大数据教学实训沙盘(TipDM-SP)是根据企业实际项目建设而成,并提供沙盘配套装置、软件以及教学实训资源。沙盘的作用主要有3个: 1、采集真实数据,解决教学中缺少真实数据的困扰; 2、形成从数据…

【C++】string模拟实现

各位读者老爷好,俺最近在学习string的一些知识。为了更好的了解string的结构,俺模拟实现了一个丐版string,有兴趣的老爷不妨垂阅!!! 目录 1.string类的定义 2.模拟实现成员函数接口 2.1.constructor&am…

c_str()函数 string类型转换成char*类型 C++实现

问题:在 class 的构造函数中,如果我们在类中初始化了 char * 类型,在调用构造函数时,如果直接传入字符串( string )类型,编译器会提出如下警告: 想要消除这个警告,就需要将 string 类型的变量转…

【vue3文件上传同时出现两个提示框,一个提示成功,一个提示失败,一个是用写死的,一个是接口返回的】

文件上传同时出现两个提示框,一个提示成功,一个提示失败,一个是用写死的,一个是接口返回的 原因: 接口返回的是字符串code200" 把判断的code码改为字符串的就好了

选择哪种Facebook广告目标更有效

在Facebook广告投放中,广告目标的选择决定了投放效果和转化率,但很多人往往忽略了这一步的细节。今天,我们来一起看看Facebook广告目标有哪些,以及如何精准选择! 1. 广告目标在投放中的重要性 广告目标不仅仅是一…

matlab实现主成分分析方法图像压缩和传输重建

原创 风一样的航哥 航哥小站 2024年11月12日 15:23 江苏 为了研究图像的渐进式传输技术,前文提到过小波变换,但是发现小波变换非常适合传输缩略图,实现渐进式传输每次传输的数据量不一样,这是因为每次变换之后低频成分大约是上一…

【缓存策略】你知道 Cache Aside(缓存旁路)这个缓存策略吗

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

稀疏视角CBCT重建的几何感知衰减学习|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 Geometry-Aware Attenuation Learning forSparse-View CBCT Reconstruction 稀疏视角CBCT重建的几何感知衰减学习 01 文献速递介绍 稀疏视角锥形束计算机断层扫描(CBCT)重建的几何感知学习方法 锥形束计算机断层扫描(CBCT&a…

电子应用产品设计方案-3:插座式自动温控器设计

一、设计 插座式自动温控器作为一种便捷的温度控制设备,在日常生活和工业应用中发挥着重要作用。它能够根据环境温度的变化自动控制连接设备的电源通断,实现对温度的精确调节和节能控制。本设计旨在提供一种功能强大、易于使用、安全可靠的插座式自动温控…

机器学习—神经网络的Softmax输出

为了建立一个能进行多类分类的神经网络,将采用Softmax回归模型,把它放入神经网络的输出层,如何实现? 当我们用两门课做手写数字识别的时候,我们使用这种架构的神经网络,如果你现在想用十个类进行手写数字分…

web——sqliabs靶场——第五关——报错注入和布尔盲注

这一关开始上强度了,不回显东西了,又要学到新的东西了 发现它没有正确的回显,学到了新知识,报错注入 报错注入 什么是报错注入: MySQL提供了一个 updatexml() 函数,当第二个参数包含特殊符号时会报错&am…

【JavaScript】LeetCode:86-90

文章目录 86 只出现一次的数字87 颜色分类88 下一个排列89 寻找重复数90 前K个高频元素 86 只出现一次的数字 异或x ^ x 0,x ^ 0 x,相同为0,相异为1,且满足交换律。例如:[4, 1, 2, 1, 2] > 1 ^ 1 ^ 2 ^ 2 ^ 4 0 …