來源:古月居
對于人類來講,90%以上的信息都是通過視覺獲取的,眼睛就是獲取大量視覺信息的傳感器,然后再交給大腦這個“處理器”進(jìn)行處理,之后我們才能理解外部環(huán)境,建立世界觀。
如何讓機(jī)器人也能理解外部環(huán)境呢,我們首先想到的就是給機(jī)器人也安裝一對眼睛,是不是就可以和人類一樣來理解世界了呢?但是這個過程可比人類復(fù)雜的多,本講我們就來學(xué)習(xí)機(jī)器人中的視覺處理技術(shù)。
機(jī)器視覺這么火,那么它的基本原理是什么樣的呢?我們先來了解一下。
機(jī)器視覺原理
?機(jī)器視覺:用計(jì)算機(jī)來模擬人的視覺功能,但并不僅僅是人眼的簡單延伸,更重要的是具有人腦的一部分功能一一從客觀事物的圖像中提取信息,進(jìn)行處理并加以理解,最終用于實(shí)際檢測、測量和控制;
?交叉學(xué)科:涉及人工智能、神經(jīng)生物學(xué)、物理學(xué)、計(jì)算機(jī)科學(xué)、圖像處理、模式識別等諸多領(lǐng)域;
?關(guān)鍵技術(shù):圖像采集與處理、模式識別、機(jī)器學(xué)習(xí)…;
?傳感器:單目視覺、雙目立體視覺、多目視覺、全景視覺等;
人類視覺擅長于對復(fù)雜、非結(jié)構(gòu)化的場景進(jìn)行定性解釋,但機(jī)器視覺憑借速度、精度和可重復(fù)性等優(yōu)勢,非常適合對結(jié)構(gòu)化場景進(jìn)行定量測量。
一般來講,典型的機(jī)器視覺系統(tǒng)可以分為如圖1所示的三個部分:圖像采集、圖像分析和控制輸出。
圖1 典型機(jī)器視覺系統(tǒng)的三個部分
圖像采集注重對原始光學(xué)信號的采樣,是整個視覺系統(tǒng)的傳感部分,核心是相機(jī)和相關(guān)的配件。
其中光源用于照明待檢測的物體,并突顯其特征,便于讓相機(jī)能夠更好的捕捉圖像。光源是影響機(jī)器視覺系統(tǒng)成像質(zhì)量的重要因素,好的光源和照明效果對機(jī)器視覺判斷影響很大。當(dāng)前,機(jī)器視覺的光源已經(jīng)突破人眼的可見光范圍,其光譜范圍跨越紅外光(IR)、可見光、紫外光(UV)乃至X射線波段,可實(shí)現(xiàn)更精細(xì)和更廣泛的檢測范圍,以及特殊成像需求。
相機(jī)被喻為機(jī)器視覺系統(tǒng)的“眼睛”,承擔(dān)著圖像信息采集的重要任務(wù)。圖像傳感器又是相機(jī)的核心元器件,主要有CCD和CMOS兩種類型,其工作原理是將相機(jī)鏡頭接收到的光學(xué)信號轉(zhuǎn)化成數(shù)字信號。選擇合適的相機(jī)是機(jī)器視覺系統(tǒng)設(shè)計(jì)的重要環(huán)節(jié),不僅直接決定了采集圖像的質(zhì)量和速度,同時也與整個系統(tǒng)的運(yùn)行模式相關(guān)。
圖像處理系統(tǒng)接收到相機(jī)傳來的數(shù)字圖像之后,通過各種軟件算法進(jìn)行圖像特征提取、特征分析和數(shù)據(jù)標(biāo)定,最后進(jìn)行判斷。這是各種視覺算法研究最為集中的部分,從傳統(tǒng)的模式識別算法,到當(dāng)前熱門的各種機(jī)器學(xué)習(xí)方法,都是為了更好的讓機(jī)器理解環(huán)境。
對于人來講,識別某一個物體是蘋果似乎理所當(dāng)然,但是對于機(jī)器人來講,就需要提取各種各樣不同種類、顏色、形狀的蘋果特征,然后訓(xùn)練得到一個蘋果的“模型”,再通過這個模型對實(shí)時圖像做匹配,從而分析面前這個東西到底是不是蘋果。
在機(jī)器人系統(tǒng)中,視覺識別的結(jié)果最終要和機(jī)器人的某些行為綁定,也就是第三個部分——控制輸出,包含I/O接口、運(yùn)動控制、可視化顯示等。當(dāng)圖像處理系統(tǒng)完成圖像分析后,將判斷的結(jié)果發(fā)給機(jī)器人控制系統(tǒng),接下來機(jī)器人完成運(yùn)動控制。比如視覺識別到了抓取目標(biāo)的位置,通過IO口控制夾爪完成抓取和放置,過程中識別的結(jié)果和運(yùn)動的狀態(tài),都可以在上位機(jī)中顯示,方便我們監(jiān)控。
圖2 典型機(jī)器視覺系統(tǒng)的三個部分
開源軟件或框架
就機(jī)器視覺而言,在這三個部分中,圖像分析占據(jù)了絕對的 核心,涉及的方法、使用的各種開源軟件或者框架非常多,我們來了解最為常用的幾個。
OpenCV
?由英特爾公司于1999年啟動,致力于CPU密集型的任務(wù);
?推進(jìn)機(jī)器視覺的研究,提供一套開源且優(yōu)化的基礎(chǔ)庫,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法;
?提供一個共同的基礎(chǔ)庫,使得開發(fā)人員的代碼更容易閱讀和轉(zhuǎn)讓,促進(jìn)了知識的傳播;
?透過提供不需要開源或免費(fèi)的軟件許可( BSD ),促進(jìn)商業(yè)應(yīng)用軟件的開發(fā);
?由一系列C函數(shù)和少量C++類構(gòu)成,同時提供C++、Python、Ruby、MATLAB、C#、GO等語言的接口。
OpenCV這個名稱很多人應(yīng)該聽說過,這是機(jī)器視覺領(lǐng)域最為知名的開源軟件之一。
OpenCV主要使用C/C++語言編寫,執(zhí)行效率較高,致力于真實(shí)世界的實(shí)時應(yīng)用。OpenCV實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面很多通用算法,這樣我們在開發(fā)視覺應(yīng)用的時候,就不需要重新去造輪子,而是基于這些基礎(chǔ)庫,專注自己應(yīng)用的優(yōu)化,同時大家的基礎(chǔ)平臺一致,在知識傳播的時候也更加方便,只要你看得懂OpenCV的函數(shù),就可以很快熟悉別人用OpenCV寫的代碼,大家交流起來非常方便。
和機(jī)器人操作系統(tǒng)一樣,一款可以快速傳播的開源軟件,一般都會選擇相對開放的許可證,OpenCV主要采用BSD許可證,我們基于OpenCV寫的代碼,可以對原生庫做修改,不用開源,還可以商業(yè)化應(yīng)用。OpenCV目前支持的編程語言也非常多,無論你熟悉哪一種,都可以調(diào)用OpenCV快速開始視覺開發(fā),比如C ++,Python,Java、MATLAB等語言,而且還支持Windows,Linux,Android和Mac OS等操作系統(tǒng)。
OpenCV中提供的功能非常多,我們在后續(xù)的內(nèi)容中,會給大家介紹一些基礎(chǔ)的圖像處理方法,大家如果想要深入研究,還可以網(wǎng)上搜索相關(guān)的內(nèi)容。
?Google在2015年發(fā)布的機(jī)器學(xué)習(xí)平臺,采用數(shù)據(jù)流圖,架構(gòu)靈活,用于數(shù)值計(jì)算的開源軟件庫;
?節(jié)點(diǎn)在圖中表示數(shù)學(xué)操作,線表示在節(jié)點(diǎn)間相互聯(lián)系的多維數(shù)據(jù)數(shù)組,即張量(tensor);
TensorFlow的整體技術(shù)框架為兩個部分:前端系統(tǒng)提供編程模型,負(fù)責(zé)構(gòu)造計(jì)算圖;后端系統(tǒng)提供運(yùn)行時環(huán)境,負(fù)責(zé)執(zhí)行計(jì)算圖。
圖4 TensorFlow整體技術(shù)框架
這里的計(jì)算圖大家應(yīng)該似曾相識,沒錯,機(jī)器人操作系統(tǒng)ROS的技術(shù)框架也是用到了計(jì)算圖。在TensorFlow的計(jì)算圖中,數(shù)據(jù)流是重點(diǎn),數(shù)據(jù)在這個圖中以張量(tensor)的形式存在,節(jié)點(diǎn)在圖中表示數(shù)學(xué)操作,邊表示節(jié)點(diǎn)間數(shù)據(jù)的流向。在機(jī)器學(xué)習(xí)的訓(xùn)練過程中,張量——也就是數(shù)據(jù),會不斷從數(shù)據(jù)流圖中的一個節(jié)點(diǎn)流向(flow)另外一個節(jié)點(diǎn),從而完成一系列數(shù)學(xué)運(yùn)算,最終得到結(jié)果。這就是TensorFlow名稱的由來,正如如圖5所示的這張圖一樣,它生動形象地描述了復(fù)雜數(shù)據(jù)結(jié)構(gòu)在人工神經(jīng)網(wǎng)中的流動、傳輸、分析和處理模式。
圖5 TensorFlow整體技術(shù)框架
為了便于數(shù)據(jù)的調(diào)試和可視化,TensorFlow還提供了一套可視化工具——TensorBoard,用戶可以很容易看到數(shù)據(jù)流動的每一個部分,同時看到數(shù)據(jù)訓(xùn)練或者測試的效果。比如如圖9-8所示中,經(jīng)過前邊神經(jīng)網(wǎng)絡(luò)的計(jì)算,藍(lán)色和黃色兩種數(shù)據(jù)被逐漸識別并區(qū)分開來。
圖6 TensorBoard
TensorFlow跨平臺性好,可以在Linux、MacOS、Windows、Android等系統(tǒng)下運(yùn)行,還可以在眾多計(jì)算機(jī)中分布式運(yùn)行,回想一下多年前戰(zhàn)勝人類的圍棋AI——AlphaGo,其后臺在上萬臺計(jì)算機(jī)中、基于TensorFlow搭建的“最強(qiáng)大腦”。
當(dāng)然,TensorFlow也有不足之處,主要表現(xiàn)在它的代碼比較底層,需要用戶編寫大量的應(yīng)用代碼,而且很多相似的功能,用戶還不得不“重新造輪子”。
此外,TensorFlow是Google資深工程師開發(fā)而來,使用了不少高深的技術(shù)和概念,對于大眾開發(fā)者來講,上手學(xué)習(xí)的門檻就有點(diǎn)高,熟悉的人可以用的爐火純青,做出很炫酷的效果,不熟悉的人上手就得花費(fèi)很長時間。對此,TensorFlow官方也提供了一些開源例程和不少訓(xùn)練好的模型,其中之一就是Tensorflow Object Detection API,實(shí)現(xiàn)了近年來多種優(yōu)秀的深度卷積神經(jīng)網(wǎng)絡(luò),可以幫助開發(fā)者輕松構(gòu)建、訓(xùn)練和部署對象檢測模型。
如圖7所示,前兩個是TensorFlow官方例程中的目標(biāo)檢測演示,可以在圖片中識別出小狗、人、風(fēng)箏等目標(biāo),在這套開源的框架中,官方還附帶了80多種已經(jīng)訓(xùn)練好的目標(biāo)模型,包含了我們生活中常見的物品,這兩個圖片就是使用官方模型識別的效果,比如這里識別到的碗、西蘭花,還有這里的杯子、桌子、瓶子等,都可以較為穩(wěn)定的識別到。不過模型之外的物品就難以識別了。
圖7 TensorFlow Object Detection API
想要使用這套框架識別其他目標(biāo)怎么辦,沒問題,我們可以針對想要識別的目標(biāo)采樣并標(biāo)注,再放到網(wǎng)絡(luò)中訓(xùn)練,就可以得到自己的模型庫了,接下來就可以完成我們想要的識別任務(wù)。比如這里識別兩位明星的效果,就是網(wǎng)友使用TensorFlow目標(biāo)檢測方法實(shí)現(xiàn)的。
總之Tensorflow Object Detection API,為我們演示了一整套TensorFlow工程應(yīng)用的流程,按照這個流程,我們就可以快速開發(fā)視覺目標(biāo)檢測了。
PyTorch
PyTorch:
?Facebook在2017年發(fā)布的一個開源的Python機(jī)器學(xué)習(xí)庫,底層由C++實(shí)現(xiàn);
?不僅能夠?qū)崿F(xiàn)強(qiáng)大的GPU加速,同時還支持動態(tài)神經(jīng)網(wǎng)絡(luò);
?簡潔高效,追求最少的封裝,符合人類思維,讓用戶盡可能地專注于實(shí)現(xiàn)自己的想法;
?除了Facebook外,它已經(jīng)被Twitter、CMU和Salesforce等機(jī)構(gòu)采用;
之前我們有提到過TensorFlow入門門檻較高,除此之外,TensorFlow中的計(jì)算圖是靜態(tài)的,也就是說我們要先創(chuàng)建好計(jì)算圖的結(jié)構(gòu),然后才能訓(xùn)練,過程中想要改變網(wǎng)絡(luò)模型是比較困難的。
2017年初,F(xiàn)acebook發(fā)布了另外一個開源的機(jī)器學(xué)習(xí)庫——PyTorch,雖然底層也是用C++實(shí)現(xiàn)的,但是上層主要支持Python。如果用編程語言做一個類比,Tensorflow需要先構(gòu)建計(jì)算圖,這就類似C語言,運(yùn)行之前需要先進(jìn)行編譯,但是可以適配不同的硬件平臺,效率較高;而PyTorch類似Python語言,可以動態(tài)構(gòu)建圖結(jié)構(gòu),簡單靈活,但是功能的全面性和跨平臺性稍差。
除此之外,PyTorch的設(shè)計(jì)追求最少的封裝,盡量符合人類的思維模式,避免重復(fù)造輪子,讓用戶盡可能地專注于實(shí)現(xiàn)自己的想法,所思即所得,不需要考慮太多關(guān)于框架本身的束縛。不像TensorFlow中張量、圖、操作、變量等抽象的概念,PyTorch精簡了很多,源碼也只有TensorFlow的十分之一左右,更少的抽象、更直觀的設(shè)計(jì),使得PyTorch的源碼十分易于閱讀,也更容易進(jìn)行調(diào)試,就像Python代碼一樣。
總結(jié)而言,TensorFlow和PyTorch都是優(yōu)秀的機(jī)器學(xué)習(xí)開源框架,兩者的功能類似,TensorFlow跨平臺性能更好,PyTorch靈活易用性更好,兩者都有較為廣泛的應(yīng)用,而且作為機(jī)器學(xué)習(xí)的計(jì)算平臺,兩者不僅都可以用于機(jī)器視覺識別,還可以用于自然語言理解、運(yùn)動控制等諸多領(lǐng)域。
圖8 PyTorch
YOLO
回到具體的目標(biāo)識別。以自動駕駛為例,人們看到圖像以后,可以立即識別其中的對象以及所在的位置。這讓我們能夠在幾乎無意識的情況下完成復(fù)雜的任務(wù),比如躲避行人。
因此,自動駕駛的訓(xùn)練需要類似水平的反應(yīng)能力和準(zhǔn)確性。這樣的系統(tǒng)必須能夠分析實(shí)時視頻中的道路,并且能夠在確定路徑之前,檢測各種類型的對象及其在現(xiàn)實(shí)中的位置。
YOLO就是當(dāng)前最為熱門的一種實(shí)時目標(biāo)檢測系統(tǒng),在2015年提出,全稱是You only look once,看一眼就能夠識別出來,可見實(shí)時性對YOLO是至關(guān)重要的指標(biāo)。簡單介紹下YOLO的算法流程,它將對象檢測重新定義為一個回歸問題,運(yùn)用單個卷積神經(jīng)網(wǎng)絡(luò)(CNN) ,將圖像分成網(wǎng)格,并預(yù)測每個網(wǎng)格的對象概率和邊界框。
以一個100x100的圖像為例,Yolo的CNN網(wǎng)絡(luò)將輸入的圖片分割成7x7的網(wǎng)格,然后每個網(wǎng)格負(fù)責(zé)去檢測那些中心點(diǎn)落在該格子內(nèi)的目標(biāo),比如如圖9所示,小狗這個目標(biāo)的中心點(diǎn)在左下角的網(wǎng)格中,那該網(wǎng)格就負(fù)責(zé)預(yù)測狗這個對象。
每個網(wǎng)格中將有多個邊界框,在訓(xùn)練時,我們希望每個對象只有一個邊界框,比如最終只有一個邊界框把這只狗包起來。因此,我們根據(jù)哪個邊界框與之前標(biāo)注的重疊度最高,預(yù)測對象的位置和概率。
最終包圍對象的邊界框,就是識別的結(jié)果,使用四個描述符進(jìn)行說明:
1.邊界框的中心位置
2.邊界框的高度
3.邊界框的寬度
4.識別到對象所屬的類
這樣就完成了對目標(biāo)的實(shí)時檢測,拿到目標(biāo)的信息之后,就可以進(jìn)行后續(xù)的機(jī)器人行為控制了。YOLO識別的速度非???,它能夠處理實(shí)時視頻流,比如車輛行駛的動態(tài)監(jiān)測、自然環(huán)境中的目標(biāo)識別,有著非常廣泛的應(yīng)用價值。
以上就是當(dāng)前較為熱門的機(jī)器學(xué)習(xí)和目標(biāo)檢測框架,用于機(jī)器視覺的開源軟件還有很多,有興趣可以繼續(xù)探索補(bǔ)充。
審核編輯:湯梓紅
-
傳感器
+關(guān)注
關(guān)注
2566文章
53008瀏覽量
767507 -
機(jī)器視覺
+關(guān)注
關(guān)注
163文章
4597瀏覽量
122912 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8503瀏覽量
134628 -
OpenCV
+關(guān)注
關(guān)注
32文章
642瀏覽量
42908
原文標(biāo)題:機(jī)器視覺原理及常用工具庫
文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
評論