车辆检测之图像识别

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_classes
        self.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_path
        image = Image.open(file_path)

        # 调整图片大小为500x400
        image = 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_image
    if 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  # 将概率值乘以100
            label_text.config(text=f"{label} - {max_probability:.2f}%")  # 显示为百分比格式

        # 调整图片大小为500x400
        image = 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 放置在窗口的指定位置。

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

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

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

相关文章

[职场] 怎么写个人简历模板 #其他#知识分享

怎么写个人简历模板 怎么写个人简历模板1 姓名:xxx 性别:x 年龄:x岁 婚姻状况:x 最高学历:xx 政治面貌:xx 现居城市:xx 籍贯:xx 联系电话:xxxxxx 电子邮箱:xx…

安装Django Web框架

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Django是基于Python的重量级开源Web框架。Django拥有高度定制的ORM和大量的API,简单灵活的视图编写,优雅的URL,适…

软件工程体系概念

软件工程 软件工程是应用计算机科学、数学及 管理科学等原理开发软件的工程。它借鉴 传统工程的原则、方法,以提高质量,降 低成本为目的。 一、软件生命周期 二、软件开发模型 1.传统模型 瀑布模型、V模型、W模型、X 模型、H 模型 (1)瀑布模型 瀑布…

Crypto++ 入门

一、简介 Crypto(也称为CryptoPP、libcrypto或cryptlib)是一个免费的开源C库,提供了多种加密方案。它由Wei Dai开发和维护,广泛应用于需要强大加密安全的各种应用程序中。该库提供了广泛的加密算法和协议的实现,包括&…

线程池概念、线程池的不同创建方式、线程池的拒绝策略

文章目录 💐线程池概念以及什么是工厂模式💐标准库中的线程池💐什么是工厂模式?💐ThreadPoolExecutor💐模拟实现线程池 💐线程池概念以及什么是工厂模式 线程的诞生是因为,频繁的创…

原Veritas(华睿泰)中国研发中心敏捷教练、项目集经理郑鹤琳受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 原Veritas(华睿泰中国)中国研发中心敏捷教练、项目集经理郑鹤琳女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾,演讲议题为“敏捷项目管理-知行合一”。大会将于6月29-30日在北京举办,敬请关注…

LabVIEW与数字孪生

LabVIEW与数字孪生技术在工业自动化、智慧城市、医疗设备和航空航天等领域应用广泛,具备实时数据监控、虚拟仿真和优化决策等特点。开发过程中需注意数据准确性、系统集成和网络安全问题,以确保数字孪生模型的可靠性和有效性。 经典应用:LabV…

数据挖掘常见算法(分类算法)

K-近邻算法(KNN) K-近邻分类法的基本思想:通过计算每个训练数据到待分类元组Zu的距离,取和待分类元组距离最近的K个训练数据,K个数据中哪个类别的训练数据占多数,则待分类元组Zu就属于哪个类别…

win10 修改远程桌面端口,在Win10上修改远程桌面端口的要怎么操作

在Windows 10上修改远程桌面端口是一个涉及系统配置的过程,这通常是为了增强安全性或满足特定网络环境的需要。 一、通过注册表编辑器修改远程桌面端口 1. 打开注册表编辑器: - 按下Win R组合键,打开“运行”对话框。 - 在“运行”对话框…

结构体 (一)

在我们C语言中,为我们提供了不同的内置类型,例如:char 、short 、int 、long 、float 、double 等等,但是呢,仅仅只有这些内置类型是远远不够的,当我们想要描述一名学生,一本书,一件…

Linux:目录和文件管理命令2

目录 一、Linux目录结构: 二、查看文件 2.1、cat 命令——显示并连接(Concatenate)文件的内容 2.2、more 和 less 命令——分页查看文件内容 2.3、head 和 tail 命令——查看文件开头或末尾的部分内容 三、统计和检索文件内容 3.1、wc…

不知大家信不信,竟有这么巧的事,我领导的老婆,竟然是我老婆的下属,我在想要不要利用下这层关系,改善下领导对我的态度,领导怕老婆

职场如战场,每个人都身不由己。每天上班,除了要面对堆积如山的工作,还要小心应对来自领导的“狂风暴雨”。最近,我无意间发现领导一个秘密,这个秘密让我对职场关系和人性都产生了新的思考。 故事要从那天晚上说起。我…

ARM相关理论知识

一、计算机的组成 1.输入设备:将数据与程序转换成计算机能够识别,存储,运算的形式,输送到计算机中。 2.输出设备:将计算机对程序和数据的运算结果输送到计算机外部设备 3.控制器:由程序技术器&#xff0…

《数字图像处理》实验报告一

一、实验任务与要求 1、用 matlab 编写空间域点处理操作处理给定的几幅图像,要求: 使用 imread 读取当前工作目录下的图像设计点处理操作并用代码实现处理用 imnshow 显示处理后的图像用 imwrite 保存处理后的图像 2、提交内容:m文件 实验…

【ChatBI】超轻量Python库Vanna快速上手,对接oneapi

oneapi 准备 首先确保你有oneapi ,然后申请 kimi的api 需要去Moonshot AI - 开放平台 然后添加一个api key 然后打开oneapi的渠道界面,添加kimi。 然后点击 测试, 如果能生成响应时间,就是配置正确。 然后创建令牌 http:…

渗透测试基础(六) MS10-046漏洞攻击

1. 漏洞介绍 1.1 漏洞介绍 Microsoft Windows快捷方式LNK文件自动执行代码漏洞。Windows支持使用快捷方式或LNK文件。LNK文件是指向本地文件的引用,点击LNK文件与点击快捷方式所制定的目标具有相同效果。Windows没有正确的处理LNK文件,特制的LNK文件可能导致Windows自动执行…

微服务(服务治理)

服务远程调用时存在的问题 注册中心原理 服务治理中的三个角色分别是什么? 服务提供者:暴露服务接口,供其它服务调用服务消费者:调用其它服务提供的接口注册中心:记录并监控微服务各实例状态,推送服务变更信…

MIT6.s081 2021 Lab Utilities

Boot xv6 按照示例切换到 util 分支后,看到目录下包含 Makefile 文件,执行 make qemu 即可。 sleep 思路 借助系统调用 sleep 实现一个命令行程序,关键是要找到封装了系统调用的 C 函数的位置,根据提示: … user/u…

物联网系统运维——实验备份与恢复,数据镜像软件DRBD介绍,DRBD的安装和应用,extundelete的安装和应用(重点),环境准备,配置设置

一.数据备份 1.数据备份的重要性 备份是系统中需要考虑的最重要的事项,虽然这在系统的整个规划,开发和测试过程中甚至占不到1%,看似不太重要且默默无闻的工作只有到恢复的时候才能真正体现出其重要性,任何数据的丢失与数据宕机,都是不可以被接收的。 2.数据备份策…

oracle 11g rac安装grid 执行root脚本add vip -n 。。。on node= ... failedFailed 错误处理

问题: CRS-4402: The CSS daemon was started in exclusive mode but found an active CSS daemon on node racdg1-1, number 1, and is terminating An active cluster was found during exclusive startup, restarting to join the cluster PRCN-2050 : The requ…