竞赛 深度学习猫狗分类 - python opencv cnn

news2024/11/25 3:09:28

文章目录

  • 0 前言
  • 1 课题背景
  • 2 使用CNN进行猫狗分类
  • 3 数据集处理
  • 4 神经网络的编写
  • 5 Tensorflow计算图的构建
  • 6 模型的训练和测试
  • 7 预测效果
  • 8 最后

0 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 **基于深度学习猫狗分类 **

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

在这里插入图片描述

1 课题背景

要说到深度学习图像分类的经典案例之一,那就是猫狗大战了。猫和狗在外观上的差别还是挺明显的,无论是体型、四肢、脸庞和毛发等等,
都是能通过肉眼很容易区分的。那么如何让机器来识别猫和狗呢?这就需要使用卷积神经网络来实现了。
本项目的主要目标是开发一个可以识别猫狗图像的系统。分析输入图像,然后预测输出。实现的模型可以根据需要扩展到网站或任何移动设备。我们的主要目标是让模型学习猫和狗的各种独特特征。一旦模型的训练完成,它将能够区分猫和狗的图像。

2 使用CNN进行猫狗分类

卷积神经网络 (CNN)
是一种算法,将图像作为输入,然后为图像的所有方面分配权重和偏差,从而区分彼此。神经网络可以通过使用成批的图像进行训练,每个图像都有一个标签来识别图像的真实性质(这里是猫或狗)。一个批次可以包含十分之几到数百个图像。

对于每张图像,将网络预测与相应的现有标签进行比较,并评估整个批次的网络预测与真实值之间的距离。然后,修改网络参数以最小化距离,从而增加网络的预测能力。类似地,每个批次的训练过程都是类似的。
在这里插入图片描述

3 数据集处理

猫狗照片的数据集直接从kaggle官网下载即可,下载后解压,这是我下载的数据:
在这里插入图片描述在这里插入图片描述
相关代码



    import os,shutil
    
    original_data_dir = "G:/Data/Kaggle/dogcat/train"
    base_dir = "G:/Data/Kaggle/dogcat/smallData"
    if os.path.isdir(base_dir) == False:
        os.mkdir(base_dir)
    
    # 创建三个文件夹用来存放不同的数据:train,validation,test
    train_dir = os.path.join(base_dir,'train')
    if os.path.isdir(train_dir) == False:
        os.mkdir(train_dir)
    validation_dir = os.path.join(base_dir,'validation')
    if os.path.isdir(validation_dir) == False:
        os.mkdir(validation_dir)
    test_dir = os.path.join(base_dir,'test')
    if os.path.isdir(test_dir) == False:
        os.mkdir(test_dir)
    
    # 在文件中:train,validation,test分别创建cats,dogs文件夹用来存放对应的数据
    train_cats_dir = os.path.join(train_dir,'cats')
    if os.path.isdir(train_cats_dir) == False:
        os.mkdir(train_cats_dir)
    train_dogs_dir = os.path.join(train_dir,'dogs')
    if os.path.isdir(train_dogs_dir) == False:
        os.mkdir(train_dogs_dir)
    
    validation_cats_dir = os.path.join(validation_dir,'cats')
    if os.path.isdir(validation_cats_dir) == False:
        os.mkdir(validation_cats_dir)
    validation_dogs_dir = os.path.join(validation_dir,'dogs')
    if os.path.isdir(validation_dogs_dir) == False:
        os.mkdir(validation_dogs_dir)
    
    test_cats_dir = os.path.join(test_dir,'cats')
    if os.path.isdir(test_cats_dir) == False:
        os.mkdir(test_cats_dir)
    test_dogs_dir = os.path.join(test_dir,'dogs')
    if os.path.isdir(test_dogs_dir) == False:
        os.mkdir(test_dogs_dir)


    #将原始数据拷贝到对应的文件夹中 cat
    fnames = ['cat.{}.jpg'.format(i) for i in range(1000)]
    for fname in fnames:
        src = os.path.join(original_data_dir,fname)
        dst = os.path.join(train_cats_dir,fname)
        shutil.copyfile(src,dst)
    
    fnames = ['cat.{}.jpg'.format(i) for i in range(1000,1500)]
    for fname in fnames:
        src = os.path.join(original_data_dir,fname)
        dst = os.path.join(validation_cats_dir,fname)
        shutil.copyfile(src,dst)
    
    fnames = ['cat.{}.jpg'.format(i) for i in range(1500,2000)]
    for fname in fnames:
        src = os.path.join(original_data_dir,fname)
        dst = os.path.join(test_cats_dir,fname)
        shutil.copyfile(src,dst)


#将原始数据拷贝到对应的文件夹中 dog
fnames = ['dog.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
    src = os.path.join(original_data_dir,fname)
    dst = os.path.join(train_dogs_dir,fname)
    shutil.copyfile(src,dst)

fnames = ['dog.{}.jpg'.format(i) for i in range(1000,1500)]
for fname in fnames:
    src = os.path.join(original_data_dir,fname)
    dst = os.path.join(validation_dogs_dir,fname)
    shutil.copyfile(src,dst)

fnames = ['dog.{}.jpg'.format(i) for i in range(1500,2000)]
for fname in fnames:
    src = os.path.join(original_data_dir,fname)
    dst = os.path.join(test_dogs_dir,fname)
    shutil.copyfile(src,dst)
print('train cat images:', len(os.listdir(train_cats_dir)))
print('train dog images:', len(os.listdir(train_dogs_dir)))
print('validation cat images:', len(os.listdir(validation_cats_dir)))
print('validation dog images:', len(os.listdir(validation_dogs_dir)))
print('test cat images:', len(os.listdir(test_cats_dir)))
print('test dog images:', len(os.listdir(test_dogs_dir)))
train cat images: 1000
train dog images: 1000
validation cat images: 500
validation dog images: 500
test cat images: 500
test dog images: 500


4 神经网络的编写

cnn卷积神经网络的编写如下,编写卷积层、池化层和全连接层的代码

conv1_1 = tf.layers.conv2d(x, 16, (3, 3), padding='same', activation=tf.nn.relu, name='conv1_1')
conv1_2 = tf.layers.conv2d(conv1_1, 16, (3, 3), padding='same', activation=tf.nn.relu, name='conv1_2')
pool1 = tf.layers.max_pooling2d(conv1_2, (2, 2), (2, 2), name='pool1')
conv2_1 = tf.layers.conv2d(pool1, 32, (3, 3), padding='same', activation=tf.nn.relu, name='conv2_1')
conv2_2 = tf.layers.conv2d(conv2_1, 32, (3, 3), padding='same', activation=tf.nn.relu, name='conv2_2')
pool2 = tf.layers.max_pooling2d(conv2_2, (2, 2), (2, 2), name='pool2')
conv3_1 = tf.layers.conv2d(pool2, 64, (3, 3), padding='same', activation=tf.nn.relu, name='conv3_1')
conv3_2 = tf.layers.conv2d(conv3_1, 64, (3, 3), padding='same', activation=tf.nn.relu, name='conv3_2')
pool3 = tf.layers.max_pooling2d(conv3_2, (2, 2), (2, 2), name='pool3')
conv4_1 = tf.layers.conv2d(pool3, 128, (3, 3), padding='same', activation=tf.nn.relu, name='conv4_1')
conv4_2 = tf.layers.conv2d(conv4_1, 128, (3, 3), padding='same', activation=tf.nn.relu, name='conv4_2')
pool4 = tf.layers.max_pooling2d(conv4_2, (2, 2), (2, 2), name='pool4')

flatten = tf.layers.flatten(pool4)
fc1 = tf.layers.dense(flatten, 512, tf.nn.relu)
fc1_dropout = tf.nn.dropout(fc1, keep_prob=keep_prob)
fc2 = tf.layers.dense(fc1, 256, tf.nn.relu)
fc2_dropout = tf.nn.dropout(fc2, keep_prob=keep_prob)
fc3 = tf.layers.dense(fc2, 2, None)

5 Tensorflow计算图的构建

然后,再搭建tensorflow的计算图,定义占位符,计算损失函数、预测值和准确率等等

self.x = tf.placeholder(tf.float32, [None, IMAGE_SIZE, IMAGE_SIZE, 3], 'input_data')
self.y = tf.placeholder(tf.int64, [None], 'output_data')
self.keep_prob = tf.placeholder(tf.float32)
# 图片输入网络中
fc = self.conv_net(self.x, self.keep_prob)
self.loss = tf.losses.sparse_softmax_cross_entropy(labels=self.y, logits=fc)
self.y_ = tf.nn.softmax(fc) # 计算每一类的概率
self.predict = tf.argmax(fc, 1)
self.acc = tf.reduce_mean(tf.cast(tf.equal(self.predict, self.y), tf.float32))
self.train_op = tf.train.AdamOptimizer(LEARNING_RATE).minimize(self.loss)
self.saver = tf.train.Saver(max_to_keep=1)

最后的saver是要将训练好的模型保存到本地。

6 模型的训练和测试

然后编写训练部分的代码,训练步骤为1万步

acc_list = []
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    for i in range(TRAIN_STEP):
        train_data, train_label, _ = self.batch_train_data.next_batch(TRAIN_SIZE)

        eval_ops = [self.loss, self.acc, self.train_op]
        eval_ops_results = sess.run(eval_ops, feed_dict={
            self.x:train_data,
            self.y:train_label,
            self.keep_prob:0.7
        })
        loss_val, train_acc = eval_ops_results[0:2]

        acc_list.append(train_acc)
        if (i+1) % 100 == 0:
            acc_mean = np.mean(acc_list)
            print('step:{0},loss:{1:.5},acc:{2:.5},acc_mean:{3:.5}'.format(
                i+1,loss_val,train_acc,acc_mean
            ))
        if (i+1) % 1000 == 0:
            test_acc_list = []
            for j in range(TEST_STEP):
                test_data, test_label, _ = self.batch_test_data.next_batch(TRAIN_SIZE)
                acc_val = sess.run([self.acc],feed_dict={
                    self.x:test_data,
                    self.y:test_label,
                    self.keep_prob:1.0
            })
            test_acc_list.append(acc_val)
            print('[Test ] step:{0}, mean_acc:{1:.5}'.format(
                i+1, np.mean(test_acc_list)
            ))
    # 保存训练后的模型
    os.makedirs(SAVE_PATH, exist_ok=True)
    self.saver.save(sess, SAVE_PATH + 'my_model.ckpt')

训练结果如下:
在这里插入图片描述
训练1万步后模型测试的平均准确率有0.82。

7 预测效果

选取三张图片测试
在这里插入图片描述
在这里插入图片描述
可见,模型准确率还是较高的。

8 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

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

相关文章

google scholar 显示异常流量

有时候可能会出现下图警告,导致打不开谷歌学术的界面,我们需要修改一下访问网址 在网站后面添加 .pk 或者 .pr ,如下: https://scholar.google.com.pk/https://scholar.google.com.pr/

网络变压器/网络滤波器/脉冲变压器接地电路的选择

Hqst华强盛(盈盛)电子导读:网络变压器/网络滤波器/脉冲变压器,以下都称网络变压器,它的接地在网络布置中非常重要,它可以有效地提高信号的稳定性和可靠性。 网络变压器接地的布置方式通常有以下几种: 一,单…

Rust学习日记(二)变量的使用--结合--温度换算/斐波那契数列--实例

前言: 这是一个系列的学习笔记,会将笔者学习Rust语言的心得记录。 当然,这并非是流水账似的记录,而是结合实际程序项目的记录,如果你也对Rust感兴趣,那么我们可以一起交流探讨,使用Rust来构建程…

《算法通关村—原来如此简单》

《算法通关村—原来如此简单》 理解层序遍历 我们有一个二叉树,我们如何去进行一层一层的遍历呢? 需要我们借用一个数据结构来进行遍历,数据结构就是队列。我们首先把根节点放入队列中,然后从此进行遍历。如何进行遍历&#xf…

SpringBoot项目从resources目录读取文件

SpringBoot 从 resources 读取文件 使用 Spring 给我们提供的工具类来进行读取 File file org.springframework.util.ResourceUtils.getFile("classpath:人物模板.docx");可能读取失败,出现如下错误: java.io.FileNotFoundException: clas…

JSP 中医知识管理系统myeclipse开发sql数据库BS模式java编程网页结构

一、源码特点 JSP 中医知识管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,比较流行的ssh框架系统具有完整的源代码和数据库,myeclipse开发系统主要采用B/S模式开发。 javaWeb中医知识系统 二、功能介绍 此次系统主要…

电脑提示由于找不到msvcp120.dll无法继续执行代码的问题如何解决

在打开软件过程中,我们可能会遇到各种错误和问题。其中之一就是msvcp120.dll无法继续执行代码的问题。这个问题通常是由于缺少或损坏的Microsoft Visual C Redistributable Packages导致的。为了解决这个问题,我们可以采取以下四个解决方案: …

【逗老师的无线电】BI1FQO教你整骚活,纯4G MMDVM热点版

开篇图,看我手搓出来的尺寸超小的MMDVM热点盒子(都不能叫做盒子啦) 咱就说这玩意尺寸有多小,架构有多简单,4G网卡直连双工热点版,省去树莓派或者OpenWrt,功耗低至0.几W。开机秒快。 基本原…

大数据管理平台是什么?如何利用工单系统提升企业管理效率?

随着数字化时代的来临,大数据管理平台已成为企业优化运营、提高竞争力的关键工具。工单管理系统作为大数据管理平台的核心组件,对于企业服务的优化和提升发挥着至关重要的作用。本文小编将为您揭示工单管理系统在大数据管理平台中的重要地位,…

libpcap之数据分流

当前系统都是多核系统,为了充分利用多核优势,数据包可以在底层就进行分流,可以通过多线程/多进程对同一个接口的数据进行并行的处理。 一、实验 一个server/client程序一个简单的抓包程序,抓取server/client之间的通信数据 1.1 …

Bat批量处理

一:创建文件夹 excel创建文件 复制出来新建文本文件 另存为bat 双击bat 二:批量移动文件 A列:获取的文件名列表 dir /b/o:n> original.txt B列:填充序号 C列公式:每隔9行增加1 INT((ROW(B1)-1)/9)1 D列公式&am…

CDN与WAF防火墙:强强联手,守护您的网站安全

随着互联网的普及,网站安全问题变得愈发重要。恶意攻击、数据泄露和服务中断等问题都可能给网站和用户带来严重损害。在保护网站免受这些威胁的过程中,内容分发网络(CDN)和Web应用程序防火墙(WAF)是两个强大…

C++算法 —— 贪心(2)

文章目录 1、柠檬水找零2、将数组和减半的最少操作次数3、最大数4、摆动序列5、最长递增子序列6、递增的三元子序列7、最长连续递增子序列 1、柠檬水找零 860. 柠檬水找零 如果一开始顾客给了10块,那就直接结束。给了5块那就收下。之后每一个位置,都需要…

进阶C语言-指针的进阶(三)

模拟实现qsort函数 🎈1.测试bubble_sort,排序整型数组🎈2测试bubble_sort,排序结构体数组 📝关于qsort函数,我们可以先去cpluplus网站上面了解一下: //1.排序整型数组,两个整型可以…

Linux 上的轻量级浏览器

导读大多数 Linux 桌面环境中包含的基本图像查看器可能不足以满足你的需要。如果你想要一些更多的功能,但仍然希望它是轻量级的,那么看看这四个 Linux 桌面中的图像查看器,如果还不能满足你的需要,还有额外的选择。 当你需要的不…

竞赛选题 深度学习实现语义分割算法系统 - 机器视觉

文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…

整理的一些Java细节问题

1. 为什么要有无参构造? 在 Java 中,如果一个类没有显式定义构造方法,编译器会自动生成一个默认的无参构造方法(也称为默认构造方法)。无参构造方法是一个没有任何参数的构造方法。 无参构造方法的存在有几个重要原因…

【vscode输出中文乱码】

vscode输出中文乱码为一个个的问号。 这个链接亲测有用 win11对应的界面在这里:

产品经理入门学习(二):产品经理问题思考维度

参考引用 黑马-产品经理入门基础课程 1. 抓住核心用户 1.1 为什么要抓住核心用户 什么是用户? 所有和产品有关系的群体就是用户,他们是一群既有共性,又有差异的群体组合 做产品为什么要了解用户? 了解用户的付费点、更好的优化产…

文件同步工具推荐:挑选高效实用的工具大揭秘

随着工作的累积,会持续产出大量电子资料和文件。如何妥善管理这些文件资料,成了一个问题。有需求就有市场,当下市场上也有很多文件同步工具。 有什么好用的文件同步工具? Zoho WorkDrive 同步网盘就是一款好用的文件同步工具&am…