天天看點

python 實作顯著性檢測_使用python輕松實作高大上的YOLOV4對象檢測算法YOLOV4對象檢測算法綜述:模型中的名詞架構選擇python+opencv 實作YOLOV4YOLOV4 圖檔識别下期預告

YOLO系列對象檢測算法,算是人工智能技術領域的一匹黑馬,當開發者宣布不再為YOLO系列檢測算法更新時,很多開發者瞬間失去了”精神食糧“。突然,當YOLOV4檢測算法釋出的時候,讓很多開發者喜出望外。

python 實作顯著性檢測_使用python輕松實作高大上的YOLOV4對象檢測算法YOLOV4對象檢測算法綜述:模型中的名詞架構選擇python+opencv 實作YOLOV4YOLOV4 圖檔識别下期預告

YOLOV4對象檢測

YOLOV4對象檢測算法綜述:

python 實作顯著性檢測_使用python輕松實作高大上的YOLOV4對象檢測算法YOLOV4對象檢測算法綜述:模型中的名詞架構選擇python+opencv 實作YOLOV4YOLOV4 圖檔識别下期預告

COCO 模型上的檢測資料

43.5%mAP+65FPS 精度速度最優平衡,YOLOV4無論是在速度上,還是在精度上,都絕對碾壓很多對象檢測算法,在論文中,作者也是采用了大量的調優算法來加速YOLOV4的檢測模型

權重殘差連接配接(WRC)

跨階段部分連接配接(CSP)

跨小批量标準化(CmBN)

自對抗訓練(SAT)

Mish激活

馬賽克資料增強

CmBN

DropBlock正則化

CIoU Loss

python 實作顯著性檢測_使用python輕松實作高大上的YOLOV4對象檢測算法YOLOV4對象檢測算法綜述:模型中的名詞架構選擇python+opencv 實作YOLOV4YOLOV4 圖檔識别下期預告

對象檢測

模型中的名詞

Input:算法的輸入,包括整個圖像,一個patch,或者是image pyramid

Backbone:可以了解為提取圖像特征的部分,可以參考經訓練好的網絡,例如(VGG16,ResNet-50, ResNeXt-101, Darknet53等)

Neck:特征增強子產品,前面的backbone已經提取到了一些相關的淺層特征,由這部分對backbone提取到的淺層特征(low-level feature)進行加工,增強,進而使得模型學到的特征是想要的特征。

Head:檢測頭。如果想直接得到bbox,那就可以接conv來輸出結果,例如Yolo,SSD

是以,一個檢測算法可以了解為:

Object Detection = Input+Backbone + Neck + Head

Bag of freebies

什麼叫Bag of freebies?在目标檢測中是指:用一些比較有用的訓練技巧來訓練模型,進而使得模型取得更好的準确率但是不增加模型的複雜度,也就不增加推理(inference)是的計算量(cost)。在目标檢測中,提到bag of freebies,首先會想到的 就是Data augmentation。

Data augmentation

目的在于增加訓練樣本的多樣性,使得檢測模型具有高的魯棒性。常見的資料增強方式包括兩個方面:幾何增強以及色彩增強。

  • 幾何增強包括:随機翻轉(水準翻轉較多,垂直翻轉較少),随機裁剪(crop),拉伸,以及旋轉。
  • 色彩增強包括:對比度增強,亮度增強,以及較為關鍵的HSV空間增強。

.Bag of specials

什麼叫做bag of specials:就是指一些plugin modules(例如特征增強模型,或者一些後處理),這部分增加的計算量(cost)很少,但是能有效地增加物體檢測的準确率,我們将這部分稱之為Bag of specials

架構選擇

python 實作顯著性檢測_使用python輕松實作高大上的YOLOV4對象檢測算法YOLOV4對象檢測算法綜述:模型中的名詞架構選擇python+opencv 實作YOLOV4YOLOV4 圖檔識别下期預告

架構選擇

一個模型的分類效果好不見得其檢測效果就好,想要檢測效果好需要以下幾點:

  • 更大的網絡輸入分辨率——用于檢測小目标
  • 更深的網絡層——能夠覆寫更大面積的感受野
  • 更多的參數——更好的檢測同一圖像内不同size的目标

為了增大感受野,作者使用了SPP-block,使用PANet代替FPN進行參數聚合以适用于不同level的目标檢測。

YOLOv4的架構:

  • backbone:CSPResNext50
  • additional block:SPP-block
  • path-aggregation neck:PANet
  • heads:YOLOv3的heads

YOLOV4的改進,作者不僅增加了以上的優化算法,更是改進了其他方面的技術,比如:

  • 一種新的資料增強Mosaic法和Self-AdversarialTraining 自對抗訓練法。
python 實作顯著性檢測_使用python輕松實作高大上的YOLOV4對象檢測算法YOLOV4對象檢測算法綜述:模型中的名詞架構選擇python+opencv 實作YOLOV4YOLOV4 圖檔識别下期預告

Mosaic法和Self-AdversarialTraining

  • 應用遺傳算法選擇最優超參數。
  • 改進SAM,改進PAN,和交叉小批量标準化(CmBN),使設計适合于有效的訓練和檢測
python 實作顯著性檢測_使用python輕松實作高大上的YOLOV4對象檢測算法YOLOV4對象檢測算法綜述:模型中的名詞架構選擇python+opencv 實作YOLOV4YOLOV4 圖檔識别下期預告

SAM,PAN

更加詳細的技術,大家可以參考作者的論文以及GitHub源代碼進行分享學習

python+opencv 實作YOLOV4

python 實作顯著性檢測_使用python輕松實作高大上的YOLOV4對象檢測算法YOLOV4對象檢測算法綜述:模型中的名詞架構選擇python+opencv 實作YOLOV4YOLOV4 圖檔識别下期預告

python+opencv 實作YOLOV4

YOLOV4的實作,除了作者分享的Darknet之外,現在還有了tensorflow、Pytorch、keras等等方法的實作,但是始終沒有比較簡答的代碼實作(畢竟tensorflow、Pytorch、keras技術,不是很好掌握)

opencv4.4版本的釋出,宣布支援最新的YOLOV4對象檢測算法,同時還優化了大量的工作

本部分代碼需要更新一下你的opencv版本到4.4

YOLOV4 圖檔識别

模型初始化

import numpy as np
import timeimport cv2import oslabelsPath =  "yolo-coco/coco.names"
LABELS = Nonewith open(labelsPath,'rt') as f:
    LABELS = f.read().rstrip('\n').split("\n")
np.random.seed(42)
COLORS = np.random.randint(0, 255, size=(len(LABELS), 3),dtype="uint8")
weightsPath = "yolo-coco/yolov4.weights"
configPath = "yolo-coco/yolov4.cfg"
net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)
           

1-5行:首先我們導入第三方庫

7-10行:我們加載YOLOV4在COCO訓練集上的對象名稱

12-13行:初始化随機的顔色,這裡主要是為後續檢測到不同的對象,進行不同顔色的邊框畫圖

15-17:初始化YOLOV4的模型,cv2.dnn.readNetFromDarknet(configPath, weightsPath)函數來加載模型的CFG以及weights參數

python 實作顯著性檢測_使用python輕松實作高大上的YOLOV4對象檢測算法YOLOV4對象檢測算法綜述:模型中的名詞架構選擇python+opencv 實作YOLOV4YOLOV4 圖檔識别下期預告

代碼截圖

加載圖檔進行神經網絡檢測

image = cv2.imread("images/3.jpg")
(H, W) = image.shape[:2]
ln = net.getLayerNames()ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]
blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416),swapRB=True, crop=False)
net.setInput(blob)start = time.time()
layerOutputs = net.forward(ln)end = time.time()
print("[INFO] YOLO took {:.6f} seconds".format(end - start))
           

19-20行:輸入圖檔,擷取圖檔的長度與寬度

22-28行:計算圖檔的blob值,輸入神經網絡,進行前向回報預測圖檔,隻不過net.forward裡面是ln, 神經網絡的所有out層,這裡我們定義了一個time函數,用來計算YOLOV4的檢測時間

python 實作顯著性檢測_使用python輕松實作高大上的YOLOV4對象檢測算法YOLOV4對象檢測算法綜述:模型中的名詞架構選擇python+opencv 實作YOLOV4YOLOV4 圖檔識别下期預告

代碼截圖

周遊檢測結果

32-34:首先初始化一些參數,主要用來存檢測到的結果資料

36-42:周遊所有的檢測層,提取檢測到的圖檔對象置信度以及label ID

44-53:我們過濾到置信度小于0.5的對象,提取大于0.5置信度的對象,分别計算每個檢測對象的BOX、置信度以及label ID,并儲存在如下先前建立的初始化參數list裡面

boxes = []

confidences = []

classIDs = []

python 實作顯著性檢測_使用python輕松實作高大上的YOLOV4對象檢測算法YOLOV4對象檢測算法綜述:模型中的名詞架構選擇python+opencv 實作YOLOV4YOLOV4 圖檔識别下期預告

代碼截圖

通過以上代碼便實作了python的YOLOV4對象檢測,但是檢測的結果并不理想,對于每個對象,Yolo4 會框出 3 個左右的區域,但是我們隻需要顯示出最合适的區域。非最大值抑制算法,就是搜尋出局部最大值,将置信度最大的框儲存,其餘删除。

非最大值抑制來定義最大的邊框

idxs = cv2.dnn.NMSBoxes(boxes, confidences, 0.5,0.4)
if len(idxs) > 0:	for i in idxs.flatten():		(x, y) = (boxes[i][0], boxes[i][1])
		(w, h) = (boxes[i][2], boxes[i][3])
		color = [int(c) for c in COLORS[classIDs[i]]]		cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)		text = "{}: {:.4f}".format(LABELS[classIDs[i]], confidences[i])		cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX,
			0.5, color, 2)cv2.imshow("Image", image)cv2.waitKey(0)
           

最後,我們使用非最大值抑制算法,把每個對象的最大邊框顯示出來,以便我們檢測模型的結果

python 實作顯著性檢測_使用python輕松實作高大上的YOLOV4對象檢測算法YOLOV4對象檢測算法綜述:模型中的名詞架構選擇python+opencv 實作YOLOV4YOLOV4 圖檔識别下期預告

代碼截圖

以上便是完整的python opencv實作YOLOV4的代碼,本部分代碼與YOLOV3的實作類似,小夥伴們可以參考小編往期的文章關于YOLOV3的介紹,最後我們運作一下代碼,看看實作檢測的效果

python 實作顯著性檢測_使用python輕松實作高大上的YOLOV4對象檢測算法YOLOV4對象檢測算法綜述:模型中的名詞架構選擇python+opencv 實作YOLOV4YOLOV4 圖檔識别下期預告

YOLOV4

YOLOV4的檢測,用起來,确實速度有了很大的提示,就如上圖一樣,檢測隻用了1.3S左右,速度與精度的結合,美中不足的地方是上圖的人的置信度才0.777

下期預告

當然YOLOV4檢測算法完全可以使用在視訊檢測,以及攝像頭的實時對象檢測,本部分代碼我們下期分享