猫狗分类识别模型建立②模型建立

一、导入依赖库

pip install opencv-python  
pip install numpy  
pip install tensorflow
pip install keras

二、模型建立

'''
pip install opencv-python  
pip install numpy  
pip install tensorflow
pip install keras
'''
import os
import xml.etree.ElementTree as ET

import cv2
import numpy as np
from keras.layers import Input
from keras.models import Model
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.layers import Conv2D, Dense, Flatten, MaxPooling2D
from tensorflow.keras.models import Sequential
from tensorflow.keras.utils import to_categorical

# 设置文件夹路径
images_dir = "imgs/"
annotations_dir = "imgs/"
num_classes = 2  # 设置类别总数
input_shape = (128, 128, 3)
# 模型名称
model_name = "dog_cat.keras"
# 用于存储图像数据和标签的列表
images = []
labels = []

"""
1 dog 狗
2 cat 猫
"""
# 假设我们有一个从标签文本到标签索引的映射字典
label_to_index = {
    "dog": 0,
    "cat": 1,
    # ... 添加其他类别
}

# 遍历文件夹加载数据
for filename in os.listdir(images_dir):
    if filename.endswith(".png"):
        image_path = os.path.join(images_dir, filename)
        annotation_path = os.path.join(annotations_dir, filename[:-4] + ".xml")

        # 读取图像
        image = cv2.imread(image_path)
        image = cv2.resize(image, (128, 128))  # 调整图像大小
        images.append(image)

        # 解析XML标注文件获取标签
        tree = ET.parse(annotation_path)
        root = tree.getroot()
        object_element = root.find("object")
        if object_element is not None:
            label_text = object_element.find("name").text
            label_index = label_to_index.get(label_text)
            if label_index is not None:
                labels.append(label_index)
            else:
                print(f"Warning: Unknown label '{label_text}', skipping.")

# 转换为NumPy数组并进行归一化
images = np.array(images) / 255.0
labels = np.array(labels)

# 确保所有的标签都是有效的整数
if labels.dtype != int:
    raise ValueError("Labels must contain only integers.")

labels = to_categorical(labels, num_classes=num_classes)  # 假设num_classes是类别的总数


# 使用Functional API定义模型
# 创建一个输入层,shape参数指定了输入数据的形状,input_shape是一个之前定义的变量,表示输入数据的维度。
inputs = Input(shape=input_shape)
# 下面的每一行都是通过一个层对数据进行处理,并将处理后的结果传递给下一个层。
# 对输入数据进行卷积操作,使用32个3x3的卷积核,并使用ReLU激活函数。结果赋值给变量x。
x = Conv2D(32, (3, 3), activation="relu")(inputs)
# 对x进行最大池化操作,池化窗口大小为2x2。这有助于减少数据的空间尺寸,从而减少计算量并提取更重要的特征。
x = MaxPooling2D(pool_size=(2, 2))(x)
# 再次进行卷积操作,这次使用64个3x3的卷积核,并继续使用ReLU激活函数。
x = Conv2D(128, (3, 3), activation="relu")(x)
# 再次进行最大池化操作,进一步减少数据的空间尺寸。
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Flatten()(x)  # 将多维的数据展平为一维,以便后续可以连接到全连接层(或称为密集层)。
# 创建一个全连接层,包含64个神经元,并使用ReLU激活函数。这一层可以进一步提取和组合特征。
x = Dense(128, activation="relu")(x)
# 创建一个输出层,神经元的数量与类别的数量(num_classes)相等。使用softmax激活函数,将输出转换为概率分布。
outputs = Dense(num_classes, activation="softmax")(x)
# 使用输入和输出来创建模型实例
model = Model(inputs=inputs, outputs=outputs)  # 通过指定输入和输出来定义模型的结构。
# 编译模型,指定优化器、损失函数和评估指标
# 使用Adam优化器、分类交叉熵损失函数,并监控准确性指标。
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])

# 使用图像数据和标签训练模型
# 使用fit方法训练模型,指定训练数据、训练轮次(epochs)和批处理大小(batch_size)。
model.fit(images, labels, epochs=55, batch_size=512)

# 保存训练好的模型到文件
# 将训练好的模型保存为HDF5文件,以便以后加载和使用。
model.save(model_name)
# keras.saving.save_model(model, "cnn_model.keras")
# model.save("cnn_model.h5")

三、文件结构及构建的模型

①文件结构

②建立后的模型

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python Selenium 详解:实现高效的UI自动化测试

落日余辉,深情不及久伴。大家好,在当今软件开发的世界中,自动化测试已经成为保障软件质量和快速迭代的重要环节。而在自动化测试的领域中,UI自动化测试是不可或缺的一部分,它可以帮助测试团队快速验证用户界面的正确性…

【RAG论文】文档树:如何提升长上下文、非连续文档、跨文档主题时的检索效果

RAPTOR Recursive Abstractive Processing for Tree-Organized RetrievalICLR 2024 Stanfordhttps://arxiv.org/pdf/2401.18059 RAPTOR(Recursive Abstractive Processing for Tree-Organized Retrieval)是一种创建新的检索增强型语言模型,它…

使用NuScenes数据集生成ROS Bag文件:深度学习与机器人操作的桥梁

在自动驾驶、机器人导航及环境感知的研究中,高质量的数据集是推动算法发展的关键。NuScenes数据集作为一项开源的多模态自动驾驶数据集,提供了丰富的雷达、激光雷达(LiDAR)、摄像头等多种传感器数据,是进行多传感器融合…

【PostgreSQL17新特性之-事务级别超时参数transaction_timeout】

PostgreSQL数据库里有多个和会话相关的参数,PostgreSQL17-beta1版本新增了一个transaction_timeout参数,来限制事务的持续时间。 当前的一些和会话相关的超时参数如下 -----------------------------------------------------------------------------…

OrangePi Kunpeng Pro 开发板测评 | AI 边缘计算 大模型部署

0 前言 此次很幸运能够参与 OrangePi Kunpeng Pro 开发板的测评,感谢 CSDN 给予这次机会。 香橙派联合华为发布了基于昇腾的 OrangePi Kunpeng Pro 开发板,具备 8TOPS 的 AI 算力,能覆盖生态开发板者的主流应用场景,具备完善的配…

el-pagination在删除非第一页的最后一条数据遇到的问题

文章目录 前言一、问题展示二、解决方案三、源码解析1、elementui2、elementplus 总结 前言 这个问题是element-ui中的问题,可以从源码中看出来,虽然页码更新了,active也是对的,但是未调用current-change的方法,这里就…

C#多线程同步lock、Mutex

C#使用多线程可以通过System.Threading命名空间下的Thread类来实现 lock和Mutex用于实现线程同步的机制&#xff1a; 上代码&#xff1a; class People{public People(int idd){id idd;}public int id;public int age;}class TestHelper{public TestHelper() { }List<Peo…

鸿蒙开发接口图形图像:【WebGL】

WebGL WebGL提供图形绘制的能力&#xff0c;包括对当前绘制图形的位置、颜色等进行处理。 WebGL标准图形API&#xff0c;对应OpenGL ES 2.0特性集。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md…

4月平板电脑行业线上销售数据分析

由于全球科技发展趋势&#xff0c;如AI技术的应用&#xff0c;以及厂商新品发布计划&#xff1b;同时&#xff0c;平板电脑作为个人电脑的延伸产品&#xff0c;其便携性和生产力相较于手机具有明显优势&#xff0c;这也为行业的进一步发展提供了动力。 据鲸参谋数据统计&#…

开一个抖音小店可以经营几个类目?经营几个类目最合适?

大家好&#xff0c;我是喷火龙。 抖音小店的商品类目和商品数量是没有限制的&#xff0c;只要是在营业执照的经营范围之内的类目都能入驻抖音小店&#xff0c;但是选择的主营类目不能超过三个。 有些商家可能会想&#xff0c;自己经营多个类目&#xff0c;做多种商品种类&…

C++STL容器系列(三)list的详细用法和底层实现

目录 一&#xff1a;介绍二&#xff1a;list的创建和方法创建list方法 三&#xff1a;list的具体用法3.1 push_back、pop_back、push_front、pop_front3.2 insert() 和 erase()3.3 splice 函数 四&#xff1a;list容器底层实现4.1 list 容器节点结构5.2 list容器迭代器的底层实…

算法的时间复杂度(详解)

前言&#xff1a; 算法(Algorithm):就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&#xff0c;并产生出一个或一组值作为 输出。简单来说算法就是一系列的计算步骤&#xff0c;用来将输入数据转化成输出结果 一、算法效率 1.1 如何衡量一个算法的好坏 如何衡…

一篇文章搞懂二叉树

文章目录 DP 树叶的度树的度节点的层次节点的祖先节点的子孙双亲节点或父节点 树的表示孩子兄弟表示法双亲表示法树和非树树的应用 二叉树满二叉树完全二叉树推论二叉树的存储以数组的方式以链表的方式堆(Heap)堆的分类大根堆和小根堆的作用 二叉树的遍历DFS和BFS DP 动态规划…

【CALayer-时钟练习-CADisplayLink Objective-C语言】

一、我们接着来看,这个CADisplayLink啊, 1.刚才我们说那个时间呢,差上1秒钟的样子,然后呢,我们现在呢,用这个叫做CADisplayLink的东西,来解决,用这个类,来解决啊, 我们说,NSTimer,是跑到这儿了以后,一秒钟以后, 它才会执行,这个timeChange方法,真正的时间,不…

同比和环比

1、概述 同比和环比是两种常见的数据分析方法&#xff0c;用于衡量数据在不同时间段的变化情况。通过同比和环比的计算&#xff0c;可以更清晰地了解数据在不同时间段的增长或下降情况&#xff0c;从而为决策提供依据。 2、同比 同比&#xff08;Year-on-Year, YoY&#xff09…

618手把手教你捡漏服务器

618最全捡漏攻略 捡漏规则1、新人优惠⭐⭐⭐2、教育优惠⭐⭐3、回馈活动⭐️ ECS价格对比新人优惠&#x1f49d;京东云 50/年百度云 60.69/年阿里云 82/年腾讯云 99/年 回馈活动&#x1f381;阿里云 教育优惠&#x1f3eb;阿里云腾讯云 hi&#xff0c;好久不见各位&#xff0c;…

【408真题】2009-27

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

Debug - nacos配置 第二弹

好的 又是一个蠢蠢的 nacos 配置上出现的问题 在使用 nacos 进行 配置共享时 报错 Description: Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver c…

分割、合并字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;字符串对象提供了分割和合并字符串的方法。分割字符串是把字符串分割为列表&#xff0c;而合并字符串是把列表合并为字符串&a…

JVM之性能优化

1.JVM优化什么 由博客JVM之垃圾回收-CSDN博客我们已经了解到了数据存储是在方法区和堆区&#xff0c;而堆区的使用更为频繁。堆区有什么呢?老年代、新生代、GC。因此JVM性能优化&#xff0c;优化什么&#xff1f; 我们猜想一下&#xff0c;新生代的大小设置&#xff1b;老年代…