python 实现显著性检测_使用python轻松实现高大上的YOLOV4对象检测算法
YOLO系列對(duì)象檢測(cè)算法,算是人工智能技術(shù)領(lǐng)域的一匹黑馬,當(dāng)開發(fā)者宣布不再為YOLO系列檢測(cè)算法更新時(shí),很多開發(fā)者瞬間失去了”精神食糧“。突然,當(dāng)YOLOV4檢測(cè)算法發(fā)布的時(shí)候,讓很多開發(fā)者喜出望外。
YOLOV4對(duì)象檢測(cè)
YOLOV4對(duì)象檢測(cè)算法綜述:
COCO 模型上的檢測(cè)數(shù)據(jù)
43.5%mAP+65FPS 精度速度最優(yōu)平衡,YOLOV4無論是在速度上,還是在精度上,都絕對(duì)碾壓很多對(duì)象檢測(cè)算法,在論文中,作者也是采用了大量的調(diào)優(yōu)算法來加速YOLOV4的檢測(cè)模型
加權(quán)殘差連接(WRC)
跨階段部分連接(CSP)
跨小批量標(biāo)準(zhǔn)化(CmBN)
自對(duì)抗訓(xùn)練(SAT)
Mish激活
馬賽克數(shù)據(jù)增強(qiáng)
CmBN
DropBlock正則化
CIoU Loss
對(duì)象檢測(cè)
模型中的名詞
Input:算法的輸入,包括整個(gè)圖像,一個(gè)patch,或者是image pyramid
Backbone:可以理解為提取圖像特征的部分,可以參考經(jīng)訓(xùn)練好的網(wǎng)絡(luò),例如(VGG16,ResNet-50, ResNeXt-101, Darknet53等)
Neck:特征增強(qiáng)模塊,前面的backbone已經(jīng)提取到了一些相關(guān)的淺層特征,由這部分對(duì)backbone提取到的淺層特征(low-level feature)進(jìn)行加工,增強(qiáng),從而使得模型學(xué)到的特征是想要的特征。
Head:檢測(cè)頭。如果想直接得到bbox,那就可以接conv來輸出結(jié)果,例如Yolo,SSD
因此,一個(gè)檢測(cè)算法可以理解為:
Object Detection = Input+Backbone + Neck + Head
Bag of freebies
什么叫Bag of freebies?在目標(biāo)檢測(cè)中是指:用一些比較有用的訓(xùn)練技巧來訓(xùn)練模型,從而使得模型取得更好的準(zhǔn)確率但是不增加模型的復(fù)雜度,也就不增加推理(inference)是的計(jì)算量(cost)。在目標(biāo)檢測(cè)中,提到bag of freebies,首先會(huì)想到的 就是Data augmentation。
Data augmentation
目的在于增加訓(xùn)練樣本的多樣性,使得檢測(cè)模型具有高的魯棒性。常見的數(shù)據(jù)增強(qiáng)方式包括兩個(gè)方面:幾何增強(qiáng)以及色彩增強(qiáng)。
幾何增強(qiáng)包括:隨機(jī)翻轉(zhuǎn)(水平翻轉(zhuǎn)較多,垂直翻轉(zhuǎn)較少),隨機(jī)裁剪(crop),拉伸,以及旋轉(zhuǎn)。
色彩增強(qiáng)包括:對(duì)比度增強(qiáng),亮度增強(qiáng),以及較為關(guān)鍵的HSV空間增強(qiáng)。
.Bag of specials
什么叫做bag of specials:就是指一些plugin modules(例如特征增強(qiáng)模型,或者一些后處理),這部分增加的計(jì)算量(cost)很少,但是能有效地增加物體檢測(cè)的準(zhǔn)確率,我們將這部分稱之為Bag of specials
架構(gòu)選擇
架構(gòu)選擇
一個(gè)模型的分類效果好不見得其檢測(cè)效果就好,想要檢測(cè)效果好需要以下幾點(diǎn):
更大的網(wǎng)絡(luò)輸入分辨率——用于檢測(cè)小目標(biāo)
更深的網(wǎng)絡(luò)層——能夠覆蓋更大面積的感受野
更多的參數(shù)——更好的檢測(cè)同一圖像內(nèi)不同size的目標(biāo)
為了增大感受野,作者使用了SPP-block,使用PANet代替FPN進(jìn)行參數(shù)聚合以適用于不同level的目標(biāo)檢測(cè)。
YOLOv4的架構(gòu):
backbone:CSPResNext50
additional block:SPP-block
path-aggregation neck:PANet
heads:YOLOv3的heads
YOLOV4的改進(jìn),作者不僅增加了以上的優(yōu)化算法,更是改進(jìn)了其他方面的技術(shù),比如:
一種新的數(shù)據(jù)增強(qiáng)Mosaic法和Self-AdversarialTraining 自對(duì)抗訓(xùn)練法。
Mosaic法和Self-AdversarialTraining
應(yīng)用遺傳算法選擇最優(yōu)超參數(shù)。
改進(jìn)SAM,改進(jìn)PAN,和交叉小批量標(biāo)準(zhǔn)化(CmBN),使設(shè)計(jì)適合于有效的訓(xùn)練和檢測(cè)
SAM,PAN
更加詳細(xì)的技術(shù),大家可以參考作者的論文以及GitHub源代碼進(jìn)行分享學(xué)習(xí)
python+opencv 實(shí)現(xiàn)YOLOV4
python+opencv 實(shí)現(xiàn)YOLOV4
YOLOV4的實(shí)現(xiàn),除了作者分享的Darknet之外,現(xiàn)在還有了tensorflow、Pytorch、keras等等方法的實(shí)現(xiàn),但是始終沒有比較簡答的代碼實(shí)現(xiàn)(畢竟tensorflow、Pytorch、keras技術(shù),不是很好掌握)
opencv4.4版本的發(fā)布,宣布支持最新的YOLOV4對(duì)象檢測(cè)算法,同時(shí)還優(yōu)化了大量的工作
本部分代碼需要升級(jí)一下你的opencv版本到4.4
YOLOV4 圖片識(shí)別
模型初始化
import numpy as npimport 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行:首先我們導(dǎo)入第三方庫
7-10行:我們加載YOLOV4在COCO訓(xùn)練集上的對(duì)象名稱
12-13行:初始化隨機(jī)的顏色,這里主要是為后續(xù)檢測(cè)到不同的對(duì)象,進(jìn)行不同顏色的邊框畫圖
15-17:初始化YOLOV4的模型,cv2.dnn.readNetFromDarknet(configPath, weightsPath)函數(shù)來加載模型的CFG以及weights參數(shù)
代碼截圖
加載圖片進(jìn)行神經(jīng)網(wǎng)絡(luò)檢測(cè)
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行:計(jì)算圖片的blob值,輸入神經(jīng)網(wǎng)絡(luò),進(jìn)行前向反饋預(yù)測(cè)圖片,只不過net.forward里面是ln, 神經(jīng)網(wǎng)絡(luò)的所有out層,這里我們定義了一個(gè)time函數(shù),用來計(jì)算YOLOV4的檢測(cè)時(shí)間
代碼截圖
遍歷檢測(cè)結(jié)果
boxes = []confidences = []classIDs = []for output in layerOutputs:
for detection in output:
scores = detection[5:]
classID = np.argmax(scores) confidence = scores[classID] if confidence > 0.5:
box = detection[0:4] * np.array([W, H, W, H])
(centerX, centerY, width, height) = box.astype("int")
x = int(centerX - (width / 2))
y = int(centerY - (height / 2))
boxes.append([x, y, int(width), int(height)])
confidences.append(float(confidence))
classIDs.append(classID)
32-34:首先初始化一些參數(shù),主要用來存檢測(cè)到的結(jié)果數(shù)據(jù)
36-42:遍歷所有的檢測(cè)層,提取檢測(cè)到的圖片對(duì)象置信度以及l(fā)abel ID
44-53:我們過濾到置信度小于0.5的對(duì)象,提取大于0.5置信度的對(duì)象,分別計(jì)算每個(gè)檢測(cè)對(duì)象的BOX、置信度以及l(fā)abel ID,并保存在如下先前建立的初始化參數(shù)list里面
boxes = []
confidences = []
classIDs = []
代碼截圖
通過以上代碼便實(shí)現(xiàn)了python的YOLOV4對(duì)象檢測(cè),但是檢測(cè)的結(jié)果并不理想,對(duì)于每個(gè)對(duì)象,Yolo4 會(huì)框出 3 個(gè)左右的區(qū)域,但是我們只需要顯示出最合適的區(qū)域。非最大值抑制算法,就是搜索出局部最大值,將置信度最大的框保存,其余刪除。
非最大值抑制來定義最大的邊框
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)
最后,我們使用非最大值抑制算法,把每個(gè)對(duì)象的最大邊框顯示出來,以便我們檢測(cè)模型的結(jié)果
代碼截圖
以上便是完整的python opencv實(shí)現(xiàn)YOLOV4的代碼,本部分代碼與YOLOV3的實(shí)現(xiàn)類似,小伙伴們可以參考小編往期的文章關(guān)于YOLOV3的介紹,最后我們運(yùn)行一下代碼,看看實(shí)現(xiàn)檢測(cè)的效果
YOLOV4
YOLOV4的檢測(cè),用起來,確實(shí)速度有了很大的提示,就如上圖一樣,檢測(cè)只用了1.3S左右,速度與精度的結(jié)合,美中不足的地方是上圖的人的置信度才0.777
下期預(yù)告
當(dāng)然YOLOV4檢測(cè)算法完全可以使用在視頻檢測(cè),以及攝像頭的實(shí)時(shí)對(duì)象檢測(cè),本部分代碼我們下期分享
總結(jié)
以上是生活随笔為你收集整理的python 实现显著性检测_使用python轻松实现高大上的YOLOV4对象检测算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mooc哈尔滨c语言作业答案,哈尔滨工业
- 下一篇: ssms没有弹出服务器验证_使用SSMS