基于CNN卷积神经网络 猫狗图像识别

news2024/11/19 5:51:33

目录

一:数据集准备

二:读取自己的数据集

三:搭建网络 训练模型

四:猫狗图像识别


一:数据集准备

从官网下载比较麻烦,可根据以下链接,从百度网盘获取数据集

https://pan.baidu.com/s/13hw4LK8ihR6-6-8mpjLKDA

密码:dmp4

猫狗图像识别数据集 如下

二:读取自己的数据集

import os
import cv2
import numpy as np
from tqdm import tqdm  # 进度条
from random import shuffle  # 随机打乱

IMAGE_SIZE = 50


def label_img(img_name):
    label_name = img_name.split('.')[0]
    # print(label_name)
    if label_name == 'cat':
        return [1, 0]
    elif label_name == 'dog':
        return [0, 1]
    return []


def create_train_data(dir_path):
    train_data = []
    # 遍历目录获取每一张图片的路径
    for img_path in tqdm(os.listdir(dir_path)):
        # print(img_path)
        label = label_img(img_path)
        if len(label) != 0:
            img_path = os.path.join(dir_path, img_path)
            # 单通道
            img_mat = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
            # print(img_mat, type(img_mat), img_mat.shape)
            if img_mat is not None:
                img = cv2.resize(img_mat, (IMAGE_SIZE, IMAGE_SIZE))
                # cv2.imshow("resize", img)
                # cv2.waitKey(0)
                # cv2.destoryAllWindows()
                train_data.append([np.array(img), np.array(label)])
    shuffle(train_data)
    np.save('mark_catDog_TrainData.npy', train_data)


create_train_data("./train/train")

等待加载........

直至加载完成100% 

三:搭建网络 训练模型

1 导入库

import tflearn
import numpy as np
from tflearn.layers.estimator import regression
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.core import input_data, fully_connected, dropout

2 搭建网络

# 搭建网络 卷积 激活 池化 全连
# 输入层
conv_input = input_data([None, IMAGE_SIZE, IMAGE_SIZE, 1], name='input')
# 第一层卷积
conv1 = conv_2d(conv_input, 32, 5, activation='relu')
conv1 = max_pool_2d(conv1, 2)
# 第二层网络
conv2 = conv_2d(conv1, 64, 5, activation='relu')
conv2 = max_pool_2d(conv2, 2)
# 第三层网络
conv3 = conv_2d(conv2, 1024, 5, activation='relu')
conv3 = max_pool_2d(conv3, 2)
# 全连层1
fully_layer1 = fully_connected(conv3, 1024, activation='relu')
# 防止过拟合
fully_layer1 = dropout(fully_layer1, 0.6)
# 全连层2
fully_layer2 = fully_connected(fully_layer1, 2, activation='softmax')
# 设置损失函数和优化器
model_net = regression(fully_layer2, optimizer='adam', learning_rate=0.0005, loss='categorical_crossentropy',
                       name='model_net')

3 数据集划分

# 创建模型
model = tflearn.DNN(model_net, tensorboard_dir='log')

# 加载数据npy文件
train_data = np.load('mark_catDog_TrainData.npy', allow_pickle=True)
print(train_data, len(train_data), type(train_data))
# 数据划分
train = train_data[:-30]
test = train_data[-30:]

X = np.array([i[0] for i in train]).reshape((-1, IMAGE_SIZE, IMAGE_SIZE, 1))
Y = [i[1] for i in train]
x_test = np.array([i[0] for i in test]).reshape((-1, IMAGE_SIZE, IMAGE_SIZE, 1))
y_test = [i[1] for i in test]

4 模型训练及保存

# 模型训练
model.fit({'input': X},
          {'model_net': Y},
          n_epoch=2,
          validation_set=({'input': x_test}, {'model_net': y_test}),
          snapshot_step=10,
          show_metric=True,
          run_id="model_class"
          )

# 模型保存
model.save("model/cat-dog.model")

训练时间较长,需要耐心等待

直至加载完毕,将模型保存

训练模型 完整源码:

import tflearn
import numpy as np
from tflearn.layers.estimator import regression
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.core import input_data, fully_connected, dropout

IMAGE_SIZE = 50

# 搭建网络 卷积 激活 池化 全连
# 输入层
conv_input = input_data([None, IMAGE_SIZE, IMAGE_SIZE, 1], name='input')
# 第一层卷积
conv1 = conv_2d(conv_input, 32, 5, activation='relu')
conv1 = max_pool_2d(conv1, 2)
# 第二层网络
conv2 = conv_2d(conv1, 64, 5, activation='relu')
conv2 = max_pool_2d(conv2, 2)
# 第三层网络
conv3 = conv_2d(conv2, 1024, 5, activation='relu')
conv3 = max_pool_2d(conv3, 2)
# 全连层1
fully_layer1 = fully_connected(conv3, 1024, activation='relu')
# 防止过拟合
fully_layer1 = dropout(fully_layer1, 0.6)
# 全连层2
fully_layer2 = fully_connected(fully_layer1, 2, activation='softmax')
# 设置损失函数和优化器
model_net = regression(fully_layer2, optimizer='adam', learning_rate=0.0001, loss='categorical_crossentropy',
                       name='model_net')

# 创建模型
model = tflearn.DNN(model_net, tensorboard_dir='log')

# 加载数据npy文件
train_data = np.load('mark_catDog_TrainData.npy', allow_pickle=True)
print(train_data, len(train_data), type(train_data))
# 数据划分
train = train_data[:-30]
test = train_data[-30:]

X = np.array([i[0] for i in train]).reshape((-1, IMAGE_SIZE, IMAGE_SIZE, 1))
Y = [i[1] for i in train]
x_test = np.array([i[0] for i in test]).reshape((-1, IMAGE_SIZE, IMAGE_SIZE, 1))
y_test = [i[1] for i in test]

# 模型训练
model.fit({'input': X},
          {'model_net': Y},
          n_epoch=2,
          validation_set=({'input': x_test}, {'model_net': y_test}),
          snapshot_step=10,
          show_metric=True,
          run_id="model_class"
          )

# 模型保存
model.save("model/cat-dog.model")

四:猫狗图像识别

模型保存后,可以使用模型测试,看看猫狗识别的准确率如何

可以从数据集中下载图片至工程进行测试:

测试1 

# 将检测的图片变成np array
def classify(img_path):
    # 灰度读取
    img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
    if img is not None:
        img = cv2.resize(img, (IMAGE_SIZE, IMAGE_SIZE))
        data = img.reshape(-1, IMAGE_SIZE, IMAGE_SIZE, 1)
        return data


predict = model.predict(classify('dog.11392.jpg'))[0]
print(predict)
max_index = np.argmax(predict)
if max_index == 0:
    print("猫")
elif max_index == 1:
    print("狗")

测试结果如下,识别为狗,识别正确

测试2 

predict = model.predict(classify('cat.299.jpg'))[0]
print(predict)
max_index = np.argmax(predict)
if max_index == 0:
    print("猫")
elif max_index == 1:
    print("狗")

测试结果如下,错将猫识别为狗,识别错误

 经过多次测试,识别的准确率并不高,模型训练的不够好,需要调参优化,再多花时间训练

# 设置损失函数和优化器
model_net = regression(fully_layer2, optimizer='adam', learning_rate=0.0005, loss='categorical_crossentropy',
                       name='model_net')

深度学习,一般学习率 learning_rate是设置为0.0001,

若是对这个猫狗识别比较感兴趣的,可以自己调参优化,多搭建几层网络,如果训练出比较好的模型可以告诉我一下,嘻嘻(可以理解为博主很懒)

如果对于使用模型不够熟悉的,可以参考以下源码(图片自行准备,图片名称记得修改)

import tflearn
import numpy as np
import cv2
from tflearn.layers.estimator import regression
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.core import input_data, fully_connected, dropout

IMAGE_SIZE = 50

# 搭建网络 卷积 激活 池化 全连
# 输入层
conv_input = input_data([None, IMAGE_SIZE, IMAGE_SIZE, 1], name='input')
# 第一层卷积
conv1 = conv_2d(conv_input, 32, 5, activation='relu')
conv1 = max_pool_2d(conv1, 2)
# 第二层网络
conv2 = conv_2d(conv1, 64, 5, activation='relu')
conv2 = max_pool_2d(conv2, 2)
# 第三层网络
conv3 = conv_2d(conv2, 1024, 5, activation='relu')
conv3 = max_pool_2d(conv3, 2)
# 全连层1
fully_layer1 = fully_connected(conv3, 1024, activation='relu')
# 防止过拟合
fully_layer1 = dropout(fully_layer1, 0.6)
# 全连层2
fully_layer2 = fully_connected(fully_layer1, 2, activation='softmax')
# 设置损失函数和优化器
model_net = regression(fully_layer2, optimizer='adam', learning_rate=0.0005, loss='categorical_crossentropy',
                       name='model_net')

# 加载数据npy文件
train_data = np.load('mark_catDog_TrainData.npy', allow_pickle=True)
print(train_data, len(train_data), type(train_data))
# 数据划分
train = train_data[:-30]
test = train_data[-30:]

X = np.array([i[0] for i in train]).reshape((-1, IMAGE_SIZE, IMAGE_SIZE, 1))
Y = [i[1] for i in train]
x_test = np.array([i[0] for i in test]).reshape((-1, IMAGE_SIZE, IMAGE_SIZE, 1))
y_test = [i[1] for i in test]

# 创建模型
model = tflearn.DNN(model_net, tensorboard_dir='log')
# 加载模型
model.load("./model/cat-dog.model")


# 将检测的图片变成np array
def classify(img_path):
    # 灰度读取
    img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
    if img is not None:
        img = cv2.resize(img, (IMAGE_SIZE, IMAGE_SIZE))
        data = img.reshape(-1, IMAGE_SIZE, IMAGE_SIZE, 1)
        return data


predict = model.predict(classify('cat.299.jpg'))[0]
print(predict)
max_index = np.argmax(predict)
if max_index == 0:
    print("猫")
elif max_index == 1:
    print("狗")

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

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

相关文章

【Docker系列】容器环境配置

个人名片: 对人间的热爱与歌颂,可抵岁月冗长🌞 Github👨🏻‍💻:念舒_C.ying CSDN主页✏️:念舒_C.ying 个人博客🌏 :念舒_C.ying Docker可以让开发者打包他们…

55.函数的参数传递

55.函数的参数传递 文章目录55.函数的参数传递1.函数的参数2.参数的传递方法3.使用位置参数传递参数4.使用关键字传递参数1.函数的参数 自定义函数有2种参数:形式参数和实际参数。 def语句中的参数不是实际参数,我们称之为形式参数,简称形参…

C51——添加震动开盖功能,使用外部中断优化

void main() {double dis;Timer1Init();Time0Init();SG90_Init();while(1){dis get_dis();if(dis<10 || SW1 0||Vibrate 0){OpenTheLed5();opengaizi(); // }else{CloseTheLed5();closegaizi();}} }像这样只是简单的通过震动模块传给单片机一个让舵机转动&#xff0c;出来…

lvm 制作

壹&#xff1a; 创建LVM 逻辑卷 1&#xff0c;将物理盘格式为pv卷&#xff08;物理卷&#xff09;&#xff0c;使用pvcreate 命令 pvcreate /dev/sdc 或则是 pvcreate /dev/sdc /dev/sdb pvdisplay 或pvs 命令查看 PV 物理卷得创建情况 2,创建卷组 VG 通过vgcreate 命令,将pv加…

《图解TCP/IP》阅读笔记(第六章 6.3、6.4)—— 鼎鼎大名的UDP、TCP

前言&#xff1a; 本篇将要介绍UDP和TCP&#xff0c;篇幅略长&#xff0c;主要是TCP的内容较为复杂 6.3 UDP UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09; 根据此前的了解&#xff0c;UDP不提供复杂的控制机制&#xff0c;其是一种利用IP提…

JavaSE(类和对象、this用法、构造方法)

1. 面向对象 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 JAVA是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。 面向过程注重的是…

2005-2020年全国及31省绿色信贷水平原始数据及测算

2005-2020年各省绿色信贷水平原始数据及测算 1、时间&#xff1a;2005-2020年 2、来源&#xff1a;整理自统计NJ、工业NJ、2018年经济普查&#xff0c;其中2017年采用插值法填补 3、范围&#xff1a;包括全国及31省市 4、数据内容&#xff1a;包含计算过程和原始数据 5、具…

动态规划——线性dp

基于数字三角形问题扩展 参考闫氏dp分析法参考闫氏dp分析法参考闫氏dp分析法 方格取数 f[i1][j1][i2][j2]表示&#xff08;1,1&#xff09;到&#xff08;i1,j1&#xff09;和&#xff08;1,1&#xff09;到(i2,j2)和的最大值f[i1][j1][i2][j2]表示&#xff08;1,1&#xff09…

ubuntu小技巧29--frp实现通过公网访问内网服务

ubuntu小技巧29--frp实现通过公网访问内网服务1 介绍2 方法步骤3 注意事项4 说明1 介绍 很多时候我们需要在外部网络中访问局域网或者个人家庭主机&#xff0c;以便于实现一个机器在多个地方都能用&#xff0c;此时我们就可以使用 frp 或者其竞品来实现该功能。 frp 是一个专…

11Python面相对象基础语法

面相对象基础语法 01. dir 内置函数 在 Python 中 对象几乎是无所不在的&#xff0c;我们之前学习的 变量、数据、函数 都是对象 在 Python 中可以使用以下两个方法验证&#xff1a; 使用内置函数 dir 传入 标识符 / 数据&#xff0c;可以查看对象内的 所有属性及方法 提示…

基于 UWB 数字孪生钢厂人员安全定位

钢铁冶炼从原料采购、焦化烧结、炼铁、炼钢、轧钢、到产出成品&#xff0c;其冗长的生产工序、复杂的作业场景&#xff0c;更应加以重视生产现场的人员作业安全&#xff0c;将安全防范监管贯穿日常作业全过程&#xff0c;打通安全生产责任“最后一公里”。 随着近几年钢厂信息…

电源管理芯片|“小方寸”大作为—TMI3191直击智能穿戴电源痛点!

随着移动通信、人工智能等技术的不断发展和融合, 智能终端产业正在加速裂变&#xff0c;智能穿戴迅速成为人们日常生活和工作中的新宠。 根据IDC最新数据显示&#xff0c;2016年~2020年出货量从1.02亿台增长至4.45亿台&#xff0c;预测2020-2025年全球智能可穿戴设备出货量复合…

手写B+树

1.特点 https://blog.csdn.net/weixin_57128596/article/details/127030901?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167176442416800188598723%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id167176442416800…

springboot mybatis大学生校园宿舍管理系统源码含文档

摘 要&#xff1a;宿舍是大学生学习与生活的主要场所之一&#xff0c;宿舍管理是高校学工管理事务中 尤为重要的一项。随着我国高校招生规模的进一步扩大&#xff0c;学生总体人数的不断增加&#xff0c; 宿舍管理工作变得愈加沉重和琐碎&#xff0c;学生宿舍信息的采集、汇总…

Classifier Guided Diffusion

前言 上次已经学习了open AI的 DDPM(DDPM原理与代码剖析)和 IDDPM(IDDPM原理和代码剖析), 以及 斯坦福的 DDIM DDIM原理及代码(Denoising diffusion implicit models). 这次来看openAI的另一个作品 Diffusion Models Beat GANs on Image Synthesis github: https://github.com…

操作系统(4)页面替换策略算法模拟实现

1. 效果展示 2. 程序流程图 &#xff08;1&#xff09; 程序总流程 &#xff08;2&#xff09; FIFO策略 &#xff08;3&#xff09; LRU策略 &#xff08;4&#xff09; OPT策略 3. 数据结构设计 //页面数据结构struct PageInfo {int id;int visit;};PageInfo* Block; // 物…

我国电力物流行业发展现存问题及解决策略分析 企业应加强信息化建设

电力物流是电力发、输、配、售流程的一部分&#xff0c;是为了满足终端用户需求&#xff0c;对电力从发电到终端用户的高效率、高效益的流动以及流程各环节相互提供的服务和相关信息在此过程中的正、反向流动所进行的计划、实施与控制过程。 根据观研报告网发布的《中国电力物流…

nginx反向代理ssl配置

nginx反向代理是各大应用环境最重要的环节&#xff0c;今天我们来说说如何配置反代理SSL这书&#xff0c;首先配置准备好&#xff1a;nginx环境、SSL证书、确定需要设置的端口防火墙开放&#xff08;尤其是云服务器需要单独设置&#xff0c;windows防火墙单独设置&#xff09;。…

电巢:上海半导体投资浪潮的前奏、高潮与转折

朱旭东是上海半导体投资界的开创性人物&#xff0c;他带领浦科投资投出了中微半导体、盛美半导体等当下的「国之重器」&#xff0c;并控股了万业企业、上工申贝等A股上市公司。随后又在国内率先发起设立并管理了上海半导体装备材料产业投资基金&#xff0c;推动旗下上市公司万业…

前端开发--JavaScript Bom和Dom

JavaScript Bom和Dom这一篇就够啦JavaScript Bom和Dom1、Web API 基本认知2、DOM -- 基础2.1 DOM简介2.2 获取元素2.3 事件基础2.4 操作元素2.5 节点操作2.6 DOM重点核心3、DOM -- 事件高级3.1 注册事件(绑定事件)3.2 删除事件(解绑事件)3.3 DOM事件流3.4 事件对象3.5 事件委托…