Tag Archives: OpenCV視覺辨識函式庫

[ 介紹文 ] 2018.12.04- 千呼萬喚終於始出來!!OpenCV 4.0發佈

撰文

Jack Omnixri

圖片

Jack Omnixri

主題圖片

freepik

說明

本文由作者Jack Omnixri授權轉載,特此致謝!原文網址為:http://ai-robot-stsp.tw/forums/topic/opencv-4-0千呼萬喚始出來/

 

有在玩電腦(機器)視覺的朋友,對開源電腦視覺函式庫「OpenCV」一定不陌生。從2000年發展至今已超過十八個年頭,中間歷經多次重大變革及分支,從2.2版開始支援C++,2.4版開始支援CUDA、OpenCL等加速工具,2.4.9版後本來進到3.0版,停止支援C語言只支援C++,但許多使用C語言的伙伴仍不離不棄,繼續將部份新增功能加入,於是劇情就展開成兩條支線,目前已來到2.4.13.6版,後續是否能繼續發展,實在令人擔憂。而3.0.0版於2015年正式推出,加入許多深度學習工具,3.3版後加入了更多深度學習框架及算法,如Caffe、Yolo⋯⋯等等。最近(2018年11月20日)正式推出4.0版更讓人眼睛一亮,在深度學習部份有了重大改革,實在值得花些時間好好研究。

圖1 OpenCV發展史(OmniXRI Jack整理製作)

 

以下就簡單把此次4.0版更新重點做點整理:

  1. 更完整支援C++11,去除大量OpenCV 1.x版留下的C API,要配合CMake 3.5.1之後版本編譯。

  2. 除原有CUDA、OpenCL支援平行演算外,另外新增大量以GPU繪圖加速計算的處理函式庫G-API。

  3. 在深度神經網路(DNN)模組中增加FP16支援,同時加入ONNX框架,使得各種模型能順利加入執行,如AlexNet、Inception v2、Resnet、VGG、Yolo、Tiny Yolo v2⋯⋯等等。

  4. 對DNN的改進,如Mask RCNN、Faster R-CNN。

  5. 在快速QR Code檢測、3D場場建構的Kinect Fusion、高質量密集光流算法也都有重大改進。

 

另外,Intel OpenVINO對OpenCV也是大力支援,同步推出更新版本,可支援更多的模型及算法,包括:

1. 支援低解析度(Int8)推論,以利Intel CPU及未來低階推論用AI晶片。
2. 加強支援TensorFlow、MXNet、ONNX等框架,以及R-FCN、Yolo v3、 OpenPose等模型算法。
3. 增加三種預訓練模型,以利人臉特徵點、人體姿態建立及將影像超解析度等應用。
4. 可下載ResNet-50、ResNet-101、ResNet-152、GoogleNet v3等模型參數。

 

更多預訓練模型可參考:
https://github.com/opencv/open_model_zoo

 

OpenCV 4.0及OpenVINO更完整的釋出說明可參考官網:
https://opencv.org/opencv-4-0-0.html
https://docs.opencv.org/4.0.0/index.html

 

相關文章

[ 影片 ] 2018.11.01- CAVEDU觀點:如何看AI與科技教育(完整版)

拍攝

宗諭

剪輯、後製

怡婷

資料提供

豐智

製作協助

皇甫、鈺莨

主講人

阿吉老師曾吉弘

 

 

 

在這一集的「CAVEDU觀點」中,我們探討的主題是:AI與科技教育

總共有以下幾個重點:

 

  1. CAVEDU如何看AI人工智慧教學?(約開始於0:22)

  2. 科技教學方式一直改變,該怎麼辦?(約開始於2:35)

  3. CAVEDU如何設計課程?(約開始於4:53)

  4. CAVEDU如何在課程中導入AI人工智慧?(約開始於5:50)

  5. CAVEDU如何把AI人工智慧落實在大學、高中課堂上(約開始於6:30)

  6. 使用AI人工智慧進行視覺辨識,和使用OpenCV有何不同?(約開始於7:14)

  7. 設計樹莓派AI無人車的核心理念?(約開始於8:43)

  8. 什麼是邊緣運算?(約開始於9:32)

  9. 為何邊緣運算結合AI相關應用適合教學場域?(約開始於10:32)

  10. Intel Movidius神經運算棒介紹(約開始於10:51)

  11. 人工智慧實務工作坊(AGV)介紹(約開始於12:55)

 

重點相當多,讀者們可以根據自己想觀看的內容,選擇段落:

 

也歡迎大家訂閱我們的YouTube頻道,接收來自教育現場的AI與科技教育的訊息,謝謝。

 

相關文章

[LattePanda] OpenCV視覺辨識人臉追蹤

本文說明如何使用 LattePanda搭配OpenCV視覺辨識函式庫來打造人臉辨識機器人。

作者/攝影 袁佑緣
時間  1小時
成本
  • LattePanda
  • 螢幕
  • 鍵盤
  • 滑鼠
  • 喇叭
  • webcam
難度 * *
材料表
  • LattePanda
  • 螢幕
  • 鍵盤
  • 滑鼠
  • Webcam

 

本文說明如何使用 LattePanda搭配 python語言去使用OpenCV機器視覺函式庫來打造一個人臉辨識機器人,本範例的操作環境將以LattePanda的Windows10為主。

 

1. 軟體準備

安裝Python與相關套件

首先請到Python的網站下載最新版的安裝檔,在這邊要提醒一下Python目前有兩種版本,一個是2.7x版,另一個3.x版。Python 2.7x版是比較舊的版本,同時官方也有發出聲明將不會在繼續更新了,而本篇的範例使用的是新版3.x的Python,所以請注意一下不要選錯囉,以本文為例,最新的版本是3.6.1,如下圖。接著請按照以下步驟進行。

 

請在安裝Python時,將下方Add Python 3.6 to PATH勾選起來,意思是要把Python加入windows作業系統的環境變數內。

 

安裝完成後,為了測試我們的電腦是否能正常呼叫Python,請呼叫您電腦的終端機,windows的使用者請按下快捷鍵win+R便會在左下角顯示執行視窗,接著輸入cmd,這樣一來就會叫出windows的命令提示字元。

 

 

接下來請在上面輸入Python,呼叫Python的互動界面,如果能成功看到>>>的符號,那就代表已經成功叫起Python的界面了,而使用者可以直接在上面輸入Python的相關指令,如果沒有正確顯示這個界面的話,可能是您前面的安裝過程有問題,請重新回到前面的安裝步驟,有可能是您沒有勾選系統變數那個選項,所以windows無從呼叫Python。

接下來請輸入exit()跳出這個Python互動界面,回到windows的命令提示字元。

接下來請輸入pip install numpy,使用Python的套件管理員pip來安裝numpy這個套件。

裝完numpy之後,一樣使用pip來安裝OpenCV套件,請輸入pip install opencv-python

最後請輸入pip install pyserial,安裝在python中用來做Serial溝通的pyserial套件。

準備Python IDE

撰寫Python的程式除了要打code之外,還需要執行的環境,所以筆者在這邊推薦一款非常容易上手的Python IDE,請到以下的網站(http://thonny.org/)下載並安裝Thonny。

 

裝完必要的Python套件之後,我們就要來把Thonny的程式路徑設定成我們電腦系統中預設的Python執行程式。請點選Tools然後再點選Options,進入Thonny的偏好設定。如下圖。

接下來選擇interpreter,也就是Python的直譯器為系統預設的路徑,如下圖。

2.硬體架設

 本範例使用羅技C170的webcam作為辨識人臉的攝影鏡頭,另外為了要能夠追蹤人臉的位置,我們還需要架設一個旋轉平台,如下圖,由底下的小型伺服馬達(MG90)來控制鏡頭對到的方位。且注意到下方的小馬達控制訊號線是接到LattePanda左邊的3Pin接頭,記得靠外側是要接深色的地線喔!

 

 

3.軟體實作

Arduino 程式碼

為了要控制旋轉平台的伺服馬達,我們需要使用LattePanda上的Arduino Leonardo晶片,請打開Arduino IDE並打上以下的程式碼,並上傳到LattePanda上的Arduino端(請記得選對COM port)。

Arduino端的控制動作其實很簡單,它會聽取Serial傳來的字元命令,如果是小寫的字母a或b就會分別左右旋轉一度,進而達到轉動鏡頭的效果,而伺服馬達的控制訊號腳位在本範例中用的是9號腳位,接法如上圖,如果想接其他腳位請記得要改一下Arduino程式碼裡的腳位定義(s.attach(9))。

#include <Servo.h>

Servo s;
int degree = 90;

void setup()
{
    Serial.begin(115200);
    s.attach(9);
}

void loop()
{
    if(Serial.available())
    {
        int cmd = Serial.read();
        if(cmd == 'a')
        {
            degree++;
            if(degree >= 180)
                degree = 180;
            s.write(degree);
        }
        else if(cmd == 'b')
        {
            degree--;
            if(degree <= 0)
                degree = 0;
            s.write(degree);
        }
        else
            Serial.println("Press a/b to turn the camrea!");
    }
}

 

Python 程式碼

前面已經準備好Python會需要用到的函式庫跟IDE了,接下來我們就要來實作最後關鍵的人臉辨識以及追蹤,因為需要用到辨識人臉的模型,請去OpenCV的github網站(https://github.com/opencv/opencv/tree/master/data/haarcascades)下載 haarcascade_frontalface_default.xml與 haarcascade_eye.xml這兩個.xml檔,分別是用來辨識人的臉部與以及眼睛。

程式碼的實做可以拆解成幾個重要的部份,以下就讓我們一步一步的來了解吧!

首先我們會由cv2.VideoCapture(0)來讀取Webcam的影像資訊,並且設定初始的解析度是640×480,接下來在連接埠COM5建立一個Serial通道,用來下指令給Arduino端,以控制鏡頭的方向。

而while迴圈裡面則包含了主要的辨識程式,辨識的方法其實很簡單,就是先把鏡頭每一幀的照片先灰階化,再透過前面下載的臉部及眼部辨識模組套進去(face_cascde和eye_cascade)去做最可能的人臉偵測(這裡使用的方法是取最大/近的臉部面積)。

最後為了要追蹤人臉,我們需要計算出人臉的中心位置(position = x + w/2.0),x是標示人臉方框的 角落x座標,w則是寬度,所以取一半的寬度就會得到人中的x座標位置,接下來我們只要跟我們取的影像中線做比較,然後左右旋轉鏡頭去做追蹤即可,而這調中線的位置則可以從前面設定的解析度640×480來算出,取寬的一半就能得到範例程式中的320了,如果說讀者想要嘗試其他的解析度,請記得也要修改鏡頭追蹤的中線喔!

import cv2
import numpy as np
import serial

face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')

cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
ser = serial.Serial('COM5', 115200)

while True:
    _, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 2, 5)
    if len(faces):
        (x, y, w, h) = max(faces, key=lambda face: face[2]*face[3])
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
        position = x + w/2.0
        print(position)
        if position < 320:
            ser.write(b'a')
        else:
            ser.write(b'b')
        
    cv2.imshow('face', img)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

 

示範影片

 

相關文章: