?
1 計算機視覺
1.1 計算機視覺概述
計算機視覺(Computer Vision)又稱機器視覺(Machine Vision),是一門讓機器學會如何去“看”的學科,是深度學習技術的一個重要應用領域,被廣泛應用到安防、工業質檢和自動駕駛等場景。具體的說,就是讓機器去識別攝像機拍攝的圖片或視頻中的物體,檢測出物體所在的位置,并對目標物體進行跟蹤,從而理解并描述出圖片或視頻里的場景和故事,以此來模擬人腦視覺系統。因此,計算機視覺也通常被叫做機器視覺,其目的是建立能夠從圖像或者視頻中“感知”信息的人工系統。
計算機視覺的發展歷程要從生物視覺講起。對于生物視覺的起源,目前學術界尚沒有形成定論。有研究者認為最早的生物視覺形成于距今約7億年前的水母之中,也有研究者認為生物視覺產生于距今約5億年前寒武紀【1, 2】。寒武紀生物大爆發的原因一直是個未解之謎,不過可以肯定的是在寒武紀動物具有了視覺能力,捕食者可以更容易地發現獵物,被捕食者也可以更早的發現天敵的位置。視覺能力加劇了獵手和獵物之間的博弈,也催生出更加激烈的生存演化規則。視覺系統的形成有力地推動了食物鏈的演化,加速了生物進化過程,是生物發展史上重要的里程碑。經過幾億年的演化,目前人類的視覺系統已經具備非常高的復雜度和強大的功能,人腦中神經元數目達到了1000億個,這些神經元通過網絡互相連接,這樣龐大的視覺神經網絡使得我們可以很輕松的觀察周圍的世界,如?圖1?所示。
?
圖1:人類視覺感知
1.2 計算機視覺應用場景
計算機視覺技術經過幾十年的發展,已經在交通(車牌識別、道路違章抓拍)、安防(人臉閘機、小區監控)、金融(刷臉支付、柜臺的自動票據識別)、醫療(醫療影像診斷)、工業生產(產品缺陷自動檢測)等多個領域應用,影響或正在改變人們的日常生活和工業生產方式。未來,隨著技術的不斷演進,必將涌現出更多的產品和應用,為我們的生活創造更大的便利和更廣闊的機會。
?
圖2:計算機視覺技術在各領域的應用
1.3 計算機視覺任務的挑戰
對人類來說,識別貓和狗是件非常容易的事。但對計算機來說,即使是一個精通編程的高手,也很難輕松寫出具有通用性的程序(比如:假設程序認為體型大的是狗,體型小的是貓,但由于拍攝角度不同,可能一張圖片上貓占據的像素比狗還多)。計算機視覺任務在許多方面都具有挑戰性,物體外觀和所處環境往往變化很大,目標被遮擋、目標尺寸變化、目標變形、背景嘈雜、環境光照變化。
除此之外,計算機視覺任務還面臨數據量有限、數據類別不均衡、速度實時需求等挑戰。
2 常見的計算機視覺任務簡介和基礎概念
計算機視覺任務依賴于圖像特征(圖像信息),圖像特征的質量在很大程度上決定了視覺系統的性能。傳統方法通常采用SIFT、HOG等算法提取圖像特征,再利用SVM等機器學習算法對這些特征進一步處理來解決視覺任務。行人檢測就是判斷圖像或視頻序列中是否存在行人并給予精確定位,最早采用的方法是HOG特征提取+SVM分類器,檢測流程如下:
利用滑動窗口對整張圖像進行遍歷,獲得候選區域
提取候選區域的HOG特征
利用SVM分類器對特征圖進行分類(判斷是否是人)
使用滑動窗口會出現重復區域,利用NMS(非極大值)對重復的區域進行過濾
分類的結果強依賴于手工特征提取方法,往往只有經驗豐富的研究者才能完成。
在這種背景下,基于神經網絡的特征提取方法應運而生。Yann LeCun是1998年第一次將卷積神經網絡應用到圖像識別領域的,其主要邏輯是使用卷積神經網絡提取圖像特征,并對圖像所屬類別進行預測,通過訓練數據不斷調整網絡參數,最終形成一套能自動提取圖像特征并對這些特征進行分類的網絡LeNet[1]。這一方法在手寫數字識別任務上取得了極大的成功,但在接下來的時間里,卻沒有得到很好的發展。其主要原因一方面是數據集不完善,只能處理簡單任務,在大尺寸的數據上容易發生過擬合;另一方面是硬件瓶頸,網絡模型復雜時,計算速度會特別慢。
2012年Alex Krizhevsky等人在提出了AlexNet[2], 并應用在大尺寸圖片數據集ImageNet上,獲得2012年ImageNet比賽冠軍,極大的推動了卷積神經網絡在計算機視覺領域的發展。
如?圖所示。
?
圖5:早期的卷積神經網絡處理圖像任務示意
全連接:也稱為多層感知機。
卷積:在卷積神經網絡中,卷積層的實現方式是數學中定義的互相關運算。
池化:池化是使用某一位置的相鄰輸出的總體統計特征代替網絡在該位置的輸出。
dropout:是深度學習中一種常用的抑制過擬合的方法,通過隨機刪除一部分神經元。
3 常見的計算機視覺任務快速實踐
目前,隨著互聯網技術的不斷進步,數據量呈現大規模的增長,越來越豐富的數據集不斷涌現。另外,得益于硬件能力的提升,計算機的算力也越來越強大。不斷有研究者將新的模型和算法應用到計算機視覺領域。由此催生了越來越豐富的模型結構和更加準確的精度,同時計算機視覺所處理的問題也越來越豐富,包括分類、檢測、分割、場景描述、圖像生成和風格變換等,甚至還不僅僅局限于2維圖片,包括視頻處理技術和3D視覺等,應用的領域也越來越廣泛。目前主流的計算機視覺任務,主要包括圖像分類、目標檢測、圖像分割、OCR、視頻分析和圖像生成等。接下來我們介紹每個任務,并通過PaddleHub工具快速進行實踐。
首先安裝PaddleHub:
In [?]
!pip install paddlehub --upgrade -i https://mirror.baidu.com/pypi/simple
通過以下指令導入依賴包。
In [1]
import paddlehub as hub import cv2 from PIL import Image import matplotlib.pyplot as plt %matplotlib inline
3.1 圖像分類
圖像分類利用計算機對圖像進行定量分析,把圖像或圖像中的像元或區域劃分為若干個類別中的某一種。
圖像分類是計算機視覺中重要的基本問題,也是圖像檢測、圖像分割、物體跟蹤、行為分析等其他高層視覺任務的基礎,在很多領域有廣泛應用,包括安防領域的人臉識別和智能視頻分析等,交通領域的交通場景識別,互聯網領域基于內容的圖像檢索和相冊自動歸類,醫學領域的圖像識別等。
我們通過第一章講解的PaddleHub快速實現圖像分類,使用resnet50_vd_dishes模型識別如下美食圖片,更多模型及實現請參考PaddleHub模型庫
In [22]
classifier = hub.Module(name="resnet50_vd_dishes") result = classifier.classification(images=[cv2.imread('imgs/test1.jpg')]) print('result:{}'.format(result))
[2022-06-28 1755,454] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
result:[{'白灼蝦': 0.4448080360889435}]
上面介紹了ResNet模型實現了美食分類,除此之外,圖像分類還包含豐富的模型,主要分為CNN骨干網絡模型和Transformer骨干網絡模型,每一類又分為部署到服務器端的高精度模型和部署到手機等移動端平臺的輕量級系列模型,具有更快的預測速度,如?圖8?所示:
?
圖:圖像分類算法
注:如果想了解更多分類模型細節,請參考圖像分類開發套件PaddleClas
3.2 目標檢測
對計算機而言,能夠“看到”的是圖像被編碼之后的數字,但它很難理解高層語義概念,比如圖像或者視頻幀中出現的目標是人還是物體,更無法定位目標出現在圖像中哪個區域。目標檢測的主要目的是讓計算機可以自動識別圖片或者視頻幀中所有目標的類別,并在該目標周圍繪制邊界框,標示出每個目標的位置。目標檢測應用場景覆蓋廣泛,如安全帽檢測、火災煙霧檢測、人員摔倒檢測、電瓶車進電梯檢測等等。
我們使用PaddleHub檢測模型yolov3_darknet53_vehicles進行車輛檢測。
In [24]
vehicles_detector = hub.Module(name="yolov3_darknet53_vehicles") result = vehicles_detector.object_detection(images=[cv2.imread('imgs/test2.jpg')], visualization=True) # 結果保存在'yolov3_vehicles_detect_output/'目錄,可以觀察可視化結果 img = Image.open(result[0]['save_path']) plt.figure(figsize=(15,8)) plt.imshow(img) plt.show()
[2022-06-28 1517,573] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
上面使用單階段目標檢測模型YOLOv3實現了車輛檢測,目前目標檢測主要分為Anchor based(兩階段和單階段)、Anchor free模型、Transformer系列如?圖?所示:
?
圖:目標檢測算法
其中Anchor是預先設定好比例的一組候選框集合,Anchor based方法就是使用Anchor提取候選目標框,在特征圖上的每一個點對Anchor進行分類和回歸。兩階段模型表示模型分為兩個階段,第一個階段使用anchor回歸候選目標框,第二階段使用候選目標框進一步回歸和分類,輸出最終目標框和對應的類別。單階段模型無候選框提取過程,直接在輸出層回歸bbox的位置和類別,速度比兩階段模型塊,但是可能造成精度損失。由于需要手工設計Anchor,并且Anchor匹配對不同尺寸大小的物體不友好,因此發展出Anchor free模型,不再使用預先設定的anchor,通常通過預測目標的中心或者角點,對目標進行檢測。
注:如果想了解更多目標檢測模型細節,請參考目標檢測開發套件PaddleDetection
3.3 圖像分割
圖像分割指的是將數字圖像細分為多個圖像子區域的過程,即對圖像中的每個像素加標簽,這一過程使得具有相同標簽的像素具有某種共同視覺特性。圖像分割的目的是簡化或改變圖像的表示形式,使得圖像更容易理解和分析。圖像分割通常用于定位圖像中的物體和邊界(線,曲線等)。圖像分割的領域非常多,人像分割、車道線分割、無人車、地塊檢測、表計識別等等。
我們通過PaddleHub快速實現圖像分割,使用deeplabv3p_xception65_humanseg預訓練模型進行人像分割。
In [25]
human_seg = hub.Module(name="deeplabv3p_xception65_humanseg") result = human_seg.segmentation(images=[cv2.imread('./imgs/test3.jpg')], visualization=True) # 結果保存在'humanseg_output/'目錄,可以觀察可視化結果 img_ori = Image.open('./imgs/test3.jpg') img = Image.open(result[0]['save_path']) fig = plt.figure(figsize=(8,8)) # 顯示原圖 ax = fig.add_subplot(1,2,1) ax.imshow(img_ori) # 顯示人像分割圖 ax = fig.add_subplot(1,2,2) ax.imshow(img) plt.show()
[2022-06-28 1845,298] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
上面使用deeplabv3p識別實現了人像分割,除此之外,圖像分割還包含如?圖所示算法:
?
圖12:圖像分割算法
?
注:如果想了解更多圖像分割模型細節,請參考圖像分割開發套件PaddleSeg
3.4 OCR
OCR(Optical Character Recognition,光學字符識別)是計算機視覺重要方向之一。傳統定義的OCR一般面向掃描文檔類對象,即文檔場景文字識別(Document Analysis & Recognition,DAR),現在我們常說的OCR一般指場景文字識別(Scene Text Recognition,STR),主要面向自然場景。OCR技術有著豐富的應用場景,如卡證票據信息抽取錄入審核、工廠自動化、政府工作醫院等文檔電子化、在線教育等。
?
圖:文字識別示意圖
我們通過PaddleHub快速實現OCR任務,使用chinese_ocr_db_crnn_mobile模型進行文字識別。
In [24]
ocr = hub.Module(name="chinese_ocr_db_crnn_mobile") result = ocr.recognize_text(images=[cv2.imread('./imgs/test4.jpg')], visualization=True) # 結果保存在'ocr_result/'目錄,可以觀察可視化結果 img = Image.open(result[0]['save_path']) plt.figure(figsize=(20,20)) plt.imshow(img) plt.show()
[2022-06-28 1756,761] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object [2022-06-28 1757,665] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
?
?
?
上面使用DBNet檢測模型和CRNN識別實現了文字識別,可以看到上述OCR實現過程分為檢測和識別2個模型,我們稱之為兩階段算法,除此之外還有端到端算法,使用一個模型同時完成文字檢測和文字識別。文檔分析能夠幫助開發者更好地完成文檔理解相關任務,通常OCR算法和文檔分析算法結合使用。
?
圖14:OCR算法
其中,版面分析識別文檔中的圖像、文本、標題和表格等區域,然后對文本、標題等區域進行OCR的檢測識別,如?圖15(a)?所示。表格識別對文檔中表格區域進行結構化分析,最終結果輸出Excel文件,如?圖15(b)?所示。關鍵信息提取算法,將每個檢測到的文本區域分類為預定義的類別,如訂單ID、發票號碼,金額等,如?圖15(c)?所示。文檔視覺問答DocVQA包括語義實體識別SER 和關系抽取RE任務?;赟ER任務,可以完成對圖像中的文本識別與分類;基于RE任務,可以完成對圖象中的文本內容的關系提取,如判斷問題對(pair),如?圖15(d)?所示。PP-Structure包含了版面分析、表格識別、視覺問答等功能,支持模型訓練、測試等,如?圖15(e)?所示。
?
圖15:文檔分析算法
注:如果想了解更多OCR模型細節,請參考OCR開發套件PaddleOCR
3.5 視頻分析
視頻分析旨在通過智能分析技術,自動化地對視頻中的內容進行識別和解析。視頻是動態的按照時間排序的圖片序列,然后圖片幀間有著密切的聯系,存在上下文聯系;視頻有音頻信息,部分視頻也有文本信息,視頻分析常見子任務如?圖16?所示:
?
圖16:視頻分析子任務示意圖
我們通過PaddleHub快速實現視頻分類任務,使用videotag_tsn_lstm預訓練模型
In [2]
videotag = hub.Module(name="videotag_tsn_lstm") result = videotag.classify(paths=["imgs/dance.mp4"]) print(result)
[2022-06-28 1527,292] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
[{'path': 'imgs/dance.mp4', 'prediction': {'舞蹈': 0.8504236936569214}}]
上面使用TSN模型實現了視頻分類,根據視頻分析的應用領域,分為以下算法,
?
圖18:視頻分析算法
注:如果想了解更多視頻分析模型細節,請參考視頻分析開發套件PaddleVideo
3.6 圖像生成
GAN的全稱是Generative Adversarial Networks,即生成對抗網絡,由Ian J. Goodfellow等人提出。一般一個GAN網絡包括了一個生成器(Generator)和一個判別器(Discriminator),生成器用于生成越來越接近實際標簽的數據,判別器用來區分生成器的生成結果和實際標簽。生成模型和判別模型構成了一個動態的“博弈過程”,最終的平衡點即納什均衡點,即生成模型所生成數據(G(z))無限接近真實數據(x)。GAN模型應用也非常廣泛,可應用于圖像生成、風格遷移、超分辨率、影像上色、人臉屬性編輯、人臉融合、動作遷移等。
In [21]
import cv2 import paddlehub as hub model = hub.Module(name='UGATIT_100w') # 結果保存在'output/'目錄,可以觀察可視化結果 result = model.style_transfer(images=[cv2.imread('imgs/test6.jpg')], visualization=True) img_ori = Image.open('./imgs/test6.jpg') img = cv2.cvtColor(result[0], cv2.COLOR_BGR2RGB) img = Image.fromarray(img) fig = plt.figure(figsize=(8,8)) # 顯示原圖 ax = fig.add_subplot(1,2,1) ax.imshow(img_ori) # 顯示生成漫畫圖 ax = fig.add_subplot(1,2,2) ax.imshow(img) plt.show()
[2022-06-28 1724,765] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
上面使用U-GAT-IT模型實現了人像動漫化,根據GAN的應用領域,分為以下算法,
?
圖20:圖像生成算法
注:如果想了解更多圖像生成模型細節,請參考圖像生成開發套件PaddleGAN
4 總結
本章我們主要介紹了計算機視覺概念、應用場景和挑戰,然后介紹了目前常見的計算機視覺任務(圖像分類、目標檢測、圖像分割、OCR、視頻分析、圖像生成),并通過PaddleHub快速實現。
編輯:黃飛
?
評論
查看更多