顯示具有 機器人, Arduino 標籤的文章。 顯示所有文章
顯示具有 機器人, Arduino 標籤的文章。 顯示所有文章

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]裡有"一個"資料,表示要放到indx1桶子的只有
 一個,故indx1=1。
 接著,原本的輸入X=[0,1,2,2,3,4,4]裡有"兩個"資料,表示要放到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日 星期六

使用中文語音下令機器人去控制家裡的電燈



      使用中文語音下達指令給機器人,讓機器人去控制家裡的電燈.
原本的範例也可以直接利用手機平板或是電腦直接做控制家裡的電燈,這次利用
Google語音辨識的功能,讓機器人去完成該指令動作,一來是省去了必須另外打開手機電腦
的麻煩,二來是讓機器人比較像是家裡一份子的感覺. 是機器人與物聯網概念的結合,其運用也可以用在其他家電如電視,電風扇,冷氣,電子鎖等等.

<圖一>系統概念圖


<圖二>阿布拉機機器人



<圖三>辨識語音輸出文字



影片DEMO:

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 動作.