2017年2月10日 星期五
演算法(2)--使用Numpy.bincount來實作簡單的桶子排序法
會注意到Numpy.bincount()這個函數,其實是在閱讀機器學習的程式碼裡常常出現。常用來
處理類別標籤的向量。它是內建在Python Numpy裡。原文的解釋其實有點難懂,故我把我的心得
記下來,發現它原始設計的概念就是類似桶子排序法的基本概念,是一個很有趣的函數,所以也
特別用它實作一簡單的桶子排序。
理解Numpy.bincount()
numpy.bincount(x, weights=None, minlength=None)
1.假設輸入X=[0,1,2,2,3,4,4],那麼產生bins(桶子)的數量為該X最大值4
再加1=5,於是我們產生了5個bins(桶子)的排序編號為indx0~indx4,
可以視為一向量[indx0,indx1,indx2,indx3,indx4]
2.接著來看如何放原本的資料到這5的桶子(bins,分別indx0~indx4)
原本的輸入X=[0,1,2,2,3,4,4]裡有"一個"資料0,表示要放到indx0桶子的只有一個,
故indx0=1。
接著,原本的輸入X=[0,1,2,2,3,4,4]裡有"一個"資料1,表示要放到indx1桶子的只有
一個,故indx1=1。
接著,原本的輸入X=[0,1,2,2,3,4,4]裡有"兩個"資料2,表示要放到indx2桶子的有
兩個,故indx1=2。
依序放完所以桶子,indx3及 indx4桶子,可以得到indx3=1,indx4=2
故得到輸出結果為[1,1,2,1,2]即:[indx0=1,indx1=1,indx2=2,indx3=1,indx4=2]
使用Python語言程式如下:
EX1:
import numpy as np
X=[0,1,2,2,3,4,4]
print(np.bincount(X))
結果是:[1,1,2,1,2]
EX2:
import numpy as np
X=[0,5,3,2,3,1,4,2,4]
print(np.bincount(X))
結果是:[1,1,2,2,2,1]
注意:輸入的X數值不可以為負,否則報錯
若有實數值,實際測試會被無條件捨去後當整數使用
2016年12月18日 星期日
OPENCV(12)--追蹤顏色物件並利用它來做打磚塊遊戲
這篇文章利用之前所介紹的OPENCV基礎方法來做一個可以追蹤顏色物件的範例。
首先我用3D印表機列印一個綠色的小物件,然後用筆電的內建webcam 抓取即時影像透過OPENCV的處裡來追蹤這個綠色物件的位置。然後可以畫出他移動的軌跡。接著利用這個特點把它應用在經典遊戲打磚塊擋板的控制,當該綠色物件往右移時打磚塊裡的擋板也會跟著往右移,往左移也跟著往左移,提供一種不需透過鍵盤或滑鼠就可以隔空操作擋板的方式,增加遊戲的樂趣。實際操作請觀看底下影片連結。
主要處理步驟如下
1.開啟Web camera 擷取影像
_, frame = cap.read()
2. 高斯模糊
frame = cv2.GaussianBlur(frame,(77,77),0)
3.從BGR轉成HSV 色域
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
4.設定擷取綠色物件範圍
lower_green = np.array([60,50,50])
upper_green = np.array([80,255,255])
mask = cv2.inRange(hsv, lower_green, upper_green)
5.利用找出的mask 跟原圖做 Bitwise-AND
res = cv2.bitwise_and(frame,frame, mask= mask)
6.找出輪廓
cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
7.找出輪廓之後便可以找出其質心或是面積周長
M = cv2.moments(cnt)
<圖一>追蹤物件並劃出軌跡
<圖二>應用在打磚塊遊戲,擋板位置會跟著綠色物件X軸位置而移動
2016年11月17日 星期四
OPENCV(10)--Canny Edge Detection(Canny邊緣檢測)
這篇介紹Canny 邊緣檢測原理,即OPENCV提供的Canny演篹法函式庫並實作一範例程式
可用兩個Trackbar 去調整minVal(T1) ,maxVal(T2)閥值,可以清楚看出minVal ,maxVal閥值對Canny 邊緣的變化影響。
原理:
Canny 邊緣檢測是一種非常流行的邊緣檢測演算法,是 John F.Canny 在
1986 年提出的。它是一個有很多步驟形成的演算法,我們接下來逐步介紹。
Canny邊緣檢測演算法步驟:
Step 1.雜訊去除
由於邊緣檢測很容易受到雜訊影響,所以第一步是使用 5x5 的高斯濾波器 去除雜訊。
Step 2.計算圖像梯度
對平滑後的圖像使用 Sobel 運算元計算水平方向和垂直方向的一階導數(Gx 和 Gy),
根據得到的這兩幅梯度圖(Gx 和 Gy)找到邊界的梯度和方向,公式如下:
2016年11月16日 星期三
OPENCV(9)--Image Gradients(圖像梯度)
這篇文章介紹Image Gradients(圖像梯度),Gradient(梯度)簡單來說就是求導數(微分)。
利用Gradient(梯度)可以找出圖像邊界,通常會將圖像先灰值化,而邊界就存在像素變化差異大的地方。
例如:鄰近連續的黑像素(0)與白像素(255)之間必然存在一邊界,鄰近像素值差異越大,存在的邊界越明顯。可以把鄰近連續的像素值變化看作一函數,而利用Gradient(梯度)便可查知其形成的可能邊界。
Sobel 運算元和 Scharr 運算元
Sobel,Scharr 可求一階或二階導數。
Scharr 其實是Sobel在kernel 核心3X3時的優化。
Sobel 運算元是高斯平滑與微分操作的結合體,所以它的抗雜訊能力很好。
你可以設定求導的方向,x方向或y方向(即對X或Y作偏微分)。也可以設定使用的卷積核的大小ksize)。
如果 ksize=-1,會使用 3x3 的 Scharr 濾波器,它的的效果要 比 3x3 的 Sobel 濾波器好
3x3 的 Scharr 濾波器卷積核如下:
Sobel 濾波器卷積核如下:
Laplacian 運算元
Laplacian 是求二階導數,其找出邊界效果佳,但是對於抗雜訊能力不佳。
可假設其離散實現類似於二階Sobel 導數,事實上,OpenCV 在計算拉普拉斯運算元時直接調用Sobel 算子。計算公式如下:
拉普拉斯濾波器使用的卷積核:
OpenCV 提供了這種不同的梯度濾波器,或者說高通濾波器。Sobel,Scharr 和 Laplacian。
使用到的函數為:cv2.Sobel(),cv2.Schar(),cv2.Laplacian()
下圖為其程式範例結果:
<圖一>Sobel ,Scharr ,Laplacian
2016年11月6日 星期日
人工神經網路(2)--使用Python實作後向傳遞神經網路演算法(Backprogation artificial neature network)
這篇文章介紹後向傳遞神經網路演算法(Backprogation artificial neature network),並使用Python語言實作實現一XOR邏輯功能的多層網路模型。
在底下前一篇文章單一神經元感知器的實作上知道,單一感知器無法實作出具XOR邏輯運算的功能,在這篇會改用多層網路模型並使用後向傳遞神經網路演算法(Backprogation artificial neature network)來實現XOR的邏輯功能。
人工神經網路(1)--使用Python實作perceptron(感知器)
多層神經網路:
多層感知器是有一個或是多個隱含層的神經網路,通常網路包含一個來源神經元的輸入層,至少包含一個計算元的隱含層,以及一個計算神經元的輸出層,輸入號信一層一層的向前傳遞,這動作也稱之為前饋式傳遞神經網路,其模型如下圖<一>所示
多層神經網路,各層多有其特定的功能,輸入層為接受外部的輸入信號,輸出層從隱含層接受輸出信號,為整個網路建立輸出形樣類別。
隱含層的神經元發現特徵,其權重表示了其輸入型樣中的特徵,輸出層再根據這些特徵確定輸出型樣。
利用一個隱含層,可以表示輸入信號的任何連續ˋ函數,利用兩個隱含層甚至可以表示不連續的函數,換言之,多個隱含層也可以解決單一感知器只能做單一線性分割的問題。
<圖一>有兩個隱含層的多層感知器神經網路
多層神經網路如何學習?
最常用的是後向傳遞神經網路演算法,在1969年被首次提出(Bryson和Ho),但是由於對計算要求過於嚴苛而被忽略,直到20世紀80年代這種演算法才又被重新重視。
多層網路的學習過程與感知器類似,提供輸入信號經過權重調節加總,計算出實際輸出,跟期望輸出比較算出誤差,再藉由調整權重來減小收斂誤差。
在感知器中,每個輸入Xi僅有一個相對應的權重Wi和一個輸出Y,但在多層神經網路中,每一個權重對每一個輸出都有貢獻,而每一個輸入信號Xi,連接到各隱含層的神經元都有相對應的權重Wij,每個隱含層輸出也會有相對應的Wjk連結到每個輸出Yk,如下<圖二>所示:
其中i為輸入層第i個輸入,j表示隱含層第j個神經元感知器,k為輸出層第k個輸出。
在後向傳遞網路中,學習演算法過程分為兩個階段,第一階段與感知器前饋式演算雷同,信號由輸入端向隱含層一層一層傳遞直到輸出層,如果實際輸出與預期的輸出不同,則計算其誤差,而第二階段則是將此誤差反向從輸出端經過隱含層再傳遞回輸入層,在這過程則同時調整其權重Wjk和Wij。反覆這樣的動作直到誤差收斂到一定的滿足條件值。
<圖二>三層後向傳遞網路
2016年11月5日 星期六
人工神經網路(1)--使用Python實作perceptron(感知器)
這篇文章介紹人工神經網路最基本的單元,perceptron(感知器)。使用最簡化的數學公式
說明,並利用Python語言實作單一感知器and 及or 的邏輯功能.
1943年,Warren McCulloch 和Walter Pitts 提出了一簡單計算元素的神經元,這個思想現在仍然是大多數人工神經網路的基礎.
如下<圖一>神經元接收了來自輸入連結的一些輸入信號(X1......Xn),這些輸入信號可以是原始資料或是其他神經元的輸出信號。輸出信號則可以是最終答案,也可以是其他神經元的輸入信號。
神經元計算帶權重的輸入信號和並將結果和臨界值θ比較,如果網路淨輸入比臨界值低,則神經元輸出0,反之,如果網路淨輸入比臨界值低,則神經元輸出1。
<圖一>典型的神經元
換言之,神經元使用下面的轉移或激勵函數.
其中X是神經元的淨權重輸入,Xi 是"輸入i"的值,Wi是"輸入i"的權重,
n是神經元輸入數量,Y是神經元的輸出。
2016年11月1日 星期二
OPENCV(6)--Trackbar(軌道桿)
這篇介紹OPENCV提供的另一個基本工具Trackbar(軌道桿).可以用滑鼠拖拉改變特定的數值.
如下圖,拖拉 R,G,B Trackbar(軌道桿) 即可以更改,RGB顏色,範圍可以設定為0~255之間的數值.
Opencv 並沒有提供如Checkbox 這樣的工具,但是只要將Trackbar(軌道桿) 範圍值成0~1 ,也可以權當如checkbox的功能,當然如果需要更多一些GUI介面的元件,在Python 裡也可以利用別人提供的套件,如Tkinter ,或是PyQT 之類的.也可以跟OPENCV 套件整合在一起由Python實現.這就是Python 語言的便利性.
<圖一>當切換ON/OFF Trackbar(軌道桿) 在ON 位置時, 拉動R,G,B Trackbar(軌道桿)可以及時改變顏色
2016年10月27日 星期四
OPENCV(5)--Drawing
這篇介紹OPENCV提供的的基本畫圖工具.主要是可以應用在影像辨識出輪廓或特徵時
圈選或標註之用.
<圖1>
首先使用Numpy 產生一黑底圖矩陣img , 512x512 像素當畫布
程式如下,3為channel (B,G,R) =(0,0,0)
img = np.zeros((512,512,3), np.uint8)
1.畫直線:
OENCV 函式: cv2.line(img,(20,20),(500,500),(255,0,0),5)
*1. 畫在img 圖像
*2. 給定對角兩點(20,20),(500,500)
*3. 給定線條顏色(255,0,0) 為(B,G,R) 所以為一藍色線
*4. 5:為設定的線寬,預設為1 ,值越大線條越粗
2.畫矩形:
OENCV 函式: cv2.rectangle(img,(25,25),(400,400),(0,255,0),4)
*1. 畫在img 圖像
*2. 給定對角兩點(25,25),(400,400)
*3. 給定線條顏色(0,255,0)為(B,G,R) 所以為一綠色線
*4. 4:為設定的線寬,預設為1 ,值越大線條越粗
2016年10月21日 星期五
OPENCV(2)--Capture Video from Camera
這篇介紹如何透過OPENCV 開啟電腦上的Webcam 擷取影像並做灰階化後及時同步顯示影像.
video可以看成是一段時間內幾十張單一影像的連續呈現,如30FPS(Frames per second) 就是每秒30張影像,因為人眼視覺暫留的作用,所以在我們看起來它就變成了動畫.所以camera擷取進的影像也是一張一張的圖片,而我們也可以直接對這一張張的影像圖片連續做處裡如灰階化.所以在OPENCV處理video的影像跟單一張圖片的影像並沒有區別.
底下圖(1) 左邊即為webcam讀取的原始影像,右邊為灰階化後的即時影像
<圖1>
從程式碼中觀看,frame即為從webcam 讀取的單張影像,而只要連續對讀取的frame做處理即可
顯示即時處理後的影像結果.當然電腦的CPU/GPU處理的速度,會直接影響處理效率.
一般使用預設的的640x480 來做處理即可,即使未來對影像特徵值得處理也不需太高解析度的影像,甚至更小解析度32x32 就夠了.
要在OPENCV裡使用Webcam 只要底下一行程式即可
預設電腦的webcam 代號0
cap = cv2.VideoCapture(0)
2016年10月19日 星期三
OPENCV(1 )--How to install OPENCV in Python
This page show how to install OPENCV in Python.
A.In windows
1.先下載及安裝Python 2.7 or 3.x
https://www.python.org/downloads/
雖然很多人還是愛用python2.7版,但是我還是建議安裝Python3.x 版
安裝時記得將底下add python 3.5 to path 打勾,至於安路徑目錄可以自行修改到
任一磁碟都可以.
安裝好之後,直接開啟Dos 命令視窗.直接打python 按Enter ,應該會出現如下畫面
表示python 安裝成功,
2016年9月24日 星期六
使用中文語音下令機器人去控制家裡的電燈
2016年9月11日 星期日
ESP8266 WIFI(6) -Using Python to control LED ON/OFF
這篇介紹如何用Python 語言透過ESP8266 Wifi連線去控制Arduino 端的LED.
<圖一概念圖>
<圖二> 下圖是Python GUI 程式執行時,及Arduino 端LED實際運作狀態.
當按下分別對應的LED按鈕後,LED即會 ON/OFF 動作.
訂閱:
文章 (Atom)























