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.rhkb.cn/news/344510.html

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

相关文章

RPA影刀 | 设置当前时间

1. 新建流程 2. 创建指令 指令1:获取当前日期时间 指令3:日期时间转文本 %Y:年 %m:月 %d:日期 其他字符自由添加。 常用格式如下: %Y年%m月%d日%Y-%m-%d%Y_%m_%d%Y%m%d 3. 运行流程

fastadmin/thinkPHPQueue消息队列详细教程

thinkphp-queue 是thinkphp 官方提供的一个消息队列服务,它支持消息队列的一些基本特性: 消息的发布,获取,执行,删除,重发,失败处理,延迟执行,超时控制等队列的多队列, 内存限制 ,启动,停止,守护等消息队列可降级为同步执行1、通过composer安装thinkPHP消息队列 …

spring源码解析-(2)Bean的包扫描

包扫描的过程 测试代码: // 扫描指定包下的所有类 BeanDefinitionRegistry registry new SimpleBeanDefinitionRegistry(); // 扫描指定包下的所有类 ClassPathBeanDefinitionScanner scanner new ClassPathBeanDefinitionScanner(registry); scanner.scan(&quo…

Java中volatile关键字

保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。 1.volatile的可见性 一个典型的例子:永不停止的循环。 public class Forever…

kettle从入门到精通 第六十六课 ETL之kettle kettle阻塞教程,轻松获取最后一行数据,so easy

场景:ETL沟通交流群内有小伙伴反馈,如何在同步一批数据完成之后记录下同步结果呢?或者是调用后续步骤、存储过程、三方接口等。 解决:使用步骤Blocking step进行阻塞处理即可。 1、下面的demo演示从表t1同步数据至表t2&#xff…

[每周一更]-(第100期):介绍 goctl自动生成代码

​ 在自己组件库中,由于部分设计会存在重复引用各个模板的文件,并且基础架构中需要基础模块内容,就想到自动生成代码模板,刚好之前有使用过goctl,以下就简单描述下gozero中goctl场景和逻辑,后续自己借鉴将自…

TiDB-从0到1-配置篇

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇 一、系统配置 TiDB的配置分为系统配置和集群配置两种。 其中系统配置对应TiDB Server(不包含TiKV和PD的参数&#xff0…

在Windows11系统上搭建SFTP服务器

利用OpenSSH搭建SFTP服务器 下载安装部署OpenSSH创建一个测试账户测试链接为SFTP用户配置根目录下载安装部署OpenSSH 参考链接 部署完启动服务要使用管理员模式。 net start sshd创建一个测试账户 使用PC的微软账户是访问不了SFTP的。 需要使用被微软账户覆盖掉的系统账户和…

【python报错】list indices must be integers or slices, not tuple

【Python报错】list indices must be integers or slices, not tuple 在Python中,列表(list)是一种常用的数据结构,用于存储一系列的元素。当你尝试使用不支持的索引类型访问列表元素时,会遇到list indices must be in…

Unity 编辑器扩展 一键替换指定物体下的所有材质球

先看效果 实现方案 1:创建几个用于测试的Cube 2:创建一个脚本 3:编写脚本内容 主要是这部分的逻辑 附上完整代码 using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine;public class Tool {[MenuItem(…

在Visual Studio2022中同一个项目里写作业,有多个cpp文件会报错

为了省事,在同一个项目里写很多个题目,结果只有一个cpp文件时没出错,写了2个cpp文件再想运行时就出错了; Method 1 将不相关的cpp文件移出去 在源文件中对其点击右键,找到“从项目中排除”; 结果如图&…

新能源汽车内卷真相

导语:2025年,我国新能源汽车总产能预计可达3661万辆,如此产能如何消化? 文 | 胡安 “这样卷下去不是办法,企业目的是什么?是盈利,为国家作贡献,为社会作贡献。我们应该有大格局&…

软件游戏找不到d3dx9_43.dll怎么办,三分钟教你解决此问题

在现代科技发展的时代,电脑已经成为我们生活中不可或缺的一部分。然而,在使用电脑的过程中,我们可能会遇到一些问题,其中之一就是电脑缺失d3dx943.dll文件。这个问题可能会影响到我们的正常使用,因此了解其原因和解决方…

2024 IDEA最新永久使用码教程(2099版)

本篇文章我就来分享一下2024年当前最新版 IntelliJ IDEA 最新注册码,教程如下,可免费永久,亲测有效,适合Windows和Mac。 本教程适用于 J B 全系列产品,包括 Pycharm、IDEA、WebStorm、Phpstorm、Datagrip、RubyMine、…

AddressSanitizer理论及实践:heap-use-after-free、free on not malloc()-ed address

AddressSanity:A Fast Address Sanity Checker 摘要 对于C和C 等编程语言,包括缓冲区溢出和堆内存的释放后重用等内存访问错误仍然是一个严重的问题。存在许多内存错误检测器,但大多数检测器要么运行缓慢,要么检测到的错误类型有…

什么时候用C而不用C++?

做接口只用C,千万别要C。C是编译器敏感的,一旦导出的接口里有 std::string这些东西,以及类,注定了要为各个编译器的各个版本准备独立的库。 刚好我有一些资料,是我根据网友给的问题精心整理了一份「C的资料从专业入门…

Qt OPC UA初体验

介绍 OPC UA全称Open Platform Unified Architecture,开放平台统一架构,是工业自动化领域通用的数据交换协议,它有两套主要的通信机制:1.客户端-服务器通信;2.发布订阅。Qt对OPC UA通信标准也提供了支持,目…

分享一个 .NET Core Console 项目使用依赖注入的详细例子

前言 依赖注入(Dependency Injection,简称DI)是一种软件设计模式,主要用于管理和组织一个软件系统中不同模块之间的依赖关系。 在依赖注入中,依赖项(也称为组件或服务)不是在代码内部创建或查…

Elastic Search(ES)Java 入门实操(3)数据同步

基本概念和数据查询代码: Elastic Search (ES)Java 入门实操(1)下载安装、概念-CSDN博客 Elastic Search(ES)Java 入门实操(2)搜索代码-CSDN博客 想要使用 ES 来查询数…

【全开源】云调查考试问卷系统(FastAdmin+ThinkPHP+Uniapp)

便捷、高效的在线调研与考试新选择​ 云调查考试问卷是一款基于FastAdminThinkPHPUniapp开发的问卷调查考试软件,可以自由让每一个用户自由发起调查问卷、考试问卷。发布的问卷允许控制问卷的搜集、回答等各个环节的设置,同时支持系统模板问卷&#xff…