目標檢測必須要OpenCV?10行Python代碼也能實現,親測好用!

2021-01-07 大數據文摘

大數據文摘出品

編譯:朱一輝、雪清、小魚

短短10行代碼就可以實現目標檢測?!

本文作者和他的團隊構建了一個名為ImageAI 的Python庫,集成了現今流行的深度學習框架和計算機視覺庫。本文將手把手教你構建自己的第一個目標檢測應用,而且文摘菌已經幫你踩過坑了,親測有效!

無人超市、人臉識別、無人駕駛,眾多的使用場景及案例,使得【目標檢測】正成為計算機視覺最有前景的方向。

聽起來似乎是個很難實現的技術,需要大量訓練數據和算法才能完成。事實上,本文作者開發了一個基於Python的函數庫,可以用十行代碼高效實現目標檢測。

還不熟悉的讀者,我們先來看看,目標檢測到底是什麼,以及軟體開發人員面臨的挑戰。

目標檢測是藉助於計算機和軟體系統在圖像/場景中,定位目標並識別出每個目標的類別的技術。目前已廣泛用於人臉檢測、車輛檢測、行人計數、網絡圖像、安全系統和無人駕駛汽車等領域。隨著計算機技術不斷發展和軟體開發人員的不懈努力,未來目標檢測技術將更廣泛的普及開來。

在應用程式和系統中使用先進的目標檢測方法,以及基於這些方法構建新的應用程式並不容易。早期目標檢測是基於經典算法而實現的,如 OpenCV(廣受歡迎的計算機視覺庫)所支持的一些算法。然而,這些經典算法的性能會因條件而受到限制。

2012年,深度學習領域取得眾多突破,學者們提出了一系列全新、高精度的目標檢測算法和方法,比如R-CNN, Fast-RCNN, Faster-RCNN, RetinaNet,以及既快又準的SSD和YOLO等。要使用這些基於深度學習的方法和算法(當然深度學習也是基於機器學習),需要對數學和深度學習框架有很深的理解。數百萬的軟體開發人員致力於整合目標檢測技術進行新產品的開發。但是想要理解這項技術並加以使用,對非深度學習領域的程式設計師來說並不容易。

一位自學了計算機的開發者Moses Olafenwa在幾個月前意識到了這個問題,並與同伴一起開發了一個名叫ImageAI的Python函數庫。

ImageAI可以讓程式設計師和軟體開發者只用幾行代碼,就能輕易地把最先進的計算機視覺技術整合到他們現有的以及新的應用程式裡面。

用ImageAI實現目標檢測,你只需要以下步驟:

1. 安裝Python

2. 安裝ImageAI和相關函數庫

3. 下載目標檢測模型文件

4. 運行示例代碼(只有10行)

準備工作

文摘菌測試環境為Windows 64位系統,Python版本為3.6。關注大數據文摘微信公眾號,在後臺回復「檢測」可獲取代碼和模型文件~

1) 從Python官網下載並安裝Python 3,並安裝pip。

下載地址:

https://python.org

https://pip.pypa.io/en/stable/installing/

2)用pip安裝下列依賴

找到Pyhthon安裝目錄下的Scripts文件夾,如C:\XXX \Python\Python36\Scripts,打開cmd命令窗口,依次輸入下列安裝命令即可。

1. Tensorflow:

pip install tensorflow

2.Numpy:

pip install numpy

3.SciPy

pip install scipy

4.OpenCV

pip install opencv-python

5.Pillow

pip install pillow

6.Matplotlib

pip install matplotlib

7. H5py

pip install h5py

8. Keras

pip install keras

9. ImageAI

pip install https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl

註:在安裝ImageAI時如果出現異常,可先下載.whl文件,並放在Scripts文件夾下,用下列命令進行安裝:

pip install imageai-2.0.1-py3-none-any.whl

3) 下載用於目標檢測的RetinaNet模型文件:

下載地址:

https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5

準備工作到此結束,你可以寫自己的第一個目標檢測代碼了。新建一個Python文件並命名(如FirstDetection.py),然後將下述代碼寫入此文件。接著將RetinaNet模型文件、FirstDetection.py和你想檢測的圖片放在同一路徑下,並將圖片命名為「image.jpg」。

下面是FirstDetection.py中的10行代碼:

from imageai.Detection import ObjectDetectionimport osexecution_path = os.getcwd()detector = ObjectDetection()detector.setModelTypeAsRetinaNet()detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))detector.loadModel()detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))for eachObject in detections:print(eachObject["name"] + " : " + eachObject["percentage_probability"] )

然後,雙擊FirstDetection.py運行代碼,並稍等片刻,識別結果就會在控制臺列印出來。一旦結果在控制臺輸出,在包含FirstDetection.py的文件夾裡,你會發現一張新保存的圖片,文件名為「imagenew.jpg」。

註:如果運行代碼時出現下列異常:

則需要安裝Numpy+MKL依賴,下載對應的.whl文件並放在Scripts文件夾下,用pip安裝.whl文件即可。

下載地址:

https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy

檢測結果

來看看下面這2張示例圖片以及經過檢測後保存的新圖片。

檢測前:

檢測後:

檢測結果:

person : 55.8402955532074

person : 53.21805477142334

person : 69.25139427185059

person : 76.41745209693909

bicycle : 80.30363917350769

person : 83.58567953109741

person : 89.06581997871399

truck : 63.10953497886658

person : 69.82483863830566

person : 77.11606621742249

bus : 98.00949096679688

truck : 84.02870297431946

car : 71.98476791381836

檢測結果:

person : 71.10445499420166

person : 59.28672552108765

person : 59.61582064628601

person : 75.86382627487183

motorcycle : 60.1050078868866

bus : 99.39600229263306

car : 74.05484318733215

person : 67.31776595115662

person : 63.53200078010559

person : 78.2265305519104

person : 62.880998849868774

person : 72.93365597724915

person : 60.01397967338562

person : 81.05944991111755

motorcycle : 50.591760873794556

motorcycle : 58.719027042388916

person : 71.69321775436401

bicycle : 91.86570048332214

motorcycle : 85.38855314254761

文摘菌測試了另外幾張圖片,結果如下:

檢測前:

檢測後:

檢測結果:

car : 59.04694199562073

car : 50.62631368637085

car : 71.59191966056824

car : 52.60368585586548

person : 76.51243805885315

car : 56.73831105232239

car : 50.02853870391846

car : 94.18612122535706

car : 70.23521065711975

car : 75.06842017173767

car : 87.21032738685608

car : 89.46954607963562

person : 73.89532923698425

bicycle : 90.31689763069153

bus : 65.3587281703949

竟然可以檢測出牛……

檢測結果:

person : 55.15214800834656

person : 62.79672980308533

person : 69.01599168777466

person : 67.26776957511902

person : 75.51649808883667

person : 52.9820442199707

person : 67.23594665527344

person : 69.77047920227051

person : 83.80664587020874

person : 61.785924434661865

person : 82.354336977005

person : 93.08169484138489

cow : 84.69656705856323

檢測結果:

person : 65.07909297943115

person : 65.68368077278137

person : 68.6377465724945

person : 83.80006551742554

person : 85.69389581680298

person : 55.40691018104553

person : 56.62997364997864

person : 58.07020664215088

person : 70.90385556221008

person : 95.06895542144775

代碼解釋

下面我們來解釋一下這10行代碼的含義。

from imageai.Detection import ObjectDetectionimport osexecution_path = os.getcwd()

上面3行代碼中,第一行導入ImageAI的目標檢測類,第二行導入Python的os類,第三行定義一個變量,用來保存Python文件、RetianNet模型文件和圖片所在文件夾的路徑。

detector = ObjectDetection()detector.setModelTypeAsRetinaNet()detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))detector.loadModel()detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))

上面5行代碼中,第一行定義目標檢測類,第二行將模型類型設置為RetinaNet,第三行將模型的路徑設為RetinaNet模型文件所在路徑,第四行將模型載入目標檢測類,然後第五行調用檢測函數,並解析輸入圖片和輸出圖片的路徑。

for eachObject in detections:print(eachObject["name"] + " : " + eachObject["percentage_probability"] )

上面2行代碼中,第一行迭代所有detector.detectObjectsFromImage函數返回的結果,然後,第二行列印出模型檢測出的圖片中每個目標的類型和概率。

ImageAI還支持配置目標檢測過程中的其他功能。例如,將檢測到的每個目標的圖片單獨提取出來。通過簡單地把extract_detected_objects=True寫入detectObjectsFromImage函數,目標檢測類就會為圖片對象集新建一個文件夾,然後提取出每個圖片,將它們存入這個文件夾,並返回一個數組用來保存每個圖片的路徑,如下所示:

detections, extracted_images = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"), extract_detected_objects=True)

我們用第一個示例圖片提取出來的檢測結果如圖所示:

參數配置

為了滿足目標檢測的生產需求,ImageAI提供了一些可配置的參數,包括:

Adjusting Minimum Probability(可調整最小概率閾值)

默認閾值為50%,如果檢測結果的概率值低於50%,則不顯示檢測結果。你可以根據具體需求對該閾值進行修改。

Custom Objects Detection(自定義目標檢測)

使用提供的CustomObject類,你可以讓檢測結果只顯示特定類型的目標。

Detection Speeds(檢測速度)

可以將檢測速度設置為「fast」、「 faster」和「fastest」,以減少檢測圖片所需的時間。

Input Types(輸入類型)

你可以解析並修改圖像的文件路徑,其中,Numpy數組,或是圖片文件流都可以作為輸入類型。

Output Types(輸出類型)

你可以修改detectObjectsFromImage 函數的返回結果,例如返回圖片文件或Numpy數組。

詳細的說明文檔在GitHub上,GitHub連結:

https://github.com/OlafenwaMoses/ImageAI

關注大數據文摘微信公眾號,在後臺回復「檢測」可獲取代碼和模型文件~

動手試試吧,歡迎在留言區分享~

相關焦點

  • Python不超過10行代碼就可實現人臉識別,教你辨別真假
    一般我們考慮使用OpenCV、dlib等開源庫的人臉檢測功能(基於專家經驗的傳統特徵值方法計算量少從而速度更快),也可以使用基於深度學習實現的技術如MTCNN(在神經網絡較深較寬時運算量大從而慢一些)。下面環境搭建:1. 安裝 Ubuntu17.10 > 安裝步驟在這裡2.
  • 如何利用樹莓派實現基於深度學習的目標檢測(入門)
    儘管只有信用卡大小,但視頻、音頻等功能都可以實現,可謂是「麻雀雖小,五臟俱全」。今天將通過工作室陳成琳學姐的實驗,從實驗目的、實驗步驟、實驗總結為大家介紹如何利用樹莓派實現基於深度學習的目標檢測。一些教程可以在pyimagesearch 網站學習;URL:  https://www.pyimagesearch.com/category/raspberry-pi/這裡以opencv-dnn模塊為例,演示一個demo。也可以使用tensorflow object detection API實現實時目標檢測。這個api的使用網上太多教程。
  • 基於TensorFlow 、OpenCV 和 Docker 的實時視頻目標檢測
    實時和視頻目標識別都可以在我的個人筆記本電腦上以高性能運行,僅使用 8GB CPU。Docker在數據科學中的應用我不在這裡描述 Tensorflow 目標檢測 API 的實現,因為相關的文檔很多。我將展示數據科學家在日常工作中如何使用 Docker。
  • 用OpenCV和Python模糊和匿名化人臉
    注意:要了解有關OpenCV繪圖功能的更多信息,請務必花一些時間學習我的OpenCV教程。 現在我們已經實現了兩種人臉模糊方法,讓我們學習如何使用OpenCV和Python應用它們來模糊圖像中的人臉。打開項目結構中的blur_face.py文件,並插入以下代碼:
  • 基於OpenCV的條形碼檢測
    打開一個新文件,將其命名為 detect_barcode.py,如何開始寫代碼:# 導入必要的包/庫import numpy as npimport argparseimport imutilsimport cv2# 構造參數解析並分析參數ap = argparse.ArgumentParser()ap.add_argument("-i"
  • 使用Python+OpenCV實現圖像數據採集
    然而,自從我13歲開始學習機器學習,我就一直不明白這一點,為什麼要花費所有的時間來建立最好的模型——只是為了滿足於一個數字?在本文中,將提供代碼並指導你如何通過構建與模型交互的拍照接口來真正完成項目。安裝cv2(OpenCV)我們將使用的圖像庫是cv2。因為cv2不能在Kaggle這樣的在線平臺上工作,所以它必須在你的計算機上本地完成。
  • python利用opencv實現證件照換底
    opencv今天就給大家介紹一下python利用opencv庫進行藍底換紅底或者白底照片的操作。1.強大的opencv庫說到圖像處理,不得不提opencv庫。它是一個跨平臺的計算機視覺庫,可以運行在不同作業系統上,它由一些列c函數和少量c++函數組成,並提供python,matlab等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。我們這裡用的opencv-python 就是opencv的python API接口。
  • Python+OpenCV的基礎圖像處理操作匯總
    在本文中,我們將看到從目錄中讀取圖像、修改圖像並將其存儲在另一個目錄中的函數實現。下面是我們要討論的主要內容。通過在CMD(命令提示符)中發出以下命令來安裝opencv python(這是一個用於python的非正式預構建opencv包):opencv-contrib-python(包含main和contrib模塊)opencv-python-headless(與opencv-python相同,但沒有
  • 基於opencv 的圖像處理入門教程
    安裝OpenCV 的安裝還是比較簡單的,直接用 pip 命令在命令行安裝即可,輸入以下命令:pip install opencv-python驗證是否安裝成功,可以運行 python 命令,然後分別輸入以下命令:import cv2
  • 「python opencv 計算機視覺零基礎實戰」第一節
    本文系統及環境:本文將在windows7作業系統下以python作為程式語言,完成對opencv的程序編寫。python版本是3.8。一、學習目標安裝opencv了解什麼是計算機視覺了解讀取圖片的方法了解顯示圖片的方法二、完成opencv的helloworld程序編寫2.1 opencv是什麼要了解opencv是什麼,首先可以看
  • Python 圖像處理 OpenCV (1):入門
    /官方 Demo :https://github.com/opencv/opencv/blob/master/samples/python圖書推薦圖書的話我就推薦一本吧,如果要看書學習絕對不能錯過的「Learning OpenCV 3」,當然,是英文原版的,中文版的話翻譯有點慘不忍睹,對英文閱讀壓力大的同學可以中英文對照著看:
  • 使用Python+OpenCV+Dlib實現人臉檢測與人臉特徵關鍵點識別
    相關閱讀:https://towardsdatascience.com/essential-opencv-functions-to-get-you-started-into-computer-vision-743df932e60Dlib是一個高級的機器學習庫,它是為解決複雜的現實世界問題而創建的。這個庫是用C++程式語言創建的,它與C/C++、Python和java一起工作。
  • 利用OpenCV和深度學習實現人臉檢測
    這裡整理了一份前段時間做的小demo,實現獻醜了本文基於OpenCV3.3.1或以上版本(如OpenCV3.4)、DNN模塊和face_detector示例實現簡單、實時的人臉檢測。1 face_detector簡介face_detector示例連結:https://github.com/opencv/opencv/tree/master/samples/dnn/face_detector當電腦配置好OpenCV3.3.1或以上版本時,在opencv\samples\dnn也可以找到face_detector
  • 「Python+cv2」Python安裝opencv及圖像的基本操作
    Python環境opencv的安裝1、檢查是否安裝python環境3、安裝opencvpython環境下opencv的安裝:pip3 install opencv-pythonpython opencv安裝因為我已經安裝,所以會出現安裝位置的提示。
  • opencv-python獲取圖像:面向對象與面向過程
    下面是分別用面向過程與面向對象的編程方法實現讀取本地圖像和打開攝像頭兩段代碼:# -*- coding: utf-8 -*-"""面向過程的編程方法,用函數把解決問題的步驟一步一步實現。運行環境:win10系統 python==3.6 opencv-contrib-python== 4.1.0第一行「# -*- coding: utf-8 -*-」 告訴Python解釋器,按照UTF-8編碼讀取原始碼"""import
  • 「python opencv視覺零到實戰」八、圖片選區操作
    一、學習目標了解什麼是ROI了解floodFill的使用方法如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 入門指南:用Python實現實時目標檢測(內附代碼)
    目標檢測 (ObjectDetection) 也是計算機視覺最酷的應用之一,這是不容置疑的事實。現在的CV工具能夠輕鬆地將目標檢測應用於圖片甚至是直播視頻。本文將簡單地展示如何用TensorFlow創建實時目標檢測器。
  • 如何快速簡單的安裝opencv-python
    python3.6.8下載將pip源更換到國內鏡像用pip管理工具安裝庫文件時,默認使用國外的源文件,因此在國內的下載速度會比較慢,可能只有50KB/s。幸好,國內的一些頂級科研機構已經給我們準備好了各種鏡像,下載速度可達2MB/s。
  • 【視覺與圖像】Python+OpenCV教程入門篇
    OpenCV-Python就是用Python包裝了C++的實現,背後實際就是C++的代碼在跑,所以代碼的運行速度跟原生C/C++速度一樣快。舉兩個簡單的例子就一目了然了:一個是讀入圖片,另一個是調整圖片的對比度和亮度:
  • 深度學習框架之pytorch(63)目標檢測R-CNN1
    2013年首次將深度卷積神經網絡引入目標檢測領域的算法是OverFeat算法,出自論文《OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks》,它基於AlexNet卷積神經網絡,實現了識別、定位、檢測共用同一個網絡框架,獲得了2013年ILSVRC定位比賽的冠軍。