2018年10月19日 星期五

筆記:CNN及眾多應用

將高雄港邊夜景逆時鐘旋轉,好像CNN範例

  • 深度學習概念(連結)
  • CNN及眾多應用(連結)
  • RNN及眾多應用(連結)
  • TensorFlow安裝(連結)
  • TensorFlow語法與使用(連結)
  • Porting AI ( QCS605 QCS603 Android )(連結)

CNN


卷積神經網絡(Convolutional Neural Network,CNN)的出發點是利用圖像的局部信息,例如局部模式如輪廓和邊界,通過「卷積核」作為中介,圖像通過卷積操作後仍然保留原先的位置關係。



卷積(convolution)乍聽之下會聯想到天上美美的卷積雲,但那是美麗的誤會。以離散的觀念可看成是向量平移和加權疊加。若用連續的觀念,就是不僅僅與當前時刻輸入有關,也跟之前若干時刻的輸入有關,是之前時刻的輸入信號經過一段過程,對現在時刻系統輸出的影響,就要考慮各個時刻連續性輸入的影響(疊加)。

y(n)=x(n)∗h(n)
y(n)的序列表示成y(0) y(1) y(2)代表系統的反映信號。
x(n)的對應時間的序列x(0) x(1) x(2)。
所謂的影響可以是減弱或增加,但是影響的方式和強度可以更進一步變成。h(t)這個函數與x(0)相乘來表達,方式為x(m)×h(m−n)

若是圖像處理,最常見的例子就是MASK運算,常見應用於濾波處理。用一個模板和一個圖片進行卷積,對於圖像上的一個點,和模板相乘,然後各點的積相加,就得到了這點的卷積值。對圖像上的每個點都這樣處理,可以消除噪點,強化特徵。


用下面這個平均矩陣,來平滑圖像,高頻的信號就會被周圍的數值平均成為平滑山峰。


整張圖形的做法,則是類似下面的計算方式。


DNN將二維圖形,以一維陣列來表示,雖然有效,但喪失了圖像的結構和附近點的彼此關聯。CNN類似人臉辨識時使用Eigen想法。有些特徵不需要看整張圖片才能捕捉起來,也就是將圖片解析度降維的方法。下面是各種由簡單到複雜的CNN模型和應用。

除了CNN畢竟有許多要



NormalLenet5AlexNetVGG
MNISTpart1part2part3
CIFAR10

part4part5

part1


來原

MNIST利用CNN處理後,正確率可以提升到百分之九十九,效果非常顯著。test12.py (和範例相比較,74行有變動)。
  1. Max-pooling 這是為了確保經過 Convolution 後圖片中的特徵可以被確實保留下來而採取的方法。
  2. 不同的 Activation Function 先前在添加神經網絡層的時候,如果沒有指定 Activation function 就是使用預設的線性函數,但是在 CNN 中會使用 ReLU(Rectified Linear Unit)作為 Activation function,模擬出非線性函數,確保神經元輸出的值在 0 到 1 之間。
  3. 新增 Dropout 函數 用來避免過度配適(Overfitting)。
  4. 更換 Optimizer 將我們先前一直使用的梯度遞減(Gradient descent)更換為 ADAM,是一個更進階且更成熟的梯度遞減演算法。

輸入圖片(解析度 28x28 的手寫數字圖片)
第一層是 Convolution 層(32 個神經元),會利用解析度 5x5 的 filter 取出 32 個特徵,然後將圖片降維成解析度 14x14
第二層是 Convolution 層(64 個神經元),會利用解析度 5x5 的 filter 取出 64 個特徵,然後將圖片降維成解析度 7x7
第三層是 Densely Connected 層(1024 個神經元),會將圖片的 1024 個特徵攤平輸出結果之前使用 Dropout 函數避免過度配適
第四層是輸出層(10 個神經元),使用跟之前相同的 Softmax 函數輸出結果

part2


來源
運作為目錄test23,先安裝sklearn( pip install -U scikit-learn ),並且把MNIST_data部份資料移動到mnist/train-labels.idx1-ubyte 等四個
依序執行
python  lenet5_train.py 訓練
python  lenet5_evil.py 產生評估結果
python  lenet5_test.py 需要在工作目錄下,製造20個檔案,正確率70%,並有比較圖
最後是進行特殊測試kaggle,參考文章
https://www.kaggle.com/competitions 選擇digit recognizer


選擇data - download all
用google帳號登入下載了全部,將test.csv解壓縮後,放在工作目錄執行
python  lenet5_kaggle.py 結果 result.csv但是沒有比對正確答案,先擱置

part3


來源



Alexnet架構如上
參考的說明位置  建立新目錄test24並且還要建立mnist並且把四個檔案拷貝進來,依序執行
alexnet_inference2
alexnet_train2
alexnet_eval2
正確率97%

part4

同樣是Alexnet架構
參考的說明位置  建立目錄test25
需要先下載檔案 位置  有三種檔案,下載的是  CIFAR-10 binary version (suitable for C programs) 解壓縮後在工作目錄下狀態是 data/cifar-10-batches-bin 有許多bin檔案依序執行
read_cifar.py  連續跳出兩張圖片
cifar_inference.py
cifar_train.py
cifar_eval.py 正確率66%

part5

VGG模型
VGG架構
參考的說明位置  接續前面測試test25 依序執行
vgg_inference.py
vgg_train.py
vgg_eval.py 正確率 80%
vgg_test.py  需要自己做出20張 32*32大小的飛機照片,文章提到測試效果不好(並沒有實際測試)

Grad-CAM

連結
連結
連結
 

其他範例

ImageNet範例
蘋果中文字辨識範例
下棋範例
自動著色
Prisma;CNN的過程中,可以讓系統逐步學習到畫作的風格,累積眾多分類答案後,就成為分類器。若在風格這個層次暫停,讓系統記憶風格資料。當輸入一張新的圖片時,讓CNN將新畫作和記憶的風格相比較,當然會有很大的差異,差異越大,表示風格越不同。但是若在這時後,修改畫作,減少差距。逐漸累積後,新畫作就會成為新的風格。這就是Prisma的精神。應用上可以參考文章。必須具備有VGG。

CNN延伸應用,物體位置辨識


能夠在一個畫面中,找到各個項目,有許多精彩的演進。參考資料。基本精神是用openCV的想法,利用Sliding Window找不同範圍,效差不佳,開始有以Bound為基礎的各種加速手段。
  1. R-CNN:先取出約2000個可能的區域。
  2. Fast R-CNN:在 R-CNN 中,2000 多個區域都要個別去運算 CNN,這些區域很多都是重疊的,也就是說這些重疊區域的 CNN 很多都是重複算的。所以 Fast R-CNN 的原則就是全部只算一次 CNN 就好,CNN 擷取出來的特徵可以讓這 2000 多個區域共用。先透過 selective search 預選 region proposals。
  3. Faster R-CNN:與其預先篩選 region proposals,不如從 CNN 的 feature map 上選出 region proposals。實做的方式可以參考這個
  4. Mask R-CNN:使用FCN概念,建構於 Faster R-CNN。

YOLO


很娛樂化的名子,能在前面這麼多精彩論文下,開闢出新做法,並且大幅提升辨識率速度,雖然正確率不是最前段班,但考量速度這個因素,已經很難得。

方式上,揚棄了bound的概念,是將整張圖視為一體進行訓練和測試。一開始不太能體會他的想法,後來漸漸掌握到,它每格的大小是固定的。每格內容不包括格子和整張圖的相對位置,而是和這個類別的相對資訊,還有框的大小,還有分類機率值。原本以為它和同一畫面中其他物件有關係,後來才發現那是錯誤的想法。

後續的YOLO 2和3 還有更好表現。

這是論文的原文版中文版概念介紹1概念介紹2  非常棒的演講 。很好的說明1 說明2

實作部分,先建立tensor/yolo目錄,下載入門專案的code,解壓縮,依照指示就可完成。有幾點要記錄。

  1. 目錄在tensor/yolo
  2. train後的內容是以ckpt方式儲存,存放位置在model/中
  3. 如果下載已經預先訓練檔案 pretrain ckpt file ,移動到model/pretrain目錄後,直接執行就可以看到成果。test:python demo.py
  4. 如果依照pascal-Voc2007從無到有開始建立,過程包括下載檔案,放置到正確位置
  5. unzip pascal-Voc2007 train data and test data into the same folder / data ( train and test mixed together )  file1 file2  prepare a folder "VOCdevkit2007"  mv VOC2007 to "VOCdevkit2007"
  6. 開始執行,python tools/train.py -c conf/train.cfg
  7. 程式中設定是執行一百萬次,在目前機器上,大約一萬次一小時,中間中斷半成品也可以測試歐,只是準確率較低,也不知道能否接續訓練
  8. 未來,自行訓練需要格式。既然有pascal-Voc2007的執行範例,會發現前面有段先製作業,將資料轉換成需要形式,也就是說,未來可以訓練自己的資料格式 convert the Pascal-voc data to text_record file (python tools/preprocess_pascal_voc.py )
隨便以chair為例,成功框出區塊


程式碼對應說明:文章1 文章2   文章3  文章4
其他git:  git  git

沒有留言:

張貼留言