车辆检测之图像识别

1. 导入资源包

import torch.nn as nn
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk,ImageDraw,ImageFont
import torch
from torchvision import transforms, models
from efficientnet_pytorch import EfficientNet
import numpy as np
import cv2
import tkinter.ttk as ttk
import time
from tkinter import filedialog
import subprocess
import os
import re
import threading

注:
1. torch.nn:这是PyTorch的一个模块,用于构建神经网络。

2. tkinte:Python的标准GUI库,用于创建图形用户界面。

3. PIL(Pillow):一个图像处理库,用于打开、处理和保存多种不同格式的图像。

4. torch:PyTorch的核心库,用于构建和训练神经网络。

5. torchvision:包含图像处理、数据集和预训练模型等工具的库。

6. efficientnet_pytorch:一个提供EfficientNet模型的PyTorch实现。

7. numpy:一个强大的数学库,用于进行科学计算。

8. cv2:OpenCV库的Python接口,用于计算机视觉任务。

9. tkinter.ttk:tkinter的一个模块,提供了改进的Tk控件。

10. threading:Python的标准线程库,用于创建和管理线程。

2. 创建EfficientNet 的模型

2.1. 加载预训练模型

class EfficientNetModel(nn.Module):def __init__(self, num_classes=10, pretrained=True):super(EfficientNetModel, self).__init__()# 加载预训练的EfficientNet模型self.efficientnet = EfficientNet.from_name('efficientnet-b3')num_ftrs = self.efficientnet._fc.in_features# 将EfficientNet模型的最后一层全连接层替换为一个新的全连接层,输出特征数量设置为num_classesself.efficientnet._fc = nn.Linear(num_ftrs, num_classes)

注:类继承自 torch.nn.Module,用于创建一个基于 EfficientNet 的模型,可以用于图像分类任务。这个类接受两个参数:num_classes 表示输出分类的数量,pretrained 表示是否使用预训练的模型权重。

2.2. 向前传播

def forward(self, x):return self.efficientnet(x)

注:提供的代码片段是Python编程语言中的一个方法定义,这个方法forward是许多深度学习框架中神经网络模型的一个标准部分。特别是在PyTorch框架中,forward方法定义了数据通过网络的前向传播方式。在这个特定的例子中,方法接受一个参数x,这通常代表输入数据,然后通过一个名为efficientnet的层或模块进行处理,并返回结果。

2.3. 定义EfficientNet类

var foo = 'bar';

注:提供的代码片段是JavaScript语言中的一个变量声明和赋值语句。这个语句创建了一个名为foo的变量,并将字符串’bar’赋值给它。在JavaScript中,使用var关键字声明的变量拥有函数作用域或全局作用域,这意味着变量foo可以在声明它的函数内部或者全局环境中被访问和修改。

3. 加载训练好的模型参数

model_path = 'best_EfficientNet_b3_updata6.pth'
model.load_state_dict(torch.load(model_path, map_location=torch.device('cpu')))
model.eval()

注:
1. model_path 变量指定了模型权重文件的路径,这个文件通常是一个 PyTorch 模型的状态字典,它包含了模型的参数。

2. torch.load() 函数用于加载模型权重文件。

3. map_location=torch.device(‘cpu’) 参数指定了加载模型权重时使用的设备。在这里,它被设置为 CPU。这意味着即使模型是在 GPU 上训练的,加载时也会将其参数移动到 CPU 上。

4. model.load_state_dict() 方法用于将加载的状态字典加载到模型中,这样模型就有了训练好的参数。

5. model.eval() 方法将模型设置为评估模式。这个方法对模型没有什么影响,但是如果模型中有定义为仅在训练模式下使用的层(如 Dropout 或 BatchNorm),则这个调用会使其在评估模式下正确地行为。

4. 定义图像转换

transform = transforms.Compose([transforms.Resize((300, 300)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),  # ResNet-50 的标准化
])

注:
1. transforms.Resize((300, 300)):将输入图像的大小调整为 300x300 像素。这个步骤确保所有输入到模型的图像都具有相同的尺寸,这是许多深度学习模型的要求。

2. transforms.ToTensor():将 PIL 图像或 NumPy 数组转换为浮点数张量,并对其进行归一化,使得其数值范围在 [0, 1] 内。此外,它还会将图像的维度从 (H, W, C) 转换为 (C, H, W),这与 PyTorch 的默认图像维度格式相匹配。

3. transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]):对图像进行标准化处理。这个步骤根据提供的均值和标准差对图像的每个通道进行标准化。这些均值和标准差通常来自预训练模型的训练数据集,对于 ResNet-50 模型,这些值是常用的。标准化可以使得模型在训练和推理时对输入数据的分布有更稳定的预期,这有助于模型的性能和收敛。

5. 类别标签

classes =  ['皮卡', '敞篷车', '跑车', '掀背两箱车', '小型面包车', 'SUV', '轿车', '厢式货车', '旅行车', '公共汽车', '消防车', '出租车']

6. 初始化全局变量

// An highlighted block
var foo = 'bar';

注:
1. selected_image_path:这个变量可能用于存储用户选择的图像文件的路径。在 GUI 应用程序中,通常会提供一个文件对话框让用户选择图像文件,然后应用程序将选择的文件的路径存储在这个变量中。

2. label_text:这个变量可能用于存储与图像相关联的标签文本。例如,如果应用程序是一个图像分类器,label_text 可能用于显示图像的最可能的类别。

3. right_canvas_image:这个变量可能用于存储一个图像对象,该对象将在 GUI 的画布上显示。在 Tkinter(Python 的 GUI 库)中,画布(Canvas)是一个可以用来绘制图形和图像的组件。right_canvas_image 可能是一个 ImageTk.PhotoImage 对象,它是一个可以在 Tkinter 中显示的图像。

7. 上传图片

def upload_image():global selected_image_path, label_text# 获取'.\output'目录下的所有文件files = os.listdir(r'.\output')# 遍历文件for file in files:# 拼接文件的完整路径file_path = os.path.join(r'.\output', file)# 检查文件是否为图片文件(这里假设只需要删除jpg和png文件)if file.endswith('.jpg') or file.endswith('.png'):# 删除文件os.remove(file_path)file_path = filedialog.askopenfilename()if file_path:selected_image_path = file_pathimage = Image.open(file_path)# 调整图片大小为500x400image = image.resize((500, 400), Image.Resampling.LANCZOS)# 居中图片photo = ImageTk.PhotoImage(image)canvas_left.create_image(0, 0, anchor='nw', image=photo)canvas_left.image = photo  # Keep a reference!# 创建图片的标签if label_text is None:label_text = tk.Label(window, text="", font=("Arial", 16))label_text.place(x=1185,y=155)

注:
1. 函数首先获取 .\output 目录下的所有文件,并遍历这些文件。如果文件是图片文件(假设只有 .jpg 和 .png 格式),则将其删除。这可能是为了清理之前的输出,为新的图像处理做准备。

2. 使用 tkinter.filedialog.askopenfilename() 弹出一个文件对话框,让用户选择一个图像文件。如果用户选择了文件,则将文件的路径存储在 selected_image_path 变量中.

3. 使用 PIL.Image.open() 打开用户选择的图像文件.

4. 调整图像的大小为 500x400 像素,使用 Image.Resampling.LANCZOS 重采样方法,这是一种高质量的重采样滤波器。

5. 将调整大小后的图像居中显示在一个名为 canvas_left 的画布上。这里使用了 ImageTk.PhotoImage 来创建一个可以在 Tkinter 中显示的图像对象,并将其附加到画布上。

6. 如果 label_text 是 None,则创建一个新的标签 label_text,用于显示图像的标签文本。标签被放置在窗口的特定位置(坐标为 x=1185, y=155),并设置了字体样式和大小。

8. 车型检查

def start_detection():global right_canvas_imageif selected_image_path is not None:image = Image.open(selected_image_path)input_image = transform(image).unsqueeze(0)with torch.no_grad():outputs = model(input_image)_, predicted = torch.max(outputs, 1)label = classes[predicted.item()]probabilities = torch.nn.functional.softmax(outputs, dim=1)max_probability = probabilities[0][predicted].item() * 100  # 将概率值乘以100label_text.config(text=f"{label} - {max_probability:.2f}%")  # 显示为百分比格式# 调整图片大小为500x400image = image.resize((500, 400), Image.Resampling.LANCZOS)# 显示图片在右侧画布photo = ImageTk.PhotoImage(image)# 检查是否已经创建了右侧画布的图片if right_canvas_image is None:right_canvas_image = canvas_right.create_image(0, 0, anchor='nw', image=photo)else:canvas_right.itemconfig(right_canvas_image, image=photo)canvas_right.image = photo  # 保持引用else:messagebox.showwarning("警告", "请先选择一张图像")# 将标签放置在图片上label_text.place(x=1185,y=155)

注:

  1. 函数首先检查 selected_image_path 是否为 None,如果不是,则说明用户已经选择了一张图像。

  2. 使用 PIL.Image.open() 打开用户选择的图像文件。

  3. 将图像通过之前定义的 transform 进行预处理,然后添加一个批次维度,因为模型期望输入的是一个批次的数据。

  4. 使用 torch.no_grad() 上下文管理器,确保在推理过程中不会计算梯度,这会减少计算资源的使用。

  5. 将预处理后的图像输入到模型中,得到输出 outputs。

  6. 使用 torch.max() 函数获取最高分数的类别索引 predicted。

  7. 根据类别索引从 classes 列表中获取类别标签 label。

  8. 计算 outputs 的softmax概率,并获取最大概率值 max_probability。

  9. 更新 label_text 的配置,显示类别标签和最大概率值。

  10. 调整图像大小为 500x400 像素,并使用 ImageTk.PhotoImage 创建一个可以在 Tkinter 中显示的图像对象。

  11. 如果 right_canvas_image 是 None,则创建一个新的图像对象在 canvas_right 上显示。如果不是 None,则更新现有的图像对象。

  12. 如果用户没有选择图像,则使用 tkinter.messagebox.showwarning() 显示一个警告消息框。

  13. 最后,将 label_text 放置在窗口的指定位置。

运行结果:
在这里插入图片描述

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

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

相关文章

微信QQ视频裂变加群推广强制分享引流系统

用户在达到一定观看次数后,需要分享给好友或群组。只有好友点击推广链接后,观看次数才会增加。 通过引导用户分享至QQ和微信,实现快速裂变引流的效果! 视频裂变推广程序通过强制分享链接,引导用户转发,从…

代理IP知识:导致代理IP访问超时的原因有哪些?

很多用户在使用代理IP进行网络访问时,可能会遇到代理IP超时的情况,也就是代理IP的延迟过高。代理IP延迟过高会影响用户的网络体验和数据获取效率。因此,了解代理IP延迟过高的原因很重要。以下是导致代理IP延迟过高的一些常见原因:…

怎么使用RSI指标分析现货黄金行情走势?

拿到一波现货黄金行情走势,如何着手对其进行分析呢?投资者只要在网络上搜索一下,保管能够找到各种各样的答案,而本文要讨论的就是其中一种,我们借助RSI指标进行分析。 RSI就是相对强弱指标的简称,这是市场中…

炎炎夏日,矿物质水为你防暑补水

炎炎夏日,整座城市如同一个巨大的“烤箱” 人们行走在炙热烈阳中 汗如雨下,口干舌燥 在这样的高温天气中 中暑的风险也随之增加 烈日当头的夏天 该如何预防中暑呢? 或许答案藏在一杯矿物质水中 为什么矿物质水能够预防中暑?…

编译xlnt开源库源码, 使用c++读写excel文件

编译xlnt开源库源码,在linux平台使用c读写excel文件 下载xnlt源码 官方网站https://tfussell.gitbooks.io/xlnt/content/ 下载地址https://github.com/tfussell/xlnt 下载libstudxml开源库源码 下载地址https://github.com/kamxgal/libstudxml 下载xnlt源码 官方网站https://…

项目启动端口被占用

项目启动端口被占用 Identify and stop the process that’s listening on port XXXX or configure this application to listen on another port. 1、查询占用端口的pid netstat -aon|findstr "端口号"2、终止进程 taskkill /pid 进程号 /f3、重启项目

宝宝早教电子图书 酷得电子方案

宝宝早教发声书是一种专为婴幼儿设计的图书,旨在通过有趣的图画和声音来吸引宝宝的注意力,帮助他们学习语言、认知和发展各种技能。这类书籍通常包括以下特点: 鲜艳的图画:发声书通常配有色彩鲜艳、形象生动的图画,以…

算法06 贪心算法【C++实现】

我们可以扮演一个贪心的人,在金子、银、铁中选择装入背包带走的话,作为一个贪心的人,肯定要把价值最大化,优先要选择装载价值较高的金子。 目录 什么是贪心算法 证明方法 常见题型 常见题型解法 训练:小木船过河 …

WARP 加速您的 AI 数据存储基础设施

你知道一些最好的人工智能模型的秘诀吗?这是他们可以访问的数据量,他们可以接受培训。对于 AI/ML 模型:快速访问数据为王。让我强调一下,这不仅仅是数据,而是快速访问的数据。如果有人可以构建更快、更强大的模型&…

骚操作:如何让一个网页一直处于空白情况?

🧑‍💻 写在开头 点赞 收藏 学会🤣🤣🤣 如题,惯性思路很简单,就是直接撸上一个空内容的html。 注:以下都是在现代浏览器中执行,主要为**Chrome 版本 120.0.6099.217&…

在 The Sandbox 体验韩剧《碰撞搜查线》的刺激!

风靡全球的韩国电视剧《碰撞搜查线》现已登陆 The Sandbox 元宇宙! ASTORY 的电视剧《碰撞搜查线》以充满动作喜剧色彩的方式,讲述了一个交通犯罪调查小组打击公路上的恶棍的故事。该剧迅速成为 Disney 最受欢迎的节目之一! 在 The Sandbox体…

「动态规划」如何求最长递增子序列的长度?

300. 最长递增子序列https://leetcode.cn/problems/longest-increasing-subsequence/description/ 给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其…

CAN通讯相关知识拆解报文格式过滤器数据交互

在嵌入式系统中使用CAN(Controller Area Network)通讯,需要掌握以下内容: CAN协议:了解CAN总线通讯的基本原理,包括帧格式、报文结构、消息ID等内容。CAN控制器:理解CAN控制器的工作原理以及如…

java连接mysql报错

1.背景,直接升级操作系统从centos-》国产化操作系统,mysql也升级到5.7.44 2,报错 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconn…

品牌策划背后的秘密:我为何对此工作情有独钟?

你是否曾有过一个梦想,一份热爱,让你毫不犹豫地投身于一个行业? 我就是这样一个对品牌策划充满热情的人。 从选择职业到现在,我一直在广告行业里“混迹”,一路走来,也见证了许多对品牌策划一知半解的求职…

适用于Mac的免费外置硬盘数据恢复软件

“我有一个 1 TB 的外置硬盘,它被意外格式化了。我尝试从中恢复丢失的数据。我把它连接到我的Mac,但里面什么也没找到。我正在寻找适用于Mac的免费外置硬盘数据恢复软件,例如奇客数据恢复Mac版或其他Mac数据恢复免费软件来扫描它并恢复数据。…

人工ai智能写作,分享推荐三款好用软件!

在数字化时代,人工智能(AI)已经渗透到我们生活的方方面面,而在内容创作领域,AI智能写作软件更是如雨后春笋般涌现。今天,就为大家分享三款备受好评的AI智能写作软件,让你轻松掌握高效写作的秘密…

win10系统管理员账号怎么切换

1、按住“windowsx”,选择“计算机管理” 2、在页面左侧,找到“计算机管理(本地)”,展开“系统工具”,点击“本地用户和组”下面的“用户”,在右侧找到“Administrator”,双击打开。 3、在打开页面选择常规…

Docker(六)-本地镜像发布到私有库

1.下载镜像Docker Registry 用于搭建私人版本Docker Hub docker pull registry2.运行私有库Registry 运行私有库Registry,相当于本地有个私有Docker hubdocker run -d -p hostPort:containerPort -v 【宿主机目录】:【容器目录】 --privilegedtrue 【私有库镜像】…

泛微E9开发 根据判断条件,控制字段的编辑/必填属性

根据判断条件,控制字段的编辑/必填属性 1、需求说明2、实现方法3、扩展知识点1. 注册钩子事件,指定动作完成后触发1.1 接口名称及参数说明1.2 案例 2. 改变单个字段显示属性(只读/必填等)2.1 参数说明2.2 案例 1、需求说明 当字段“填报人”和字段“姓名…