基于多模型的车辆检测与识别技术的开发(车型检测)

news2024/11/20 13:25:18

车辆识别

  • 准备
  • 导入工具包
  • 创建EfficientNet 的模型
    • 加载预训练模型
    • 向前传播
    • 定义EfficientNet类
  • 加载训练好的模型参数
  • 定义图像转换
  • 类别标签
  • 初始化全局变量
  • 上传图片
  • 车型检测

准备

本篇将展示车型检测功能。

导入工具包

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

要点:

  • torch.nn:这是PyTorch的一个模块,用于构建神经网络
  • tkinter:Python的标准GUI库,用于创建图形用户界面
  • PIL(Pillow):一个图像处理库,用于打开、处理和保存多种不同格式的图像
  • torch:PyTorch的核心库,用于构建和训练神经网络
  • torchvision:包含图像处理、数据集和预训练模型等工具的库
  • efficientnet_pytorch:一个提供EfficientNet模型的PyTorch实现
  • numpy:一个强大的数学库,用于进行科学计算
  • cv2:OpenCV库的Python接口,用于计算机视觉任务
  • tkinter.ttk:tkinter的一个模块,提供了改进的Tk控件
  • threading:Python的标准线程库,用于创建和管理线程

创建EfficientNet 的模型

加载预训练模型

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 表示是否使用预训练的模型权重。

向前传播

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

定义EfficientNet类

model = EfficientNetModel(num_classes=12)
# num_classes = 12  # 根据实际类别数修改

加载训练好的模型参数

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

要点:
model_path 变量指定了模型权重文件的路径,这个文件通常是一个 PyTorch 模型的状态字典,它包含了模型的参数
torch.load() 函数用于加载模型权重文件。map_location=torch.device(‘cpu’) 参数指定了加载模型权重时使用的设备。在这里,它被设置为 CPU。这意味着即使模型是在 GPU 上训练的,加载时也会将其参数移动到 CPU 上
model.load_state_dict() 方法用于将加载的状态字典加载到模型中,这样模型就有了训练好的参数
model.eval() 方法将模型设置为评估模式。这个方法对模型没有什么影响,但是如果模型中有定义为仅在训练模式下使用的层(如 Dropout 或 BatchNorm),则这个调用会使其在评估模式下正确地行为

定义图像转换

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 的标准化
])

要点:

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

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

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

类别标签

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

初始化全局变量

selected_image_path = None
label_text = None
right_canvas_image = None

要点:

  • selected_image_path:这个变量可能用于存储用户选择的图像文件的路径。在 GUI 应用程序中,通常会提供一个文件对话框让用户选择图像文件,然后应用程序将选择的文件的路径存储在这个变量中
  • label_text:这个变量可能用于存储与图像相关联的标签文本。例如,如果应用程序是一个图像分类器,label_text 可能用于显示图像的最可能的类别
  • right_canvas_image:这个变量可能用于存储一个图像对象,该对象将在 GUI 的画布上显示。在 Tkinter(Python 的 GUI 库)中,画布(Canvas)是一个可以用来绘制图形和图像的组件。right_canvas_image 可能是一个 ImageTk.PhotoImage 对象,它是一个可以在 Tkinter 中显示的图像

上传图片

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)

要点:

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

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

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

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

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

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

车型检测

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)

要点:

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

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

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

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

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

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

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

  • 计算 outputs 的softmax概率,并获取最大概率值 max_probability

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

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

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

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

  • 最后,将 label_text 放置在窗口的指定位置
    在这里插入图片描述

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

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

相关文章

前端实战:实现块级元素的拖拽与缩放功能

在现代网页开发中,用户交互是一个非常重要的部分。在这篇文章中,我们将详细介绍如何使用原生 JavaScript 实现块级元素的拖拽与缩放功能。具体来说,我们将实现以下功能: 点击并拖动 outer 元素,可以移动整个块。点击并…

基于Java的4S店车辆管理系统

你好,我是计算机专业的毕业生,很高兴与您分享我的毕业设计。 开发语言:Java 数据库:MySQL 技术:Java、SpringBoot、B/S模式 工具:MyEclipse、MySQL 系统展示 首页 个人中心 销售员管理界面 车辆维修管…

第一个Java程序--HalloWorld(记事本版)

一、开发步骤 1.编写 将 Java 代码编写到扩展名为 .java 的源文件中 class HelloChina{public static void main(String[] args){System.out.println("HelloWorld!");} } 2.编译 winr进入DOS操作系统,进入当前目录。(操作命令见《JAVA概述…

【数据结构与算法】堆排序算法 详解

堆排序算法 Status heapAdjust(ElemType *a, int s, int m) {ElemType t a[s];for (int j s * 2 1; j < m; j j * 2 1) {if (j < m && a[j] < a[j 1]) {j;}if (t > a[j]) {break;}a[s] a[j];s j;}a[s] t;return OK; }Status heapSort(ElemType *a…

java基于ssm+jsp 超市进销存管理系统

1前台首页功能模块 宜佰丰超市进销存管理系统&#xff0c;在系统首页可以查看首页、商品信息、新闻资讯、留言反馈、我的、跳转到后台、购物车等内容&#xff0c;如图1所示。 图1前台首页功能界面图 用户注册&#xff0c;在用户注册页面可以填写用户名、密码、姓名、联系电话、…

【教程】如何一步一步训练一个SOM神经网络-自组织竞争神经网络(Self-organizing Feature Map)

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、什么是SOM神经网络1.1.SOM神经网络有什么用1.2.SOM神经网络是如何聚类的 二、如何训练一个SOM神经网络2.1. 训练一个SOM神经网络的代码示例2.2. 如何查看SOM神经网络的聚类中心 SOM神经网络全称为自组织竞争…

java基于ssm+jsp 足球赛会管理系统

1前台首页功能模块 足球赛会管理系统&#xff0c;在系统首页可以查看首页、球队介绍、球星介绍、线下足球赛、论坛信息、个人中心、后台管理、在线客服等内容&#xff0c;如图1所示。 图1前台首页功能界面图 用户登录、用户注册&#xff0c;在注册页面可以填写账号、密码、姓名…

Qt篇——获取Windows系统上插入的串口设备的物理序号

先右键【此电脑-管理- 设备管理器-端口&#xff08;COM和LPT&#xff09;】中找到我们插入的某个设备的物理序号&#xff0c;如下图红色矩形框出的信息&#xff0c;这个就是已插入设备的物理序号&#xff08;就是插在哪个USB口的意思&#xff09;。 在Linux下我们可以通过往/et…

MQTT自动回复消息工具

点击下载《MQTT自动回复消息工具V1.0.0》 1. 前言 在进行IoT系统开发时&#xff0c;各个小组成员通常是同步进行项目开发&#xff0c;经常会遇到设备端和前后端开发人员开发进度不协调的情况&#xff0c;此时接口还没开发完&#xff0c;也没有可以调试的环境&#xff0c;只能…

natsort 自然排序

1、安装 pip install natsort 2、为什么使用natsort 而不是sorted 在python中只需要调用sorted函数就可以了&#xff0c;但是这个函数有一个缺点&#xff0c;就是它是按照从第一位开始的顺序排列的。意思是&#xff1a; wav_file [1.wav, 13.wav, 9.wav, 2.wav,"23.wav…

C++STL 6大组件—你必知必会的编程利器

课程总目录 文章目录 一、vector容器二、deque和list容器三、vector、deque、list横向对比四、详解容器是配置stack、queue、priority_queue五、无序关联容器六、有序关联容器七、迭代器八、函数对象九、泛型算法和绑定器 一、vector容器 底层数据结构是动态开辟的数组&#x…

牛客周赛 F 小红的迷宫行走

原题链接&#xff1a;F-小红的迷宫行走​​​​​​ 题目大意&#xff1a;给大小的图&#xff0c;小红初始在&#xff0c;小红想要去&#xff0c;小红可以向下或者向右走&#xff0c;每次花费1代价&#xff0c;并且每个点上面有一个数字&#xff0c;小红可以瞬移到和这个数字不…

ES6模板字符串详解

ES6是JavaScript语言的一次重大更新&#xff0c;引入了许多新特性和语法改进&#xff0c;其中模板字符串是一个非常实用和灵活的语法特性。它可以让我们从数组或对象中提取值&#xff0c;并赋给对应的变量&#xff0c;让代码变得更加简洁和易读。 本文将深入探讨ES6解构赋值的语…

数据结构:栈(stack)详解 c++信息学奥赛基础知识讲解

目录 一、栈的定义 二、栈的操作 三、代码实操 四、栈的实现 1、string实现stack 2、vector实现stack 3、deque实现栈 一、栈的定义 stack是一个比较简单易用的数据结构&#xff0c;stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff…

泰勒斯威夫特2022年纽约大学毕业典礼演讲:NYU‘s 2022 Commencement Speaker Taylor Swift

NYU’s 2022 Commencement Speaker Taylor Swift Link: https://www.youtube.com/watch?vOBG50aoUwlI Singer, songwriter, producer, and director Taylor Swift received a Doctor of Fine Arts, honoris causa, at the Commencement for the Class of 2022 and delivered …

Java | Leetcode Java题解之第198题打家劫舍

题目&#xff1a; 题解&#xff1a; class Solution {public int rob(int[] nums) {if (nums null || nums.length 0) {return 0;}int length nums.length;if (length 1) {return nums[0];}int first nums[0], second Math.max(nums[0], nums[1]);for (int i 2; i <…

图形编辑器基于Paper.js教程04: Paper.js中的基础知识

背景 了解paper.js的基础知识&#xff0c;在往后的开发过程中会让你如履平地。 基础知识 paper.js 提供了两种编写方式&#xff0c;一种是纯粹的JavaScript编写&#xff0c;还有一种是使用官方提供的PaperScript。 区别就是在于&#xff0c;调用paper下的字对象是否需要加pa…

吉他练琴软件哪个好 Guitar Pro如何辅助练琴

在现代音乐学习和创作中&#xff0c;吉他打谱软件的作用越来越为人们所重视。随着技术的不断发展&#xff0c;各种吉他练琴软件也如雨后春笋般涌现&#xff0c;为吉他爱好者提供了更多选择。下面我们来看看吉他练琴软件哪个好&#xff0c;Guitar Pro如何辅助练琴的相关内容。 一…

出现 defineProps is a compiler macro and no longer needs to be imported. 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 执行前端代码的时候,出现如下问题: [@vue/compiler-sfc] defineProps is a compiler macro and no longer needs to be imported.[@vue/compiler-sfc] defineEmits is a compiler macro and no longer needs to be impo…

在线客服源码系统全端通用 源码完全开源可以二次开发 带完整的安装代码包以及搭建教程

系统概述 在线客服源码系统采用了先进的技术架构&#xff0c;包括前端界面、后端服务、数据库等部分。前端界面采用了响应式设计&#xff0c;能够自适应不同的设备屏幕尺寸&#xff0c;为用户提供良好的使用体验。后端服务采用了高性能的服务器架构&#xff0c;确保系统的稳定…