猫狗识别—静态图像识别

猫狗识别—静态图像识别

  • 1. 导入必要的库:
  • 2. 设置数据目录和模型路径:
  • 3. 定义图像转换
  • 4. 使用GPU
  • 5. 加载没有预训练权重的ResNet模型
  • 6. 创建Tkinter窗口:
  • 7.定义选择图片的函数:
  • 8.定义预测图片的函数:
  • 9.退出程序的函数:
  • 10.创建按钮:
  • 11.运行Tkinter事件循环:
  • 12. 完整代码+运行结果
    • 完整代码:
    • 运行结果:

1. 导入必要的库:

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

2. 设置数据目录和模型路径:

  • data_dir变量设置了数据目录的路径,model_path变量设置了预训练模型的路径。
#设置数据目录和模型路径
data_dir = r'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])]),
}

4. 使用GPU

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

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

model = models.resnet50(pretrained=False)  # 使用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()

6. 创建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()#添加文本标签来显示识别结果
result_label = tk.Label(root, text="", font=('Helvetica', 18))
result_label.place(x=280, y=450)#原始图像标签
image_label = tk.Label(root, text="", image="")
image_label.place(x=210, y=55)#保存用户选择的图片路径
selected_image_path = None#加载测试数据集
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#加载Haar特征级联分类器
cat_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalcatface.xml')
dog_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_alt2.xml')

7.定义选择图片的函数:

#定义一个函数来打开文件选择对话框并显示图片
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)img = img.resize((400, 350), Image.LANCZOS)imgTk = ImageTk.PhotoImage(img)image_label.config(image=imgTk)image_label.image = imgTk

8.定义预测图片的函数:

#定义一个函数来使用模型进行预测
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), Image.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), Image.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("请先选择一张图片。")

9.退出程序的函数:

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

10.创建按钮:

#创建按钮
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("退出程序.gif")  # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt1 = tk.Button(root, image=photo4, width=200, height=32, command=close)
bt1.place(x=535, y=530)

11.运行Tkinter事件循环:

#运行Tkinter事件循环
root.mainloop()

12. 完整代码+运行结果

完整代码:

import torch
import numpy as np
import torchvision
from os import path
from torchvision import datasets, models
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
import torchvision.transforms as transforms
import os
import tkinter as tk
from PIL import Image, ImageTk
from tkinter import filedialog
import cv2
import subprocess
from tkinter import messagebox# 设置数据目录和模型路径
data_dir = r'data'
model_path = 'cat_dog_classifier.pth'# 定义图像转换
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])]),
}# 使用GPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")# 加载没有预训练权重的ResNet模型
model = models.resnet50(pretrained=False)  # 使用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()# 创建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()# 添加文本标签来显示识别结果
result_label = tk.Label(root, text="", font=('Helvetica', 18))
result_label.place(x=280, y=450)# 原始图像标签
image_label = tk.Label(root, text="", image="")
image_label.place(x=210, y=55)# 保存用户选择的图片路径
selected_image_path = None# 加载测试数据集
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# 加载Haar特征级联分类器
cat_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalcatface.xml')
dog_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_alt2.xml')# 定义一个函数来打开文件选择对话框并显示图片
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)img = img.resize((400, 350), Image.LANCZOS)imgTk = ImageTk.PhotoImage(img)image_label.config(image=imgTk)image_label.image = imgTk# 定义一个函数来使用模型进行预测
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), Image.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), Image.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("请先选择一张图片。")# 退出程序的函数
def close():subprocess.Popen(["python","主页面.py"])root.destroy()# 创建按钮
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("退出程序.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()

运行结果:

在这里插入图片描述

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

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

相关文章

JSP 开发环境搭建

JSP 开发环境搭建 1. 引言 JavaServer Pages(JSP)是一种动态网页技术,广泛用于创建交互式的网页。为了开发JSP应用程序,首先需要搭建一个合适的开发环境。本文将详细介绍如何搭建JSP开发环境,包括所需软件的安装和配置步骤。 2. 环境准备 在开始之前,请确保您的计算机…

Python高级编程:深度学习基础

Python高级编程:深度学习基础 在前几篇文章中,我们探讨了Python的基础语法、面向对象编程、标准库、第三方库、并发编程、异步编程、网络编程与网络爬虫、数据库操作与ORM、数据分析与数据可视化以及机器学习基础。在这篇文章中,我们将深入探讨Python在深度学习领域的应用。…

一级_01_计算机基础及MS Office应用

1.在计算机内部用来传送、存储、加工处理的数据或指令都是以形式进行的。 十进制码 二进制码 八进制码 十六进制码 2.磁盘上的磁道是()。 一组记录密度不同的同心圆 一组记录密度相同的同心圆 一条阿基米德螺旋线 二条阿基米德螺旋线 3.下列关…

docker导入镜像添加REPOSITORY和TAG信息

docker导入镜像时添加REPOSITORY和TAG信息的命令 当你从一个tar文件导入Docker镜像时,原始的REPOSITORY和TAG信息不会自动附加到镜像上,但你可以在导入后立即使用docker tag命令手动添加这些信息。下面是整个过程的步骤概述: 步骤 1: 导入镜…

Chrome谷歌浏览器如何设置,才能正常使用?

Chrome浏览器,也被称为谷歌浏览器,由于简洁的界面设计,极快的响应速度,强大的插件商店,在全球浏览器市场份额中一直都处于遥遥领先的地位。但是因为2010年谷歌宣布退出中国,国内不能再使用谷歌的服务&#…

探索CSS中的cursor鼠标属性

在网页设计中,细节决定成败。CSS的cursor属性是这些细节中的关键一环,它不仅影响着网页的美观,更关乎用户体验。今天,我们就来深入了解一下cursor属性,看看如何通过它来增强网页的交互性。 cursor属性概览 cursor属性…

【仿真建模-解析几何】求有向线段上距指定点最近的坐标

Author:赵志乾 Date:2024-06-25 Declaration:All Right Reserved!!! 问题描述: 有向线段起点A为(x1,y1),终点B为(x2,y2&a…

HTML+CSS 3D旋转登录表单

效果演示 实现了一个具有3D旋转效果的登录框,背景为太空图片,登录框位于太空中心,可以通过输入用户名和密码进行登录。登录框使用了CSS3的3D变换和动画效果,使其具有立体感和动态效果。同时,登录框的样式也经过精心设计…

sql sever 存储过程不能请求https的解决方案

此错误的原因,通常是因为SQL Server默认不允许非加密的HTTP请求。为了解决这个问题,需要配置SQL Server允许非密码的https请求,或者使用密码的http请求。 下面是配置SQL Server允许非加密http请求 UsE [master] ;Go EXEC sp_configure Sh…

CSS中的长度单位及其使用场景

在CSS的世界里,长度单位是构建布局和样式的基础。它们帮助我们精确地控制元素的大小、间距和位置。本文将介绍CSS中常用的长度单位及其适用场景,帮助你在网页设计中做出更明智的决策。 绝对长度单位 绝对长度单位提供了固定的长度值,不受显…

【Linux】进程间通信_3

文章目录 七、进程间通信1. 进程间通信分类命名管道 未完待续 七、进程间通信 1. 进程间通信分类 命名管道 管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用FIFO文件…

详细分析Oracle中的tnsnames.ora基本知识 以及 PLSQL如何连接(附Demo)

目录 1. tnsnames.ora2. Demo3. 实战 1. tnsnames.ora Oracle 数据库网络配置文件,用于配置客户端与数据库服务器之间的连接 定义网络服务名称,客户端可以使用这些名称连接到数据库实例 基本的路径如下: Windows: ORACLE_HOME\network\ad…

MySQL 数据库安装全攻略

在本文中,将为您详细介绍 MySQL 数据库的两种安装方式:编译安装和二进制安装。无论您是新手还是有一定经验的开发者,相信这篇文章都能为您提供有价值的参考。 一、MySQL 的编译安装 (一)准备工作 首先,如…

QThread 与QObject::moveToThread利用Qt事件循环在子线程执行多个函数

1. QThread的两种用法 第一种用法就是继承QThread,然后覆写 virtual void run(), 这种用法的缺点是不能利用信号槽机制。 第二种用法就是创建一个线程,创建一个对象,再将对象moveToThread, 这种可以充分利用信号槽机制&#xff…

MySQL 支持的多种日期和时间类型

MySQL 支持的多种日期和时间类型 MySQL 支持多种日期和时间类型,包括: 1. DATE: 存储日期值(年、月、日),格式为 YYYY-MM-DD,例如:2024-06-11。 2. TIME: 存储时间值(小时、分钟、秒…

199.罗马数字转整数(力扣)

代码解决 class Solution { public:// 定义一个哈希表来存储罗马数字符号及其对应的整数值unordered_map<char, int> res {{I, 1},{V, 5},{X, 10},{L, 50},{C, 100},{D, 500},{M, 1000},};// 将罗马数字字符串转换为整数的函数int romanToInt(string s) {int num 0; …

ElasticSearch安装、配置详细步骤

一、环境及版本介绍 操作系统&#xff1a; Windows 10 软件版本&#xff1a; elasticsearch-7.17.22、kibana-7.17.22、IK-7.17.22 开发环境选择软件版本应提前考虑正式系统得环境&#xff0c;否则会产生软件与服务器环境不兼容得问题出现&#xff0c;ElasticSearch与环境支…

【机器学习300问】132、自注意力机制(Self-Attention)和传统注意力机制(Attention)的区别?

最近学习注意力机制的时候&#xff0c;发现相同的概念很多&#xff0c;有必要给这些概念做一下区分&#xff0c;不然后续的学习可能会混成一团。本文先区分一下自注意力机制和传统注意力机制。我会先直接给出它们之间有何区别的结论&#xff0c;然后通过一个例子来说明。 一、…

【C++题解】1711. 输出满足条件的整数1

问题&#xff1a;1711. 输出满足条件的整数1 类型&#xff1a;简单循环 题目描述&#xff1a; 有这样的两位数&#xff0c;其十位上的数字比个位上的数字要大&#xff0c;且十位和个位上的数字之和为偶数&#xff0c;请找出所有的满足条件的 2 位数。 输入&#xff1a; 无。…

Spring IOC 控制反转总结

Spring IOC 控制反转总结 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代Java开发中&#xff0c;Spring框架已成为不可或缺的工具&#xff0c;其核心概…