將高雄港邊夜景逆時鐘旋轉,好像CNN範例 |
- 深度學習概念(連結)
- CNN及眾多應用(連結)
- RNN及眾多應用(連結)
- TensorFlow安裝(連結)
- TensorFlow語法與使用(連結)
- Porting AI ( QCS605 QCS603 Android )(連結)
CNN
卷積神經網絡(Convolutional Neural Network,CNN)的出發點是利用圖像的局部信息,例如局部模式如輪廓和邊界,通過「卷積核」作為中介,圖像通過卷積操作後仍然保留原先的位置關係。
卷積(convolution)乍聽之下會聯想到天上美美的卷積雲,但那是美麗的誤會。以離散的觀念可看成是向量平移和加權疊加。若用連續的觀念,就是不僅僅與當前時刻輸入有關,也跟之前若干時刻的輸入有關,是之前時刻的輸入信號經過一段過程,對現在時刻系統輸出的影響,就要考慮各個時刻連續性輸入的影響(疊加)。
y(n)=x(n)∗h(n)所謂的影響可以是減弱或增加,但是影響的方式和強度可以更進一步變成。h(t)這個函數與x(0)相乘來表達,方式為x(m)×h(m−n)
y(n)的序列表示成y(0) y(1) y(2)代表系統的反映信號。
x(n)的對應時間的序列x(0) x(1) x(2)。
若是圖像處理,最常見的例子就是MASK運算,常見應用於濾波處理。用一個模板和一個圖片進行卷積,對於圖像上的一個點,和模板相乘,然後各點的積相加,就得到了這點的卷積值。對圖像上的每個點都這樣處理,可以消除噪點,強化特徵。
用下面這個平均矩陣,來平滑圖像,高頻的信號就會被周圍的數值平均成為平滑山峰。
整張圖形的做法,則是類似下面的計算方式。
DNN將二維圖形,以一維陣列來表示,雖然有效,但喪失了圖像的結構和附近點的彼此關聯。CNN類似人臉辨識時使用Eigen想法。有些特徵不需要看整張圖片才能捕捉起來,也就是將圖片解析度降維的方法。下面是各種由簡單到複雜的CNN模型和應用。
除了CNN畢竟有許多要
Normal | Lenet5 | AlexNet | VGG | |
MNIST | part1 | part2 | part3 | |
CIFAR10 | part4 | part5 |
part1
來原 |
MNIST利用CNN處理後,正確率可以提升到百分之九十九,效果非常顯著。test12.py (和範例相比較,74行有變動)。
- Max-pooling 這是為了確保經過 Convolution 後圖片中的特徵可以被確實保留下來而採取的方法。
- 不同的 Activation Function 先前在添加神經網絡層的時候,如果沒有指定 Activation function 就是使用預設的線性函數,但是在 CNN 中會使用 ReLU(Rectified Linear Unit)作為 Activation function,模擬出非線性函數,確保神經元輸出的值在 0 到 1 之間。
- 新增 Dropout 函數 用來避免過度配適(Overfitting)。
- 更換 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但是沒有比對正確答案,先擱置
依序執行
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參考的說明位置 建立新目錄test24並且還要建立mnist並且把四個檔案拷貝進來,依序執行
alexnet_train2
alexnet_eval2
正確率97%
part4
同樣是Alexnet架構
參考的說明位置 建立目錄test25
需要先下載檔案 位置 有三種檔案,下載的是 CIFAR-10 binary version (suitable for C programs) 解壓縮後在工作目錄下狀態是 data/cifar-10-batches-bin 有許多bin檔案依序執行參考的說明位置 建立目錄test25
read_cifar.py 連續跳出兩張圖片
cifar_inference.py
cifar_train.py
cifar_eval.py 正確率66%
part5
VGG模型 |
vgg_test.py 需要自己做出20張 32*32大小的飛機照片,文章提到測試效果不好(並沒有實際測試)
其他範例
ImageNet範例
蘋果中文字辨識範例
下棋範例自動著色
Prisma;CNN的過程中,可以讓系統逐步學習到畫作的風格,累積眾多分類答案後,就成為分類器。若在風格這個層次暫停,讓系統記憶風格資料。當輸入一張新的圖片時,讓CNN將新畫作和記憶的風格相比較,當然會有很大的差異,差異越大,表示風格越不同。但是若在這時後,修改畫作,減少差距。逐漸累積後,新畫作就會成為新的風格。這就是Prisma的精神。應用上可以參考文章。必須具備有VGG。
CNN延伸應用,物體位置辨識
能夠在一個畫面中,找到各個項目,有許多精彩的演進。參考資料。基本精神是用openCV的想法,利用Sliding Window找不同範圍,效差不佳,開始有以Bound為基礎的各種加速手段。
- R-CNN:先取出約2000個可能的區域。
- Fast R-CNN:在 R-CNN 中,2000 多個區域都要個別去運算 CNN,這些區域很多都是重疊的,也就是說這些重疊區域的 CNN 很多都是重複算的。所以 Fast R-CNN 的原則就是全部只算一次 CNN 就好,CNN 擷取出來的特徵可以讓這 2000 多個區域共用。先透過 selective search 預選 region proposals。
- Faster R-CNN:與其預先篩選 region proposals,不如從 CNN 的 feature map 上選出 region proposals。實做的方式可以參考這個
- Mask R-CNN:使用FCN概念,建構於 Faster R-CNN。
YOLO
很娛樂化的名子,能在前面這麼多精彩論文下,開闢出新做法,並且大幅提升辨識率速度,雖然正確率不是最前段班,但考量速度這個因素,已經很難得。
方式上,揚棄了bound的概念,是將整張圖視為一體進行訓練和測試。一開始不太能體會他的想法,後來漸漸掌握到,它每格的大小是固定的。每格內容不包括格子和整張圖的相對位置,而是和這個類別的相對資訊,還有框的大小,還有分類機率值。原本以為它和同一畫面中其他物件有關係,後來才發現那是錯誤的想法。
後續的YOLO 2和3 還有更好表現。
這是論文的原文版,中文版,概念介紹1,概念介紹2 非常棒的演講 。很好的說明1 說明2
實作部分,先建立tensor/yolo目錄,下載入門專案的code,解壓縮,依照指示就可完成。有幾點要記錄。
- 目錄在tensor/yolo
- train後的內容是以ckpt方式儲存,存放位置在model/中
- 如果下載已經預先訓練檔案 pretrain ckpt file ,移動到model/pretrain目錄後,直接執行就可以看到成果。test:python demo.py
- 如果依照pascal-Voc2007從無到有開始建立,過程包括下載檔案,放置到正確位置
- 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"
- 開始執行,python tools/train.py -c conf/train.cfg
- 程式中設定是執行一百萬次,在目前機器上,大約一萬次一小時,中間中斷半成品也可以測試歐,只是準確率較低,也不知道能否接續訓練
- 未來,自行訓練需要格式。既然有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
沒有留言:
張貼留言