基于深度学习的停车位关键点检测系统(代码+原理)

摘要:

DMPR-PS是一种基于深度学习的停车位检测系统,旨在实时监测和识别停车场中的停车位。该系统利用图像处理和分析技术,通过摄像头获取停车场的实时图像,并自动检测停车位的位置和状态。本文详细介绍了DMPR-PS系统的算法原理、创新点和实验结果,并对其性能进行了评估。
在这里插入图片描述

算法创新:

DMPR-PS系统的算法创新主要体现在以下几个方面:

  1. 深度学习模型:DMPR-PS系统采用了深度学习模型来进行停车位的检测。通过大规模数据集的训练,该模型可以自动学习停车位的特征,并准确地进行检测和分类。
    在这里插入图片描述

  2. 多尺度检测:为了应对不同大小的停车位,DMPR-PS系统使用了多尺度检测策略。通过在不同尺度下进行检测,可以提高系统对各种大小停车位的检测准确率。

  3. 实时性能:DMPR-PS系统具有较高的实时性能。它能够快速处理实时视频流,并在短时间内完成停车位的检测和识别,满足实时监测的需求。
    在这里插入图片描述

实验结果与结论:

通过对多个停车场场景的实验测试,DMPR-PS系统展现了良好的性能。实验结果表明,该系统在检测准确率和实时性能方面都具有较高的水平。

代码运行

要求:

python版本3.6pytorch版本1.4+

其他要求:

pip install -r requirements.txt
gcn-parking-slot

预训练模型

可以通过以下链接下载两个预训练模型。

链接	代码	描述
Model0	bc0a	使用ps2.0子集进行训练,如[1]所述。
Model1	pgig	使用完整的ps2.0数据集进行训练。

准备数据

可以在此处找到原始的ps2.0数据和标签。提取并组织如下:

├── datasets
│   └── parking_slot
│       ├── annotations
│       ├── ps_json_label 
│       ├── testing
│       └── training

训练和测试

将当前目录导出到PYTHONPATH:

export PYTHONPATH=`pwd`

在这里插入图片描述

演示

python3 tools/demo.py -c config/ps_gat.yaml -m cache/ps_gat/100/models/checkpoint_epoch_200.pth

训练

python3 tools/train.py -c config/ps_gat.yaml

在这里插入图片描述

测试

python3 tools/test.py -c config/ps_gat.yaml -m cache/ps_gat/100/models/checkpoint_epoch_200.pth

代码

import cv2
import time
import torch
import pprint
import numpy as np
from pathlib import Pathfrom psdet.utils.config import get_config
from psdet.utils.common import get_logger
from psdet.models.builder import build_modeldef draw_parking_slot(image, pred_dicts):slots_pred = pred_dicts['slots_pred']width = 512height = 512VSLOT_MIN_DIST = 0.044771278151623496VSLOT_MAX_DIST = 0.1099427457599304HSLOT_MIN_DIST = 0.15057789144568634HSLOT_MAX_DIST = 0.44449496544202816SHORT_SEPARATOR_LENGTH = 0.199519231LONG_SEPARATOR_LENGTH = 0.46875junctions = []for j in range(len(slots_pred[0])):position = slots_pred[0][j][1]p0_x = width * position[0] - 0.5p0_y = height * position[1] - 0.5p1_x = width * position[2] - 0.5p1_y = height * position[3] - 0.5vec = np.array([p1_x - p0_x, p1_y - p0_y])vec = vec / np.linalg.norm(vec)distance =( position[0] - position[2] )**2 + ( position[1] - position[3] )**2 if VSLOT_MIN_DIST <= distance <= VSLOT_MAX_DIST:separating_length = LONG_SEPARATOR_LENGTHelse:separating_length = SHORT_SEPARATOR_LENGTHp2_x = p0_x + height * separating_length * vec[1]p2_y = p0_y - width * separating_length * vec[0]p3_x = p1_x + height * separating_length * vec[1]p3_y = p1_y - width * separating_length * vec[0]p0_x = int(round(p0_x))p0_y = int(round(p0_y))p1_x = int(round(p1_x))p1_y = int(round(p1_y))p2_x = int(round(p2_x))p2_y = int(round(p2_y))p3_x = int(round(p3_x))p3_y = int(round(p3_y))cv2.line(image, (p0_x, p0_y), (p1_x, p1_y), (255, 0, 0), 2)cv2.line(image, (p0_x, p0_y), (p2_x, p2_y), (255, 0, 0), 2)cv2.line(image, (p1_x, p1_y), (p3_x, p3_y), (255, 0, 0), 2)#cv2.circle(image, (p0_x, p0_y), 3,  (0, 0, 255), 4)junctions.append((p0_x, p0_y))junctions.append((p1_x, p1_y))for junction in junctions:cv2.circle(image, junction, 3,  (0, 0, 255), 4)return imagedef main():cfg = get_config()logger = get_logger(cfg.log_dir, cfg.tag)logger.info(pprint.pformat(cfg))model = build_model(cfg.model)logger.info(model)image_dir = Path(cfg.data_root) / 'testing' / 'outdoor-normal daylight'display = False# load checkpointmodel.load_params_from_file(filename=cfg.ckpt, logger=logger, to_cpu=False)model.cuda()model.eval()if display:car = cv2.imread('images/car.png')car = cv2.resize(car, (512, 512))with torch.no_grad():for img_path in image_dir.glob('*.jpg'):img_name = img_path.stemdata_dict = {} image  = cv2.imread(str(img_path))image0 = cv2.resize(image, (512, 512))image = image0/255.data_dict['image'] = torch.from_numpy(image).float().permute(2, 0, 1).unsqueeze(0).cuda()start_time = time.time()pred_dicts, ret_dict = model(data_dict)sec_per_example = (time.time() - start_time)print('Info speed: %.4f second per example.' % sec_per_example)if display:image = draw_parking_slot(image0, pred_dicts)image[145:365, 210:300] = 0image += carcv2.imshow('image',image.astype(np.uint8))cv2.waitKey(50)save_dir = Path(cfg.output_dir) / 'predictions'save_dir.mkdir(parents=True, exist_ok=True)save_path = save_dir / ('%s.jpg' % img_name)cv2.imwrite(str(save_path), image)if display:cv2.destroyAllWindows()if __name__ == '__main__':main()

结论

DMPR-PS系统是一种基于深度学习的停车位检测系统,通过创新的算法设计和实时性能优化,可以有效地监测和识别停车场中的停车位。该系统在提高停车场资源利用率和管理效率方面具有重要的应用价值。

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

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

相关文章

最短路径问题相关算法、原理及适用场景

这里写目录标题 一、最短路径算法、原理及适用场景深度优先搜索算法/广度优先搜索算法Floyd算法&#xff08;Floyd-Warshell算法&#xff09;Dijkstra算法A*算法贝尔曼福特算法&#xff08;Bellman-Ford Algorithm&#xff09;SPFA算法&#xff08;Shortest Path Faster Algori…

FPGA高端项目:纯verilog的 25G-UDP 高速协议栈,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的以太网方案本协议栈的 1G-UDP版本本协议栈的 10G-UDP版本1G 千兆网 TCP-->服务器 方案1G 千兆网 TCP-->客户端 方案10G 万兆网 TCP-->服务器客户端 方案 3、该UDP协议栈性能4、详细设计方案设计架构框图网络调试助手…

传感数据分析——小波滤波

传感数据分析——小波滤波 文章目录 传感数据分析——小波滤波前言一、运行环境二、Python实现总结 前言 小波滤波算法是一种基于小波变换的滤波方法&#xff0c;其核心思想是将信号分解成不同的频率成分&#xff0c;然后对每个频率成分进行独立的处理。小波滤波器的设计和应用…

第12课 实现桌面与摄像头叠加

在上一节&#xff0c;我们实现了桌面捕获功能&#xff0c;并成功把桌面图像和麦克风声音发送给对方。在实际应用中&#xff0c;有时候会需要把桌面与摄像头图像叠加在一起发送&#xff0c;这节课我们就来看下如何实现这一功能。 1.备份与修改 备份demo11并修改demo11为demo12…

安达发|基于APS排程系统的PDM功能

APS系统&#xff08;Advanced Planning and Scheduling&#xff0c;先进计划与排程&#xff09;是一种基于APS系统&#xff08;Advanced Planning and Scheduling&#xff0c;先进计划与排程&#xff09;是一种基于供应链管理和生产管理的综合性软件系统。它通过整合企业内外部…

在anaconda中安装pytorch的GPU版本

本文前提&#xff1a; 1.你已经下载好了anaconda,最好是新建一个虚拟环境来安装pytorch的GPU版本&#xff0c;并且设置了国内镜像源&#xff1b; 2.了解自己电脑对应的cuda版本&#xff0c;可通过nvidia-smi&#xff0c;并下载好了cuda。 安装pytorch的GPU版本 到官网中https…

微信公众号-订阅通知

第一步&#xff1a; 公众号需要实名认证&#xff0c;完成以后&#xff01; 设置-开发里找到基本配置&#xff1a; 开发者ID(AppID):xxxxxxxxxxxxxxxxxxxxxxxxx 开发者密码(AppSecret):xxxxxxxxxxxxxxxxxxxxxxxxx 白名单IP也要填写上你的服务器IP哦&#xff01; 第二步&am…

聊天Demo

文章目录 参考链接使用前端界面消息窗口平滑滚动至底部vue使用watch监听vuex中的变量变化 参考链接 vue.js实现带表情评论功能前后端实现&#xff08;仿B站评论&#xff09; vue.js实现带表情评论仿bilibili&#xff08;滚动加载效果&#xff09; vue.js支持表情输入 vue.js表…

使用Scrapy框架和代理IP进行大规模数据爬取

目录 一、前言 二、Scrapy框架简介 三、代理IP介绍 四、使用Scrapy框架进行数据爬取 1. 创建Scrapy项目 2. 创建爬虫 3. 编写爬虫代码 4. 运行爬虫 五、使用代理IP进行数据爬取 1. 安装依赖库 2. 配置代理IP和User-Agent 3. 修改爬虫代码 4. 运行爬虫 六、总结 一…

【AI视野·今日Sound 声学论文速览 第四十二期】Fri, 5 Jan 2024

AI视野今日CS.Sound 声学论文速览 Fri, 5 Jan 2024 Totally 10 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers PosCUDA: Position based Convolution for Unlearnable Audio Datasets Authors Vignesh Gokul, Shlomo Dubnov深度学习模型需要大量干净的…

【算法Hot100系列】合并两个有序链表

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

前端nginx配置指南

前端项目发布后&#xff0c;有些接口需要在服务器配置反向代理&#xff0c;资源配置gzip压缩&#xff0c;配置跨域允许访问等 配置文件模块概览 配置示例 反向代理 反向代理是Nginx的核心功能之一&#xff0c;是指客户端发送请求到代理服务器&#xff0c;代理服务器再将请求…

数据结构-怀化学院期末题(321)

图的广度优先搜索 题目描述&#xff1a; 图的广度优先搜索类似于树的按层次遍历&#xff0c;即从某个结点开始&#xff0c;先访问该结点&#xff0c;然后访问该结点的所有邻接点&#xff0c;再依次访问各邻接点的邻接点。如此进行下去&#xff0c;直到所有的结点都访问为止。在…

OpenHarmony沙箱文件

一.前言 1.前景提要 DevEcoStudio版本&#xff1a;DevEco Studio 3.1 Release SDK版本&#xff1a;3.2.2.5 API版本&#xff1a;9 2.概念 在openharmony文件管理模块中&#xff0c;按文件所有者分类分为应用文件和用户文件和系统文件。 1&#xff09;沙箱文件。也叫做应…

Jmeter扩展函数?年薪50W+的测试大佬教你怎么玩

很多同学&#xff0c;都问我&#xff1a;“老师&#xff0c;我的 jmeter 里面&#xff0c;怎么没有 MD5 函数&#xff0c;base64 函数也没有&#xff0c;我是不是用了假的 jmeter&#xff1f;” 哈哈哈&#xff0c;不是的。jmeter 的函数&#xff0c;有自带函数和扩展函数两大…

等价类划分法

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;软件测试面试题分享&#xff1a; 1000道软件测试面试题及答案&#x1f4e2;软件测试实战项目分享&#xff1a; 纯接口项目-完…

<HarmonyOS第一课>1~10课后习题汇总

HarmonyOS第一课 &#xff1c;HarmonyOS主题课&#xff1e;1~3课后习题汇总 1运行Hello World 判断题 main_pages.json存放页面page路径配置信息。&#xff08;正确&#xff09;DevEco Studio是开发HarmonyOS应用的一站式集成开发环境。&#xff08;正确&#xff09; 单选题…

二叉树-遍历-单独精讲

遍历:遍历每个元素。 寻常遍历root只会指一次。 而二叉树遍历每个元素则会指三次。 中序遍历-节点的中序 void traveres(TreeNode* root){if(!root)return;traveres(root->left);cout << root->val << endl;traveres(root->right);}中序遍历亦叫节点的中…

Python 自学(六) 之函数

目录 1. python函数的基本结构 P168 2. python函数的可变参数(不定长) *parameter P169 3. python函数的返回值(单个或多个) P173 4. python的匿名函数 lambda P177 1. python函数的基本结构 P168 2. python函数的可变参数(不定…

一文读懂「Attention」注意力机制

前言:Self-Attention是 Transformer 的重点,因此需要详细了解一下 Self-Attention 的内部逻辑。 一、什么是注意力机制? Attention(注意力)机制如果浅层的理解,核心逻辑就是「从关注全部到关注重点」。 Attention 机制很像人类看图片的逻辑,当我们看一张图片的时候,我…