竞赛选题 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

news2024/11/24 20:49:56

文章目录

  • 0 前言
  • 1 背景
  • 2 算法原理
    • 2.1 动物识别方法概况
    • 2.2 常用的网络模型
      • 2.2.1 B-CNN
      • 2.2.2 SSD
  • 3 SSD动物目标检测流程
  • 4 实现效果
  • 5 部分相关代码
    • 5.1 数据预处理
    • 5.2 构建卷积神经网络
    • 5.3 tensorflow计算图可视化
    • 5.4 网络模型训练
    • 5.5 对猫狗图像进行2分类
  • 6 最后

0 前言

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

基于深度学习的动物识别算法研究与实现

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

🧿 更多资料, 项目分享:

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

1 背景

目前,由于计算机能力和相关理论的发展获得了重大突破,基于深度学习的图像检测与识别技术已经广泛应用到人们的生产生活中。学长将深度学习的技术应用到野生动物图像识别中,优化了传统的识别方法,形成对野生动物图像更为准确的识别,为实现高效的野生动物图像识别提供了可能。不同于传统的野生动物识别,基于深度学习的野生动物识别技术可以捕获到野生动物更加细致的信息,有利于对野生动物进行更加准确的识别和研究。因此,对基于深度学习的野生动物识别和研究,可以更好的帮助社会管理者和政府全面有效的对野生动物进行保护和监管,这也正是保护和识别野生动物的关键,同时这对整个自然和社会的和谐发展具有极大的推动作用。

2 算法原理

2.1 动物识别方法概况

基于人工特征的野生动物识别方法主要通过人工对野生动物图像中具有辨识度的特征信息进行提取,并通过特征比对的方式就可以对野生动物所属的类别进行识别判断。

在深度学习技术普及之前,传统的数字图像处理技术与传统机器学习技术一直是研究的热点。传统的数字图像处理技术有模块分割、降低噪声点、边缘检测等方法。传统的机器学习技术有支持向量机、随机森林算法、BP
神经网络算法等。

深度学习技术是通过计算机模拟人类大脑的分层表达结构来建立网络模型,从原始数据集中对相关信息逐层提取。之后通过建立相应的神经网络对数据进行学习和分析,从而提高对目标预测和识别的准确率。如今,深度学习技术已经相对成熟,在对目标进行特征提取方面,卷积神经网络技术逐渐取代了传统的图像处理技术,并且在人类的生产生活中得到了广泛应用,这为研究野生动物更高效的识别方法奠定了基础。

2.2 常用的网络模型

图像识别是指对原始图像进行整体分析来达到预测原始图像所属类别的技术。计算机视觉领域中对图像识别技术进行了优化,与此同时,深度学习技术也对图像识别领域展开了突破。目前在图像识别领域中,研究人员开始使用深度学习的技术,并通过在实际应用中发现,基于深度学习的识别技术比传统的识别技术效果更好,且更具有优势。

2.2.1 B-CNN

双线性卷积神经网络(Bilinear
CNN,B-CNN)[34]是用两个卷积神经网络对图像进行特征提取,然后使用相应的函数将得到所有特征进行组合,组合的数据带入到分类器中进行分类。

在这里插入图片描述

2.2.2 SSD

经典的 SSD 模型是由经典网络和特征提取网络组成。

通过引入性能更好的特征提取网络对 SSD
目标检测模型进行了优化。Fu[49]等人提出了增加卷积神经网络层数和深度的方法用于提高识别准确率。通过实际应用之后,发现该方法识别准确率确实得到了一定程度的提高,但是模型结构却越来越复杂,同时对深层次的网络训练也越来越困难。

在这里插入图片描述

3 SSD动物目标检测流程

在这里插入图片描述

学长首先对 DenseNet-169 网络进行初始化,使用 DenseNet-169 网络作为目标检测的前置网络结构,并运用迁移学习的方法对
DenseNet-169 进行预训练,并将Snapshot Serengeti数据集下的权重值迁移到野生动物检测任务中,使数据集的训练速度得到提升。将
DenseNet-169 作为前置网络置于 SSD 中的目标提取检测网络之前,更换完前置网络的 SSD 目标检测网络依然完整。

4 实现效果

在这里插入图片描述
在这里插入图片描述

做一个GUI交互界面

在这里插入图片描述

5 部分相关代码

5.1 数据预处理


    import cv2 as cv
    import os
    import numpy as np
    

    import random
    import pickle
    
    import time
    
    start_time = time.time()
    
    data_dir = './data'
    batch_save_path = './batch_files'
    
    # 创建batch文件存储的文件夹
    os.makedirs(batch_save_path, exist_ok=True)
    
    # 图片统一大小:100 * 100
    # 训练集 20000:100个batch文件,每个文件200张图片
    # 验证集 5000:一个测试文件,测试时 50张 x 100 批次
    
    # 进入图片数据的目录,读取图片信息
    all_data_files = os.listdir(os.path.join(data_dir, 'train/'))
    
    # print(all_data_files)
    
    # 打算数据的顺序
    random.shuffle(all_data_files)
    
    all_train_files = all_data_files[:20000]
    all_test_files = all_data_files[20000:]
    
    train_data = []
    train_label = []
    train_filenames = []
    
    test_data = []
    test_label = []
    test_filenames = []
    
    # 训练集
    for each in all_train_files:
        img = cv.imread(os.path.join(data_dir,'train/',each),1)
        resized_img = cv.resize(img, (100,100))
    
        img_data = np.array(resized_img)
        train_data.append(img_data)
        if 'cat' in each:
            train_label.append(0)
        elif 'dog' in each:
            train_label.append(1)
        else:
            raise Exception('%s is wrong train file'%(each))
        train_filenames.append(each)
    
    # 测试集
    for each in all_test_files:
        img = cv.imread(os.path.join(data_dir,'train/',each), 1)
        resized_img = cv.resize(img, (100,100))
    
        img_data = np.array(resized_img)
        test_data.append(img_data)
        if 'cat' in each:
            test_label.append(0)
        elif 'dog' in each:
            test_label.append(1)
        else:
            raise Exception('%s is wrong test file'%(each))
        test_filenames.append(each)
    
    print(len(train_data), len(test_data))
    
    # 制作100个batch文件
    start = 0
    end = 200
    for num in range(1, 101):
        batch_data = train_data[start: end]
        batch_label = train_label[start: end]
        batch_filenames = train_filenames[start: end]
        batch_name = 'training batch {} of 15'.format(num)
    
        all_data = {
        'data':batch_data,
        'label':batch_label,
        'filenames':batch_filenames,
        'name':batch_name
        }
    
        with open(os.path.join(batch_save_path, 'train_batch_{}'.format(num)), 'wb') as f:
            pickle.dump(all_data, f)
    
        start += 200
        end += 200
    
    # 制作测试文件
    all_test_data = {
        'data':test_data,
        'label':test_label,
        'filenames':test_filenames,
        'name':'test batch 1 of 1'
        }
    
    with open(os.path.join(batch_save_path, 'test_batch'), 'wb') as f:
        pickle.dump(all_test_data, f)
    
    end_time = time.time()
    print('制作结束, 用时{}秒'.format(end_time - start_time))



5.2 构建卷积神经网络

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.3 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是要将训练好的模型保存到本地。

5.4 网络模型训练

然后编写训练部分的代码,训练步骤为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')



训练结果如下:

在这里插入图片描述

5.5 对猫狗图像进行2分类

在这里插入图片描述

在这里插入图片描述

6 最后

🧿 更多资料, 项目分享:

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

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

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

相关文章

ChatGPT追祖寻宗:GPT-3技术报告要点解读

论文地址:https://arxiv.org/abs/2005.14165 往期相关文章: ChatGPT追祖寻宗:GPT-1论文要点解读_五点钟科技的博客-CSDN博客ChatGPT追祖寻宗:GPT-2论文要点解读_五点钟科技的博客-CSDN博客 本文的标题之所以取名技术报告而不是论文…

【差旅游记】初见乌海湖

哈喽,大家好,我是雷工。 最近在乌海出差,有幸见到了传说中在沙漠中看海的“黄河明珠”——乌海湖。 前段时间一直有点忙,现在有点时间,趁还没忘光,简单整理记录下。 那是在上个月,2023年8月8号…

K8S:Pod容器中的存储方式及PV、PVC

文章目录 Pod容器中的存储方式一.emptyDir存储卷1.emptyDir存储卷概念2.emptyDir存储卷示例 二.hostPath存储卷1.hostPath存储卷概念2.hostPath存储卷示例 三.nfs共享存储卷1.nfs共享存储卷示例 四.PV和PVC1.PV、PVC概念2.PVC 的使用逻辑及数据流向3.storageclass插…

Conditional DETR(ICCV 21)

Conditional DETR(ICCV 21) Conditional DETR for Fast Training Convergence 加速detr收敛(50 epoch收敛) DETR收敛慢的原因 DETR训练收敛速度慢,需要500 epochs DETR的Cross Attention高度依赖content embedding…

Go编程规范

文章目录 注释转义符定义变量方法一:指定变量类型,声明后若不赋值,使用默认值方法二:根据值自行判定变量类型(类型推导)方法三:省略var, 注意:左侧的变量不应该是已经声明过的,否则会导致编译错误[推荐]全局…

通讯网关软件001——利用CommGate X2Access-U实现OPC UA数据转储Access

本文介绍利用CommGate X2ACCESS-U实现从OPC UA Server读取数据并同步转储至ACCESS数据库。CommGate X2ACCESS-U是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示,实现从OPC UA Server实时读取…

经典指标策略回测一览

编辑 经典指标策略回测一览 关键词 A股市场(沪深京三市) 5000股票20年内日线走势回测,区分除权,前复权,后复权三种模式;由于数据量较大,采用两种方式共享数据,一是 天启网站的数据…

Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC 一文搞懂

简介 大家经常会看到各种各样的 GC 名称,比如:Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC。 刚开始看到这么多 GC 名词后,真的是心累 哎,没办法,一声国粹之后也只能慢慢的把它们理理顺。 GC分类 我…

(vue2)面经基础版-案例效果分析

配路由 先配一级,一级里面配二级。一级路由:首页(二级:嵌套4个小页面)、详情页 高亮a->router-link,高亮效果对自带高亮类名router-link(-exact)-active设置 注:通过children配置项&#…

【springboot源码】深度解析@Value赋值时机及底层原理

1.Value使用 Value主要是让我们程序动态的将外部值注入到bean中的,使用方式主要如下两种: 1.1Value("${}"):可以获取对应属性文件中定义的属性值。 1.2Value("#{}"):表示 SpEl 表达式通常用来获取 bean 的…

【操作系统】聊聊什么是CPU上下文切换

对于linux来说,本身就是一个多任务运行的操作系统,运行远大于CPU核心数的程序,从用户视角来看是并发执行,而在CPU视角看其实是将不同的CPU时间片进行分割,每个程序执行一下,就切换到别的程序执行。那么这个…

[激光原理与应用-70]:AD8512运算放大器的工作原理与连接电路

目录 概述: 一、AD8512的功能与主要特征 一、AD8510 1.1 管脚说明 1.2 电源电压 1.3 输入信号电压 1.4 偏置电压 1.5 参考连接 1.6 放大倍数 1.7 参考电路 二、AD8512 1.1 管脚说明 1.2 AD8512的电路连接 1.3 如何调整放大倍数 1.4 AD8512半波与全波…

基于 Socket 网络编程

基于 Socket 网络编程 前言一、基于Socket的网络通信传输(传输层)二、UDP 的数据报套接字编程1、UDP 套接字编程 API2、使用 UDP Socket 实现简单通信 三、TCP 流套接字编程1、TCP 流套接字编程 API2、使用 TCP Socket 实现简单通信3、使用 Tcp 协议进行…

【数据链路层】网络基础 -- MAC帧协议与ARP协议

数据链路层认识以太网以太网帧格式(MAC帧)认识MAC地址对比理解MAC地址和IP地址认识MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对于TCP协议的影响 再谈局域网转发原理(基于协议)ARP协议ARP协议的作用ARP协议的工作流程ARP数据报的格式 数据链路层 用于两…

网工内推 | 雄岸区块链集团,网安工程师,HCIE-Security、CISP优先

01 雄岸区块链集团 招聘岗位:网络安全测试工程师 职责描述: 1、负责安全测试工作,包括渗透测试、漏洞分析、攻防演练和安全评估等。 2、发掘业务系统安全问题,跟进安全整改。 3、出现网络攻击或安全事件时,进行紧急…

Tensorrt8.6.1安装

环境配置:Tensorrt8.6.1 ,cuda11.6, cudnn8.6.0, torch1.13.1cu116, torchvision0.14.1cu116 1.先把cuda11.6, cudnn8.6.0, torch1.13.1cu116, torchvision0.14.1cu116这几个安装完之后 2.下载Tensorrt8.6.1,复制移动以下文件 将include中头…

Nat. Rev. Bioeng. | 中山大学左涛组详述肠道微生态工程化改造

肠道微生态工程化改造 Engineering the gut microbiome Review Article, 2023-6-16, Nature Reviews Bioengineering DOI:10.1038/s44222-023-00072-2 原文链接:https://www.nature.com/articles/s44222-023-00072-2 第一作者:Xiaowu Bai&…

近距离看GPU计算-1

文章目录 前言1.什么是GPU及其分类1.独立GPU(Discrete GPU)2.集成GPU(Integrated GPU)3.移动GPU(Mobile GPU) 2.GPU绘制流水线3.GPU计算的演进之旅1.CUDA的发明2.统一可编程单元3.浮点计算的标准化4.随机存取数据5.存储支持ECC 前言 转自 GPU and Computing 公众号 在前面文章…

Java实现单链表

目录 一.单链表 二.单链表基本操作的实现 1.单链表类、属性的定义 2.求链表长度 3.链表是否包含值为key的节点 4.添加元素 5.删除节点 6.清空链表 三、完整代码 一.单链表 链表是一种在物理存储结构上非连续的存储结构,数据元素的逻辑顺序通过链表中的引用…

【深度学习】卷积神经网络(LeNet)【文章重新修改中】

卷积神经网络 LeNet 前言LeNet 模型代码实现MINST代码分块解析1 构建 LeNet 网络结构2 加载数据集3 初始化模型和优化器4 训练模型5 训练完成 完整代码 Fashion-MINST代码分块解析1 构建 LeNet 网络结构2 初始化模型参数3 加载数据集4 定义损失函数和优化器5 训练模型 完整代码…