OpenCV+深度學習預訓練模型,簡單搞定圖像識別 | 教程

2020-12-05 量子位

李林 編譯自 pyimagesearch作者 Adrian Rosebrock量子位 報導 | 公眾號 QbitAI

OpenCV是一個2000年發布的開源計算機視覺庫,有進行物體識別、圖像分割、人臉識別、動作識別等多種功能,可以在Linux、Windows、Android、Mac OS等作業系統上運行,以輕量級、高效著稱,且提供多種語言接口。

而OpenCV最近一次版本更新,為我們帶來了更好的深度學習支持,在OpenCV中使用預訓練的深度學習模型變得非常容易。

pyimagesearch網站今天發布了一份用OpenCV+深度學習預訓練模型做圖像識別的教程,量子位編譯整理如下:

最近,OpenCV 3.3剛剛正式發布,對深度學習(dnn模塊)提供了更好的支持,dnn模塊目前支持Caffe、TensorFlow、Torch、PyTorch等深度學習框架。

另外,新版本中使用預訓練深度學習模型的API同時兼容C++和Python,讓系列操作變得非常簡便:

從硬碟加載模型;對輸入圖像進行預處理;將圖像輸入網絡,獲取輸出的分類。

當然,我們不能、也不該用OpenCV訓練深度學習模型,但這個新版本讓我們能把用深度學習框架訓練好了的模型拿來,高效地用在OpenCV之中。

這篇文章就展示了如何用ImageNet上預訓練的深度學習模型來識別圖像。

OpenCV 3.3中的深度學習

自OpenCV 3.1版以來,dnn模塊一直是opencv_contrib庫的一部分,在3.3版中,它被提到了主倉庫中。

用OpenCV 3.3,可以很好地利用深度學習預訓練模型,將它們作為分類器。

新版OpenCV兼容以下熱門網絡架構:

AlexNetGoogLeNet v1(也叫Inception-5h)ResNet-34/50/…SqueezeNet v1.1VGG-based FCNENetVGG-based SSDMobileNet-based SSD

該模塊的主要貢獻者Rynikov Alexander,對這個模塊有遠大的計劃,不過,他寫的release notes是俄語的,感興趣的同學請自行谷歌翻譯著讀:https://habrahabr.ru/company/intel/blog/333612/

我認為,dnn模塊會對OpenCV社區產生很大的影響。

函數和框架

在OpenCV中使用深度學習預訓練模型,首先要安裝OpenCV 3.3,安裝過程量子位就不再詳細描述了……

下面是我們將用到的一些函數。

在dnn中從磁碟加載圖片:

cv2.dnn.blobFromImagecv2.dnn.blobFromImages

用「create」方法直接從各種框架中導出模型:

cv2.dnn.createCaffeImportercv2.dnn.createTensorFlowImportercv2.dnn.createTorchImporter

使用「讀取」方法從磁碟直接加載序列化模型:

cv2.dnn.readNetFromCaffecv2.dnn.readNetFromTensorFlowcv2.dnn.readNetFromTorchcv2.dnn.readhTorchBlob

從磁碟加載完模型之後,可以用.forward方法來向前傳播我們的圖像,獲取分類結果。

用OpenCV和深度學習給圖像分類

接下來,我們來學習如何用Python、OpenCV和一個預訓練過的Caffe模型來進行圖像識別。

下文用到的深度學習模型是在ImageNet上預訓練過的GoogleLeNet。GoogleLeNet出自Szegedy等人2014年的論文Going Deeper with Convolutions,詳情見:https://arxiv.org/abs/1409.4842

首先,打開一個新文件,將其命名為deep_learning_with_opencv.py,插入如下代碼,來導入我們需要的包:

然後拆解命令行參數:

其中第8行ap = argparse.ArgumentParser()是用來創建參數解析器的,接下來的代碼用來創建4個命令行參數:

—image:輸入圖像的路徑;—prototxt:Caffe部署prototxt的路徑—model:預訓練的Caffe模型,例如網絡權重等;—labels:ImageNet標籤的路徑,例如syn-sets。

我們在創建參數之後,將它們解析並存在一個變量args中,供稍後使用。

接下來,加載輸入圖像和標籤:

第20行從磁碟加載了圖像,第23行和24行加載了這些標籤:

搞定了標籤之後,我們來看一下dnn模塊:

注意上面代碼中的注釋,我們使用cv2.dnn.blobFromImage執行mean subtraction來對輸入圖像進行歸一化,從而產生一個已知的blob形狀。

然後從磁碟加載我們的模型:

我們用cv2.dnn.readNetFromCaffe來加載Caffe模型定義prototxt,以及預訓練模型。

接下來,我們以blob為輸入,在神經網絡中完成一次正向傳播:

請注意:我們不是在訓練CNN,而是在使用預訓練模型,因此只需要將blob從網絡中傳遞過去,來獲取結果,不需要反向傳播。

最後,我們來為輸入圖像取出5個排名最高的預測結果:

我們可以用NumPy來選取排名前5的結果,然後將他們顯示出來:

分類結果

我們已經在OpenCV中用Python代碼實現了深度學習圖像識別,現在,可以拿一些圖片來試一試。

打開你的終端,執行以下命令:

就會得到這樣的結果:

OpenCV和GoogleLeNet正確地認出了比格小獵犬,排名第一的結果是正確的,之後的4項結果相關度也很高。

在CPU上運行這個算法,得到結果也只需要不到一秒鐘。

再來一張:

結果如下:

再來:

結果依然不錯:

最後一個例子:

也認得不錯:

相關連結

教程原文:http://www.pyimagesearch.com/2017/08/21/deep-learning-with-opencv/

相關焦點

  • 深度學習與圖像識別 圖像檢測
    來源:http://blog.csdn.net/omenglishuixiang1234/article/details/53305842  點擊閱讀原文直接進入主要做了基於深度學習的圖像識別與檢測的研究,下面是一些整理內容1、深度學習的優勢(1)從統計,計算的角度看,DL
  • 超全深度學習細粒度圖像分析:項目、綜述、教程一網打盡
    由於深度學習的蓬勃發展,近年來應用了深度學習的 FGIA 取得了顯著的進步。本文系統地對基於深度學習的 FGIA 技術進行了綜述。具體來說,本文將針對 FGIA 技術的研究分為三大類:細粒度圖像識別、細粒度圖像檢索和細粒度圖像生成。本文還討論了其他 FGIA 的重要問題,比如公開可用的基準數據集及其在相關領域的特定應用。本文在結尾處強調了未來仍需進一步探討的幾個方向以及待解決的問題。
  • 圖像識別中的深度學習【香港中文大學王曉剛】
    例如,為了改進神經網絡的訓練,學者提出了非監督和逐層的預訓練,使得在利用反向傳播算法對網絡進行全局優化之前,網絡參數能達到一個好的起始點,從而在訓練完成時能達到一個較好的局部極小點。  深度學習在計算機視覺領域最具影響力的突破發生在2012年,欣頓的研究小組採用深度學習贏得了ImageNet圖像分類比賽的冠軍[3]。
  • 23個系列分類網絡,10萬分類預訓練模型,這是飛槳PaddleClas百寶箱
    對於其它視覺任務,像圖像目標檢測、圖像分割、圖像檢索、自然場景文字檢測和識別、人臉檢測和識別等等,常常將圖像分類的網絡結構作為骨幹網絡。例如使用基於 ImageNet1K 分類數據集訓練的模型作為特徵提取器,來提升目標任務的組網效率和效果。如果把某個視覺任務看成是建造一棟大樓,圖像分類的網絡結構和預訓練模型則可以看成是這棟大樓牢固的地基和穩定的骨架。
  • 圖像配準的前世今生:從人工設計特徵到深度學習
    更多關於特徵檢測和描述的細節,請參閱下面的 OpenCV 教程:https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html特徵匹配當組成一個圖像對的兩張圖的關鍵點都被識別出來以後,我們需要將它們關聯(或稱「匹配
  • ImageNet 帶來的預訓練模型之風,馬上要吹進 NLP 領域了
    這些工作無一例外都成為了新聞頭條,因為它們都證明了自己的預訓練語言模型可以在各種自然語言處理任務中取得最佳的結果。這些方法的出現預示著一個分水嶺時刻的到來了:這些預訓練語言模型有可能會在自然語言處理領域造成巨大而廣泛的影響,正如 ImageNet 預訓練模型在計算機視覺中所造成的影響一樣。從淺層到深度預訓練預訓練的詞向量已經統治了自然語言處理領域相當長一段時間。
  • 預訓練圖像處理Transformer:華為諾亞、北大等提出IPT模型,刷榜多...
    例如 OpenAI 的 iGPT、Facebook 提出的 DETR 等,這些跨界模型多應用於圖像識別、目標檢測等高層視覺任務。而華為、北大、悉大以及鵬城實驗室近期提出了一種新型預訓練 Transformer 模型——IPT(Image Processing Transformer),用於完成超解析度、去噪、去雨等底層視覺任務。
  • 史上最全 OpenCV 活體檢測教程!
    在本文的教程中,我們將活體檢測作為一個二分類問題來看待。給定一張輸入圖像,我們將訓練一個能夠識別出真假人臉的卷積神經網絡。在開始訓練我們的活體檢測模型前, 我們先查看一下使用的數據集。在接下來的教程中,你將學習到如何利用我記錄下來的數據集,並使用 OpenCV 和深度學習技術得到一個真正的活體檢測器。項目架構在繼續閱讀的過程中,讀者可以使用「下載」部分提供的連結獲取代碼、數據集以及活體檢測模型,並解壓存檔。
  • 使用OpenCV和Python構建自己的車輛檢測模型
    我們人類可以很容易地在一瞬間從複雜的場景中檢測和識別出物體。然而,將這種思維過程轉化為機器的思維,需要我們學習使用計算機視覺算法進行目標檢測。因此在本文中,我們將建立一個自動車輛檢測器和計數器模型。以下視頻是你可以期待的體驗:https://youtu.be/C_iZ2yivskE注意:還不懂深度學習和計算機視覺的新概念?
  • 世界上最好的語言PHP:OpenCV與計算機視覺已在我掌控之下
    為此,在 OpenCV 中有一個「CascadeClassifier」類,它可以加載 xml 格式的預訓練模型。在找到人臉之前,該類建議將圖像轉換為黑白格式。如果我們想要知道照片中是誰,首先我們需要使用 train 方法訓練模型,它需要兩個參數:對於這些圖像的一個人臉圖像的數組和一個數值標籤的數組。然後你可以在測試圖像(人臉)上調用 predict 方法並獲得相匹配的數值標籤。
  • Python深度學習之圖像識別
    作者 | 周偉能 來源 | 小叮噹講SAS和Python Python在機器學習(人工智慧,AI)方面有著很大的優勢。談到人工智慧,一般也會談到其實現的語言Python。前面有幾講也是關於機器學習在圖像識別中的應用。今天再來講一個關於運用google的深度學習框架tensorflow和keras進行訓練深度神經網絡,並對未知圖像進行預測。
  • 基於opencv 的圖像處理入門教程
    前言雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。
  • 「深度學習之opencv」Mat數據的矩陣輸出
    C++中使用opencv的時候,我們有事想看一下我們的圖像的數據,那麼怎麼將一個圖像數據輸出呢?實際上,這不僅限於深度學習和計算機視覺,還包括模型算法原理,模型訓練,模型轉換優化,模型部署和深度學習框架。此外,還有C ++,數據結構和編譯底層等。歡迎大家的關注,我們將共同探討進步。
  • 如何用PyTorch訓練圖像分類器
    它將介紹如何組織訓練數據,使用預訓練神經網絡訓練模型,然後預測其他圖像。為此,我將使用由Google地圖中的地圖圖塊組成的數據集,並根據它們包含的地形特徵對它們進行分類。我會在另一篇文章中介紹如何使用它(簡而言之:為了識別無人機起飛或降落的安全區域)。但是現在,我只想使用一些訓練數據來對這些地圖圖塊進行分類。下面的代碼片段來自Jupyter Notebook。
  • 第85講 Python深度學習之圖像識別
    Python在機器學習(人工智慧,AI)方面有著很大的優勢。
  • RemarkMedia 圖像識別產品登錄阿里雲市場,把深度學習變為基礎設施
    近日,RemarkMedia 圖像識別產品登陸阿里雲市場,為開發者提供了兩款已訓練好的圖片分類器鑑於深度學習對普通開發者來說有著一定難度,因此讓深度學習變成像雲計算這樣基礎設施,一直是 Remark Media 中國和阿里雲研究的重點。根據官方介紹,讓深度學習變成基礎設施,需要解決實際應用深度學習的兩大難題:監督學習需要大量的標記過的圖片樣本數據。需要簡單易用的訓練環境。
  • 一文看懂如何搭建AI應用:10周學會深度學習,還贏下5千美元
    -- 正文分割線 --△一個基於深度學習的交通燈識別分類器Demo,左上角是給出的判斷結果挑戰我最近在一個交通燈識別挑戰賽中贏得了第一名,這是由一家公司組織的計算機視覺競賽。挑戰的目標是識別行車載攝像頭拍下的圖像中,交通燈的狀態。
  • opencv教程-目標跟蹤
    1:MeanShift算法retval, window=cv.meanShift(probImage, window, criteria)參數probImage:當前圖像反向投影圖參數window:前一圖像目標框參數criteria:迭代停止條件
  • 基於深度學習的物候學識別
    點擊藍色字免費訂閱,每天收到這樣的好資訊本文闡述了基於深度學習的物候學識別,植物表型資訊簡介如下:研究人員利用農業監測網絡地面站的傳感器收集大量信息,通過將這些高質量的信息與現代圖像處理算法相結合,可逐步增加表型分析在農業上的應用潛力。
  • 從傳統圖像算法到深度學習,文字識別技術經歷了這些變化
    文字識別的發展大致可以分為兩個階段,分別是傳統圖像算法階段和深度學習算法階段。傳統的文字識別方法,在簡單的場景下能達到不錯的效果,但是不同場景下都需要獨立設計各個模塊的參數,工作繁瑣,遇到複雜的場景,難以設計出泛化性能好的模型。