猫狗识别大模型——基于python语言

目录

1.猫狗识别

2.数据集介绍

3.猫狗识别核心原理

4.程序思路

4.1数据文件框架

 4.2 训练模型

4.3 模型使用

4.4 识别结果

5.总结


1.猫狗识别

人可以直接分辨出图片里的动物是猫还是狗,但是电脑不可以,要想让电脑也分辨出图片里的动物是猫还是小狗,就要使用到深度学习,电脑学习提取图片特征,进而学习区分图片里的是猫还是狗。

2.数据集介绍

程序用到的训练数据集是猫狗图像数据集,数据格式jpg格式,猫狗数据集:

https://www.kaggle.com/datasets/shaunthesheep/microsoft-catsvsdogs-dataset

 

3.猫狗识别核心原理

猫狗识别大模型是一种深度学习架构,主要用于图像分类任务,用来区分猫和狗这两种常见的宠物动物。

该模型基于卷积神经网络(CNN),它们通过学习大量的猫和狗图像数据集中的特征来进行训练,使其能够识别出输入图片中动物的种类。

训练过程中,模型会对猫的特有纹理、颜色模式、耳朵形状等特征进行学习,并形成区分猫狗的关键特征模板。一旦模型经过充分训练并优化,它可以准确地判断新的未知图片是属于猫还是狗。

应用此类模型的方式通常是将其部署到移动设备或者云端服务器上,用户上传一张照片后,模型会返回一个预测结果,指示图像中动物的类别。

4.程序思路

基于tensorflow模型框架以及卷积神经网络还有其他各种模块,划分训练集,微调集和测试机,对猫狗图片文件进行训练。

4.1数据文件框架

 4.2 训练模型

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.optimizers import Adam
import matplotlib.pyplot as plt
import os# 获取所有的GPU设备
gpus = tf.config.list_physical_devices('GPU')# 检查是否有两个以上的GPU
if gpus and len(gpus) > 1:try:# 假设GPU1是独立GPU,设置可见设备为GPU1tf.config.set_visible_devices(gpus[1], 'GPU')tf.config.experimental.set_memory_growth(gpus[1], True)except RuntimeError as e:print(e)
else:print("没有检测到多个GPU,或者系统只存在一个GPU。")# 定义数据目录
data_dir = './pythonProject/ai_modle_win/cats vs dogs/dataset'  # 请替换为你的数据集路径
train_dir = os.path.join(data_dir, 'train')
validation_dir = os.path.join(data_dir, 'validation')
test_dir = os.path.join(data_dir, 'test')# 图像数据生成器
train_datagen = ImageDataGenerator(rescale=1./255,rotation_range=20,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True
)validation_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)# 计算样本数量
def count_files(directory):total_files = 0for root, dirs, files in os.walk(directory):total_files += len(files)return total_filestrain_samples = count_files(train_dir)
validation_samples = count_files(validation_dir)
test_samples = count_files(test_dir)# 数据生成器
def create_generator(datagen, directory, target_size, batch_size, class_mode):generator = datagen.flow_from_directory(directory,target_size=target_size,batch_size=batch_size,class_mode=class_mode)# 包装生成器以处理损坏的图像文件while True:try:yield next(generator)except (OSError, StopIteration) as e:print(f"跳过无法读取的图像文件:{e}")continuetrain_generator = create_generator(train_datagen, train_dir, (150, 150), 32, 'binary')
validation_generator = create_generator(validation_datagen, validation_dir, (150, 150), 32, 'binary')
test_generator = create_generator(test_datagen, test_dir, (150, 150), 32, 'binary')# 定义模型
model = Sequential([Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),MaxPooling2D(2, 2),Conv2D(64, (3, 3), activation='relu'),MaxPooling2D(2, 2),Conv2D(128, (3, 3), activation='relu'),MaxPooling2D(2, 2),Conv2D(128, (3, 3), activation='relu'),MaxPooling2D(2, 2),Flatten(),Dropout(0.5),Dense(512, activation='relu'),Dense(1, activation='sigmoid')
])model.compile(loss='binary_crossentropy',optimizer=Adam(learning_rate=0.001),metrics=['accuracy'])# 训练模型
history = model.fit(train_generator,steps_per_epoch=train_samples // 32,  # 将结果转换为整数validation_data=validation_generator,validation_steps=validation_samples // 32,  # 将结果转换为整数epochs=5
)# 保存模型
model.save('./pythonProject/ai_modle_win/cats vs dogs/cat_dog.h5')# 评估模型
test_loss, test_acc = model.evaluate(test_generator, steps=test_samples // 32)
print(f'Test accuracy: {test_acc:.2f}')# 可视化训练结果
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']epochs = range(len(acc))plt.figure(figsize=(12, 9))plt.subplot(1, 2, 1)
plt.plot(epochs, acc, 'b', label='Training accuracy')
plt.plot(epochs, val_acc, 'r', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.legend()plt.subplot(1, 2, 2)
plt.plot(epochs, loss, 'b', label='Training loss')
plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()plt.show()

注意更改文件路径!!!

4.3 模型使用

import tensorflow as tf
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing import image
import numpy as np
import os# 加载已保存的模型
model = load_model('./pythonProject/ai_modle_win/cats vs dogs/cat_dog.h5')# 预测函数
def predict_image(img_path):img = image.load_img(img_path, target_size=(150, 150))img_array = image.img_to_array(img)img_array = np.expand_dims(img_array, axis=0)img_array /= 255.0prediction = model.predict(img_array)if prediction[0] > 0.5:print(f"The image at {img_path} is a Dog")else:print(f"The image at {img_path} is a Cat")# 示例用法
test_image_path = './pythonProject/ai_modle_win/cats vs dogs/30.jpg'  # 替换为你的测试图片路径
predict_image(test_image_path)

使用上述训练的模型进行图片识别,注意文件路径。

4.4 识别结果

5.总结

通过构造猫狗图片数据集,然后使用深度学习训练一个猫狗识别大模型,你也快来试一试吧。

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

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

相关文章

C++面试3

一、常用设计模式 https://blog.csdn.net/m0_71530237/article/details/141140118?spm1001.2014.3001.5501 二、死锁以及解决方式? 死锁:一种常见的并发问题,发生在多个进程或线程因为竞争资源而陷入相互等待的状态,导致这些进…

Flutter之SystemChrome全局设置

一、简介 SystemChrome作为一个全局属性,很像 Android 的 Application,功能很强大。 二、使用详解 2.1 setPreferredOrientations 设置屏幕方向 在我们日常应用中可能会需要设置横竖屏或锁定单方向屏幕等不同要求,通过 setPreferredOrien…

JavaScript高级——作用域和作用链

1、概念理解: —— 就是一块“地盘”,一个代码所在的区域 —— 静态的(相对于上下文对象),在编写代码时就确定了 2、分类 ① 全局作用域 ② 函数作用域 ③ 没有块作用域(ES6有了) 3、作用 …

【秋招笔试】9.09阿里国际秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集…

QT如何通过QTableWidget控件开发表格功能

在Qt中,QTableWidget是一个高级表格控件,它允许你直接在表格中操作行、列和单元格。以下是使用QTableWidget控件开发表格功能的基本步骤和技巧: 1. 包含必要的头文件 在你的Qt项目中,你需要包含QTableWidget的头文件&#xff0c…

WPF利用Path自定义画头部导航条(TOP)样式

1;新建两个多值转换器,都有用处,用来动态确定PATH的X,Y州坐标的。 EndPointConverter 该转换器主要用来动态确定X轴,和Y轴。用于画线条的。 internal class EndPointConverter : IMultiValueConverter {public object Convert(object[] val…

GIS 中的 3D 分析

GIS 中的 3D 分析 3D 分析已成为 GIS 的一个发展趋势,因为它能够更好地表现现实世界。 这不仅仅是为了得到漂亮的图片。对于某些类型的问题,3D 分析有时是解决它们的唯一方法。 3D 数据类型的激增也推动了这一需求。例如,LiDAR、BIM、UAV、…

VS Code 配置 Rust-Analyzer 报错

报错信息: Bootstrap Error" rust-analyzer requires glibc > 2.28 in latest build. 参考了好多地方, https://github.com/rust-lang/rust-analyzer/issues/11558 https://blog.csdn.net/aLingYun/article/details/120923694 https://rust-anal…

C++——⼆叉搜索树

文章目录 一、 ⼆叉搜索树的概念二、⼆叉搜索树的性能分析三、⼆叉搜索树的插⼊四、⼆叉搜索树的查找五、⼆叉搜索树的删除六、二叉搜索树的有序遍历七、⼆叉搜索树的实现代码八、二叉搜索树key与key_value的应用key的应用key_value的应用key/value⼆叉搜索树代码实现 一、 ⼆叉…

Ollama的安装及使用

文章目录 1. ollama 下载2. linux安装3. windows安装4. 使用ollama 1. ollama 下载 下载地址:https://ollama.com/download 2. linux安装 执行命令: curl -fsSL https://ollama.com/install.sh | sh设置启动访问IP和模型存储路径: vim /…

C++类与对象深度解析(一):从抽象到实践的全面入门指南

文章目录 C 类与对象——详细入门指南前言1. 类的定义1.1 类定义的基本格式示例代码解释 1.2 访问限定符示例代码解释 1.3 类域示例代码解释 1.4 成员命名规范常见的命名约定:示例:拓展: 1.5 class与struct的默认访问权限示例: 2.…

搭建Windows下的Rust开发环境

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 2.1.1 安装vs_buildtools 在Windows系列操作系统中,Rust开发环境需要依…

归并排序(Merge Sort)

什么是归并排序 归并排序(Merge Sort)是一种经典的排序算法,它采用分治法(Divide and Conquer)策略,将一个大数组分为两个小数组,分别进行排序,然后将这两个已排序的小数组合并成一个…

RealSense L515相机使用踩坑记录

Realsense Viewer以及ROS驱动安装 要想通过ROS驱动Realsense系列产品,需要首先安装Realsense Viewer以及对应版本的realsense-ros驱动。 Realsense Viewer安装 Realsense Viewer的安装参考文章Linex Ubuntu环境下 Intel Realsense D435I 驱动ROS驱动安装配置 安…

docker进入容器运行命令

Docker容器的基本操作 在深入讨论如何进入容器并运行命令之前,让我们先回顾一下Docker容器的一些基本操作: 列出容器:使用docker ps命令列出当前正在运行的容器。如果你还想看到已经停止的容器,可以添加-a或--all选项。 启动容器…

音视频开发常见的开源项目汇总

FFmpeg 地址:https://ffmpeg.org/介绍:FFmpeg 是一个非常强大的开源多媒体框架,它可以用来处理视频和音频文件。它支持多种格式的转换、编码、解码、转码、流处理等。FFmpeg 包括了 libavformat、libavcodec、libavutil、libswscale、libpos…

JAVA学习笔记01-变量的初始化

package day01; public class VarDemo { public static void main(String[] args) { int a; //int b,c,d; // int a; int e 300; //声明一个int(整数)的变量名为e并为e存储了300这样的整数数据 声明时并初始化 int f; //声明一个…

组播 2024 9 11

PIM(Protocol Independent Multicast)是一种常用的组播路由协议,其独立于底层的单播路由协议,能够在多种网络环境中有效地实现多播路由功能。PIM主要有两种模式:PIM Sparse Mode (PIM-SM) 和 PIM Dense Mode (PIM-DM)&…

sqlx1.3.4版本的问题

sqlx1.3.4版本存在问题,在调用sqlx的Select方法时,如果传入的dest是一个slice且slice不为空,查询结果将会追加在这个slice已有的元素后面。这位用户认为这个行为是“a little surprising”的,且与json 反序列化的表现不一致&#…

【C++题解】1580. 扫雷(mine)

欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 问题:1580. 扫雷(mine) 类型:二维数组 题目描述: 扫雷游戏是一款十分经典的单机小游戏。在 n 行 m 列的雷区中有一些格子含有地雷&#x…