大创项目推荐 深度学习疫情社交安全距离检测算法 - python opencv cnn

文章目录

  • 0 前言
  • 1 课题背景
  • 2 实现效果
  • 3 相关技术
    • 3.1 YOLOV4
    • 3.2 基于 DeepSort 算法的行人跟踪
  • 4 最后

0 前言

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

🚩 **基于深度学习疫情社交安全距离检测算法 **

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

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:5分

🧿 更多资料, 项目分享:

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

1 课题背景

安全的社交距离是公共预防传染病毒的途径之一。所以,在人群密集的区域进行社交距离的安全评估是十分重要的。社交距离的测量旨在保持个体之间的物理距离和减少相互接触的人群来减缓或阻止病毒传播,在抗击病毒和预防大流感中发挥重要作用。但时刻保持安全距离具有一定的难度,特别是在校园,工厂等场所,在这种情况下,开发智能摄像头等技术尤为关键。将人工智能,深度学习集成至安全摄像头对行人进行社交距离评估。现阶段针对疫情防范的要求,主要采用人工干预和计算机处理技术。人工干预存在人力资源要求高,风险大,时间成本高等等缺点。计算机处理等人工智能技术的发展,对社交安全距离的安全评估具有良好的效果。

2 实现效果

通过距离分类人群的高危险和低危险距离。

在这里插入图片描述
相关代码

import argparse
from utils.datasets import *
from utils.utils import *def detect(save_img=False):out, source, weights, view_img, save_txt, imgsz = \opt.output, opt.source, opt.weights, opt.view_img, opt.save_txt, opt.img_sizewebcam = source == '0' or source.startswith('rtsp') or source.startswith('http') or source.endswith('.txt')# Initializedevice = torch_utils.select_device(opt.device)if os.path.exists(out):shutil.rmtree(out)  # delete output folderos.makedirs(out)  # make new output folderhalf = device.type != 'cpu'  # half precision only supported on CUDA# Load modelgoogle_utils.attempt_download(weights)model = torch.load(weights, map_location=device)['model'].float()  # load to FP32# torch.save(torch.load(weights, map_location=device), weights)  # update model if SourceChangeWarning# model.fuse()model.to(device).eval()if half:model.half()  # to FP16# Second-stage classifierclassify = Falseif classify:modelc = torch_utils.load_classifier(name='resnet101', n=2)  # initializemodelc.load_state_dict(torch.load('weights/resnet101.pt', map_location=device)['model'])  # load weightsmodelc.to(device).eval()# Set Dataloadervid_path, vid_writer = None, Noneif webcam:view_img = Truetorch.backends.cudnn.benchmark = True  # set True to speed up constant image size inferencedataset = LoadStreams(source, img_size=imgsz)else:save_img = Truedataset = LoadImages(source, img_size=imgsz)# Get names and colorsnames = model.names if hasattr(model, 'names') else model.modules.namescolors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(names))]# Run inferencet0 = time.time()img = torch.zeros((1, 3, imgsz, imgsz), device=device)  # init img_ = model(img.half() if half else img) if device.type != 'cpu' else None  # run oncefor path, img, im0s, vid_cap in dataset:img = torch.from_numpy(img).to(device)img = img.half() if half else img.float()  # uint8 to fp16/32img /= 255.0  # 0 - 255 to 0.0 - 1.0if img.ndimension() == 3:img = img.unsqueeze(0)# Inferencet1 = torch_utils.time_synchronized()pred = model(img, augment=opt.augment)[0]# Apply NMSpred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres,fast=True, classes=opt.classes, agnostic=opt.agnostic_nms)t2 = torch_utils.time_synchronized()# Apply Classifierif classify:pred = apply_classifier(pred, modelc, img, im0s)# List to store bounding coordinates of peoplepeople_coords = []# Process detectionsfor i, det in enumerate(pred):  # detections per imageif webcam:  # batch_size >= 1p, s, im0 = path[i], '%g: ' % i, im0s[i].copy()else:p, s, im0 = path, '', im0ssave_path = str(Path(out) / Path(p).name)s += '%gx%g ' % img.shape[2:]  # print stringgn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  #  normalization gain whwhif det is not None and len(det):# Rescale boxes from img_size to im0 sizedet[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()# Print resultsfor c in det[:, -1].unique():n = (det[:, -1] == c).sum()  # detections per classs += '%g %ss, ' % (n, names[int(c)])  # add to string# Write resultsfor *xyxy, conf, cls in det:if save_txt:  # Write to filexywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywhwith open(save_path[:save_path.rfind('.')] + '.txt', 'a') as file:file.write(('%g ' * 5 + '\n') % (cls, *xywh))  # label formatif save_img or view_img:  # Add bbox to imagelabel = '%s %.2f' % (names[int(cls)], conf)if label is not None:if (label.split())[0] == 'person':people_coords.append(xyxy)# plot_one_box(xyxy, im0, line_thickness=3)plot_dots_on_people(xyxy, im0)# Plot lines connecting peopledistancing(people_coords, im0, dist_thres_lim=(200,250))# Print time (inference + NMS)print('%sDone. (%.3fs)' % (s, t2 - t1))# Stream resultsif view_img:cv2.imshow(p, im0)if cv2.waitKey(1) == ord('q'):  # q to quitraise StopIteration# Save results (image with detections)if save_img:if dataset.mode == 'images':cv2.imwrite(save_path, im0)else:if vid_path != save_path:  # new videovid_path = save_pathif isinstance(vid_writer, cv2.VideoWriter):vid_writer.release()  # release previous video writerfps = vid_cap.get(cv2.CAP_PROP_FPS)w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH))h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*opt.fourcc), fps, (w, h))vid_writer.write(im0)if save_txt or save_img:print('Results saved to %s' % os.getcwd() + os.sep + out)if platform == 'darwin':  # MacOSos.system('open ' + save_path)print('Done. (%.3fs)' % (time.time() - t0))

3 相关技术

3.1 YOLOV4

YOLOv4使用卷积网络 CSPDarknet-53 特征提取,网络结构模型如图 2 所示。在每个 Darknet-53的残块行加上 CSP(Cross
Stage Partial)结构13,将基础层划分为两部分,再通过跨层次结构的特征融合进行合并。并采用 FPN( feature pyramid
networks)结构加强特征金字塔,最后用不同层的特征的高分辨率来提取不同尺度特征图进行对象检测。最终网络输出 3
个不同尺度的特征图,在三个不同尺度特征图上分别使用 3 个不同的先验框(anchors)进行预测识别,使得远近大小目标均能得到较好的检测。
在这里插入图片描述
YOLOv4 的先验框尺寸是经PASCALL_VOC,COCO
数据集包含的种类复杂而生成的,并不一定完全适合行人。本研究旨在研究行人之间的社交距离,针对行人目标检测,利用聚类算法对 YOLOv4
的先验框微调,首先将行人数据集 F 依据相似性分为i个对象,即在这里插入图片描述,其中每个对象都具有 m
个维度的属性。聚类算法的目的是 i 个对象依据相似性聚集到指定的 j 个类簇,每个对象属于且仅属于一个其到类簇中心距离最小的类簇中心。初始化 j 个 聚 类
中 心C c c c   1 2 , ,..., j,计算每一个对象到每一个聚类中心的欧式距离,见公式
在这里插入图片描述
之后,依次比较每个对象到每个聚类中心的距离,将对象分配至距离最近的簇类中心的类簇中,
得到 在这里插入图片描述个类簇S s s s  1 2 ,
,..., l,聚类算法中定义了类簇的原型,类簇中心就是类簇内所有对象在各个维度的均值,其公式见
在这里插入图片描述
相关代码

def check_anchors(dataset, model, thr=4.0, imgsz=640):# Check anchor fit to data, recompute if necessaryprint('\nAnalyzing anchors... ', end='')m = model.module.model[-1] if hasattr(model, 'module') else model.model[-1]  # Detect()shapes = imgsz * dataset.shapes / dataset.shapes.max(1, keepdims=True)wh = torch.tensor(np.concatenate([l[:, 3:5] * s for s, l in zip(shapes, dataset.labels)])).float()  # whdef metric(k):  # compute metricr = wh[:, None] / k[None]x = torch.min(r, 1. / r).min(2)[0]  # ratio metricbest = x.max(1)[0]  # best_xreturn (best > 1. / thr).float().mean()  #  best possible recallbpr = metric(m.anchor_grid.clone().cpu().view(-1, 2))print('Best Possible Recall (BPR) = %.4f' % bpr, end='')if bpr < 0.99:  # threshold to recomputeprint('. Attempting to generate improved anchors, please wait...' % bpr)na = m.anchor_grid.numel() // 2  # number of anchorsnew_anchors = kmean_anchors(dataset, n=na, img_size=imgsz, thr=thr, gen=1000, verbose=False)new_bpr = metric(new_anchors.reshape(-1, 2))if new_bpr > bpr:  # replace anchorsnew_anchors = torch.tensor(new_anchors, device=m.anchors.device).type_as(m.anchors)m.anchor_grid[:] = new_anchors.clone().view_as(m.anchor_grid)  # for inferencem.anchors[:] = new_anchors.clone().view_as(m.anchors) / m.stride.to(m.anchors.device).view(-1, 1, 1)  # lossprint('New anchors saved to model. Update model *.yaml to use these anchors in the future.')else:print('Original anchors better than new anchors. Proceeding with original anchors.')print('')  # newline

3.2 基于 DeepSort 算法的行人跟踪

YOLOv4中完成行人目标检测后生成边界框(Bounding box,Bbox),Bbox 含有包含最小化行人边框矩形的坐标信息,本研究引入
DeepSort 算法[18]完成对行人的质点进行跟踪,目的是为了在运动矢量分析时算行人安全社交距离中。首先,对行人进行质点化计算。其质点计算公式如
在这里插入图片描述
确定行人质点后,利用 DeepSort 算法实现对多个目标的精确定位与跟踪,其核心算法流程如图所示:
在这里插入图片描述
相关代码

class TrackState:'''单个轨迹的三种状态'''Tentative = 1 #不确定态Confirmed = 2 #确定态Deleted = 3 #删除态class Track:def __init__(self, mean, covariance, track_id, class_id, conf, n_init, max_age,feature=None):'''mean:位置、速度状态分布均值向量,维度(8×1)convariance:位置、速度状态分布方差矩阵,维度(8×8)track_id:轨迹IDclass_id:轨迹所属类别hits:轨迹更新次数(初始化为1),即轨迹与目标连续匹配成功次数age:轨迹连续存在的帧数(初始化为1),即轨迹出现到被删除的连续总帧数time_since_update:轨迹距离上次更新后的连续帧数(初始化为0),即轨迹与目标连续匹配失败次数state:轨迹状态features:轨迹所属目标的外观语义特征,轨迹匹配成功时添加当前帧的新外观语义特征conf:轨迹所属目标的置信度得分_n_init:轨迹状态由不确定态到确定态所需连续匹配成功的次数_max_age:轨迹状态由不确定态到删除态所需连续匹配失败的次数'''   self.mean = meanself.covariance = covarianceself.track_id = track_idself.class_id = int(class_id)self.hits = 1self.age = 1self.time_since_update = 0self.state = TrackState.Tentativeself.features = []if feature is not None:self.features.append(feature) #若不为None,初始化外观语义特征self.conf = confself._n_init = n_initself._max_age = max_agedef increment_age(self):'''预测下一帧轨迹时调用'''self.age += 1 #轨迹连续存在帧数+1self.time_since_update += 1 #轨迹连续匹配失败次数+1def predict(self, kf):'''预测下一帧轨迹信息'''self.mean, self.covariance = kf.predict(self.mean, self.covariance) #卡尔曼滤波预测下一帧轨迹的状态均值和方差self.increment_age() #调用函数,age+1,time_since_update+1def update(self, kf, detection, class_id, conf):'''更新匹配成功的轨迹信息'''self.conf = conf #更新置信度得分self.mean, self.covariance = kf.update(self.mean, self.covariance, detection.to_xyah()) #卡尔曼滤波更新轨迹的状态均值和方差self.features.append(detection.feature) #添加轨迹对应目标框的外观语义特征self.class_id = class_id.int() #更新轨迹所属类别self.hits += 1 #轨迹匹配成功次数+1self.time_since_update = 0 #匹配成功时,轨迹连续匹配失败次数归0if self.state == TrackState.Tentative and self.hits >= self._n_init:self.state = TrackState.Confirmed #当连续匹配成功次数达标时轨迹由不确定态转为确定态def mark_missed(self):'''将轨迹状态转为删除态'''if self.state == TrackState.Tentative:self.state = TrackState.Deleted #当级联匹配和IOU匹配后仍为不确定态elif self.time_since_update > self._max_age:self.state = TrackState.Deleted #当连续匹配失败次数超标'''该部分还存在一些轨迹坐标转化及状态判定函数,具体可参考代码来源'''

4 最后

🧿 更多资料, 项目分享:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习的婴儿啼哭识别项目详解

基于深度学习的婴儿啼哭识别项目详解 基于深度学习的婴儿啼哭识别项目详解一、项目背景1.1 项目背景1.2 数据说明 二、PaddleSpeech环境准备三、数据预处理3.1 数据解压缩3.2 查看声音文件3.3 音频文件长度处理 四、自定义数据集与模型训练4.1 自定义数据集4.2 模型训练4.3 模型…

Linux截图方法推荐

因为经常会遇到以图为证的情况&#xff0c;而办公设备基本都是linux,所以汇总一下常见的linux截图方式。 1&#xff1a;在 Linux 中系统集成的截图的默认方式 你想要截取整个屏幕&#xff1f;屏幕中的某个区域&#xff1f;某个特定的窗口&#xff1f; 如果只需要获取一张屏幕…

Servlet-体系结构

一、思考 读者阅读完上一篇关于Servlet基本概念的文章后&#xff0c;我们知道每次实现一个Servlet&#xff0c;都需要覆盖五个接口&#xff0c;我们对除service接口外的其它四个接口&#xff0c;我们通常不会做什么处理。那么&#xff0c;这种实现方式是否有些繁琐呢&#xff…

【Linux实用篇】Linux常用命令(2)

目录 1.3 拷贝移动命令 1.3.1 cp 1.3.2 mv 1.4 打包压缩命令 1.5 文本编辑命令 1.5.1 vi&vim介绍 1.5.2 vim安装 1.5.3 vim使用 1.6 查找命令 1.6.1 find 1.6.2 grep 1.3 拷贝移动命令 1.3.1 cp 作用: 用于复制文件或目录 语法: cp [-r] source dest ​ 说明: …

深入理解@DubboReference与@DubboService【三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探索Dubbo的核心&#xff1a;深入理解DubboReference与DubboService【三】 前言DubboService注解基本概念使用示例高级特性 DubboReference注解基本概念使用示例服务调用流程 最佳实践注解的最佳使用方…

什么是云服务器,阿里云优势如何?

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云百科aliyunbai…

Fabric2.2:在有系统通道的情况下搭建应用通道

写在最前 在使用Fabric-SDK-Go1.0.0操作Fabric网络时遇到了bug。Fabric-SDK-GO的当前版本没有办法在没有系统通道的情况下创建应用通道&#xff0c;而Fabric的最新几个版本允许在没有系统通道的情况下搭建应用通道。为了解决这个矛盾并使用Fabric-SDK-GO完成后续的项目开发&…

Web前端 ---- 【Vue3】ref和reactive实现响应式的区别和联系

目录 前言 setup ref 基本数据类型 对象形式 reactive ref和reactive的区别与联系 前言 本文介绍函数ref和函数reactive实现响应式 setup 在介绍ref和reactive之前&#xff0c;先介绍setup,vue3新引入的配置项。在该配置项中&#xff0c;在vue2中的data、methods、comput…

xtu oj 1475 冰墩墩和冰壶

题目描述 冰壶是被誉为“冰面上的国际象棋”&#xff0c;其计分规则是各自投壶&#xff0c;最后在大本营内&#xff0c;你有几个壶离圆心比对方所有壶离圆心都近就得到几分。 比如红方有两个壶&#xff0c;分别在坐标(1,1),(−2,1)&#xff1b;黄方也有两个壶&#xff0c;分别…

GULP 案例 4:如何计算热力学性质(热容、熵、焓、自由能等)?

---------------------------------------------------------------------- 物体的热力学性质是指物质处于平衡状态下压力 P、体积 V、温度 T、组成以及其他的热力学函数之间的变化规律。一般将材料的压力 P、体积 V、温度 T、内能 U、焓 H、熵 S 等统称为物体热力学性质。 热…

软件测试|Python数据可视化神器——pyecharts教程(九)

使用pyecharts绘制K线图进阶版 简介 K线图&#xff08;Kandlestick Chart&#xff09;&#xff0c;又称蜡烛图&#xff0c;是一种用于可视化金融市场价格走势和交易数据的图表类型。它是股票、外汇、期货等金融市场中最常用的技术分析工具之一&#xff0c;可以提供关于价格变…

黑马python就业课

文章目录 初级中级高级初级课程分享 初级 中级 高级 初级课程分享 链接&#xff1a;https://pan.baidu.com/s/1aiJHaThezv_mSI1rnV3d7g 提取码&#xff1a;xdpc

软件测试|Selenium StaleElementReferenceException 异常分析与解决

简介 Selenium 是一个流行的自动化测试工具&#xff0c;用于模拟用户与网页交互。然而&#xff0c;当我们在使用 Selenium 时&#xff0c;可能会遇到一个常见的异常&#xff0c;即 StaleElementReferenceException。这个异常通常在我们尝试与网页上的元素交互时抛出&#xff0…

Nacos服务注册或发现、Nacos服务分级模型、Nacos负载均衡策略、加权负载均衡、Nacos环境隔离

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、nacos服务搭建&#xff0c;nacos服务注册或发现二、Nacos服务分级模型三、Nacos负载均衡策略四、Nacos注册中心&#xff08;nacos控制台配置&#xff09;-加…

shell中echo和printf在终端输出时更改文本颜色

shell中更改echo或printf的输出颜色可以使用相应的ANSI转义码(ANSI Escape Codes)来实现&#xff1a;各种常用颜色的ANSI如下所示,截图来自于 geeksforgeeks.org 八进制格式应采用以下格式给出&#xff1a;八进制格式必须以名为\033[的参数为前缀&#xff0c;后跟需要指定的颜色…

Postman工具使用一篇快速入门教程

文章目录 下载安装注册登录CollectionFolderRequestGet请求Post请求Header设置Response响应 EnvironmentsGlobal环境变量其他环境变量Collection变量变量使用同名变量的优先级 Postman内置变量Pre-request script和Test script脚本设置、删除和获取变量获取请求参数获取响应数据…

如何使用创建时间给文件重命名,简单的批量操作教程

在处理大量文件时&#xff0c;有时要按照规则对文件重命名&#xff0c;根据文件的创建时间来重命名。那如何批量操作呢&#xff1f;现在一起来看云炫文件管理器如何用文件的创建时间来批量重命名。 按创建时间重命名文件的前后对比图。 用创建时间批量给文件重命名的步骤&…

redis高级篇之单线程和多线程

目录 1、redis的发展史 2、redis为什么选择单线程&#xff1f; 3、主线程和Io线程是怎么协作完成请求处理的&#xff1f; 4、IO多路复用 5、开启redis多线程 1、redis的发展史 Redis4.0之前是用的单线程&#xff0c;4.0以后逐渐支持多线程 Redis4.0之前一直采用单线程的主…

微信小程序开发学习笔记《8》tabBar

微信小程序开发学习笔记《8》tabBar 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。tabBar官方文档 tabBar这一节还是相当重要的。 一、什么是tabBar tabBar是移动端应用常见的页面效果&#xff0c;用于实现多页面的快速切换。小…

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II 文章目录 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II1 Le…