主頁 > 後端開發 > [Python影像識別] 四十五.目標檢測入門普及和ImageAI“傻瓜式”物件檢測案例詳解 (1)

[Python影像識別] 四十五.目標檢測入門普及和ImageAI“傻瓜式”物件檢測案例詳解 (1)

2021-08-05 07:46:21 後端開發

該系列文章是講解Python OpenCV影像處理知識,前期主要講解影像入門、OpenCV基礎用法,中期講解影像處理的各種演算法,包括影像銳化算子、影像增強技術、影像分割等,后期結合深度學習研究影像識別、影像分類應用,希望文章對您有所幫助,如果有不足之處,還請海涵~

上一篇文章是影像處理的最后一篇文章,寫到這里,第一階段的44篇Python影像處理就介紹完畢,接下來我們進入Python影像識別第二階段,該部分主要以目標檢測、影像識別以及深度學習相關影像分類為主,將會分享近50篇文章,感謝您一如至往的支持,作者也會繼續加油的!

本文主要介紹目標檢測原理,通過七個問題來普及什么是目標檢測,然后利用ImageAI實作最簡單的目標檢測案例,加深讀者的印象,希望您喜歡,且看且珍惜,

文章目錄

  • 一.目標檢測入門普及
    • 1.什么是目標檢測?
    • 2.目標檢測的核心問題是什么?
    • 3.目標檢測演算法常用分類
    • 4.目標檢測常見演算法
    • 5.目標檢測應用
    • 6.目標檢測未來挑戰
    • 7.目標檢測原理簡述
  • 二.ImageAI簡介
  • 三.安裝流程
  • 四.TinyYOLOv3模型物件檢測案例
    • 1.案例實作
    • 2.學習建議
  • 五.總結

萬字長文整理,希望對您有所幫助,同時,該部分知識均為作者查閱資料撰寫總結,并且開設成了收費專欄,為小寶賺點奶粉錢,感謝您的抬愛,如果有問題隨時私聊我,只望您能從這個系列中學到知識,一起加油,代碼下載地址(如果喜歡記得star,一定喔):

  • https://github.com/eastmountyxz/ImageProcessing-Python

影像識別:

  • [Python影像識別] 四十五.物件檢測案例入門及ImageAI基礎用法 (1)

影像處理:

  • [Python影像處理] 一.影像處理基礎知識及OpenCV入門函式
  • [Python影像處理] 二.OpenCV+Numpy庫讀取與修改像素
  • [Python影像處理] 三.獲取影像屬性、興趣ROI區域及通道處理
  • [Python影像處理] 四.影像平滑之均值濾波、方框濾波、高斯濾波及中值濾波
  • [Python影像處理] 五.影像融合、加法運算及影像型別轉換
  • [Python影像處理] 六.影像縮放、影像旋轉、影像翻轉與影像平移
  • [Python影像處理] 七.影像閾值化處理及演算法對比
  • [Python影像處理] 八.影像腐蝕與影像膨脹
  • [Python影像處理] 九.形態學之影像開運算、閉運算、梯度運算
  • [Python影像處理] 十.形態學之影像頂帽運算和黑帽運算
  • [Python影像處理] 十一.灰度直方圖概念及OpenCV繪制直方圖
  • [Python影像處理] 十二.影像幾何變換之影像仿射變換、影像透視變換和影像校正
  • [Python影像處理] 十三.基于灰度三維圖的影像頂帽運算和黑帽運算
  • [Python影像處理] 十四.基于OpenCV和像素處理的影像灰度化處理
  • [Python影像處理] 十五.影像的灰度線性變換
  • [Python影像處理] 十六.影像的灰度非線性變換之對數變換、伽馬變換
  • [Python影像處理] 十七.影像銳化與邊緣檢測之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子
  • [Python影像處理] 十八.影像銳化與邊緣檢測之Scharr算子、Canny算子和LOG算子
  • [Python影像處理] 十九.影像分割之基于K-Means聚類的區域分割
  • [Python影像處理] 二十.影像量化處理和采樣處理及區域馬賽克特效
  • [Python影像處理] 二十一.影像金字塔之影像向下取樣和向上取樣
  • [Python影像處理] 二十二.Python影像傅里葉變換原理及實作
  • [Python影像處理] 二十三.傅里葉變換之高通濾波和低通濾波
  • [Python影像處理] 二十四.影像特效處理之毛玻璃、浮雕和油漆特效
  • [Python影像處理] 二十五.影像特效處理之素描、懷舊、光照、流年以及濾鏡特效
  • [Python影像處理] 二十六.影像分類原理及基于KNN、樸素貝葉斯演算法的影像分類案例
  • [Python影像處理] 二十七.OpenGL入門及繪制基本圖形(一)
  • [Python影像處理] 二十八.OpenCV快速實作人臉檢測及視頻中的人臉
  • [Python影像處理] 二十九.MoviePy視頻編輯庫實作抖音短視頻剪切合并操作
  • [Python影像處理] 三十.影像量化及采樣處理萬字詳細總結(推薦)
  • [Python影像處理] 三十一.影像點運算處理兩萬字詳細總結(灰度化處理、閾值化處理)
  • [Python影像處理] 三十二.傅里葉變換(影像去噪)與霍夫變換(特征識別)萬字詳細總結
  • [Python影像處理] 三十三.影像各種特效處理及原理萬字詳解(毛玻璃、浮雕、素描、懷舊、流年、濾鏡等)
  • [Python影像處理] 三十四.數字影像處理基礎與幾何圖形繪制萬字詳解(推薦)
  • [Python影像處理] 三十五.OpenCV影像處理入門、算數邏輯運算與影像融合(推薦)
  • [Python影像處理] 三十六.OpenCV影像幾何變換萬字詳解(平移縮放旋轉、鏡像仿射透視)
  • [Python影像處理] 三十七.OpenCV和Matplotlib繪制直方圖萬字詳解(掩膜直方圖、H-S直方圖、黑夜白天判斷)
  • [Python影像處理] 三十八.OpenCV影像增強萬字詳解(直方圖均衡化、區域直方圖均衡化、自動色彩均衡化)
  • [Python影像處理] 三十九.Python影像分類萬字詳解(貝葉斯影像分類、KNN影像分類、DNN影像分類)
  • [Python影像處理] 四十.全網首發Python影像分割萬字詳解(閾值分割、邊緣分割、紋理分割、分水嶺演算法、K-Means分割、漫水填充分割、區域定位)
  • [Python影像處理] 四十一.Python影像平滑萬字詳解(均值濾波、方框濾波、高斯濾波、中值濾波、雙邊濾波)
  • [Python影像處理] 四十二.Python影像銳化及邊緣檢測萬字詳解(Roberts、Prewitt、Sobel、Laplacian、Canny、LOG)
  • [Python影像處理] 四十三.Python影像形態學處理萬字詳解(腐蝕膨脹、開閉運算、梯度頂帽黑帽運算)
  • 萬字長文告訴新手如何學習Python影像處理(上篇完結 四十四)

一.目標檢測入門普及

該部分結合自己多年影像識別的經驗,并參考影像演算法AI(yegeli)、Zhengxia Zou、牛戈和SIGAI老師們的文章進行總結,主要通過七個核心問題帶領初學者了解什么是目標檢測,

1.什么是目標檢測?

目標檢測(Object Detection)旨在尋找出影像中所有感興趣的目標物體或物件,包含物體定位和物體分類兩個子任務,同時確定它們的類別和位置,如下圖所示,通過卷積神經網路有效定位貓的輪廓及類別,

目標檢測是計算機視覺領域中最基本、最具挑戰性的問題之一,近年來受到了廣泛的關注,它在過去二十年的發展可以說是計算機視覺歷史的縮影,由于各類物體有不同的外觀、形狀和姿態,加上成像時光照、遮擋、天氣、解析度、景深等因素的干擾,目標檢測一直是計算機視覺領域最具有挑戰性的問題,并且目標檢測的結果將直接影響后續的跟蹤、動作識別和行為描述的效果,因此,目標檢測發展到今天仍然是非常具有挑戰且存在很大提升空間的問題,

在這里插入圖片描述


2.目標檢測的核心問題是什么?

在計算機視覺領域,影像識別主要包括四大類任務:

  • 分類(Classification)
    解決“是什么?”問題,即給定一張圖片或一段視頻判斷里面包含什么類別的目標,
  • 定位(Location)
    解決“在哪里?”問題,即定位出這個目標的的位置,
  • 檢測(Detection)
    解決“在哪里?是什么?”問題,即定位出這個目標的位置并且知道目標物是什么,
  • 分割(Segmentation)
    包括實體分割(Instance-level)和場景分割(Scene-level),解決“每一個像素屬于哪個目標物或場景”的問題,

在這里插入圖片描述

如上圖所示(參考yegeli老師,推薦大家關注),目標檢測主要是實作分類問題和定位問題的疊加,其核心問題即:

  • 分類問題:確定圖片(或某個區域)中的影像屬于哪個類別,
  • 定位問題:目標可能出現在影像的任何位置,

同時,需要解決大小問題(目標存在各種不同的大小)和形狀問題(目標可能有各種不同的形狀),

在這里插入圖片描述


3.目標檢測演算法常用分類

每個領域的分類方法通常各式各樣,這里主要介紹兩種分類方法,

(1) 基于應用程式的角度分類
目標檢測作為計算機視覺的基本問題之一,是許多其他計算機視覺任務的基礎,如實體分割、影像字幕、物件跟蹤等,從應用程式的角度來看,目標檢測可以被分為兩個研究主題:

  • general object detection
    旨在探索統一框架下檢測不同型別物體的方法,以模擬人類的視覺和認知,

  • detection applications
    指特定應用場景下的檢測,如行人檢測、人臉檢測、文本檢測等,

近年來,隨著深度學習技術的快速發展,為目標檢測注入了新的血液,取得了顯著的突破,將其推向了一個前所未有的研究熱點,目前,目標檢測已廣泛應用于自主駕駛、機器人視覺、視頻監控等領域,下圖顯示了過去二十年中與“目標檢測”相關的出版物數量的增長,

在這里插入圖片描述

(2) 基于深度學習的目標檢測分類
基于深度學習的目標檢測演算法主要分為兩類:Two stage和One stage,

在這里插入圖片描述

  • Two stage
    Two-stage Detection將檢測框定為一個“從粗到細”的程序,先進行區域生成,該區域稱之為Region Proposal(簡稱RP,一個有可能包含待檢物體的預選框),再通過卷積神經網路進行樣本分類,
    任務流程:特征提取 => 生成RP => 分類/定位回歸,常見tow stage目標檢測演算法有:
    – R-CNN
    – SPP-Net
    – Fast R-CNN
    – Faster R-CNN
    – R-FCN
    – …

在這里插入圖片描述

  • One stage
    One-stage Detection定義為 “ 一步完成 ”程序,不用RP,直接在網路中提取特征來預測物體分類和位置,
    任務流程:特征提取 => 分類/定位回歸,常見one stage目標檢測演算法有:
    – OverFeat
    – YOLOv1
    – YOLOv2
    – YOLOv3
    – SSD
    – RetinaNet
    – …

在這里插入圖片描述


4.目標檢測常見演算法

在過去的二十年中,人們普遍認為,目標檢測的發展大致經歷了兩個歷史時期:“ 傳統的目標檢測時期 ” ( 2014年以前 ) 和 “ 基于深度學習的檢測時期 ” ( 2014年以后 ),其發展歷程如下圖所示,

在這里插入圖片描述

下面分別列舉了各里程碑式的目標檢測演算法,后續博客會分別進行詳細介紹及編程案例實作,

(1) 傳統檢測器(Traditional Detectors)
早期的目標檢測演算法大多是基于手工特征構建的,由于當時缺乏有效的影像表示,人們只能設計復雜的特征表示,以及各種加速技術來用盡有限的計算資源,

  • Viola Jones Detectors
    2001年,P. Viola和M. Jones在沒有任何約束條件(如膚色分割)的情況下首次實作了人臉的實時檢測,VJ檢測器采用滑動視窗最直接的檢測方法,查看影像中所有可能的位置和比例,看看是否有視窗包含人臉,其檢測器結合了 “積分影像”、“特征選擇” 和 “檢測級聯” 三種重要技術,大大提高了檢測速度,

  • HOG Detector
    方向梯度直方圖(HOG)特征描述符最初是由N. Dalal和B.Triggs在2005年提出的,HOG可以被認為是對當時的尺度不變特征變換和形狀背景關系的重要改進,多年來,HOG檢測器一直是許多目標檢測器和各種計算機視覺應用的重要基礎,

  • Deformable Part-based Model (基于可變形部件的模型,DPM)
    DPM最初是由P. Felzenszwalb提出的,于2008年作為HOG檢測器的擴展,DPM遵循“分而治之”的檢測思想,訓練可以簡單地看作是學習一種正確的分解物件的方法,推理可以看作是對不同物件部件的檢測的集合,例如,檢測“汽車”的問題可以看作是檢測它的視窗、車身和車輪,

在這里插入圖片描述

(2) CNN based Two-stage Detectors
隨著手工特征的性能趨于飽和,目標檢測在2010年之后達到了一個穩定的水平,2012年卷積神經網路在世界范圍內重生,由于深度卷積網路能夠學習影像的魯棒性和高層次特征表示,一個自然的問題是我們能否將其應用到目標檢測中?

在2014年,R. Girshick等人率先打破僵局,提出了具有CNN特征的區域(RCNN)用于目標檢測,從那時起,目標檢測開始以前所未有的速度發展,在深度學習時代,目標檢測可以分為兩類,即 two-stage detection 和 one-stage detection,分別對應“從粗到細”的檢測程序和“一步完成”的檢測程序,

  • RCNN
    RCNN首先通過選擇性搜索提取一組物件候選框,然后,每個提案都被重新調整成一個固定大小的影像,并輸入到一個在 ImageNet 上訓練得到的CNN模型 ( 如AlexNet) 來提取特征,最后,利用線性SVM分類器對每個區域內的目標進行預測,識別目標類別,

  • SPPNet
    2014年,K. He等人提出了空間金字塔池化網路 ( Spatial Pyramid Pooling Networks,SPPNet ) ,以前的CNN模型需要固定大小的輸入,例如,AlexNet需要224x224影像,SPPNet主要貢獻是引入了空間金字塔池化(SPP)層,它使CNN能夠生成固定長度的表示,而不需要重新縮放影像/感興趣區域的大小,利用SPPNet進行目標檢測時,只對整個影像進行一次特征映射計算,然后生成任意區域的定長表示,訓練檢測器,避免了卷積特征的重復計算,

  • Fast RCNN
    2015年,R. Girshick提出了 Fast RCNN 檢測器,這是對 R-CNN和SPPNet的進一步改進,Fast-RCNN融合了R-CNN和SPPNet的優點,使我們能夠在相同的網路配置下同時訓練檢測器和邊界框回歸器,

  • Faster RCNN
    2015年,S. Ren等人提出了 Faster RCNN 檢測器,在 Fast RCNN 之后不久,Faster RCNN是第一個端到端的,也是第一個接近實時的深度學習檢測器,Faster RCNN 主要貢獻是引入了區域建議網路 ( RPN ),使幾乎cost-free的區域建議成為可能,從RCNN到Faster RCNN,一個目標檢測系統中的大部分獨立塊,如提案檢測、特征提取、邊界框回歸等,都已經逐漸集成到一個統一的端到端學習框架中,

  • Feature Pyramid Networks(FPN)
    2017年,T.-Y.Lin等人基于 Faster RCNN 提出了特征金字塔網路 ( FPN ),在FPN之前,大多數基于深度學習的檢測器只在網路的頂層進行檢測,雖然CNN較深層的特征有利于分類識別,但不利于物件的定位,為此,開發了具有橫向連接的自頂向下體系結構,用于在所有級別構建高級語意,由于CNN通過它的正向傳播,自然形成了一個特征金字塔,FPN在檢測各種尺度的目標方面顯示出了巨大的進步,FPN現在已經成為許多最新探測器的基本組成部分,

在這里插入圖片描述

(3) CNN based One-stage Detectors

  • You Only Look Once (YOLO)
    YOLO由R. Joseph等人于2015年提出,它是深度學習時代的第一個單級檢測器,YOLO是“You Only Look Once”的縮寫,其速度較快,從它的名字可以看出,作者完全拋棄了之前的“提案檢測+驗證”的檢測范式,相反,它遵循一個完全不同的哲學:將單個神經網路應用于整個影像,該網路將影像分割成多個區域,同時預測每個區域的邊界框和概率,后來R. Joseph在 YOLO 的基礎上進行了一系列改進,提出了其 v2 和 v3 版本,在保持很高檢測速度的同時進一步提高了檢測精度,盡管與兩級探測器相比,它的探測速度有了很大的提高,但是YOLO的定位精度有所下降,特別是對于一些小目標,

  • Single Shot MultiBox Detector (SSD)
    SSD由W. Liu等人于2015年提出,這是深度學習時代的第二款單級探測器,SSD的主要貢獻是引入了多參考和多解析度檢測技術,這大大提高了單級檢測器的檢測精度,特別是對于一些小目標,SSD與以往任何檢測器的主要區別在于,前者在網路的不同層檢測不同尺度的物件,而后者僅在其頂層運行檢測,

  • RetinaNet
    單級檢測器速度快、結構簡單,但多年來一直落后于兩級檢測器的精度,T.-Y.Lin等人發現了背后的原因,并在2017年提出了RetinaNet,他們聲稱,在密集探測器訓練程序中所遇到的極端的前景-背景階層不平衡(the extreme foreground-background class imbalance)是主要原因,為此,在 RetinaNet 中引入了一個新的損失函式“焦損失(focal loss)”,通過對標準交叉熵損失的重構,使檢測器在訓練程序中更加關注難分類的樣本,焦損耗使得單級檢測器在保持很高的檢測速度的同時,可以達到與兩級檢測器相當的精度,

在這里插入圖片描述

建立具有更少偏置的大資料集,是開發先進的計算機視覺演算法的關鍵,在目標檢測方面,在過去10年中,已經發布了許多著名的資料集和基準測驗,包括 PASCAL VOC 挑戰的資料集(如VOC2007、VOC2012)、ImageNet大尺度視覺識別挑戰(如ILSVRC2014)、MS-COCO檢測挑戰等,表1給出了這些資料集的統計資料,下圖顯示了這些資料集的一些影像示例,

在這里插入圖片描述

在這里插入圖片描述


5.目標檢測應用

  • 車輛檢測
    自動駕駛、違章查詢、關鍵通道檢測、廣告檢測(檢測廣告中的車輛型別,彈出鏈接)等,

在這里插入圖片描述

  • 人臉檢測
    人臉支付、智能門控、考勤簽到、智慧超市、車站機場實名認證、公共安全(逃犯抓捕、走失人員檢測)等,

在這里插入圖片描述

  • 行人檢測
    步態識別、智能輔助駕駛、智能監控、暴恐檢測(根據面相識別暴恐傾向)、移動偵測、區域入侵檢測、安全帽/安全帶檢測等,

在這里插入圖片描述

  • 遙感檢測
    大地遙感(如土地使用、公路、水渠、河流監控)、農作物監控、工業檢測、JS檢測等,

在這里插入圖片描述


6.目標檢測未來挑戰

近20年來,目標檢測取得了顯著的成就,包括里程碑檢測器、關鍵技術、加速方法、檢測應用、資料集和指標,,如VJ、HOG、DPM、Faster-RCNN、YOLO、SSD等,未來的目標檢測研究可能會集中在以下幾個方面:

在這里插入圖片描述

  • 加快檢測演算法的速度(Lightweight object detection)
    使其能夠在移動設備上平穩運行,一些重要的應用包括移動增強現實、智能攝像頭、人臉驗證等,雖然近年來已經做了很大的努力,但機器和人眼之間的速度差距仍然很大,特別是在檢測一些小物體時,

  • 自動機器學習目標檢測(Detection meets AutoML)
    近年來,基于深度學習的檢測器變得越來越復雜,嚴重依賴于經驗,未來的方向是在使用神經結構搜索設計檢測模型時減少人為干預 ,譬如如何設計引擎和如何設定錨框 ) ,AutoML可能是未來的目標檢測,

  • 領域自適應檢測(Detection meets domain adaptation)
    任何目標檢測器的訓練程序本質上都可以看作是一個假設資料獨立且同分布(i.i.d)時的似然估計程序,使用非 i.i.d 資料的目標檢測,特別是對一些實際應用程式來說,仍然是一個挑戰,GAN在領域自適應方面顯示出良好的應用前景,對未來的目標檢測具有重要的指導意義,

  • 弱監督檢測(Weakly supervised detection)
    基于深度學習的檢測器的訓練通常依賴于大量注釋良好的影像,注釋程序耗時、開銷大且效率低,開發弱監督檢測技術,只使用影像級標注或部分使用邊界框標注對檢測器進行訓練,對于降低人工成本和提高檢測靈活性具有重要意義,

  • 小目標檢測(Small object detection)
    在大場景中檢測小物體一直是一個挑戰,該研究方向的一些潛在應用包括利用遙感影像計算野生動物的數量和檢測一些重要JS目標的狀態,進一步的方向可能包括視覺注意機制的集成和高解析度輕量級網路的設計,

  • 視頻目標檢測(Detection in videos)
    高清視頻中的實時目標檢測/跟蹤對于視頻監控和自主駕駛具有重要意義,傳統的目標檢測器通常設計為基于影像的檢測,而忽略了視頻幀之間的相關性,通過探索時空相關性來改進檢測是一個重要的研究方向,

  • 含資訊融合的目標檢測(Detection with information fusion)
    RGB-D影像、三維點云、激光雷達等多資料源/多模式的目標檢測對自主駕駛和無人機應用具有重要意義,目前存在的問題包括:如何將訓練有素的檢測器移植到不同的資料模式,如何進行資訊融合以提高檢測能力等,

在這里插入圖片描述


7.目標檢測原理簡述

目標檢測分為兩大系列——RCNN系列和YOLO系列,RCNN系列是基于區域檢測的代表性演算法,YOLO是基于區域提取的代表性演算法,另外還有著名的SSD是基于前兩個系列的改進,基本原理包括:

(1) 候選區域產生
目標檢測技術大都會涉及候選框(bounding boxes)的生成,物體候選框獲取當前主要使用影像分割與區域生長技術,區域生長(合并)主要由于檢測影像中存在的物體具有區域區域相似性(顏色、紋理等),目標識別與影像分割技術的發展進一步推動有效提取影像中資訊,

  • 滑動視窗
    ① 首先對輸入影像進行不同視窗大小的滑窗進行從左往右、從上到下的滑動,每次滑動時候對當前視窗執行分類器(分類器是事先訓練好的),如果當前視窗得到較高的分類概率,則認為檢測到了物體,② 對每個不同視窗大小的滑窗都進行檢測后,會得到不同視窗檢測到的物體標記,這些視窗大小會存在重復較高的部分,接著采用非極大值抑制(Non-Maximum Suppression, NMS)的方法進行篩選,③ 最終經過NMS篩選后獲得檢測到的物體,

在這里插入圖片描述

  • 選擇性搜索
    影像中物體可能存在的區域應該是有某些相似性或者連續性區域的,因此,選擇搜索基于上面這一想法采用子區域合并的方法進行提取bounding boxes,① 首先對輸入影像進行分割演算法產生許多小的子區域,② 根據這些子區域之間相似性(相似性標準主要有顏色、紋理、大小等)進行區域合并,不斷的進行區域迭代合并,每次迭代程序中對這些合并的子區域做bounding boxes(外切矩形),這些子區域外切矩形就是通常所說的候選框,最終提高檢測物體的概率,

在這里插入圖片描述

(2) 資料表示
經過標記后的樣本資料如下所示:

在這里插入圖片描述

預測輸出可以表示如下,其中pc為預測結果的置信概率,(bx,by,bw,bh)是邊框坐標,Ci為屬于某個類別的概率,通過預測結果、實際結果,構建損失函式,

在這里插入圖片描述

(3) 效果評估
使用IoU(Intersection over Union,交并比)來判斷模型的好壞,交并比是指預測邊框、實際邊框交集和并集的比率,一般約定0.5為一個可以接收的值,

在這里插入圖片描述

(4) 非極大值抑制
預測結果中,可能多個預測結果間存在重疊部分,需要保留交并比最大的、去掉非最大的預測結果,這就是非極大值抑制(Non-Maximum Suppression,簡寫作NMS),如下圖所示,對同一個物體預測結果包含三個概率0.8、0.9、0.95,經過非極大值抑制后,僅保留概率最大的預測結果,

在這里插入圖片描述

寫到這里,一個簡單的目標檢測程序介紹完畢,接下來我們重點使用ImageAI庫實作最簡單的目標檢測或物件檢測案例,這部分原理應用了yegeli老師的博客,

參加及推薦文章,大家可以關注并前往學習,

  • 目標檢測(Object Detection) - 影像演算法AI yegeli老師
  • https://arxiv.org/abs/1905.05055v2
  • Object Detection in 20 Years: A Survey 綜述:目標檢測的二十年 - 牛戈老師
  • 目標檢測最新進展總結與展望 - SIGAI老師
  • 論文筆記-2019-Object Detection in 20 Years: A Survey

二.ImageAI簡介

ImageAI是一個開源Python庫,旨在使開發人員能夠使用簡單的幾行代碼構建具有包含深度學習和計算機視覺功能的應用程式和系統, 這個AI Commons專案由Moses Olafenwa和John Olafenwa開發和維護,官方原始碼及檔案如下:

  • https://github.com/OlafenwaMoses/ImageAI
  • https://imageai-cn.readthedocs.io/zh_CN/latest/

在這里插入圖片描述

在這里插入圖片描述

ImageAI本著簡潔的原則,支持最先進的機器學習演算法,用于 影像預測自定義影像預測物體檢測視頻檢測視頻物件跟蹤影像預測訓練,ImageAI目前支持使用在ImageNet-1000資料集上訓練的4種不同機器學習演算法進行影像預測和訓練,ImageAI還支持使用在COCO資料集上訓練的RetinaNetYOLOv3TinyYOLOv3 進行物件檢測、視頻檢測和物件跟蹤, 最終,ImageAI將為計算機視覺提供更廣泛和更專業化的支持,包括但不限于特殊環境和特殊領域的影像識別,

  • 新版本:ImageAI 2.1.6

在這里插入圖片描述

新添加功能:

  • 添加了SqueezeNet、ResNet50、InceptionV3 和 DenseNet121 模型進行自定義影像預測訓練
  • 添加了自定義訓練模型和json檔案進行匯入和匯出自定義影像
  • 預覽版:添加視頻物件檢測和視頻自定義物件檢測(物件跟蹤)
  • 為所有影像預測和物件檢測任務添加檔案,numpy陣列和流輸入型別
  • 添加檔案和numpy陣列輸出型別,用于影像中的物件檢測和自定義物件檢測
  • 引入4種速度模式(normal, fast, faster 和 fastest)進行影像預測,在fastest速度模式下預測時間將縮短50%,同時保持預測精準度
  • 為影像所有物體檢測和視頻物體檢測任務引入5種速度模式(normal, fast, faster, fastest 和 flash)
  • 引入幀檢測率,允許開發人員調整視頻中的檢測間隔frame_detection_interval,有利于達到特定效果

ImageAI核心功能如下:

1.影像檢測
ImageAI提供 4 種不同的演算法和模型型別來執行影像預測,并在ImageNet-1000資料集上進行訓練,為影像預測提供的4 種演算法包括:

  • MobileNetV2
  • ResNet50
  • InceptionV3
  • DenseNet121

在這里插入圖片描述


2.物件檢測
ImageAI提供了非常方便和強大的方法來對影像進行物件檢測并從影像中提取每個物件,物件檢測類提供對三種模型的支持,并提供針對最先進性能或實時處理進行調整的選項,

  • RetinaNet
  • YOLOv3
  • TinyYOLOv3

在這里插入圖片描述

person : 91.946941614151
--------------------------------
person : 73.61021637916565
--------------------------------
laptop : 90.24320840835571
--------------------------------
laptop : 73.6881673336029
--------------------------------
laptop : 95.16398310661316
--------------------------------
person : 87.10319399833679
--------------------------------

3.視頻物件檢測和跟蹤
ImageAI提供了非常方便和強大的方法來執行視頻中的物件檢測和跟蹤特定物件,提供的視頻物件檢測類僅支持當前最先進的RetinaNet,但可以選擇調整最先進的性能或實時處理,下圖展示了對人、自行車和摩托車的視頻快照檢測效果,

在這里插入圖片描述

下面是ImageAI回傳到“per_second”函式中的視頻分析的可視化,

在這里插入圖片描述


4.自定義模型訓練
ImageAI為您提供了用于訓練新模型的類和方法,該模型可用于對您自己的自定義物件進行預測,您可以在5行代碼中使用演算法訓練您的自定義模型 ,

  • SqueezeNet
  • ResNet50
  • InceptionV3
  • DenseNet

下圖展示了來自IdenProf資料集的樣本,用于訓練預測專業人士的模型,

在這里插入圖片描述

自定義影像預測:來自在 IdenProf 上訓練的樣本模型的預測,用于預測專業人士,

在這里插入圖片描述

mechanic : 76.82620286941528
chef : 10.106072574853897
waiter : 4.036874696612358
police : 2.6663416996598244
pilot : 2.239348366856575

ImageAI提供了一些類和方法,供您使用通過ImageAI模型訓練類訓練的自己的模型來運行影像預測您自己的自定義物件,您可以使用SqueezeNet、ResNet50、InceptionV3和DenseNet訓練的自定義模型以及包含自定義物件名稱映射的JSON檔案,


5.自定義檢測模型訓練
ImageAI提供類和方法供您在自定義資料集上訓練新的YOLOv3物件檢測模型,這意味著您可以通過提供影像、注釋和使用 ImageAI 進行訓練來訓練模型以檢測任何感興趣的物件,

在這里插入圖片描述

下圖展示了自定義YOLOv3模型的檢測結果,該模型經過訓練以檢測 Hololens 耳機,

在這里插入圖片描述

hololens  :  39.69653248786926  :  [611, 74, 751, 154]
hololens  :  87.6643180847168  :  [23, 46, 90, 79]
hololens  :  89.25175070762634  :  [191, 66, 243, 95]
hololens  :  64.49641585350037  :  [437, 81, 514, 133]
hololens  :  91.78624749183655  :  [380, 113, 423, 138]

ImageAI現在提供類和方法,供您使用通過DetectionModelTraining類訓練的自己的模型檢測和識別影像中的自定義物件,您可以使用自定義訓練的YOLOv3模式和訓練期間生成的detection_config.json檔案,


6.自定義視頻物件檢測和分析
來自自定義 YOLOv3 模型的視頻檢測結果,訓練用于檢測視頻中的 Hololens 耳機,

在這里插入圖片描述


三.安裝流程

安裝程序比較簡單,直接呼叫pip工具即可,

  • pip install imageai --upgrade
  • pip install imageai-2.0.2-py3-none-any.whl
    Processing c:\users\xxx\downloads\imageai-2.0.2-py3-none-any.whl
(base) C:\Users\xiuzhang>activate tensorflow
(tensorflow) C:\Users\xiuzhang>cd Downloads

(tensorflow) C:\Users\xiuzhang\Downloads>pip install imageai-2.0.2-py3-none-any.whl
Processing c:\users\xiuzhang\downloads\imageai-2.0.2-py3-none-any.whl
Installing collected packages: imageai
Successfully installed imageai-2.0.2

本地安裝下載鏈接如下:

  • https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.2/imageai-2.0.2-py3-none-any.whl

在這里插入圖片描述

依賴擴展包:

  • Python 3.5.1
  • Tensorflow 1.4.0
  • Numpy 1.13.1
  • SciPy 0.19.1
  • OpenCV
  • pillow
  • Matplotlib
  • h5py
  • Keras 2.x

四.TinyYOLOv3模型物件檢測案例

1.案例實作

物件檢測是計算機視覺領域中的一種技術,它處理識別和跟蹤影像和視頻中存在的物件,目標檢測有多種應用,如人臉檢測、車輛檢測、行人計數、自動駕駛汽車、安全系統等,ImageAI提供了非常方便和強大的方法來對影像進行物件檢測并從影像中提取每個物件,ImageAI 包含幾乎所有最先進的深度學習演算法的Python 實作,如RetinaNet、YOLOv3和 TinyYOLOv3,

ImageAI使用物件檢測、視頻檢測和物件跟蹤 API,無需訪問網路即可呼叫,ImageAI使用預先訓練的模型并且可以輕松定制,ImageAI中的 ObjectDetectionImageAI 庫的類包含使用預訓練模型對任何影像或影像集執行物件檢測的函式,借助 ImageAI,可以檢測和識別 80 種不同的常見日常物品,

在這里插入圖片描述

下面開始實作一個簡單的物件檢測案例,

第一步,成功安裝ImageAI后,下載包含將用于物件檢測的分類模型的TinyYOLOv3模型檔案,

  • https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/yolo-tiny.h5

第二步,創建如下圖所示的檔案夾,

  • Object-detection:根檔案夾
  • models:存盤預先訓練的模型
  • input : 存盤要執行物件檢測的影像檔案
  • output:存盤檢測到物件的影像檔案

在這里插入圖片描述

│  test_detector.py
│
├─input
│      test_car.png
│
├─models
│      yolo-tiny.h5
│
└─output

第三步,創建test_detector.py檔案,從ImageAI庫匯入ObjectDetection類,

from imageai.Detection import ObjectDetection

第四步,實體化ObjectDetection并指定相關的路徑檔案,

model_path = "./models/yolo-tiny.h5"
input_path = "./input/test_car-02.png"
output_path = "./output/pre_car-02.png"

detector = ObjectDetection()

第五步,利用實體化ObjectDetection類,呼叫其中的函式實作不同的功能,該類包含以下功能呼叫預先訓練模式:

  • setModelTypeAsRetinaNet()
  • setModelTypeAsYOLOv3()
  • setModelTypeAsTinyYOLOv3()

第六步,使用預訓練TinyYOLOv3模型,利用setModelTypeAsTinyYOLOv3()函式加載模型,

detector.setModelTypeAsTinyYOLOv3()

第七步,設定模型路徑并實作影像物件檢測,這里需要detectObjectsFromImage使用detector創建的物件,并輸出結果,

detector.setModelPath(model_path)
detector.loadModel()
detection = detector.detectObjectsFromImage(input_image=input_path, 
                                            output_image_path=output_path)

完整代碼如下圖所示:

# -*- coding: utf-8 -*-
"""
Created on Mon Jul 26 14:26:27 2021
@author: xiuzhang
"""

from imageai.Detection import ObjectDetection

#實體化
detector = ObjectDetection()

#路徑定義
model_path = "./models/yolo-tiny.h5"
input_path = "./input/test_car.png"
output_path = "./output/pre_car.png"

#預訓練模式
detector.setModelTypeAsTinyYOLOv3()

#設定預訓練模型路徑
detector.setModelPath(model_path)

#加載模型
detector.loadModel()

#創建物件
detection = detector.detectObjectsFromImage(input_image=input_path, output_image_path=output_path)

#檢測結果
for eachItem in detection:
    print(eachItem["name"] , " : ", eachItem["percentage_probability"])

輸入影像如下圖所示,位于input檔案夾中,

請添加圖片描述

輸出結果如下圖所示,可以看到不同列類別的預測概率及對應輪廓,

在這里插入圖片描述

請添加圖片描述

同時,還可以預測其他的車輛及行人等,

在這里插入圖片描述

請添加圖片描述


2.學習建議

個人認為Python提供了良好的擴展包供大家學習,如果您對CV感興趣,可以先閱讀作者前面的影像處理系列文章,后面再進行目標檢測的實驗,而目標檢測可以嘗試先了解最簡單調包的實作,后面再一步步告訴大家如果構建YOLO或SSD模型,

此外,Python開源庫提供了強大的源代碼,大家可以去學習及修改對應的功能,比如:

  • setModelTypeAsTinyYOLOv3函式原型

在這里插入圖片描述

在這里插入圖片描述

同時,該擴展包可以檢測多種型別的物件,從上圖源代碼中可以看到,也可以看到繪制方塊及Text的程序,

在這里插入圖片描述

后續作者會想辦法嘗試自定義資料集進行目標識別,比如農產品、飛行器、自然災害等,

  • https://github.com/OlafenwaMoses/ImageAI/blob/master/imageai/Classification/CUSTOMCLASSIFICATION.md
from imageai.Classification.Custom import CustomImageClassification
import os

execution_path = os.getcwd()

prediction = CustomImageClassification()
prediction.setModelTypeAsResNet50()
prediction.setModelPath(os.path.join(execution_path, "idenprof_resnet_ex-056_acc-0.993062.h5"))
prediction.setJsonPath(os.path.join(execution_path, "idenprof.json"))
prediction.loadModel(num_objects=10)

predictions, probabilities = prediction.classifyImage(os.path.join(execution_path, "4.jpg"), result_count=5)

for eachPrediction, eachProbability in zip(predictions, probabilities):
    print(eachPrediction + " : " + eachProbability)

最后推薦劉兄的系列文章,也真心不錯,

  • 深度學習和目標檢測系列教程 2-300:小試牛刀,使用 ImageAI 進行物件檢測

五.總結

寫到這里,第一篇目標檢測入門文章就介紹完畢,希望您喜歡,

  • 一.目標檢測入門普及
    1.什么是目標檢測?
    2.目標檢測的核心問題是什么?
    3.目標檢測演算法常用分類
    4.目標檢測常見演算法
    5.目標檢測應用
    6.目標檢測未來挑戰
    7.目標檢測原理簡述
  • 二.ImageAI簡介
  • 三.安裝流程
  • 四.TinyYOLOv3模型物件檢測案例
    1.案例實作
    2.學習建議

在這里插入圖片描述

源代碼下載地址,記得幫忙點star和關注喔,

  • https://github.com/eastmountyxz/ImageProcessing-Python

大學之道在明明德,
在親民,在止于至善,
這周又回答了很多博友的問題,有大一學生的困惑,有論文的咨詢,也有老鄉和考博的疑問,還有無數博友奮斗路上的相互勉勵,雖然自己早已忙成狗,但總忍不住去解答別人的問題,最后那一句感謝和祝福,永遠是我最大的滿足,雖然會花費我一些時間,但也挺好的,無所謂了,跟著心走,不負遇見,感恩同行,莫愁前路無知己,繼續加油,晚安娜和珞,

在這里插入圖片描述

(By:Eastmount 2021-08-03 晚上10點 http://blog.csdn.net/eastmount/ )

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/291872.html

標籤:python

上一篇:【python實戰】不玩微博,一封郵件就能知道實時熱榜,天秀吃瓜

下一篇:全網首發,一篇文章帶你走進pycharm的世界----別再問我pycharm的安裝和環境配置了!!!萬字只為君一笑,趕緊收藏起來吧

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more