竞赛项目 深度学习的动物识别
文章目录
- 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 npimport random
import pickleimport timestart_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 += 200end += 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
相关文章:
竞赛项目 深度学习的动物识别
文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…...
MySQL相关的SQL语句、数据库、数据表、字段、类型
文章目录 前言MySQL整数类型MySQL字符串类型MySQL小数类型MySQL时间类型常用的基本SQL语句 前言 1、SQL语句不区分大小写。 MySQL整数类型 序号数据类型数据范围1TINYINT-128~1272SMALLINT-32768~327673MEDIUMINT-223~223-14INT-231~231-15BIGINT-263~263-1 MySQL字符串类型 …...
微信个人小程序申请 (AppID 和 AppSecret)
1. 登录微信公众平台 https://mp.weixin.qq.com/cgi-bin/loginpage?url%2Fcgi-bin%2Fhome%3Ft%3Dhome%2Findex%26lang%3Dzh_CN%26token%3D47421820 2. 右上角立即注册 3. 注册类型选择小程序 4. 账号信息 5. 邮箱激活 6. 小程序发布流程 7. 小程序信息 (前往填写) 8. 获取小程…...
使用zap日志替代xorm日志
xorm提供了自定义日志的接口,它的接口定义如下: // Logger is a logger interface type Logger interface {Debug(v ...interface{})Debugf(format string, v ...interface{})Error(v ...interface{})Errorf(format string, v ...interface{})Info(v ..…...
YOLOv5-7.0实例分割+TensorRT部署
一:介绍 将YOLOv5结合分割任务并进行TensorRT部署,是一项既具有挑战性又令人兴奋的任务。分割(Segmentation)任务要求模型不仅能够检测出目标的存在,还要精确地理解目标的边界和轮廓,为每个像素分配相应的…...
回归决策树模拟sin函数
# -*-coding:utf-8-*- import numpy as np from sklearn import tree import matplotlib.pyplot as pltplt.switch_backend("TkAgg") # 创建了一个随机数生成器对象 rng rngnp.random.RandomState(1) print("rng",rng) #5*rng.rand(80,1)生成一个80行、1列…...
NeRF基础代码解析
embedders 对position和view direction做embedding。 class FreqEmbedder(nn.Module):def __init__(self, in_dim3, multi_res10, use_log_bandsTrue, include_inputTrue):super().__init__()self.in_dim in_dimself.num_freqs multi_resself.max_freq_log2 multi_resself…...
职场新星:Java面试干货让你笑傲求职路(三)
职场新星:Java面试干货让你笑傲求职路 1、token 为什么存放在 redis 中?2、索引的底层原理是什么?3、Spring IOC和AOP的原理4、接口和抽象类有什么共同点和区别?5、为什么要使用线程池?直接new个线程不好吗?…...
获取指定收获地址的信息
目录 1 /// 获取指定收获地址的信息 2 /// 删除指定的收获地址信息 3 /// 取消订单 4 /// 确认订单收货 /// <summary> /// 获取指定收获地址的信息</...
突破笔试:力扣全排列(medium)
1. 题目链接:46. 全排列 2. 题目描述:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[…...
gitlab 503 错误的解决方案
首先使用 sudo gitlab-ctl status 命令查看哪些服务没用启动 sudo gitlab-ctl status 再用 gitlab-rake gitlab:check 命令检查 gitlab。根据发生的错误一步一步纠正。 gitlab-rake gitlab:check 查看日志 tail /var/log/gitlab/gitaly/current删除gitaly.pid rm /var/opt…...
智能离子风棒联网监控静电消除器的主要功能和特点
智能离子风棒联网监控静电消除器是一种集成了智能化和网络化监控功能的设备,用于监测和消除静电现象。它的工作原理是通过产生大量的正负离子,将空气中的静电中和和消除,从而达到防止静电积累和放电的目的。 智能离子风棒联网监控静电消除器的…...
matplotlib 设置legend的位置在轴最上方,长度与图的长度相同
import matplotlib.pyplot as plt import numpy as npx1 np.linspace(0, 10, 50) x2 [6,4,3]ax plt.subplot() ax.plot(x1, label"test1") ax.plot(x2, label"test2") # 设置图例的位置 # 将左下角放置在【0, 1.02】位置处,横为1,…...
Docker-Compose 安装rabbitmq
【编写:docker-compose-rabbitmq.yml】创建数据目录: mkdir -p /opt/rabbitmq/data cd /opt/rabbitmq# 创建 docker-compose-rabbitmq.yml vim docker-compose-rabbitmq.yml 输入: version: "3.1" services:rabbitmq:image: rabbit…...
leetcode357- 2812. 找出最安全路径
这个题比较经典,可以用多个算法来求解,分别给出各个算法的求解方法,主要是分为第一部分的多源BFS求每个位置的距离和第二部分求(0,0)到(n-1,n-1)的最短路径(可以用多种方法求) 目录 多源BFS求最短路径枚举安全系数判断…...
Oracle连接数据库提示 ORA-12638:身份证明检索失败
ORA-12638 是一个 Oracle 数据库的错误代码,它表示身份验证(认证)检索失败。这通常与数据库连接相关,可能由于以下几个原因之一引起: 错误的用户名或密码: 提供的数据库用户名或密码不正确,导致…...
在 Linux 中使用 systemd 注册服务
Systemd 是一种现代的 Linux 系统初始化系统和服务管理器。它旨在管理系统服务的初始化、配置和控制。Systemd 的一个关键特性是它可以管理服务,这些服务是为系统提供特定功能的后台进程。在本指南中,我们将探讨如何使用 systemd 在 Linux 中注册服务。 …...
(03)Unity HTC VRTK 基于 URP 开发记录
1.简介 本篇主要内容为:URP如何与VRTK结合、URP需要注意的地方、VRTK的功能进行阐述。 因项目本身要求要渲染出比较好的画质,所以抛弃了Unity默认渲染管线Built-in,使用URP进行渲染,当然也可以选HDRP,但考虑到后期项目…...
.bit域名调研
.bit域名研究 问题: .bit域名和ENS域名的相同点?不同点?有什么关系? .bit的定义 .bit 是基于区块链的,开源的,跨链去中心化账户系统.bit 提供了以 .bit 为后缀的全局唯一的命名体系,可用于加密…...
Vue数组变更方法和替换方法
一、可以引起UI界面变化 Vue 将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括: push()pop()shift()unshift()splice()sort()reverse() 以上七个数组都会改变原数组,下面来分别讲解它们的区别&…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
