04 基於深度學習的圖像分類技術

一、完成keras環境搭建

安裝和配置環境的過程請參考如下的博客,https://blog.csdn.net/Super_jm_/article/details/78397074

1. 安裝CUDA

下載網址:https://developer.nvidia.com/cuda-downloads (注意:Ubuntu下載請務必下載runfile文件,如下圖1示)
驗證安裝成功:使用nvcc --version命令
在這裏插入圖片描述

2. 安裝cuDNN

關於cuDNN的介紹,它是用於神經網絡的GPU加速器;
更多具體的介紹參考鏈接,https://blog.csdn.net/fangjin_kl/article/details/53906874

3. 安裝Anaconda

下載鏈接,https://repo.continuum.io/archive/

4. 安裝Tensorflow

安裝教程,https://www.oschina.net/translate/how-to-install-and-use-tensorflow-on-ubuntu-16-04
如何判定版本,https://blog.csdn.net/chineseqsc/article/details/80259775
如何知道GPU是否運行計算過程,https://blog.csdn.net/castle_cc/article/details/78389082

5. 安裝Keras

安裝命令,sudo pip install keras
如何判定版本,https://blog.csdn.net/chineseqsc/article/details/80259775

6. 安裝OpenCV

安裝命令,sudo pip3 installopencv-python,具體可參考
https://www.cnblogs.com/freshmen/p/7272393.html

二、交通標誌分類項目

1. 簡介

從一堆交通標誌數據集(有62類的數據,如下圖2,其中每類數據格式如下圖3所示)裏面,完成分類訓練,並實現輸入一張交通標誌照片給出分類結果和精確概率。
詳細項目情況,請看鏈接
https://www.cnblogs.com/skyfsm/p/8051705.html
在這裏插入圖片描述
在這裏插入圖片描述

2. 神經網絡框架

主要是採用了LeNet-5的結構,一共7層,如下圖4所示,它是YannLeCun教授於1998年提出的第一個成功用於手寫數字識別的卷積神經網絡。
詳細關於此網絡介紹,請查看
https://blog.csdn.net/xjy104165/article/details/78218057 和 https://blog.csdn.net/kaido0/article/details/53161684
在這裏插入圖片描述

3. 項目代碼

代碼結構如下所示,第一個文件keras_image_classifer爲代碼,第二個文件traffic-sign爲數據集,如下圖5所示;其中keras_image_classifer中包含的文件如下圖6,net文件裏存放的是LeNet網絡的keras實現代碼(如圖8所示),traffic-sign-code文件放的是訓練數據的代碼和預測數據的代碼(如圖8所示);最後是文件traffic-sign放的是數據集(如圖7),裏面內容如之前的圖2和圖3所示。
項目代碼請下載,https://github.com/AstarLight/Keras-image-classifer-framework

4. 研讀代碼

(1)分析lenet.py代碼

主要分爲三個部分(如下圖9所示)
第一部分引入各種需要的包依賴,Sequential是用來建立時間序列模型的(是構建神經網絡的二種常用方法之一),Conv2D是二維卷積層,對二維輸入窗進行滑動窗卷積,MaxPooling2D指的是最大空間池化,從糾正特徵映射中取出窗口最大的元素,Activation指的是激活層,對一個層施加激活函數,Flatten用來將輸入壓平,即把多維數據一維化,多用在卷積層到全連接層的過度,Dense指的是全連接層,對上一層的神經元進行全部連接,實現特徵的非線性化組合,backend指的是後端字段,用來選擇後端引擎,配置方法是打開路徑~/.keras/keras.json,更改裏面的image_data_format字段值(後端介紹,https://keras-cn.readthedocs.io/en/latest/backend/);
第二部分是模型初始化,主要處理輸入圖像的格式;
model = Sequential(),是用來構建序列模型的;
要提供輸入的模式(默認的情況是圖像寬度、圖像高度、圖像通道數),若image_data_format是字符串channels_first,則說明輸入模式是圖像通道數、圖像寬度、圖像高度;
第三部分是通過model構建LeNet-5各層結構。
第一層網絡結構,採用之前建立的序列模型model的add方法實現。Conv2D(20,(5, 5), padding=“same”, input_shape=inputShape)),其中20指的是卷積核個數,卷積核大小是5*5的矩陣,採用的是填充模式same,保留邊界處的卷積結果,使得卷積後的結果和原圖像一樣大小,具體的卷積計算過程如下圖10所示,輸入模式同初始化。
在這裏插入圖片描述
model.add(Activation(“relu”)),爲第一層增加激活函數層;
第二層網絡結構是最大池化層,MaxPooling2D(pool_size=(2, 2), strides=(2, 2))),其中pool_size參數的意思是代表垂直和水平兩個方向的下采樣因子,(2, 2)的意思是使圖像在兩個方向上均變爲原長的一半;strides表示步長的意思,(2, 2)代表在兩個方向上步長都是2;最大池化的過程見下圖11所示;
在這裏插入圖片描述
第三層網絡卷積層和第四層池化層都和之前的一樣;
第五層是壓平層,將多維的輸入轉爲一維輸出;
第六層Dense(500)的意思指的是全連接層,500代表輸出的維度;
第七層Dense(classes)中classes指的是輸出分類的個數,即最後得到的分類結果,激活函數採用的是softmax
(softmax的分類過程,https://www.jianshu.com/p/ffa51250ba2e,如下圖12所示)
在這裏插入圖片描述
在這裏插入圖片描述

(2)分析train.py代碼

主要分爲六個部分(如下圖13、14、15所示)
第一部分是導入包依賴部分,matplotlib是python的一個2D繪圖庫,如果想保存圖像但是不想把圖像打印出來,可以使用matplotlib.use(“Agg”),其中Agg是保存爲png格式圖片;
詳情http://blog.sina.com.cn/s/blog_836db8100102wlao.html,注意一定再導入pylab或pyplot包之前進行。 第二部分是parameter和argument的區別,https://zhidao.baidu.com/question/2116957332636950747.html
第三部分是參數設置,其中epochs指的是,1e-3的意思是0.001,CLASS_NUM是分類數量,norm_size是歸一化圖像大小;
在這裏插入圖片描述
第四部分是加載圖像數據,又分爲四個子部分,讀取圖像路徑、讀入圖像內容、歸一化處理、標籤向量化;
讀取圖像路徑中,常用的函數解釋如下
random.seed()方法,https://blog.csdn.net/qq_36142336/article/details/78797190
shuffle() 函數,將序列中所有元素隨機排列,http://www.runoob.com/python/func-number-shuffle.html
cv2.imread(),https://blog.csdn.net/weixin_39943271/article/details/79086131
os.path.sep,http://blog.sina.com.cn/s/blog_5dd2af0901012r86.html
第五部分是訓練數據過程,
在這裏插入圖片描述
第六部分是訓練函數開始入口,
在這裏插入圖片描述

(3)分析predict.py代碼

主要分爲三個部分(如下圖16所示)
第一部分是導入各種包依賴,
第二部分是命令行處理程序,
第三部分預測圖像類別過程,又分爲三個子部分。
在這裏插入圖片描述
圖片與數組的轉化,image_to_array,https://blog.csdn.net/code_better/article/details/53242943
ImageDataGenerator,https://www.cnblogs.com/touch-skyer/p/8603751.html
kerasmodel.compile,https://www.cnblogs.com/smuxiaolei/p/8662177.html
fit_generator,http://keras-cn.readthedocs.io/en/latest/models/sequential/
batch與epoch以及iterations的區別,https://blog.csdn.net/chancein007/article/details/73822955

5. 上傳代碼

Scp指令本地上傳服務器,https://www.cnblogs.com/zhaofeng555/p/8075279.html
上傳出現not aregular file 解決方案,記得加上-r,可參看鏈接
https://blog.csdn.net/sdujava2011/article/details/47283949

6. 運行代碼

注意:Python多版本的啓動,python、python2、python3,sudopython,sudo python2,sudopython3
在這裏插入圖片描述
系統缺少相應的模塊請按如下教程安裝,
Installingimutils in ubuntu,https://stackoverflow.com/questions/36579781/installing-imutils-in-ubuntu
Matplotlib,https://blog.csdn.net/yato0514/article/details/78754551
Keras.preprocessing.image,https://github.com/keras-team/keras/issues/692
Nomodule namedtensorflow,
Nomodule named’sklearn.model_selection’,http://blog.51cto.com/emily18/2087973
Nomodule named cv2,
在某.py文件中調用其他.py內的函數,https://blog.csdn.net/winycg/article/details/78512300

7. 運行結果

輸入要查詢的圖像,會返回該圖像的類別以及準確率,分別如下圖18、19所示;
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章