校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > opencv-python+yolov3實現目標檢測

opencv-python+yolov3實現目標檢測

熱門標簽:聊城語音外呼系統 ai電銷機器人的優勢 海外網吧地圖標注注冊 孝感營銷電話機器人效果怎么樣 商家地圖標注海報 打電話機器人營銷 南陽打電話機器人 地圖標注自己和別人標注區別 騰訊地圖標注沒法顯示

因為最近的任務有用到目標檢測,所以昨天晚上、今天上午搞了一下,快速地了解了目標檢測這一任務,并且實現了使用opencv進行目標檢測。

網上資料挺亂的,感覺在搜資源上浪費了我不少時間,所以我寫這篇博客,把我這段時間了解到的東西整理起來,供有緣的讀者參考學習。

目標檢測概況

目標檢測是?

目標檢測,粗略來說就是:輸入圖片/視頻,經過處理,得到:目標的位置信息(比如左上角和右下角的坐標)、目標的預測類別、目標的預測置信度(confidence)。

拿Faster R-CNN這個算法舉例:輸入一個batch(batch size也可以為1)的圖片或者視頻,網絡直接的outputs是這樣的:
[batchId, classId, confidence, left, top, right, bottom],batchId, classId, confidence, left, top, right, bottom都是標量。
batchId表示這一個batch中,這張圖片的id(也即index),后四個標量即目標的位置信息:左上角像素點和右下角像素點的坐標。

目標檢測算法?

按照歷史脈絡來談:

手工特征提取算法,如VJ、HOG、DPM

R-CNN算法(2014),最早的基于深度學習的目標檢測器之一,其結構是兩級網絡:1)首先需要諸如選擇性搜索之類的算法來提出可能包含對象的候選邊界框;2)然后將這些區域傳遞到CNN算法進行分類;

R-CNN算法存在的問題是其仿真很慢,并且不是完整的端到端的目標檢測器。

Fast R-CNN算法(2014末),對原始R-CNN進行了相當大的改進:提高準確度,并減少執行正向傳遞所花費的時間。

但是,該模型仍然依賴于外部區域搜索算法。

faster R-CNN算法(2015),真正的端到端深度學習目標檢測器。刪除了選擇性搜索的要求,而是依賴于

(1)完全卷積的區域提議網絡(RPN, Region Purpose Network),可以預測對象邊界框和“對象”分數(量化它是一個區域的可能性的分數)。

(2)然后將RPN的輸出傳遞到R-CNN組件以進行最終分類和標記。

R-CNN系列算法,都采取了two-stage策略。特點是:雖然檢測結果一般都非常準確,但仿真速度非常慢,即使是在GPU上也僅獲得5 FPS。

one-stage方法有:yolo(2015)、SSD(2015末),以及在這兩個算法基礎上改進的各論文提出的算法。這些算法的基本思路是:均勻地在圖片的不同位置進行密集抽樣,抽樣時可以采用不同尺度和長寬比,然后利用CNN提取特征后直接進行分類與回歸。

整個過程只需要一步,所以其優勢是速度快,但是訓練比較困難。

yolov3(2018)是yolo作者提出的第三個版本(之前還提過yolov2和它們的tinny版本,tinny版本經過壓縮更快但是也降低了準確率)。yolov3支持80類物體的目標檢測,完整列表[戳這里]: https://github.com/pjreddie/darknet/blob/master/data/coco.names

時間線:

yolov3模型簡介

性能介紹

首先,套路,yolov3很強大(不強大我用它干啥呢)。速度上,它比 R-CNN 快 1000 倍,比 Fast R-CNN 快 100 倍。檢測準確率上,它不是最準的:YOLOv3-608比 DSSD 更高,接近 FPN。但是它的速度不到后二者的1/3。

從下圖也可以看出:

架構介紹

可以看出,他是一系列卷積、殘差、上采樣組成的。特點在于,它將預測分在三個尺度(Scale)進行(見圖中三個彩色框),也在三個scale分別輸出。

opencv-python實現

why opencv?

opencv( 3.4.2+版本)的dnn(Deep Neural Network-DNN)模塊封裝了Darknet框架,這個框架是

自己寫的,它由封裝了yolo算法。因為這么一層關系,我們可以使用opencv方便地使用yolo的各個版本,而且有數據(見下)證明OpenCV的DNN模塊在 CPU的實現速度比使用 OpenML 的 Darknet 快9倍。

正文

我會先結合腳本片段講解,再給出該腳本的完整代碼,講解。

引庫

import numpy as np
import cv2 as cv
import os
import time

參數:

yolo_dir = '/home/hessesummer/github/NTS-Net-my/yolov3'  # YOLO文件路徑
weightsPath = os.path.join(yolo_dir, 'yolov3.weights')  # 權重文件
configPath = os.path.join(yolo_dir, 'yolov3.cfg')  # 配置文件
labelsPath = os.path.join(yolo_dir, 'coco.names')  # label名稱
imgPath = os.path.join(yolo_dir, 'test.jpg')  # 測試圖像
CONFIDENCE = 0.5  # 過濾弱檢測的最小概率
THRESHOLD = 0.4  # 非最大值抑制閾值

權重文件、配置文件、label名稱的下載地址:

wget https://pjreddie.com/media/files/yolov3.weights
wget https://github.com/pjreddie/darknet/blob/master/cfg/yolov3.cfg
wget https://github.com/pjreddie/darknet/blob/master/data/coco.names

簡單來說:

過濾弱檢測的最小概率:置信度小于這個值的輸出都不要了;
非最大值抑制閾值:允許框框重疊的程度(多框框檢測同一個物體),供下面的NMS算法使用,該算法會根據該值將有重疊的框框合并。值為0時,不允許框框重疊。默認值是0.3。

詳細來說:

我沒查。您自己感興趣再了解吧。

重頭戲1:

# 加載網絡、配置權重
net = cv.dnn.readNetFromDarknet(configPath, weightsPath)  ## 利用下載的文件
# print("[INFO] loading YOLO from disk...") ## 可以打印下信息

# 加載圖片、轉為blob格式、送入網絡輸入層
img = cv.imread(imgPath)
blobImg = cv.dnn.blobFromImage(img, 1.0/255.0, (416, 416), None, True, False)  ## net需要的輸入是blob格式的,用blobFromImage這個函數來轉格式
net.setInput(blobImg)  ## 調用setInput函數將圖片送入輸入層

# 獲取網絡輸出層信息(所有輸出層的名字),設定并前向傳播
outInfo = net.getUnconnectedOutLayersNames()  ## 前面的yolov3架構也講了,yolo在每個scale都有輸出,outInfo是每個scale的名字信息,供net.forward使用
# start = time.time()
layerOutputs = net.forward(outInfo)  # 得到各個輸出層的、各個檢測框等信息,是二維結構。
# end = time.time()
# print("[INFO] YOLO took {:.6f} seconds".format(end - start)) ## 可以打印下信息

layerOutputs是二維結構,第0維代表哪個輸出層,第1維代表各個檢測框。

其他的我都在注釋里講解了。

重頭戲2:

# 拿到圖片尺寸
(H, W) = img.shape[:2]

供下面使用:

# 過濾layerOutputs
# layerOutputs的第1維的元素內容: [center_x, center_y, width, height, objectness, N-class score data]
# 過濾后的結果放入:
boxes = [] # 所有邊界框(各層結果放一起)
confidences = [] # 所有置信度
classIDs = [] # 所有分類ID

# # 1)過濾掉置信度低的框框
for out in layerOutputs:  # 各個輸出層
    for detection in out:  # 各個框框
        # 拿到置信度
        scores = detection[5:]  # 各個類別的置信度
        classID = np.argmax(scores)  # 最高置信度的id即為分類id
        confidence = scores[classID]  # 拿到置信度

        # 根據置信度篩查
        if confidence > CONFIDENCE:
            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)

# # 2)應用非最大值抑制(non-maxima suppression,nms)進一步篩掉
idxs = cv.dnn.NMSBoxes(boxes, confidences, CONFIDENCE, THRESHOLD) # boxes中,保留的box的索引index存入idxs

這里的NMS算法就是前面提到的NMS算法。

應用檢測結果,這里是畫出框框。

# 得到labels列表
with 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")  # 框框顯示顏色,每一類有不同的顏色,每種顏色都是由RGB三個值組成的,所以size為(len(labels), 3)
if len(idxs) > 0:
    for i in idxs.flatten(): # indxs是二維的,第0維是輸出層,所以這里把它展平成1維
        (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]]]
        cv.rectangle(img, (x, y), (x+w, y+h), color, 2)  # 線條粗細為2px
        text = "{}: {:.4f}".format(labels[classIDs[i]], confidences[i])
        cv.putText(img, text, (x, y-5), cv.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)  # cv.FONT_HERSHEY_SIMPLEX字體風格、0.5字體大小、粗細2px
cv.imshow('目標檢測結果', img)
cv.waitKey(0)

第一部分講解結束,下面放完整代碼:

import numpy as np
import cv2 as cv
import os
import time

yolo_dir = '/home/hessesummer/github/NTS-Net-my/yolov3'  # YOLO文件路徑
weightsPath = os.path.join(yolo_dir, 'yolov3.weights')  # 權重文件
configPath = os.path.join(yolo_dir, 'yolov3.cfg')  # 配置文件
labelsPath = os.path.join(yolo_dir, 'coco.names')  # label名稱
imgPath = os.path.join(yolo_dir, 'test.jpg')  # 測試圖像
CONFIDENCE = 0.5  # 過濾弱檢測的最小概率
THRESHOLD = 0.4  # 非最大值抑制閾值

# 加載網絡、配置權重
net = cv.dnn.readNetFromDarknet(configPath, weightsPath)  # #  利用下載的文件
print("[INFO] loading YOLO from disk...")  # # 可以打印下信息

# 加載圖片、轉為blob格式、送入網絡輸入層
img = cv.imread(imgPath)
blobImg = cv.dnn.blobFromImage(img, 1.0/255.0, (416, 416), None, True, False)   # # net需要的輸入是blob格式的,用blobFromImage這個函數來轉格式
net.setInput(blobImg)  # # 調用setInput函數將圖片送入輸入層

# 獲取網絡輸出層信息(所有輸出層的名字),設定并前向傳播
outInfo = net.getUnconnectedOutLayersNames()  # # 前面的yolov3架構也講了,yolo在每個scale都有輸出,outInfo是每個scale的名字信息,供net.forward使用
start = time.time()
layerOutputs = net.forward(outInfo)  # 得到各個輸出層的、各個檢測框等信息,是二維結構。
end = time.time()
print("[INFO] YOLO took {:.6f} seconds".format(end - start))  # # 可以打印下信息

# 拿到圖片尺寸
(H, W) = img.shape[:2]
# 過濾layerOutputs
# layerOutputs的第1維的元素內容: [center_x, center_y, width, height, objectness, N-class score data]
# 過濾后的結果放入:
boxes = [] # 所有邊界框(各層結果放一起)
confidences = [] # 所有置信度
classIDs = [] # 所有分類ID

# # 1)過濾掉置信度低的框框
for out in layerOutputs:  # 各個輸出層
    for detection in out:  # 各個框框
        # 拿到置信度
        scores = detection[5:]  # 各個類別的置信度
        classID = np.argmax(scores)  # 最高置信度的id即為分類id
        confidence = scores[classID]  # 拿到置信度

        # 根據置信度篩查
        if confidence > CONFIDENCE:
            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)

# # 2)應用非最大值抑制(non-maxima suppression,nms)進一步篩掉
idxs = cv.dnn.NMSBoxes(boxes, confidences, CONFIDENCE, THRESHOLD) # boxes中,保留的box的索引index存入idxs
# 得到labels列表
with 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")  # 框框顯示顏色,每一類有不同的顏色,每種顏色都是由RGB三個值組成的,所以size為(len(labels), 3)
if len(idxs) > 0:
    for i in idxs.flatten():  # indxs是二維的,第0維是輸出層,所以這里把它展平成1維
        (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]]]
        cv.rectangle(img, (x, y), (x+w, y+h), color, 2)  # 線條粗細為2px
        text = "{}: {:.4f}".format(labels[classIDs[i]], confidences[i])
        cv.putText(img, text, (x, y-5), cv.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)  # cv.FONT_HERSHEY_SIMPLEX字體風格、0.5字體大小、粗細2px
cv.imshow('detected image', img)
cv.waitKey(0)

結果:

到此這篇關于opencv-python+yolov3實現目標檢測的文章就介紹到這了,更多相關opencv yolov3目標檢測內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python Opencv實現單目標檢測的示例代碼
  • Python 使用Opencv實現目標檢測與識別的示例代碼
  • OpenCV+python實現實時目標檢測功能
  • python opencv根據顏色進行目標檢測的方法示例
  • Python Opencv任意形狀目標檢測并繪制框圖
  • Python+OpenCV目標跟蹤實現基本的運動檢測
  • python opencv檢測目標顏色的實例講解

標簽:六盤水 揚州 牡丹江 楊凌 撫州 聊城 南寧 迪慶

巨人網絡通訊聲明:本文標題《opencv-python+yolov3實現目標檢測》,本文關鍵詞  opencv-python+yolov3,實現,目標,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《opencv-python+yolov3實現目標檢測》相關的同類信息!
  • 本頁收集關于opencv-python+yolov3實現目標檢測的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    久久影院午夜论| 亚洲天堂精品视频| 99re热这里只有精品视频| 天堂在线亚洲视频| 中文字幕在线观看不卡| 精品久久久久久无| 欧美精品久久一区二区三区| 粉嫩av一区二区三区粉嫩 | 亚洲欧美区自拍先锋| 精品国产人成亚洲区| 欧美色图免费看| 97久久超碰国产精品电影| 国产美女久久久久| 久久福利视频一区二区| 亚洲国产日韩一级| 一区二区三区四区视频精品免费| 久久亚洲精品国产精品紫薇| 日韩一区二区电影| 在线综合亚洲欧美在线视频 | 精品99999| 欧美蜜桃一区二区三区| 色先锋aa成人| 色香色香欲天天天影视综合网| 成人午夜伦理影院| 国产最新精品精品你懂的| 日本怡春院一区二区| 午夜精品久久久久久久| 午夜精品免费在线| 午夜激情一区二区三区| 日韩中文字幕一区二区三区| 亚洲一区二区在线免费看| 一区二区在线观看av| 亚洲精品免费在线| 亚洲欧美另类小说| 亚洲一区二区三区四区的| 洋洋av久久久久久久一区| 亚洲欧美另类综合偷拍| 一区二区三区日韩| 依依成人综合视频| 香蕉乱码成人久久天堂爱免费| 午夜亚洲国产au精品一区二区| 亚洲高清免费在线| 亚洲成人一区二区在线观看| 亚洲动漫第一页| 日韩中文字幕一区二区三区| 蜜臀av性久久久久av蜜臀妖精 | 亚洲一区二区三区激情| 亚洲成人资源网| 美国av一区二区| 国产一区二三区好的| 国产91丝袜在线播放九色| 成人精品电影在线观看| 91日韩精品一区| 欧美日韩国产乱码电影| 欧美一区二区日韩一区二区| 精品久久久三级丝袜| 中文字幕巨乱亚洲| 亚洲精品中文字幕乱码三区| 亚洲电影一区二区三区| 另类欧美日韩国产在线| 国产乱码一区二区三区| 9久草视频在线视频精品| 欧美在线看片a免费观看| 91精品国产乱码久久蜜臀| 久久人人97超碰com| 日韩一区在线播放| 午夜欧美电影在线观看| 狠狠狠色丁香婷婷综合久久五月| 国产精品888| 欧美综合久久久| 欧美成人艳星乳罩| 一区在线观看视频| 天堂午夜影视日韩欧美一区二区| 国产一区二区精品久久| 色综合久久久久网| 欧美电影免费观看高清完整版在线| 中文无字幕一区二区三区| 一个色在线综合| 久久99这里只有精品| 99久久精品免费看| 日韩欧美国产电影| 亚洲色图视频免费播放| 久久电影国产免费久久电影| 99精品国产99久久久久久白柏| 欧美精品成人一区二区三区四区| 久久久精品国产免大香伊| 亚洲午夜电影网| 丰满白嫩尤物一区二区| 欧美一区二区三区白人| 亚洲欧美偷拍另类a∨色屁股| 九九久久精品视频| 91福利精品第一导航| 精品久久久久久亚洲综合网| 亚洲已满18点击进入久久| 国产一区欧美日韩| 91精品免费在线观看| 中文字幕一区在线观看视频| 韩国av一区二区三区在线观看| 色婷婷激情久久| 国产亚洲一区二区三区在线观看| 亚欧色一区w666天堂| 成人午夜激情在线| 日韩精品中文字幕一区二区三区| 亚洲精品美国一| 国产精品一区二区久久精品爱涩| 欧美电影影音先锋| 亚洲色大成网站www久久九九| 国产真实乱对白精彩久久| 欧美绝品在线观看成人午夜影视| 专区另类欧美日韩| 成人手机在线视频| 精品剧情v国产在线观看在线| 午夜视频在线观看一区二区三区| 99re热视频精品| 欧美国产一区视频在线观看| 久久不见久久见免费视频1 | 中文字幕在线不卡一区| 国产一区二区伦理| 精品日韩一区二区三区免费视频| 亚州成人在线电影| 欧美日韩免费观看一区二区三区| 中文字幕日韩欧美一区二区三区| 国产91清纯白嫩初高中在线观看| 久久久久久久久免费| 激情综合网激情| 精品国产乱码久久| 毛片不卡一区二区| 日韩欧美亚洲另类制服综合在线 | 九九久久精品视频| 日韩精品一区二区三区蜜臀| 麻豆精品视频在线观看免费| 91精品国产免费| 蜜臀精品一区二区三区在线观看 | 白白色亚洲国产精品| 国产欧美久久久精品影院| 国产成人日日夜夜| 日本一区二区综合亚洲| 成人丝袜视频网| 欧美日韩国产高清一区二区三区 | 欧美色图片你懂的| 一区二区三区加勒比av| 91国模大尺度私拍在线视频 | 国产精品1区2区| 精品美女被调教视频大全网站| 日韩电影网1区2区| 日韩欧美一区二区视频| 久久成人免费网站| 国产午夜精品一区二区 | 欧美午夜电影网| 日韩精品一二三四| 亚洲精品在线网站| 成人午夜电影久久影院| 亚洲色图欧洲色图婷婷| 欧美日韩高清影院| 美女国产一区二区| 国产欧美在线观看一区| 国产乱理伦片在线观看夜一区| 337p粉嫩大胆色噜噜噜噜亚洲 | 蜜桃视频在线观看一区二区| 久久综合色一综合色88| 成人黄色777网| 亚洲午夜在线电影| 欧美成人福利视频| 成人av在线播放网站| 亚洲黄色av一区| 欧美岛国在线观看| 国产成人亚洲精品青草天美| 亚洲精品一二三四区| 日韩视频不卡中文| 丰满放荡岳乱妇91ww| 五月婷婷激情综合| 国产性做久久久久久| 色婷婷一区二区| 国产综合一区二区| 一个色综合网站| 2021中文字幕一区亚洲| 91成人在线观看喷潮| 久草精品在线观看| 亚洲另类中文字| 26uuu国产一区二区三区| 在线亚洲高清视频| 国产精品香蕉一区二区三区| 亚洲成人午夜电影| 国产亚洲精品7777| 欧美三级三级三级爽爽爽| 国产精品一区二区在线看| 亚洲福利一二三区| 国产日韩成人精品| 91精品国产一区二区| 99久久精品费精品国产一区二区| 男人的天堂久久精品| 国产精品不卡在线观看| 日韩一区二区在线播放| 一本久道久久综合中文字幕| 久久国产精品99久久久久久老狼| 亚洲男人的天堂一区二区| 国产亚洲成年网址在线观看| 欧美久久一二区| 色偷偷88欧美精品久久久| 久草精品在线观看|