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,一经查实,立即删除!

相关文章

步态控制之捕获点(Capture Point,CP)

捕获点(Capture Point,CP) 捕获点(Capture Point,CP)是机器人学中的一个重要概念,用于评估和控制机器人步态的稳定性。捕获点表示机器人需要踏出的下一步位置,以确保在动态条件下的稳定性。它特别适用于步态控制和动态行走控制。 应用捕获点进行步态控制 捕获点在步…

python 列出面板数据所有变量名

在Python中,处理面板数据(Panel Data)通常使用pandas库,特别是当数据以DataFrame或Panel(尽管Panel在较新版本的pandas中已被弃用)的形式存在时。然而,由于Panel的弃用,现代做法通常…

Docker日志相关命令

日志详情 --details docker logs 默认就是 --details docker logs --details 容器id docker logs 容器id最后n行日志 -n --tail –tail 是 Docker Logs 命令的一个选项,用于限制显示容器日志的行数。通过指定 --tail 后面的数字参数,你可以只显示最后…

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 提供了多种方法…

Laravel学习-控制器

一. 创建创建控制器的命令 php artisan make:controller TestController 二. 单行为控制器 意思是,在定义路由时不用定义指定方法了,他会自己找默认的方法 php artisan make:controller showProfile --invokableRoute::get(profile, 类名的命名空间方…

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

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

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

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

.net后端程序发布到nignx上,通过nginx访问

后端端口是:5009,ngixn端口5001 ,域名是 www.ckdq.site server { listen 5001; #server_name localhost; server_name www.ckdq.site; location / { proxy_pass http://localhost:5009; proxy_http_version 1.1; proxy_set_header Upgrade…

问题排查: 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<…

速盾:高防 CC CDN 的优势剖析

在当今数字化的世界中&#xff0c;网络安全和性能优化至关重要。高防 CC CDN 作为一种先进的技术组合&#xff0c;展现出了诸多显著的优势。 首先&#xff0c;高防 CC 部分能够提供强大的抵御 CC 攻击的能力。CC 攻击往往会造成服务器资源的大量消耗&#xff0c;导致正常服务受…

雪花雪花雪花

/* * Project: 0x14_Hash * File Created:Monday, January 18th 2021, 10:21:24 am * Author: Bug-Free * Problem:AcWing 137. 雪花雪花雪花 */ #include <cstdio> #include <cstring> #include <iostream> #include <vector> #define ll long …

开源与新质生产力

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

JavaScript 编程语言【 数据类型】日期和时间

文章目录 日期和时间创建访问日期组件设置日期组件自动校准&#xff08;Autocorrection&#xff09;日期转化为数字&#xff0c;日期差值Date.now()基准测试&#xff08;Benchmarking&#xff09;对字符串调用 Date.parse总结✅任务创建日期显示星期数欧洲的星期表示方法许多天…

数据交换平台_05_ 监控和管理消息队列

数据交换平台_05_ 监控和管理消息队列 目录概述需求:设计思路实现思路分析1.监控和管理消息拓展实现参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,…