0%

nvm介紹

Node Version Manager (NVM) 是用來管理Node.js版本,可以同時安裝多個不同版本,因應不同專案環境去快速做切換

安裝方式

Windows

Windows環境下到nvm-windows Releases提供最新版本的安裝檔案,Assets處下載nvm-setup的檔案

執行exe檔案進行安裝流程

安裝完成後在cmd輸入nvm測試是否安裝成功 若成功會跳出nvm version

1
nvm --version
Read more »

前言

過去對 blog 的留言板功能用過 Disqus,用了之後會在留言處自動插入廣告
看到 utterances 使用 github issue 當作留言板的儲存位置覺得滿酷的,就來研究一下

安裝環境

  • hexo 6.3.0
  • Next theme
  • npm 8.5.5
  • Windows 10

流程

  1. 到 GitHub 創建一個公開的儲存庫

  2. utterances app並在 GitHub 上啟用,選擇剛剛新增的儲存庫

  3. utterances官網進行參數設定,下拉到 Repository 處 repo:填入留言板綁定的專案名,圖片中有提到要注意的事項:專案要是公開的、有授權utterances app

  4. 設定 issue 標題取名方式,有以下幾種:

    • Issue title contains page pathname
    • Issue title contains page URL
    • Issue title contains page title
    • Issue title contains page og:title
    • Specific issue number
    • Issue title contains specific term
  5. 設定 issue 標記名稱(選填)

  6. 設定留言板主題配色

    • GitHub Light
    • GitHub Dark
    • Preferred Color Scheme
    • GitHub Dark Orange
    • Icy Dark
    • Dark Blue
    • Photon Dark
    • Boxy Light
    • Gruvbox Dark
  7. 建立好的儲存庫透過 hexo 建置好一個 blog,並修改成 Next 樣式

  8. 複製自動產生的程式碼到 themes\next\layout_partials\comments.swig

  9. 在 theme\next_config.yml 最下面加入啟用 utterances 語法

1
utterances: enable: true;

我碰到的 bug

官方教學跟各種線上教學都非常多也非常詳細,但我竟然 Debug 了一小時…
在做完以上流程後出現了留言功能,但在按下登入時…

網址觀察後發現是config的url + 當下文章的path

1
http://example.com/2022/11/14/post/?utterances=2ea222cae0003a078fc8aa047N244Fhi3TkHCsP8Hl%2F9pfC29qC7R2n1HjJm3apPbnWhu6UcHQz8c0ueHm%2FWRMWuA7WS2%2FFH1ykmbf2OxNakOqPEWQR4krMr7rU6vwG7gyd0lpDR1hf4r%2FuNirY%3D

因此將_config.yml url,改成設定的 repo 位置就可以了

簡介

光流是描述視覺運動的一個方法,透過具有時間序列的影像來得到影像中不同物件的運動速度與他們的運動角,有了運動光流資訊可以用來:

  • 運動方向檢測
  • 物件分割
  • 立體視差測量等等

如何得到影像中的光流

舉例來說一個影片由多個連續影像組成,我們追蹤不同影像同一點P,第t個frame時位置是P(x1, y1),在t+1時位置是P(x2, y2),透過這兩點座標就可以算出運動方向與運動速度

要算出這兩點光流的前提:

亮度恆定

移動前後兩點的亮度應該是相等的

$ I(x, y, t) = I(x + u, y + v, t+1) $

微小的移動

在以上條件約束的前提下,亮度恆定與微小移動下

$ I(x, y, t) = I(x + u{\delta}t, y + v{\delta}t, {\delta}t) $

對等號右邊的式子進行泰勒展開式,保留一階項

$ I(x + u, y + v, t+1) \approx I(x,y,t)+I_x∙u+I_y∙v+I_t$

假設亮度不變,下個時間同個點的亮度相等

$ I_x∙u+I_y∙v+I_t \approx 0$

$ \nabla I∙[u,v]^T + I_t = 0 $
不能透過等式 $ \nabla I∙[u,v]^T + I_t = 0 $ 解出u,v,因為只有一個等式內含有兩個未知數u,v

應用

用來預估車流移動方向的光流法:

Machine learning Roadmap 2021 介紹

現在最紅的AI,也就是以深度學習,資料驅動的模型來預測、評估得到結果

為了加強對於Machine learning的廣度與深度理解,在網路上看到一個Machine learning roadmap的圖,整理得滿不錯的

Roadmap:https://whimsical.com/machine-learning-roadmap-2021-MJ9c7zUafrUKFzheRJ8jwy

Roadmap提供所有想了解機器學習的人一個整理:

  1. 機器學習問題
  2. 機器學習的過程
  3. 機器學習的工具
  4. 機器學習的相關資源
  5. 機器學習的模型派系(ex:監督,非監督…)
  6. 機器學習的模型訓練、最佳化
  7. 機器學習的IDE、常用的第三方套件
  8. 機器學習使用的數學
  9. 機器學習的相關應用、部屬

他其實已經很完整,廣度及深度都已經有了,剩下的是如何從整理好的關鍵字向下研究,提高深度

例如:github上的Deep-Learning-Papers-Reading-Roadmap,它提供了學習方面的整理,有序的讓你了解到Deep learning這方面的經典模型

如果從Road map了解後對某一部份更有興趣,可以學習並尋找更多資源,然後填上認為缺少的重要訊息

接下來我想從這個Roadmap上的關鍵字進行相關的整理,再次對機器學習/深度學習上做一個複習

論文連結:Fast Branch Convolutional Neural Network for Traffic Sign Recognition

簡介

論文使用深度學習架構來辨識交通號誌,辨識交通號誌是高級駕駛輔助系統的重要部分,像是方向號誌、限速號誌、各種警示號誌等等

論文遇到的挑戰是影像成像受到室外環境的複雜變化,如失真、惡劣天氣、過度曝光、曝光不足、運動模糊、褪色、複雜背景,造成辨識方法更具挑戰性

使用傳統的電腦視覺辨識方法在這多變的影像是很難以用單一個演算法流程得到穩健的辨識模型,因此使用CNN架構的模型來辨識

CNN往往需要大量的參數處理來得到結果,因此要達到即時辨識模型會有一定的難度,但目前也有許多即時的CNN模型,例如:YOLO

受生物機制的啟發,論文提出一個新的架構Branch Convolution Neural Network (BCNN),在神經系統中,簡單、反射動作會在神經系統較低層次做快速反應,困難的動作會在高階的神經系統處裡後做反應,例如:在容易區分的交通號誌圖片,人眼只看一部份也可以很快的辨識出來,套用在CNN上,沒有必要通過所有CNN參數才得到結果

CNN模型對資料的處理

CNN模型在輸入交通標誌資料有以下特性

  • CNN模型傾向於將原始混淆圖像空間轉換為線性可分離空間,並將同一類標籤的樣本聚集再一起
  • 越難辨識到的交通標誌是與相同類別標籤樣本距離越遠的,表示模型辨識不到特徵
  • 模型對形狀的辨識能力比辨識限速能力好,模型前期將三角形和菱形分隔開來,CNN模型參考圖形內標示較後期才分離不同數字

Branch Convolution Neural Network

CNN和BCNN的差別在於,BCNN會在層與層之間分支輸出結果,如圖所示,傳統的CNN模型會在最後Softmax層輸出結果,BCNN模型會在其中一個分支進行預測,因此可以提高模型的預測時間

所有的樣本都不需要經過整個CNN模型,參考前段介紹的生物學機制,簡單好辨識的影像在前期的layer預測,較難的影像在後期的layer輸出結果

BCNN model訓練流程:

  1. 訓練分支分類器
  2. 評估和偏移分類器
  3. 最佳化分支分類器
  4. fine-tune model

分支分類器 Branch Classifier

分支分類器是用來快速、高精度的輸出結果,因此false negatives是允許的,但false positives是不行的
因此簡單來說分支分類器:

  • 簡單且快速
  • robust與高精度
  • 只輸出足夠置信度的樣本

由於分支分類器是使用線性分類器,使用k-folder來訓線性分類器,但分類器分的精度太高,也是沒有意義的,例如:分類結果為一個空間只有一個正樣本,他的precision是1,但recall可能非常低,因此設定precision與recall的threshold是必要的

再來就是要考慮到底要在哪幾層加入分類器,當遇到難以識別的樣本,並不會在分支分類器輸出結果,因此需要謹慎考慮分類器的插入位置與數量

迭帶搜索最佳組合流程

  1. 將分支分類器的組合編碼到[0,1]之間
  2. 設定$T_{save} $為目標函數
  3. 隨機產生不同種的分支分類器組合
  4. 計算$ T_{save} $
  5. 迭代到指定次數或找到$ T_{save} $符合閾值的組合

其中$ T_{save} $表示的是節省的時間,因此要最大化目標函數

$ T_{save} $公式:

參數定義

$ l_i, i=0,1,2…n+1, 表示CNN第i層, l_{n+1}是輸出的layer, l_0是輸入的layer $

$ T_{l_i}是第l_i層到l_{n+1}層花費的時間 $

$ C_i 表示第i層的branch classifier是否存在,當C_i=1,存在分支分類器,C_i=0則不存在 $

$ t_i 是C_i分類器對sample處理所花費的時間 $

$ S_i 是到C_i層還沒被分類的sample $

$ C_iS_i第i層分離出來的sample數 $

$ S_i^*是第i層還沒被分離出來的sample $

$ N_i^* 是 S_i^* 的數量 $

$ N_0是所有sample$

$ N_i是到第i層的sample數量 $

$ N_i^- 是第i層還沒被分類出來的數量 $

$ T_i 是第i層的sample數量 - 第i層前節省的時間 - 未分類數量*分類器平均時間 $

$ T_{save}是平均節省的時間 $

測試

測試資料

  • 從10小時的影片取出來的交通號誌benchmark,benchmark資料來源
  • 共有43類的標誌
  • 訓練資料:39k影像
  • 測試資料:12k影像
  • 15x15~222x193的影像大小
  • 影像包含交通標誌本體再向外延伸 10%的長寬

測試結果

圖表顯示每個分支分類器分離輸入影像的百分比,將近30%輸入影像從第二層分離出來,並且將近75%從第五層分離出來。

這意味著可以提前分離出大量sample。 所以,BCNN可以節省大量無意義的計算。

儘管設置了一個高精度閾值,但不可避免地還是會有sample被錯誤分類。
就像訓練的準確性和測試準確性之間的關係一樣,原始模型和BCNN準確性之間存在較大差異。

圖片內的(a)顯示是在第5層之前隨機分離出的符號,(b)是在最後12層中隨機分離出的符號。(b)中的符號顯然更扭曲,模糊和更暗。與(a)相比,(b)中的樣本難以區分和識別。

我們將在前一層中分離出來的樣本命名為簡單樣本。更難識別的交通標誌被識別出來,後來被識別出來。

它與生物學機制一致,即簡單的動作被整合到一個較短的感知,而復雜的序列則以更長的周期被整合。

可以看到在準確度與原始CNN差異不大情況下,速度提升了約兩倍

在BCNN-FT,Fine tuned微調的情況下,更接近原始CNN的準確率

總結

  • 受生物機制的啟發,提出了一種名為BCNN的交通標誌識別新框架
  • 在相同的條件下比一般的deep CNN更快
  • 在GTSRB的dataset下測試,大量的交通標誌可以在淺層分離出來

物件檢測是視覺中常見的任務之一,在影像中透過各種演算法來偵測到物件位置,常見的檢測如找到物件位置,並用矩形框標註,更精細一點的可以分割出物件的輪廓,其中會遇到的挑戰:

  • 物件亮度不同
  • 影像角度不同
  • 物件的形狀變化
  • 同類型不同型態的變化,例如顏色

因此為了測試演算法在不同類別上都能有強大的適應性,網路上有多種不同的大型影像資料庫,並附上物件的位置、類別資訊來進行驗證,以下介紹常見的影像資料庫PASCAL VOC、ImageNet、COCO

Benchmarks

PASCAL VOC Challenge

介紹

網頁上有每一年的資料更動,起初只有四個類別,1578張影像,比賽方式為檢測與分類

經過多年的資料量擴增,變為20個類別,含有11530張影像,並且有27450個ROI影像與6929個更精細的分割影像區域,並加入影像分割挑戰
競賽從2005年到2012年停止

相關連結

PASCAL Visual Object Classes Homepage

paperswithcode PASCAL VOC Semantic Segmentation

ImageNet Large Scale Visual Recognition Challenge (ILSVR)

ILSVR介紹

ImageNet是一個提供所有研究人員進行大規模影像辨識模型的資料庫,資料庫內以手動標註了1400多萬張影像,並包含2萬多個類別,實際進行挑戰時會整理出1000類來進行比賽

其中ImageNet的標記類別是根據WordNet的結構,WordNet可以想成是一個辭典,這個辭典把相近意義的同義詞連結再一起,成為一個網路架構

引用YOLO9000的圖來說明,WordNet結構是一個樹狀結構,一個節點下有多個子節點,例如飛機節點,下面有雙翼飛機、噴射機、空中巴士、隱形戰鬥機,因此在ImageNet中看到這些標記類別,都可以視為飛機類別

ILSVR相關連結

ImageNet Home

Download ImageNet Data on Kaggle

paperswithcode ImageNet object detection
的數據可以看到歷年來ImageNet影像分類比賽準確率的模型

Common Objects in Context (COCO)

COCO介紹

COCO dataset也是一個大型物件檢測、影像分割的一個資料集,他的特點參考官網介紹:

  • 具有物件分割區塊
  • 330K的影像數,有200K已經標記
  • 包含1.5M個物件
  • 物件類別有80類
  • 場景分類有91類
  • 每張圖片都有五個人工書寫的英文註釋
  • 250000個person類別針對肢體做標記

COCO相關連結

cocodataset home

paperswithcode coco object detection

評估模型方法

在物件檢測中,常使用precision, recall來評估模型
講到precision, recall前先介紹混淆矩陣與真陽TP、真陰TN、偽陽FP、偽陰FN

  • 真陽(True Positive, TP):預測為真而實際為真
  • 真陰(True Negative, TN):預測為假而實際為假
  • 偽陽(Flase Positive, FP):預測為真而實際為假
  • 偽陰(Flase Negative, FN):預測為假而實際為真

precision, recall公式:

precision公式意義:預測的為正樣本的結果中,預測正確的比率,稱為準確率

recll公式意義:取出所有正樣本結果,實際預測多少正樣本的比例,稱為召回率

以垃圾郵件分類器來舉例precision, recall數值高低的關係

垃圾郵件資料為正樣本, 不是垃圾郵件的資料為負樣本

分類器的precision高, recall高, 代表這模型非常棒, 具有濾除垃圾郵件的能力

precision高, recall低, 代表這模型預估是垃圾郵件的正確率很高, 但實際抓到垃圾郵件的數量少, 是謹慎的模型

precision低, recall高, 代表這模型垃圾郵件幾乎都有抓到, 但誤判率高, 是寬鬆的模型

precision低, recall低, 這模型沒用了

好的模型是具有高準確率,又有高召回率,因此可以使用我兩個都要的F-score指標

$\beta$ 值用來控制precision與recall之間的權重, $\beta$ 值越高,precision的結果就比較重要

論文閱讀:Beyond Bags of Features: Spatial Pyramid Matching for Recognizing Natural Scene Categories
作者Svetlana Lazebnik, Cordelia Schmid, Jean Ponce

Abstract

本論文提出一個方法來進行場景辨識

將影像劃分成越來越細的子區域

並計算每個子區域內的局部特徵直方圖

Feature extration

可以分成兩種特徵

  • weak features
    • oriented edge points
    • visual vocabulary較少
  • strong features
    • SIFT
    • visual vocabulary較多

Spatial Pyramid Matching

Create Pyramid Histogram

右上圓圓像細胞的是輸入的影像

左邊三個level是本篇文章提出的一個分割方法

隨著level提高, 分割的數量逐漸增加, 概念就跟金字塔一樣

從level 0來看,將輸入的影像經過特徵萃取

每個點代表不同的Bag Of Visual Words

計算每個特徵個別總和並用直方圖表示,如level 0下的長條形

而在level 0最終可以得到一個1*3的向量來表達這張影像

到level 1部分,將影像切成4等份

因此下面的直方圖也會有四份

順序是對應著圖中的紅色數字進行量化

level 1就可以得到1*12的向量

level 2就可以得到1*48

再拿這些向量去對其他影像進行比對

Pyramid Matching

在原論文3.1節寫到如何匹配

定義X,Y是兩個取出d維特徵向量的集合

$ \ell $ 是金字塔的等級,第l等級會有 $ 2^{\ell} $ 的網格數

每個網格會有$D= 2^{\ell d} $的維度向量

定義 $ H^{\ell}_X $, $ H^{\ell}_Y $ 是X,Y對應的histogram

匹配公式:

用下面的例子來簡單舉例:

可以看到在level 0 兩邊都至有8個點

level 1 左上最少 1, 右上最少 1, 左下最少 2, 右下最少 2 點以此類推

其實公式的精神就是再說,取出X,Y每個格子的的最小數量作為交集數量

而level與交集數量的關係:

level 0 是一個全局的角度,因此早期的匹配到很多點數量不代表真的相似,因為level 0並沒有任何空間的訊息,隨著level越來越高,分割越細,所match到的點數量越能表示他們的相似程度

因此每層的權重公式:

level0 權重 = $ \frac{1}{2^L} $

其他 = $ \frac{1}{2^{L-\ell+1}} $

由於金字塔的計算方式,會有點數重複計算到的問題,為了消去這個重複性

計算第 0 層到第 $ L-1 $ 的實際點數公式為:

把上述兩個公式合在一起得到pyramid match kernel:

論文將所有特徵向量量化成M個離散形式,最終公式為:

使用SVM訓練模型來進行多個類別分類

Sample Code

Spatial Pyramid Matching Scene Recognition

參考

Svetlana Lazebnik, Cordelia Schmid, Jean Ponce. Beyond bags of features: spatial pyramid matching
for recognizing natural scene categories. IEEE Conference on Computer Vision & Pattern Recognition
(CPRV ’06), Jun 2006, New York, United States. pp.2169 - 2178, ff10.1109/CVPR.2006.68ff. ffinria00548585f

Spatial Pyramid Matching presented by Lubomir Bourdev

C 7.2 | Spatial Pyramid Matching | SPM | CNN | Object Detection | Machine learning | EvODN

介紹

Visual bag of words視覺詞袋模型概念:將影像取出具有特徵的地方,存在待比對區域中,新影像進來時,逐一比對影像符合詞袋中哪個的特徵比較多,就跟詞袋中的影像越相似,常用來進行影像分類或影像檢索

新影像進來時,逐一比對影像符合詞袋中哪個的特徵比較多,就跟詞袋中的影像越相似,就可以將它分為詞袋中相近的那一類

上圖可以看到在影像中,先取出各自的特徵,將這些特徵統一對各自影像進行評分,可以看到從原影像取出的特徵分數是比較高的

實作流程 & 方法

  1. 取出特徵
  2. 學習出專屬於每張影像的”視覺詞彙”,建立視覺字典
  3. 量化特徵
  4. 通過“視覺詞”的頻率表示圖像

特徵提取

特徵取得方式參考文本分析方法,文本分析中由單詞出現的頻率來去做分析,圖片則是由紋理特徵出現的頻率高低作分析

而課程中提到的方法的關鍵字:

學習視覺詞彙

假設資料集中有狗、貓、飛機、山丘
透過剛剛的特徵提取可能會找到狗尾巴、貓耳朵、飛機的機翼、山丘上的樹等特徵
這些特徵之間會因為他們影像所呈現的方式而有相似性
我們在透過一個歸納個方法來將一群相似的特徵聚集再一起
使用k-means分群法來將相似的特徵組成一群
再取出各群之間的群心代表該群的特徵向量

  • 問題:如何選擇視覺詞彙的大小
    • 太小,此特徵向量不能表示所有群內的特徵性
    • 太大,量化失真,overfitting

Vector quantization 向量量化

介紹codebook

codebook概念:codebook是由一群codevector或codeword組合而成,最終目標是以這些編碼向量來代表空間中全部的資料向量(ex:k means各群心的結果)

簡單來說,一組大資料用codebook內的codeword組合而成,用來降維,降低資料量

通過視覺詞彙的頻率來代表影像

上圖可以看到當輸入的影像進來時,可以透過各個不同的特徵來評估他屬於哪一類,達到影像分類的效果

範例

可參考BagOfVisualWords

作者使用11個類別,每類影像數不同

輸入影像後,取SIFT descriptor

再透過k-means分群法將特徵分成1000群

訓練一個SVM mdoel,輸入資料為k-means的群心與對應的類別標籤

輸入測試資料進行分類評估model準確度

常見視覺辨識任務

  • Objection Detection
  • Objection localization
  • VQA(Visual Question Answering)

Challenges && Nearest Neighbor Classifier

參考cs231n Image Classification

Simple object recognition pipeline

參考 paper:Analyzing Appearance and Contour Based Methods for Object Categorization

建造一個架構,用來辨識影像,輸入影像後會輸出對應類別結果

訓練架構

訓練階段重點:

  • 訓練資料:輸入的訓練影像與標記類別
  • 定義要擷取的影像特徵
  • 訓練方法

訓練資料

dataset:ETH-80 dataset

  • 共有八類,每類41張影像,共有3280張影像
  • 解析度1024 * 768
  • 但網路上找到的dataset並沒有到達這麼高的解析度(256 * 256)

影像特徵

提到了幾個特徵提取方法

  • Global RGB histogram
  • 整體形狀分析:PCA-based methods
  • 局部形狀特徵:shape context
  • 紋理:Filter banks

訓練方法

可使用KNN classifier

result

機器學習架構

  • 分成training與Testing階段
  • Training:準備訓練資料與對應的類別${(x_1,y_1),(x_2,y_2),…,(x_N,y_N)}$,評估預測函數$f$並最小化在訓練資料上的誤差
  • Testing:輸入不在訓練資料內的未知資料,應用訓練好的fuction $f$來預測類別結果

K-nearest neighbor classifier

KNN的概念是由nearest neighbor algorithm衍伸出來,NN是透過一群已經存在的訓練資料與標籤當作基底,來對測試資料進行比對,輸出與訓練資料相似度高的類別當作結果

而KNN與NN不同的則是取出前K個相近的資料做參考,來決定最終輸出的類別結果

KNN演算法流程

訓練階段:存取所有訓練資料$x_i$與其對應的類別結果$y_i$

測試階段:

  1. 輸入$x$,計算與所有訓練資料點的距離
  2. 選擇前$k$個鄰近$x$的訓練資料
  3. 統計鄰近訓練資料最高的對應類別結果

距離量測方法:可使用歐式距離

KNN 細節整理

  • 如何決定參數k
  • 相似度比對

如何決定參數k

參數$k$的不同會影響輸出結果

  • k太小,對雜訊敏感,容易overfitting
  • k太大,容易underfitting

選擇參數k的方法:cross validate

cross validate

把資料分成多個子資料,測試參數在小樣本中的表現結果

測試流程:

  1. 輸入訓練資料,從訓練資料分割成多組不同的訓練/測試資料
  2. 選擇在平均效能中最好的參數$k$

相似度比對

參考