競賽項目 深度學習的動物識別

文章目錄

  • 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35262.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35262.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35262.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java】一只小菜坤的編程題之旅【3】

文章目錄 1丶判定是否互為字符重排2、楊輝三角3丶某公司的1個面試題(字符串包含問題) 1丶判定是否互為字符重排 這個題我們用一個非常簡單的思想就能實現,我們先將字符串轉換為字符數組,然后對字符數組進行排序,然后再…

el-radio單選框,取消選中

1.背景&#xff1a;在公司開發需求中有一個選擇顏色的單選框&#xff08;黑色&#xff0c;白色&#xff09;&#xff0c;每種顏色選擇后均支持取消選中&#xff0c;可是el-radio標簽不支持取消選中。 2.解決&#xff1a; 方法1: <el-radio-group v-model"radioColo…

【Apollo】自動駕駛的平臺背景,平臺介紹

作者簡介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在學習C/C&#xff0c;Java&#xff0c;Python等 作者主頁&#xff1a; 七七的個人主頁 文章收錄專欄&#xff1a; 七七的閑談 歡迎大家點贊 &#x1f44d; 收藏 ? 加關注哦&#xff01;&#x1f496;&#x1f…

spring boot 集成 jetcache【基礎篇:@Cached、@CreateCache、@CacheRefresh】

手打不易&#xff0c;如果轉摘&#xff0c;請注明出處&#xff01; 注明原文&#xff1a;https://zhangxiaofan.blog.csdn.net/article/details/129832925 目錄 前言 版本 配置通用說明 項目結構 代碼 啟動類 實體類 基礎使用——增刪改查&#xff08;Cached、CacheInv…

opencv實戰項目 手勢識別-手勢控制鍵盤

手勢識別是一種人機交互技術&#xff0c;通過識別人的手勢動作&#xff0c;從而實現對計算機、智能手機、智能電視等設備的操作和控制。 1. opencv實現手部追蹤&#xff08;定位手部關鍵點&#xff09; 2.opencv實戰項目 實現手勢跟蹤并返回位置信息&#xff08;封裝調用&am…

虛擬機安裝 Ubuntu桌面版,宿主機無法訪問虛擬機 ufw 防火墻簡單使用

虛擬機安裝 Ubuntu桌面版&#xff0c;宿主機無法訪問虛擬機 問題處理安裝ssh服務ufw防火墻 放行ssh服務ufw 常用命令 問題 本次安裝使用的 ubuntu-22.04.2-desktop-amd64 &#xff0c;網絡連接使用的是橋接&#xff0c;查看ubuntu的ip是正常的&#xff0c;與宿主機在同一個網段…

力扣的板子

板子 線性篩法求質因子的板子快速冪 線性篩法求質因子的板子 int limit 100000; //修改為題目中的數字的上限 bool isprime[100005] {0}; //保存所有1~limit中的數字是不是質數 int myprime[100005] {0}; //保存2~limit中所有數字的最小質因子 int primes[100000] {0}; …

airflow是什么

Airflow 簡介 Airflow是一個基于有向無環圖(DAG)的可編程、調度和監控的工作流平臺&#xff0c;它可以定義一組有依賴的任務&#xff0c;按照依賴依次執行。airflow提供了豐富的命令行工具用于系統管控&#xff0c;而其web管理界面同樣也可以方便的管控調度任務&#xff0c;并…

Lua 閉包

一、Lua 中的函數 Lua 中的函數是第一類值。意味著和其他的常見類型的值&#xff08;例如數值和字符串&#xff09;具有同等權限。 舉個例子&#xff0c;函數也可以像其他類型一樣存儲起來&#xff0c;然后調用 -- 將 a.p 指向 print 函數 a { p print } -- 使用 a.p 函數…

(原創)Flutter與Native頁面互相跳轉

前言 實際開發混合項目時&#xff0c;常常會有頁面跳轉的需求 如果是原生界面和flutter界面需要互相跳轉 這種情況應該怎么處理呢&#xff1f; 今天這篇博客主要就來介紹下這個情況 其實想一下&#xff0c;這個問題可以拆成四個小的問題來分析&#xff1a; 1&#xff1a;原生界…

什么是全局代理,手機怎么設置全局代理

目錄 什么是全局代理 全局代理的優缺點 優點 缺點 手機怎么設置全局代理 注意事項 總結 在計算機網絡和信息安全中&#xff0c;全局代理是一種常用的技術手段&#xff0c;用于將網絡流量通過代理服務器進行轉發和處理。本文將介紹什么是全局代理&#xff0c;探討全局代理…

pyspark筆記 pyspark.sql.functions

col qqpyspark 筆記 pyspark.sql.function col VS select_UQI-LIUWJ的博客-CSDN博客 取某一列 lit 創建一個包含指定值的列 date_trunc 將日期截取成由第一個參數指定的字符串值 year, yyyy, yy——截取到年month,mon,mm——截取到月day,dd ——截取到天microsecondmillis…

SpringBoot WebSocket配合react 使用消息通信

引入websocket依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>配置websocket import org.springframework.context.annotation.Bean; import org.spr…

Highcharts引入

Highcharts是和jQuery一起使用的&#xff0c;所以需要下載好jQuery jQuery下載方式&#xff1a;訪問&#xff1a;http://cdn.staticfile.org/jquery/2.1.4/jquery.min.js&#xff0c;然后全選復制到自己新建的txt文檔中&#xff0c;最后把擴展名改為js。 Highcharts下載方式&…

pytest運行時參數說明,pytest詳解,pytest.ini詳解

一、Pytest簡介 1.pytest是一個非常成熟的全功能的Python測試框架&#xff0c;主要有一下幾個特點&#xff1a; 簡單靈活&#xff0c;容易上手&#xff0c;支持參數化 2.能夠支持簡單的單元測試和復雜的功能測試&#xff0c;還可以用來做selenium、appium等自動化測試&#xf…

使用sqlplus連接oracle,提示ORA-01034和ORA-27101

具體內容如下 PL/SQL Developer 處 登錄時 終端處 登錄時 ERROR: ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist Process ID: 0 Session ID: 0 Serial number: 0 解決方法是執行以下命令 sqlplus /nolog conn / as sysdba startup …

【Hilog】鴻蒙系統日志源碼分析

【Hilog】鴻蒙系統日志源碼分析 Hilog采用C/S結構&#xff0c;Hilogd作為服務端提供日志功能。Client端通過API調用&#xff08;最終通過socket通訊&#xff09;與HiLogd打交道。簡易Block圖如下。 這里主要分析一下。Hilog的讀、寫、壓縮落盤&#xff0c;以及higlog與android…

學術論文GPT源碼解讀:從chatpaper、chatwithpaper到gpt_academic

前言 之前7月中旬&#xff0c;我曾在微博上說準備做“20個LLM大型項目的源碼解讀” 針對這個事&#xff0c;目前的最新情況是 已經做了的&#xff1a;LLaMA、Alpaca、ChatGLM-6B、deepspeedchat、transformer、langchain、langchain-chatglm知識庫準備做的&#xff1a;chatpa…

GitHub上受歡迎的Android UI Library

內容 抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進度條TabLayout圖標下拉刷新ViewPager圖表(Chart)菜單(Menu)浮動菜單對話框空白頁滑動刪除手勢操作RecyclerViewCardColorDrawableSpinner布局模糊效果TabBarAppBar選擇器(Picker)跑馬燈日歷時間主題樣式ImageView通知聊…

chapter 1 formation of crystal, basic concepts

chapter 1 晶體的形成 1.1 Quantum Mechanics and atomic structure 1.1.1 Old Quantum Theory problems of planetary model: atom would be unstableradiate EM wave of continuous frequency to solve the prablom of planetary model: Bohr: Quantum atomic structureP…