猫狗识别—静态图像识别

猫狗识别—静态图像识别

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

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

相关文章

基于YOLOv5+pyqt5的口罩佩戴检测系统(PyQT页面+YOLOv5模型+数据集)

简介 在各种工作环境和公共场所,确保人们正确佩戴口罩对个人防护和公共卫生至关重要,尤其是在医疗设施、制造业车间和拥挤的公共交通中。为了满足这一需求,我们开发了一种基于YOLOv5目标检测模型的口罩佩戴检测系统。本项目不仅实现了高精度的口罩佩戴检测,还设计了一个可…

第四天 怎么又迟到了呀 哎啥时候来准时上个课呀

泛型编程 Traits实现,是什么 泛型编程(Generic Programming)是一种通过编写与特定类型无关的代码来实现代码复用和抽象的编程范式。 在C中,模板(Templates)是实现泛型编程的主要手段。 Traits&#xff0…

reactjs18 中使用@reduxjs/toolkit同步异步数据的使用

react18 中使用@reduxjs/toolkit 1.安装依赖包 yarn add @reduxjs/toolkit react-redux2.创建 store 根目录下面创建 store 文件夹,然后创建 index.js 文件。 import {configureStore } from "@reduxjs/toolkit"; import {counterReducer } from "./feature…

CS-隐藏防朔源-数据转发-iptables(Linux自带的防火墙)

免责声明:本文仅做技术交流与学习... 目录 准备环境: 1-iptables转发机设置转发: 2-CS服务器配置iptables服务器的IP 准备环境: 两台外网服务器. --iptables服务器就是做一个中转...封了中转就没了... 1-iptables转发机设置转发: iptables -I INPUT -p tcp -m tcp --dport 8…

Python 基础:使用 unittest 模块进行代码测试

目录 一、测试函数2.1 通过案例2.2 不通过案例2.3 添加新测试 二、测试类2.1 单个测试案例2.2 多个测试案例 三、总结 遇到看不明白的地方,欢迎在评论中留言呐,一起讨论,一起进步! 本文参考:《Python编程:…

外贸SEO工具有哪些推荐?

"我们作为一个专业的Google SEO团队,比较推荐一下几个适合外贸SEO的工具。Ahrefs 是一个非常强大的工具,可以帮助你深入分析竞争对手的表现,找到有潜力的关键词,还可以监控你的网站链接状况。另外,SEMrush 也很不…

conda下安装32位版本python

前言:当前主流的系统为64bit系统,conda软件为64bit软件,因此使用conda创建虚拟环境安装python时默认安装的python为64bit版本,但部分研发场景需要调用32bit依赖,只能使用32bit的python,因此需要安装32bit的…

python OpenCV 库中的 cv2.Canny() 函数来对图像进行边缘检测,并显示检测到的边缘特征

import cv2# 加载图像 image cv2.imread(4.png)# 使用 Canny 边缘检测算法提取边缘特征 edges cv2.Canny(image, 100, 200)# 显示边缘特征 cv2.imshow(Edges, edges) cv2.waitKey(0) cv2.destroyAllWindows() 代码解析: 导入 OpenCV 库: import cv2加…

基于Java医院药品交易系统详细设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…

JavaScript中的Date对象,以及常用格式化日期的方法封装

一、Date对象 二、操作Date对象 1、创建Date对象 (1)常用方法 (2)使用示例 2、获取日期 (1)常用方法 (2)使用示例 3、设置日期 (1)常用方法 &…

【LeetCode】六、哈希集合Set相关:存在重复元素判断 + MyHashSet设计

文章目录 1、Set集合2、Java中的Set集合3、leetcode217:存在重复元素4、P705:设计哈希集合 1、Set集合 无序:写进去的顺序和遍历读出来的顺序不一样不重复 主要作用:查看是否有重复元素(给一个数组,转为…

信息技术课如何禁止学生玩游戏

在信息技术课上禁止学生玩游戏是一个常见的挑战,但可以通过一系列策略和工具来有效地实现。以下是一些建议: 明确课堂规则和纪律: (1)在课程开始时,明确告知学生课堂规则和纪律,包括禁止玩游戏的规定。 (2)强调遵守…

C#——this关键字详情

this关键字 在 C# 中,可以使用 this 关键字来表示当前对象,日常开发中我们可以使用 this 关键字来访问类中的成员属性以及函数。 使用this表示当前类的对象 执行结果 使用 this 关键字串联构造函数 执行结果 使用 this 关键字作为类的索引器 执行结果 …

diffusion model(十八):diffusion model中negative prompt的工作机制

info个人博客主页http://myhz0606.com/article/ncsn 前置阅读: DDPM: http://myhz0606.com/article/ddpm classifier-guided:http://myhz0606.com/article/guided classifier-free guided:http://myhz0606.com/article/classi…

用Roofline模型去分析pytorch和Triton算子

用Roofline模型去分析pytorch和Triton算子 1.参考链接2.测试环境3.安装相关依赖4.锁频5.获取理论算力6.创建测试脚本7.运行测试程序生成Roofline图8.NVIDIA Nsight Compute生成Roofline9.效果图A.nn.LinearB.Triton实现 本文演示了如何用Roofline模型去分析pytorch和Triton算子…

Vue2 - 项目上线后生产环境中去除console.log的输出以及断点的解决方案

前言 当你准备将Vue.js应用程序部署到生产环境时,一个关键的优化步骤是移除代码中的所有 console.log 语句以及断点。在开发阶段,console.log 是一个非常有用的调试工具,但在生产环境中保留它们可能会影响性能和安全性。在本文中,我将向你展示如何通过使用Vue CLI 2来自动…

【LLVM】学习使用PGO优化

笔者在查看PGO优化时看到了本站的这篇文章,其中代码和命令行部分贴上了序号,且命令行带上了$符号,不便于读者调试。 遂将代码重新整理到gitee,链接在此。 汇编代码分析 目前笔者使用的llvm版本为llvm-19,主要改动发生…

Postgresql从小白到高手 九 : psql高级查询及内部视图使用

Postgresql从小白到高手 九:pgsql 复杂查询及内部表高级查询 文章目录 Postgresql从小白到高手 九:pgsql 复杂查询及内部表高级查询一、多表查询二、pgsql内部表1.内部表2.内部表查询应用 一、多表查询 内联 :inner join on 简写 join on 结果集只有符合 筛选条件…

【Golang】Steam 创意工坊 Mod 文件夹批量重命名

本文将介绍一个使用Go语言编写的脚本,其主要功能是解析XML文件并基于解析结果重命名文件夹。这个脚本适用于需要对文件夹进行批量重命名,并且重命名规则依赖于XML文件内容的情况。 脚本功能概述 Steam创意工坊下载的Mod文件夹批量重命名为id名称 运行前…

maven仓库的作用以及安装 , DEA配置本地Maven

ay12-maven 主要内容 Maven的作用Maven仓库的作用Maven的坐标概念Maven的安装IDEA配置本地Maven 一、maven概述 1.1、项目开发中的问题 1、我的项目依赖一些jar包,我把他们放在哪里?直接拷贝到项目的lib文件夹中?如果我开发的第二个项目还是需要上面…