計算機設計大賽 深度學習貓狗分類 - python opencv cnn

文章目錄

  • 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,shutiloriginal_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,testtrain_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)#將原始數據拷貝到對應的文件夾中 catfnames = ['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.pswp.cn/news/717510.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717510.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717510.shtml

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

相關文章

Python測試框架pytest介紹用法

1、介紹 pytest是python的一種單元測試框架,同自帶的unittest測試框架類似,相比于unittest框架使用起來更簡潔、效率更高 pip install -U pytest 特點: 1.非常容易上手,入門簡單,文檔豐富,文檔中有很多實例可以參考 2.支持簡單的單…

C++內存模型與內存序

寫在前面 在真正了解Memory Order的作用之前,曾經簡單地將Memory Order等同于mutex和atomic來進行線程間數據同步,或者用來限制線程間的執行順序,其實這是一個錯誤的理解。直到后來仔細研究了Memory Order之后,才發現無論是功能還…

Android 12 設置默認的屏幕亮度百分比

1、安卓每個版本的更新, 其核心代碼也會隨之更新,本次為Android 12 版本默認屏幕亮度的修改。 其中涉及的核心代碼主要有: packages\apps\Settings\src\com\android\settings\display\BrightnessLevelPreferenceController.java frameworks…

力扣706:設計哈希映射

題目: 不使用任何內建的哈希表庫設計一個哈希映射(HashMap)。 實現 MyHashMap 類: MyHashMap() 用空映射初始化對象void put(int key, int value) 向 HashMap 插入一個鍵值對 (key, value) 。如果 key 已經存在于映射中&#x…

【GPU驅動開發】- mesa編譯與鏈接過程詳細分析

前言 不必害怕未知,無需恐懼犯錯,做一個Creator! 一、總體框架圖 暫時無法在飛書文檔外展示此內容 二、Mesa API 處理 OpenGL 函數調用 Mesa API 負責實現 OpenGL 和其他圖形 API 的函數接口。Mesa API 表是一個重要的數據結構&#xf…

c# 獲得進程的標題

使用 System.Diagnostics.Process 類來獲取所有 Internet Explorer 進程的標題。以下是如何做到這一點的代碼示例: using System; using System.Diagnostics;class Program {static void Main(){foreach (Process process in Process.GetProcessesByName("iex…

數據中臺的演進與實踐——構建企業的數字核心_光點科技

數據中臺,一個在近年來被頻繁提及的概念,已經成為眾多企業數字化轉型的核心組成部分。然而,盡管它的重要性被業界廣泛認可,對于數據中臺的深入理解和有效實踐仍然是許多企業面臨的挑戰。在本文中,我們將從數據中臺的演…

從租完ecs云服務器 使用docker建立用戶 全過程

一 登錄root用戶 ssh root公網ip 輸入密碼,若沒有密碼可以前往阿里云設置服務器root密碼 二 創建新用戶 并賦予 新用戶sudo權限 adduser $USER usermod -aG sudo $USER 三 Ubuntu安裝docker sudo apt-get remove docker docker-engine docker.io containerd ru…

藍橋杯:門牌制作

題目 小藍要為一條街的住戶制作門牌號。 這條街一共有2020 位住戶,門牌號從1 到2020 編號。 小藍制作門牌的方法是先制作0 到9 這幾個數字字符,最后根據需要將字符粘貼到門牌上,例如門牌1017 需要依次粘貼字符1、0、1、7,即需要1…

反向代理原理

反向代理是一種網絡應用架構模式,主要用于將對一個或多個后端服務器的請求進行轉發、負載均衡和緩存,以提高系統的安全性、性能和可靠性。 其原理如下: 1. 客戶端向反向代理發送請求。 2. 反向代理服務器接收請求,并根據預設的規…

基于window安裝Elasticsearch詳細教程

目錄 一、安裝Java環境1.1 Java版本選擇 二、下載和安裝ES2.1 下載地址2.2 文件目錄 3、啟動服務3.1 以管理員身份打開cmd3.2 首次登錄會有密碼,需要記住3.3 訪問 一、安裝Java環境 1.1 Java版本選擇 官網地址:https://www.elastic.co/cn/support/matr…

9個接口性能優化方案,RT從9000ms到180ms

昨天接到生產 SkyWalking 鏈路監控告警: 服務的百分位數響應時間在過去的 10 分鐘內超過 2000 毫秒的次數達到 3 次。 經過不斷的優化,將接口從 9000ms 優化到 180ms,先看結果 優化前: 優化后: 廢話不多我們開始 一、定位性能差的…

Maven實戰(2)之搭建maven私服

一, 背景: 如果使用國外鏡像,下載速度比較慢; 如果使用阿里云鏡像,速度還算OK,但是假如網速不好的時候,其實也是比較慢的; 如果沒有網的情況下更加下載不了. 二, 本地倉庫、個人/公司私服、遠程倉庫關系如下: 三, 下載安裝nexus私服 略

Notepad3:告別Windows記事本,輕松進行文本編輯

名人說:莫道桑榆晚,為霞尚滿天。——劉禹錫(劉夢得,詩豪) 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊) 目錄 一、什么是Notepad3?①Notepad3②核…

openGauss學習筆記-234 openGauss性能調優-系統調優-資源負載管理-資源管理準備-設置控制組

文章目錄 openGauss學習筆記-234 openGauss性能調優-系統調優-資源負載管理-資源管理準備-設置控制組234.1 背景信息234.2 前提條件234.3 操作步驟234.3.1 創建子Class控制組和Workload控制組234.3.2 更新控制組的資源配額234.3.3 刪除控制組 234.4 查看控制組的信息 openGauss…

第八節 龍晰Anolis 8.8 安裝 DDE 桌面環境

一、前言 最小化安裝的龍晰 Anolis OS 8.8 是不帶圖形化界面的,只能使用命令行,有些時候需要用到桌面環境,而DDE (Deepin Desktop Enviroment) 就是很好的桌面環境,它是指龍晰 Anolis 所搭載的中國自主桌面環境,用起來…

客戶快遞信息管理系統——導入文件識別存儲

客戶快遞信息管理系統背景: 目前不少公司都提供網購服務,為了將商品快遞給客戶,就必須保存和管理客戶的姓名、電話號碼、郵寄地址等信息。為此,本項目要求完成一個小型客戶快遞信息管理系統,完成對客戶快遞信息的建立…

C++構造函數析構函數

構造和析構函數用于管理對象的初始化和清理工作,確保對象的正確生命周期管理。以下是其重要特性: 構造函數不能是虛函數 從存儲空間角度: 虛函數是需要通過虛函數表和虛指針來調用的,如果用虛函數實現構造函數,而對象…

【算法沉淀】刷題筆記:并查集 帶權并查集+實戰講解

🎉🎉歡迎光臨🎉🎉 🏅我是蘇澤,一位對技術充滿熱情的探索者和分享者。🚀🚀 🌟特別推薦給大家我的最新專欄《數據結構與算法:初學者入門指南》📘&am…

Day13:信息打點-JS架構框架識別泄漏提取API接口枚舉FUZZ爬蟲插件項目

目錄 JS前端架構-識別&分析 JS前端架構-開發框架分析 前端架構-半自動Burp分析 前端架構-自動化項目分析 思維導圖 章節知識點 Web:語言/CMS/中間件/數據庫/系統/WAF等 系統:操作系統/端口服務/網絡環境/防火墻等 應用:APP對象/API接…