pytorch之猫狗识别项目

1. 导入资源包

资源包
import torchvision:PyTorch 提供的视觉库,包含了常用的计算机视觉模型架构、数据集以及图像转换工具。
from torchvision import datasets, models:导入 torchvision 中的 datasets 和 models 模块,用于加载常用的数据集和模型。
import subprocess:用于调用系统子进程执行命令。
from tkinter import filedialog:导入 tkinter 模块,用于创建 GUI 界面、文件对话框和消息框等用户交互组件。

import torch
import numpy as np
from torchvision import datasets, models
import torch.nn as nn
from torch.utils.data import DataLoader
import torchvision.transforms as transforms
import os
import tkinter as tk
from tkinter import filedialog
import cv2
import subprocess
from PIL import Image, ImageTk
from PIL.Image import Resampling

注:这段代码主要是结合 PyTorch 和 tkinter 构建了一个图像处理应用程序,通过 tkinter 提供的界面与用户进行交互,然后利用 PyTorch 和 OpenCV 进行图像处理和深度学习任务。

2. 设置数据目录和模型目录

:这两个路径变量是用来指定数据集和模型文件的存储路径,以便程序能够方便地访问数据和载入模型进行相关的深度学习任务。

# 设置数据目录和模型路径
data_dir = 'C:/Users/HUAWEI/PycharmProjects/pythonProject1/二分类/data'
model_path = 'cat_dog_classifier.pth'

3. 定义图像转换

# 定义图像转换
data_transforms = {'test': transforms.Compose([transforms.Resize(size=224),transforms.CenterCrop(size=224),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),
}

:在这段代码中,作者定义了一个名为 data_transforms 的字典,其中包含了针对测试数据的图像转换操作。这些图像转换操作通常用于将原始图像数据转换为神经网络模型可接受的格式,同时进行一定的预处理以提高模型性能,通过这些图像转换操作,测试数据在输入神经网络之前会被经过一系列的预处理操作,以便更好地适应神经网络的训练和推断需求,同时有助于提高模型的性能和收敛速度。

3. 使用GPU

# 使用GPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

torch.cuda.is_available():这是 PyTorch 提供的函数,用于检测当前系统是否支持 CUDA,即是否有可用的 GPU 资源,通过这段代码,作者实现了将模型加载到 GPU 上进行计算的逻辑,这样可以利用 GPU 的并行计算能力加速深度学习任务的执行速度。如果系统支持 CUDA,模型将在 GPU 上执行,否则将在 CPU 上执行。

4. 加载没有预训练权重的ResNet模型

# 加载没有预训练权重的ResNet模型
model = models.resnet50(weights=None)  # 使用pretrained=False
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 2)
model.load_state_dict(torch.load(model_path))
model = model.to(device)
model.eval()

:加载了一个不带预训练权重的 ResNet-50 模型,并对其进行了适应二分类任务的定制化处理,以便进行后续训练或推理操作。

5. 创建Tkinter窗口

# 创建Tkinter窗口
root = tk.Tk()
root.title('猫狗识别')
root.geometry('800x650')image = Image.open("图像识别背景.gif")
image = image.resize((800, 650))  # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
canvas = tk.Label(root, image=photo1)
canvas.pack()

:通过这段代码,成功地创建了一个带有背景图片的 Tkinter 窗口,为用户提供一个可视化的界面,用于展示猫狗识别的功能。

6. 添加文本标签来显示识别结果

# 添加文本标签来显示识别结果
result_label = tk.Label(root, text="", font=('Helvetica', 18))
result_label.place(x=280, y=450)

:通过这段代码,我们在 Tkinter 窗口中成功添加了一个用于显示识别结果的文本标签,方便用户在界面上查看猫狗识别的结果。

7. 保存用户选择的图片路径

selected_image_path = None

:这行代码定义了一个变量 selected_image_path,并将其初始化为 None。通常情况下,这样的操作用于在程序中声明一个变量,但暂时不对其进行赋值。在后续的代码中,可以根据实际需要来更新 selected_image_path 的取值,以存储用户选择的图像文件路径。

8. 加载测试数据集

# 加载测试数据集
image_datasets = {x: datasets.ImageFolder(root=os.path.join(data_dir, x),transform=data_transforms[x])for x in ['test']}
dataloaders = {x: DataLoader(image_datasets[x], batch_size=1, shuffle=False)for x in ['test']}
dataset_sizes = {x: len(image_datasets[x]) for x in ['test']}
class_names = image_datasets['test'].classes  # 定义class_names

:通过这段代码,我们成功加载了测试数据集,并准备好了对测试数据进行预测和评估所需的数据结构,为模型的测试和评估提供了基础。

9. 加载Haar特征级联分类器

# 加载Haar特征级联分类器
cat_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalcatface.xml')
dog_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_alt2.xml')


haarcascade_frontalcatface.xml 是用于检测猫脸分类器文件。
haarcascade_frontalface_alt2.xml 是用于检测狗脸分类器文件。
通过以上代码,我们成功加载了用于检测猫和狗脸部的 Haar 特征级联分类器,这些分类器可以用于后续对图像中的猫和狗进行脸部检测。

10. 定义一个函数来打开文件选择对话框并显示图片

# 定义一个函数来打开文件选择对话框并显示图片
def choose_image():global selected_image_pathfile_path = filedialog.askopenfilename(initialdir=data_dir, title="选择图片",filetypes=(("图片文件", "*.png *.jpg *.jpeg *.gif *.bmp"), ("所有文件", "*.*")))if file_path:selected_image_path = file_pathimg = Image.open(file_path)mg = img.resize((400, 350), Resampling.LANCZOS)imgTk = ImageTk.PhotoImage(img)image_label.config(image=imgTk)image_label.image = imgTk

:这段代码定义了一个函数 choose_image(),其作用是打开一个文件选择对话框,允许用户选择图片文件,并在程序中显示所选图片。

11. 定义一个函数来使用模型进行预测

# 定义一个函数来使用模型进行预测
def predict_image():global selected_image_pathif selected_image_path:img = Image.open(selected_image_path)transform = data_transforms['test']img_tensor = transform(img).unsqueeze(0).to(device)with torch.no_grad():outputs = model(img_tensor)_, preds = torch.max(outputs, 1)prediction = class_names[preds.item()]  # 使用str()来将整数转换为字符串result_label.config(text=f"检测到的结果为: {prediction}")# 使用OpenCV在原始图像上绘制矩形框img_cv2 = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)if prediction == 'cats':cats = cat_cascade.detectMultiScale(img_cv2, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))for (x, y, w, h) in cats:cv2.rectangle(img_cv2, (x, y), (x + w, y + h), (0, 0, 255), 2)  # 红色矩形框if len(cats) > 0:cv2.imwrite("detected_cats_image.jpg", img_cv2)  # 保存带有猫矩形框的图像img_detected_cats = Image.open("detected_cats_image.jpg").resize((350, 300), Resampling.LANCZOS)imgTk_detected_cats = ImageTk.PhotoImage(img_detected_cats)image_label.config(image=imgTk_detected_cats)image_label.image = imgTk_detected_catselif prediction == 'dogs':dogs = dog_cascade.detectMultiScale(img_cv2, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))for (x, y, w, h) in dogs:cv2.rectangle(img_cv2, (x, y), (x + w, y + h), (0, 0, 255), 2)  # 红色矩形框if len(dogs) > 0:cv2.imwrite("detected_dogs_image.jpg", img_cv2)  # 保存带有狗矩形框的图像img_detected_dogs = Image.open("detected_dogs_image.jpg").resize((350, 300), Resampling.LANCZOS)imgTk_detected_dogs = ImageTk.PhotoImage(img_detected_dogs)image_label.config(image=imgTk_detected_dogs)image_label.image = imgTk_detected_dogselse:print("未检测到猫或狗。")# 显示修改后的图像img = cv2.cvtColor(img_cv2, cv2.COLOR_BGR2RGB)img = cv2.resize(img, (400, 350))imgTk = ImageTk.PhotoImage(image=Image.fromarray(img))image_label.config(image=imgTk)image_label.image = imgTkelse:print("请先选择一张图片。")

:这段代码定义了一个名为 predict_image() 的函数,在选定的图片上使用模型进行预测,并在图像上标记检测结果(猫或狗),然后在界面中显示带有标记的图像。以下是函数的主要逻辑解释:

  1. global selected_image_path:声明 selected_image_path 是全局变量,以便在函数内部访问所选图片路径。

  2. 检查是否已选择了图片路径,若选择了,则执行以下操作:

  3. 从选定图片路径加载图像,并应用与训练时相同的测试数据转换。

  4. 使用模型进行图像预测,得到预测类别和相应得分。

  5. 根据预测类别在图像上绘制矩形框,标记检测结果,并在图像上显示矩形框。

  6. 如果检测到猫,将在图像上绘制红色矩形框并保存带有猫矩形框的图像,并在界面中显示标记的图像。

  7. 如果检测到狗,将在图像上绘制红色矩形框并保存带有狗矩形框的图像,并在界面中显示标记的图像。

  8. 如果未检测到猫或狗,输出相应信息。

  9. 将绘制了矩形框后的图像转换为适合界面展示的格式,并在界面中显示。

  10. 若未选择图片路径,则输出提示信息。

通过这个函数,用户可以在界面中选择图片并进行猫狗识别的预测,并显示标记了检测结果的图片,提高了用户体验和结果可视化。

12. 退出程序的函数

# 退出程序的函数
def close():subprocess.Popen(["python","主页面.py"])root.destroy()

注:通过这个函数,当用户希望退出当前程序时,会打开一个新的 Python 进程并运行名为 “主页面.py” 的文件,同时关闭当前程序界面,实现了程序的退出操作。

13. 创建按钮

# 创建按钮
image = Image.open("选择图片.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(root, image=photo2, width=200, height=32, command=choose_image)
bt1.place(x=60, y=530)image = Image.open("开始识别.gif")  # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt1 = tk.Button(root, image=photo3, width=200, height=32, command=predict_image)
bt1.place(x=300, y=530)image = Image.open("C:/Users/HUAWEI/Desktop/aa/aa/退出程序.gif")  # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt1 = tk.Button(root, image=photo4, width=200, height=32, command=close)
bt1.place(x=535, y=530)# 运行Tkinter事件循环
root.mainloop()

注:这段代码定义了三个按钮,每个按钮都使用了一张图片作为其显示内容,并指定了当按钮被点击时执行相应的函数。以下是代码的主要逻辑解释:

  1. image = Image.open(“选择图片.gif”):打开一张名为 “选择图片.gif” 的图片。

  2. photo2 = ImageTk.PhotoImage(image):将 PIL 库中的 Image 对象转换为 Tkinter 库中可用的图像对象。

  3. bt1 = tk.Button(root, image=photo2, width=200, height=32, command=choose_image):创建一个按钮,其图片是 photo2,宽度为 200,高度为 32,当按钮被点击时执行 choose_image 函数。

  4. bt1.place(x=60, y=530):设置按钮在窗口中的位置,x 坐标为 60,y 坐标为 530。

  5. 对于第二个按钮,重复上述步骤,但使用不同的图片和函数,该按钮位于 x 坐标 300,y 坐标 530。

  6. 对于第三个按钮,重复上述步骤,但使用不同的图片和函数,该按钮位于 x 坐标 535,y 坐标 530。

  7. root.mainloop():启动 Tkinter 事件循环,使得窗口能够响应用户的交互,如点击按钮等。

通过这些按钮,用户可以执行选择图片、进行预测和退出程序的操作,这些操作通过点击按钮触发相应的函数来执行。
运行结果
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

spring boot +Scheduled 动态定时任务配置

通常情况下我们设定的定时任务都是固定的,有时候需要我们动态的配置定时任务,下面看代码 import com.mybatisflex.core.query.QueryWrapper; import com.yzsec.dsg.web.modules.exportpwd.entity.ExportPwd; import com.yzsec.dsg.web.modules.exportpwd.entity.table.Export…

如何使用GPT-4o函数调用构建一个实时应用程序?

本教程介绍了如何使用OpenAI最新的LLM GPT-4o通过函数调用将实时数据引入LLM。 我们在LLM函数调用指南(详见https://thenewstack.io/a-comprehensive-guide-to-function-calling-in-llms/)中讨论了如何将实时数据引入聊天机器人和代理。现在,我们将通过将来自Fligh…

bat脚本简介

一、bat脚本 概念定义 BAT 批处理是一种在 Windows 系统中用于将一系列命令组合成一个可执行文件(.bat 文件)的脚本技术。 允许用户将多个操作命令按顺序编写在一起。形成一个自动化执行的流程。批处理文件可以包含各种系统命令和程序调用。 如文件操作…

中国现在最厉害的书法家颜廷利:东方伟大思想家哲学家教育家

中国书法界名人颜廷利教授,一位在21世纪东方哲学、科学界及当代中国教育领域内具有深远影响力的泰斗级人物,不仅以其深厚的国学修为和对易经姓名学的独到见解著称,还因其选择在济南市历城区的龙泉大街以及天桥区的凤凰山庄与泉星小区等地设立…

如何在隔离环境中设置 LocalAI 以实现 GPU 驱动的文本嵌入

作者:来自 Elastic Valeriy Khakhutskyy 你是否想在 Elasticsearch 向量数据库之上构建 RAG 应用程序?你是否需要对大量数据使用语义搜索?你是否需要在隔离环境中本地运行?本文将向你展示如何操作。 Elasticsearch 提供了多种方法…

多曝光融合算法(三)cv2.createAlignMTB()多曝光图像融合的像素匹配问题

文章目录 1.cv2.createAlignMTB() 主要是计算2张图像的位移,假设位移移动不大2.多曝光图像的aline算法:median thresold bitmap原理讲解3.图像拼接算法stitch4.多曝光融合工具箱 1.cv2.createAlignMTB() 主要是计算2张图像的位移,假设位移移动…

Python中猴子补丁是什么,如何使用

1、猴子补丁奇遇记 🐒 在Python的世界深处,隐藏着一种神秘而又强大的技巧——猴子补丁(Monkey Patching)。这是一项允许你在程序运行时动态修改对象(如模块、类或函数)的行为的技术。它得名于其“快速修补…

问题排查: Goalng Defer 带来的性能损耗

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言问题背景结论 引言 性能优化之路道阻且长,因为脱敏规定,…

vite常识性报错解决方案

1.导入路径不能以“.ts”扩展名结束。考虑改为导入“xxx.js” 原因:当你尝试从一个以 .ts 结尾的路径导入文件时,ESLint 可能会报告这个错误,因为它期望导入的是 JavaScript 文件(.js 或 .jsx)而不是 TypeScript 文件&…

coap-emqx:使用libcoap与emqx通信

# emqx开启CoAP网关 请参考【https://blog.csdn.net/chenhz2284/article/details/139562749?spm1001.2014.3001.5502】 # 写一个emqx的客户端程序&#xff0c;不断地往topic【server/1】发消息 【pom.xml】 <dependency><groupId>org.springframework.boot<…

开源与新质生产力

在这个信息技术迅猛发展的时代&#xff0c;全球范围内的产业都在经历着深刻的变革。在这样的背景下&#xff0c;“新质生产力”的概念引起了广泛的讨论。无论是已经成为或正努力转型成为新质生产力的企业&#xff0c;都在寻求新的增长动力和竞争优势。作为一名长期从事开源领域…

Linux用户和用户组的管理

目录 前言一、系统环境二、Linux用户组的管理2.1 新增用户组2.2 删除用户组2.3 修改用户组2.4 查看用户组 三、Linux用户的管理3.1 新增用户3.2 删除用户3.3 修改用户3.4 查看用户3.5 用户口令&#xff08;密码&#xff09;的管理 总结 前言 本篇文章介绍如何在Linux系统上实现…

OrangePi Kunpeng Pro深度评测:性能与体验的完美融合

文章目录 一、引言二、硬件开箱与介绍1.硬件清单2.硬件介绍 三、软件介绍四、性能测试1. 功率测试2. cpu测试2.1 单线程cpu测试2.2 多线程cpu测试 五、实际开发体验1. 搭建API服务器2. ONNX推理测试3. 在线推理平台 五、测评总结1. 能与硬件配置2. 系统与软件3. 实际开发体验个…

探索智慧商场的功能架构与应用

在数字化和智能化的浪潮下&#xff0c;智慧商场已经成为零售业的重要发展方向之一。智慧商场系统的功能架构设计与应用&#xff0c;结合了现代信息技术和零售业的实际需求&#xff0c;为商场的管理和运营提供了全新的解决方案。本文将深入探讨智慧商场的功能架构与应用&#xf…

matlab---app

一 基础 标签和信号灯没有回调函数 clc,clear,close all %清理命令区、工作区&#xff0c;关闭显示图形 warning off %消除警告 feature jit off %加速代码运行 ysw{i}i %循环赋值 celldisp(ysw) %显示元胞数组ysw.y1{1}[1,2] …

《软件定义安全》之二:SDN/NFV环境中的安全问题

第2章 SDN/NFV环境中的安全问题 1.架构安全 SDN强调了控制平面的集中化&#xff0c;从架构上颠覆了原有的网络管理&#xff0c;所以SDN的架构安全就是首先要解决的问题。例如&#xff0c;SDN实现中网络控制器相关的安全问题。 1.1 SDN架构的安全综述 从网络安全的角度&…

@BeforeAll 和 @AfterAll 必须是 static 的原因

BeforeAll 和 AfterAll 必须是 static 的原因 执行时机&#xff1a; BeforeAll 方法在所有测试方法之前运行。AfterAll 方法在所有测试方法之后运行。 实例化前/后的执行&#xff1a; 因为 BeforeAll 是在所有测试方法执行之前运行的&#xff0c;所以它在任何一个测试实例创建…

基于springboot的教学管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;教师管理&#xff0c;学生管理&#xff0c;课程管理 教师账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;课程管理&#xff0c;课程表…

数据结构---树与二叉树

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

【CTF MISC】XCTF GFSJ0290 reverseMe Writeup(图像处理)

reverseMe 暂无 解法 导入 Photoshop。 水平翻转&#xff0c;得到 flag。 Flag flag{4f7548f93c7bef1dc6a0542cf04e796e}声明 本博客上发布的所有关于网络攻防技术的文章&#xff0c;仅用于教育和研究目的。所有涉及到的实验操作都在虚拟机或者专门设计的靶机上进行&#xf…