2015年10月30日 星期五

[OpenCV] 安裝Visual studio 2012 與 OpenCV 2.4.11



OpenCV是一款開放原始碼(Open Source)的專案,它提供C++為語言基礎的影像處理以及電腦視覺的函式庫(Library)。當初美國英特爾公司(Intel)為了尋找能夠發揮CPU實力的項目,於是便將念頭動到了影像處理以及機器視覺領領域,而OpenCV裡的函式庫正是在這樣想法下的產品。

以下援引自Wiki
------------------------------------------------------------------------------------------------------------
OpenCV專案最早由英特爾公司於1999年啟動,致力於CPU密集型的任務,是一個包括如光線追蹤和3D顯示的計劃的一部分。早期OpenCV的主要目標是
  • 為推進機器視覺的研究,提供一套開源且最佳化的基礎庫。不重複發明輪子。
  • 提供一個共同的基礎庫,使得開發人員的代碼更容易閱讀和轉讓,促進了知識的傳播。
  • 通過提供一個不需要開源或免費的軟體許可,促進商業應用軟體的開發。
  • OpenCV現在也整合了對CUDA的支援.
OpenCV的第一個預覽版本於2000年在IEEE Conference on Computer Vision and Pattern Recognition公開,並且後續提供了五個測試版本。1.0版本於2006年釋出。
OpenCV的第二個主要版本是2009年10月的OpenCV 2.0。該版本的主要更新包括C++介面,更容易、更類型安全的模式,新的函式,以及對現有實作的最佳化(特別是多核心方面)。現在每6個月就會有一個官方版本,並由一個商業公司贊助的獨立小組進行開發。
在2012年8月,OpenCV的支援由一個非盈利性組織(OpenCV.org)來提供,並保留了一個開發者網站和使用者網站。
------------------------------------------------------------------------------------------------------------
若有興趣,則可以上OpenCV的官方網站,上面有英文詳細的介紹。英文是相當重要與基本的語言工具,請讀者務必親自細讀官方原文文件與函式庫程式。



  • 安裝流程筆記連結( Hackpad )
  • 注意 : Visual studio 2015 community 在一開始開新專案的時候,並沒有win32主控台應用程式的選項,因此需要根據它的說明下載對應的開發套件。下載完之後便會出現win32主控台應用程式的選項供您選擇

  • 2015/11/8 註 : 後來因為在設定OpenCV的路徑的時候,系統一直無法除錯,後來按照葉正聖老師的教學影片中使用2012的版本,便能夠成功執行,因此為了避免般時頭砸自己腳,所以還是請各位有興趣研究OpenCV的同好,先以Visual Studio 2012為開發平台,以免一開始就澆熄了滿腔熱血 : )




  • OpenCV 2.4.11的安裝方式與資料夾路徑設定,則可以按照銘傳大學 葉正聖 老師的教學影片所提供的步驟進行即可


老師在這邊詳細的把程式碼實作的部分給紀錄下來,如果有需要的讀者可以自行參閱。若有針對OpenCV本身的演算法的實作有興趣的讀者,則可以親自從OpenCV的函式庫裡進行探索。

2015年10月28日 星期三

[轉貼]Deep Learning(深度学习)学习笔记整理系列

由於目前對於深度學習、類神經網路、機器學習等領域的知識還不夠熟悉

所以上網搜尋了一陣子關於這些領域的相關文章

想找到比較能夠深入淺出解釋這個領域的文章

經過一番查找後

找到由中國網友 Zouxy所寫的"Deep Learning(深度学习)学习笔记整理系列"的文章

相信對於之後自己在表達以及撰寫相關程式以及說明文件

能夠以簡單明瞭的方式解釋這個對於外人來說較為難以理解的領域知識


我始終相信

要能夠當一個好的領導人

能夠化繁為簡,以簡馭繁

是必備的能力之一

-------------------------------------------------------------------------------------------------

Deep Learning 其實就是一種非監督式的特徵學習方法(Unsupervised Feature Learning)

以下是針對各篇所做的一個小小的簡介

Deep Learning(深度学习)学习笔记整理系列之(一)

簡介 : 基本概念解說,解釋人的視覺系統如何透過學習辨識事物,將此概念類比至機器視覺(像素、邊緣、樣型) 與類神經網路(多層學習層)的概念。


Deep Learning(深度学习)学习笔记整理系列之(二)

簡介 : 介紹影像中的特徵(Feature)。特徵能夠做為分類的判斷依據,也是進行機器學習(Machine Learning)的原材料。

有趣的地方在於,文章中提及許多複雜的圖像,都是由許多不同類別的簡單特徵(例如,特定方向的邊緣),依據特定比例或權重所組成。

這個現象在工程數學中的拉式轉換、傅利葉轉換、聲學等不同的領域中出現,例如由賽車引擎所發出的轟鳴聲,其實是由許多不同頻率與震幅的聲波信號所組成。當然,在語言中也是類似的現象,單純的字並沒有特定意義,但是若把它組成詞彙、成語、句子、文章,便賦予它截然不同的生命在其中。

Deep Learning(深度学习)学习笔记整理系列之(三)

簡介 : 深度學習(Deep learning) 與 機器學習和類神經網路中的知識有著許多相似的地方。原來深度學習與類神經網路是由機器學習領域中所延伸出來的知識。而深度學習則是屬於多層的人工神經網路。

類神經網路中的倒傳遞(Back propagation)方法的出現雖然讓類神經網路展開了新的研究方向,但是,類神經網路也不是完全沒有缺點,因此深度學習則針對這點進行改良。

引自原文

deep learning训练过程具体如下

  • 1)使用自下上升非监督学习(就是从底层开始,一层一层的往顶层训练)
  • 2)自顶向下的监督学习(就是通过带标签的数据去训练,误差自顶向下传输,对网络进行微调)

以下幾篇都是針對 Deep learning 常用的模型或方法

Deep Learning(深度学习)学习笔记整理系列之(四)

Deep Learning(深度学习)学习笔记整理系列之(五)

簡介 : 稀疏演算法介紹 Sparse Coding

Deep Learning(深度学习)学习笔记整理系列之(六)

簡介 : 限制波兹曼機器  Restricted Boltzmann Machine (RBM)

Deep Learning(深度学习)学习笔记整理系列之(七)

簡介 : 捲積神經網路 Convolutional Neural Networks,大大加快運算速度


最後的總結與展望,附上相關領域專家的資訊

Deep Learning(深度学习)学习笔记整理系列之(八)



2015年10月20日 星期二

[轉貼]深入浅出K-Means算法

這篇來自酷 壳 – CoolShell.cn的博文簡單明瞭的解釋了K-means 分群法的演算機制

有興趣的讀者可以自行前往

K-Means 算法

[MATLAB] Gaussian Mixture Model (GMM) 高斯混合模型

高斯混合模型 Gaussian Mixture Model (GMM)


Gaussian Mixture Model (GMM) 高斯混合模型 常用於影像處理中背景消去(Background Subtraction)中建立影像背景模型。同時也可以應用在樣型識別(Pattern Recognition)以及機器學習(Machine Learning)領域中的分群方法(Clustering)。

常見的背景消去法


最簡單靜態的背景消去方法是事先拍一張背景影像B(X,Y,t),接下來再拍攝相同背景含有物體在內的影像I(X,Y,t),接著再將兩張影像相減,得到所有像素的差值,自行訂立一個閥值(Threshold),若大於閥值者,找出該相差值大於閥值像素與其所在位置,即可找到該物體(前景, Foreground )。

               |I(X,Y,t) - B(X,Y,t)| > Threshold

另一種應用於影片的背景消去方法是利用連續的影像,求出連續影像的平均值,以該平均值訂為背景,再利用上述的背景消方法找出物體。

但是上述的方式有以下優缺點

  • 優點 : 簡單、計算快速
  • 缺點 : 準確性不佳、影像幀數高則需要更多記憶體資源、若影像變動大則沒有一個固定的閥值(Ex. 白天到黑夜)

高斯混合模型 Gaussian Mixture Model (GMM) 


為了解決上述的問題,Stauffer, C. and Grimson, W.E.L 等人在其 Adaptive Background Mixture Models for Real-Time Tracking, Computer Vision and Pattern Recognition (1999) 的論文中提出一種具有適應性的方法來嘗試解決上述缺點。

若將一幀影像視作一個統計模型,例如,灰階影像直方圖即是針對像素灰階值,我們可以將某個灰階值出現的可能性視作一個機率事件,而如此,此即為機率模型。而所謂的機率模型,就是在針對不同幀的影像進行一個統計過程,並由未知數X來求得Y的相關資訊。但是所求得的結果不是一個準確的數值,而是代表例如該像素屬於前景物體像素的機率是多少(符合的機率有多高?),而非該像素是否屬於前景像素(Yes/No 的是非問題)。

而機率模型的好處就在於能夠判讀與操作的空間相對大了許多,而非非黑即白的問題。而在數學理論上,高斯模型能夠透過增加模型的個數以符合(fit)特定的機率分布情形。
(詳細的數學計算流程請參考這兩篇博文 聚类(1)——混合高斯模型 Gaussian Mixture Model 、 漫谈 Clustering (3): Gaussian Mixture Model)

若將自然分布(高斯分布)的概念引入這個問題中,我可以將像素視為同時有好幾個模式存在(Ex. 白天模式、傍晚模式、黑夜模式),及同時有好多個高斯模型(Gaussians)存在,此概念為mixture of adaptive Gaussians。若該像素不符合背景的高斯模型(Background Gaussian),則視作前景。我們可以將影像的分布機率視作K個高斯模型混合再一起(Mixture of Gaussians)

當然,GMM本身也是有優缺點


  • 優點 : 每個像素可以有不同的閥值、閥值可以隨不同帧的影像調整、物體可以成為背景的一部分而不破壞背景
  • 缺點 : 無法應對背景快速變動的光影變化、初始化的高斯模型(Gaussian)相當重要、太多參數需要決定
高斯混合模型的MATLAB實現方法

根據 MathWorks 官網的 vision.ForegroundDetector System object 項目中,得知

detector = vision.ForegroundDetector 這行指令所回傳的是經過 GMM偵測後所得到的前景物




下面是以MATLAB所撰寫的程式,使用的版本為R2014b,謝謝學弟黃博揚提供



%% - - Initail System - ->>
close all;
clear all;
clc;

%% - - Input Video - ->>
video_file = 'D:\20150922\2x2_B3\after_rot\1\canny20151018_4_otsu_canny_roi.avi';
video      = VideoReader(video_file);

% -- Video Parameter Setting -->
frameRate    = round(video.FrameRate);
nb_frame     = get(video, 'numberOfFrames');
duration     = video.Duration; 
resize_ratio = 1;
frame_offset = 0;

% -- Video Save Setting -->
video_save     = 0;                  %控制存檔與否
videoName      = '檔案名稱.avi';
videoExtension = 'Uncompressed AVI'; %檔案格式

% -- GMM Background Substraction Setting -->
trainFrame = fix(frameRate * duration);
initVariance = 10^2;
minRatio = 0.7;
numGauss = 8;
fgDetector = vision.ForegroundDetector('NumTrainingFrames',trainFrame,...
    'MinimumBackgroundRatio',minRatio,'NumGaussians',numGauss,...
    'InitialVariance',initVariance);
%% - - Read First Frame - ->>
frame = read(video,1 + frame_offset);
frame = imresize(frame,resize_ratio);
[h,w,~] = size(frame);

%% - - Initial Display - ->>
figure(1);
fig = imshow(frame,'border','tight');
hold on;

%% - - Run Tracking Program - ->>
for k = 1 : nb_frame - frame_offset
    tic;
    %% - - Read Frame & Pre-processing - ->>
    frame     = read(video,k + frame_offset);
    frame     = imresize(frame,resize_ratio);
    
    %  -- GMM Background Substraction -->
    segmentation = step(fgDetector,frame);  % foregroundMask = step(H,I), I = input image  
    
    %% - - Corner Detection Setting - ->>
    C = corner(frame(:,:,1), method, N);
    
    %% - - Display Image - ->>
    set(fig,'CData',segmentation);          % fig為圖形的握把物件代稱
    drawnow;
    
    %% - - Save Video - ->>
    if video_save == 1;
        FrameSave(k) = getframe(gcf);
    end
    toc;
end

%% - - Save Video - ->>
if video_save == 1
    VideoSave = VideoWriter(videoName,videoExtension);
    VideoSave.FrameRate = frameRate;
    open(VideoSave);
    writeVideo(VideoSave,FrameSave);
    close(VideoSave);
end



/* 載入prettify的autoloader */ /* 載入JQuery */