猫狗识别(超详细版)(py代码)

news2025/1/15 19:55:26

猫狗识别(一)

一、图像识别

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 = r'data'

model_path = 'cat_dog_classifier.pth'

data_dir变量设置了数据目录的路径,model_path变量设置了预训练模型的路径。

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字典定义了图像转换的参数,用于将输入图像转换为适合模型处理的格式。

4.使用GPU: 

# 使用GPU

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

device变量用于检查是否有可用的GPU,如果有,则使用GPU进行计算。

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()

代码加载了一个没有预训练权重的ResNet模型,并替换了最后的全连接层以适应两类输出(猫和狗)。然后,它加载了预训练的模型参数,并将模型设置为评估模式。

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')

创建了一个Tkinter窗口,并设置了标题和大小。还添加了背景图片和用于显示识别结果的标签。

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

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

def choose_image():

    global selected_image_path

    file_path = filedialog.askopenfilename(initialdir=data_dir, title="选择图片",

                                           filetypes=(("图片文件", "*.png *.jpg *.jpeg *.gif *.bmp"), ("所有文件", "*.*")))

    if file_path:

        selected_image_path = file_path

        img = Image.open(file_path)

        img = img.resize((400, 350), Image.LANCZOS)

        imgTk = ImageTk.PhotoImage(img)

        image_label.config(image=imgTk)

        image_label.image = imgTk

choose_image函数用于打开一个文件选择对话框,允许用户选择一个图像文件,并将其显示在GUI上。

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

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

def predict_image():

    global selected_image_path

    if 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_cats

        elif 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_dogs

        else:

            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 = imgTk

    else:

        print("请先选择一张图片。")

predict_image函数使用加载的模型对用户选择的图像进行预测,并将结果显示在GUI上。它还使用OpenCV在检测到的猫或狗周围绘制矩形框。

9.退出程序的函数:

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

 close函数用于关闭当前窗口并打开主页面。

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)

创建了三个按钮,分别用于选择图片、开始识别和退出程序。每个按钮都绑定了一个相应的函数。

9.运行Tkinter事件循环: 

# 运行Tkinter事件循环

root.mainloop()

调用root.mainloop()启动Tkinter的事件循环,使GUI开始运行。

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

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

相关文章

【NUCLEO-G071RB】009——HAL库-显示编译时间

NUCLEO-G071RB:009——HAL库-显示编译时间 编译时间设计目标程序修改运行测试 编译时间 这里的编译时间指的是烧录文件的编译时间,它由编译环境的日期和时间共同决定。 设计目标 1、获取编译时间,默认是ASC码格式 2、将编译时间转换为HEX …

哈尔滨等保如何做?

哈尔滨等保测评是确保信息系统安全稳定运行的重要一环,它涉及到对业务、资产、安全技术和安全管理的全面调研和评估。本文将详细阐述哈尔滨等保测评的实施步骤和注意事项,帮助读者更好地理解和执行等保测评工作。 首先,我们需要明确等保测评的…

新品发布 | 捷云等保一体机2.0全新上市,助力中小企业破解等保难题

等保2.0时代,随着网络威胁不断复杂化和组织化,作为网络安全“弱势群体”的中小企业,等保建设工作正面临着安全意识、管理、人才、资金捉襟见肘等问题,主要体现在以下两个方面: 等保建设流程复杂 中小企事业单位缺乏专…

条件概率的理解

P(A)表示A的先验概率 P(B)表示B的先验概率 P(A | B)表示在B发生的情况下,A的条件概率 P(B | A)表示在A发生的情况下,B的条件概率 先验概率是在进行实验之前基于当前知识对结果概率的最佳合理评估。后验概率是在考虑了新信息后,事件发生的修正…

行为树BehaviorTree

主要依托于BehaviorTree.CPP进行介绍。 1 基本概念 1.1 是什么与用来做什么 官网 https://www.behaviortree.dev/docs/learn-the-basics/BT_basics Unlike a Finite State Machine, a behavior Tree is a tree of hierarchical nodes that controls the flow of execution o…

C++:day5

思维导图 例题 #include <iostream> using namespace std; class RMB { private:int yuan;int jiao;int fen;static int count;public:RMB(){count;}RMB(int yuan, int jiao, int fen) : yuan(yuan), jiao(jiao), fen(fen){count;}const RMB operator(const RMB &R)…

基于springboot实现交通管理在线服务系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现交通管理在线服务系统演示 摘要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装交通管理在线服…

上海亚商投顾:微盘股指数涨近5% 超跌低价股集体反弹

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 大小指数6月7日走势分化&#xff0c;沪指全天探底回升&#xff0c;深成指跌近1%&#xff0c;创业板指跌超2%&a…

wordpress轻量免费主题

WordPress建站公司 适合提供WordPress建站服务的公司或个体(个人)工作室使用的WordPress建站公司主题模板。 https://www.jianzhanpress.com/?p545 首屏大图红色简洁wordpress主题 首屏大图红色简洁wordpress主题&#xff0c;非常地高端大气上档次&#xff0c;可用于多个行…

《软件定义安全》之六:SDN和NFV安全实践

第6章 SDN和NFV安全实践 1.基于流的安全防护 1.1 DDoS检测清洗 DDoS检测清洗应用ADS APP的设计思路&#xff1a;借助安全控制平台中流相关的组件&#xff0c;从SDN控制器中获得相应的流量&#xff0c;并根据抗DDoS应用订阅的恶意流特征进行检测&#xff0c;发现恶意流量后&a…

Day 43 keepalived高可用集群

keepalived高可用集群 负载均衡 lb集群 load balance ​ 流量分发 高可用 ha集群 high availability ​ 主要是给服务器做冗余 keepalive 持久连接 保持存活 keepalived 高可用软件名称 红帽有自己的高可用集群套件&#xff1a;RHCS keepalived介绍 ​ keepalived是集…

8.1 基本打印功能

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 在使用“MFC应用”项目模板生成应用程序的过程中&#xff0c;如果在“高级功能”窗口中不取消对打印和打印预览的设置&#xff0c;那么应用程序就已经具备了简单的打印和打…

开源VisualFbeditor中文版,vb7 IDE,VB6升级64位跨平台开发安卓APP,Linux程序

吴涛老矣&#xff0c;社区苦无64位易语言&#xff0c;用注入DLL增强菜单&#xff0c;做成VS一样的界面 终归是治标不治本&#xff0c;一来会报毒&#xff0c;二来闭源20年没更新了 开源的VB7&#xff0c;欢迎易语言的铁粉进群&#xff1a;1032313876 【Freebasic编程语言】编绎…

细说中国自动化集成商100家

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 在当今快速发展的工业自动化领域&#xff0c;中国企业正以其卓越的技术实力和创新能力&#xff0c;在全球市场上占据着越来越重要的位置。为了更…

【MySQL】(基础篇七) —— 通配符和正则表达式

通配符和正则表达式 本章介绍什么是通配符、如何使用通配符以及怎样使用LIKE操作符进行通配搜索&#xff0c;以便对数据进行复杂过滤&#xff1b;如何使用正则表达式来更好地控制数据过滤。 目录 通配符和正则表达式LIKE操作符百分号(%)通配符下划线(_)通配符 通配符使用技巧正…

【APP逆向】央视频播放量增加,逆向全过程解密

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

2024北京通信展:聚焦新一代信息通信技术、产品、应用及解决方案

中国国际信息通信展览会&#xff08;PTEXPO&#xff09;作为工业和信息化部主办的ICT行业盛会&#xff0c;自1990年创办以来&#xff0c;已走过了三十多年的辉煌历程。三十余载光阴荏苒&#xff0c;PT展以其独特的魅力&#xff0c;不仅成为反映信息通信行业发展新成果的重要窗口…

【vue3|第8期】深入理解Vue 3 computed计算属性

日期&#xff1a;2024年6月10日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

邻接矩阵深度优先遍历

深度优先遍历&#xff0c;就是一条路&#xff0c;走到底&#xff0c;然后再走下一个岔路。 下面代码就主要使用递归来进行&#xff0c;当然也可以借助栈来实现。 private void traverse(char v, boolean[] visited) {int index _getIndexOfV(v);//获取v顶点在vertexS字符数组…

传感器技术

传感器技术 传感器概述传感器简介传感器的特性线性度灵敏度迟滞重复性传感器的动态特性 步进电动机步进电机的工作原理 传感器概述 传感器简介 传感器&#xff1a;能够感受被测量并按照一定规律转换成可用输出信号的器件或装置。 敏感元件&#xff1a;传感器中能直接感受或响…