日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 目标检测 >内容正文

目标检测

OpenCV调用YOLOv4进行目标检测

發(fā)布時間:2025/3/11 目标检测 74 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV调用YOLOv4进行目标检测 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目標檢測就是對目標進行動態(tài)實時跟蹤定位,常見的目標檢測算法有 R-CNN、Fast R-CNN、Faster R-CNN、SSD、Yolo 等,其中 Yolo 的速度和精確度都比較高,且只需訓練一次,使用起來比較方便。

這里我們就使用官方現(xiàn)成的模型來檢測圖片,看一看效果,先學會使用流程,以后再訓練自己的模型。

注意:opencv-python 目前只有?4.4.0?版本適配了 YOLOv4


導入庫

import numpy as np import time import cv2
  • 1
  • 2
  • 3

設置標簽和標注顏色

LABELS = open("coco.names").read().strip().split("\n") np.random.seed(666) COLORS = np.random.randint(0, 255, size=(len(LABELS), 3), dtype="uint8")
  • 1
  • 2
  • 3

coco.names?內包含了很多目標標簽,如 person、bicycle、car 等,且按一定順序排列,里面基本包含了 Yolo 官方模型中可檢測的對象。該文件可從以下鏈接中提取:https://gitee.com/public_sharing/ObjectDetection-YOLO/blob/master/coco.names

每個對象配備了不一樣的顏色,以便在圖片中標記時便于區(qū)分。


加載網絡

# 導入 YOLO 配置和權重文件并加載網絡: net = cv2.dnn_DetectionModel('yolov4.cfg', 'yolov4.weights') # 獲取 YOLO 未連接的輸出圖層 layer = net.getUnconnectedOutLayersNames()
  • 1
  • 2
  • 3
  • 4

yolov4.cfg?和?yolov4.weights?文件就是官方提供的模型,下載鏈接:https://pan.baidu.com/s/1XrcPHdp2_4c-dKge2Guw4w?提取碼:xsxb 。如果失效,可以直接百度搜索?Yolov4模型下載,有很多人都分享出來了。

cv2.dnn_DetectionModel?是 opencv 4.1.2 開始新增的方法,用于加載網絡。以前是使用?cv2.dnn.readNetFromDarknet?,此處使用也可以達到同樣的效果。

getUnconnectedOutLayersNames()?用于提取輸出圖層的名稱,yolo 含有很多的圖層,可以使用?getLayerNames()?將所有圖層的名稱提取出來。但在這里,我們只需要使用 yolo 的最后輸出圖層。


檢測圖片

# 導入圖片 image = cv2.imread('timg.jpg') # 獲取圖片尺寸 (H, W) = image.shape[:2]# 從輸入圖像構造一個 blob,然后執(zhí)行 YOLO 對象檢測器的前向傳遞,給我們邊界盒和相關概率 blob = cv2.dnn.blobFromImage(image, 1/255.0, (416, 416),swapRB=True, crop=False) net.setInput(blob) start = time.time() # 前向傳遞,獲得信息 layerOutputs = net.forward(layer) # 用于得出檢測時間 end = time.time() print("[INFO] YOLO took {:.6f} seconds".format(end - start))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

blobFromImage 用于對圖像進行預處理
cv2.dnn.blobFromImage(image[, scalefactor[, size[, mean[, swapRB[, crop[, ddepth]]]]]])

  • image:輸入圖像
  • scalefactor:圖像各通道數(shù)值的縮放比例
  • size:輸出圖像的空間尺寸
  • mean:用于各通道減去的值,以降低光照的影響
  • swapRB:交換 RB 通道,默認為 False
  • crop:圖像裁剪,默認為 False。當值為 True 時,先按比例縮放,然后從中心裁剪成 size 尺寸
  • ddepth:輸出的圖像深度,可選 CV_32F 或者 CV_8U

數(shù)據(jù)提取

boxes = [] confidences = [] classIDs = []# 循環(huán)提取每個輸出層 for output in layerOutputs:# 循環(huán)提取每個框for detection in output:# 提取當前目標的類 ID 和置信度scores = detection[5:]classID = np.argmax(scores)confidence = scores[classID]# 通過確保檢測概率大于最小概率來過濾弱預測if confidence > 0.5:# 將邊界框坐標相對于圖像的大小進行縮放,YOLO 返回的是邊界框的中心(x, y)坐標,# 后面是邊界框的寬度和高度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))# 更新邊界框坐標、置信度和類 id 的列表boxes.append([x, y, int(width), int(height)])confidences.append(float(confidence))classIDs.append(classID)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

3 個列表內保存的內容:

  • boxes:對象的邊界框
  • confidences :YOLO 分配給對象的置信度值,較低的置信度值表示該對象可能不是網絡認為的對象。上面的代碼中將過濾掉小于 0.5 閾值的對象
  • classIDs:檢測到的對象的類標簽

這樣每個被提取出的對象,都確定了標簽和區(qū)域坐標就、位置。接下來就是在圖片中標記出來,便于我們觀看。


標記顯示

# 非最大值抑制,確定唯一邊框 idxs = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.3) # 確定每個對象至少有一個框存在 if len(idxs) > 0:# 循環(huán)畫出保存的邊框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, 1, lineType=cv2.LINE_AA)text = "{}: {:.4f}".format(LABELS[classIDs[i]], confidences[i])cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX,0.5, color, 1, lineType=cv2.LINE_AA) cv2.imshow("Tag", image) cv2.waitKey(0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

對于每個對象,Yolo 會框出 3 個左右的區(qū)域,我們只需要顯示出最合適的區(qū)域。非最大值抑制,就是搜索出局部最大值,將置信度最大的框保存,其余剔除。

cv2.dnn.NMSBoxes(bboxes, scores, score_threshold, nms_threshold, eta=None, top_k=None)

  • bboxes:一組邊框
  • scores:一組對應的置信度
  • score_threshold:置信度的閾值
  • nms_threshold:非最大抑制的閾值

之后將每個對象的方框和標簽都畫出來

結果展示:


完整代碼

import numpy as np import time import cv2LABELS = open("coco.names").read().strip().split("\n") np.random.seed(666) COLORS = np.random.randint(0, 255, size=(len(LABELS), 3), dtype="uint8") # 導入 YOLO 配置和權重文件并加載網絡: net = cv2.dnn_DetectionModel('yolov4.cfg', 'yolov4.weights') # 獲取 YOLO 未連接的輸出圖層 layer = net.getUnconnectedOutLayersNames() image = cv2.imread('timg.jpg') # 獲取圖片尺寸 (H, W) = image.shape[:2] # 從輸入圖像構造一個 blob,然后執(zhí)行 YOLO 對象檢測器的前向傳遞,給我們邊界盒和相關概率 blob = cv2.dnn.blobFromImage(image, 1/255.0, (416, 416),swapRB=True, crop=False) net.setInput(blob) start = time.time() # 前向傳遞,獲得信息 layerOutputs = net.forward(layer) # 用于得出檢測時間 end = time.time() print("YOLO took {:.6f} seconds".format(end - start))boxes = [] confidences = [] classIDs = []# 循環(huán)提取每個輸出層 for output in layerOutputs:# 循環(huán)提取每個框for detection in output:# 提取當前目標的類 ID 和置信度scores = detection[5:]classID = np.argmax(scores)confidence = scores[classID]# 通過確保檢測概率大于最小概率來過濾弱預測if confidence > 0.5:# 將邊界框坐標相對于圖像的大小進行縮放,YOLO 返回的是邊界框的中心(x, y)坐標,# 后面是邊界框的寬度和高度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))# 更新邊界框坐標、置信度和類 id 的列表boxes.append([x, y, int(width), int(height)])confidences.append(float(confidence))classIDs.append(classID) # 非最大值抑制,確定唯一邊框 idxs = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.3) # 確定每個對象至少有一個框存在 if len(idxs) > 0:# 循環(huán)畫出保存的邊框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, 1, lineType=cv2.LINE_AA)text = "{}: {:.4f}".format(LABELS[classIDs[i]], confidences[i])cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX,0.5, color, 1, lineType=cv2.LINE_AA) cv2.imshow("Tag", image) cv2.waitKey(0)

總結

以上是生活随笔為你收集整理的OpenCV调用YOLOv4进行目标检测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 激情宗合网 | 国产精品一区三区 | 欧美大尺度床戏做爰 | 国产一区二区伦理 | 国产情侣一区二区三区 | 久久一久久| 日本性欧美 | 欧美日韩一区二区三区69堂 | 日本亚洲一区 | 亚洲操操操 | 最好看的中文字幕 | 在线视频日韩欧美 | 中文字幕在线国产 | 加勒比色综合 | 精品人妻伦一二三区免费 | 久久久精品毛片 | 娇小的粉嫩xxx极品 国产精品人人爽人人爽 | 小俊大肉大捧一进一出好爽 | 男人操女人的视频 | 欧美aaaaaaa | 午夜精品久久久久久久久久久久久 | 亚洲av无码一区二区三区在线播放 | 91免费视频网站 | missav | 免费高清av在线看 | 欧美日韩一区二区三区不卡视频 | 国产精品www色诱视频 | 国产无限制自拍 | 黄色91在线观看 | 一级黄色片片 | 香蕉a视频 | 国产无套粉嫩白浆内谢 | 肉嫁高柳家 高清 | 亚洲熟妇中文字幕五十中出 | 丰满少妇在线观看bd | 国产精品久久久久久久免费 | 无码任你躁久久久久久老妇 | 九一福利视频 | 久久女女| 西西午夜影院 | 一本久道综合色婷婷五月 | 精品伦精品一区二区三区视频密桃 | www网站在线观看 | 欧美天天影院 | 婷婷激情视频 | 日本美女视频 | 99色热| 亚洲欧洲日韩国产 | 无套内谢大学处破女www小说 | 波多野结衣一本一道 | 激情综合av| 少妇又紧又色又爽又刺激 | 日韩在线视频网 | 久久综合福利 | 国产真实在线 | 国产欧美视频一区二区三区 | 色爱av | 美足av电影| 日韩精品免费一区二区 | h在线免费 | 日日摸夜夜添狠狠添久久精品成人 | 国产精品毛片一区二区在线看舒淇 | 蜜色影院| 男女视频国产 | 伊人开心网 | 欧美激情在线一区 | 中日韩免费视频 | 久久免费激情视频 | 91精品久久久久久久99蜜桃 | 亚洲天堂社区 | 日韩成人免费观看 | 18无码粉嫩小泬无套在线观看 | 亚洲第一偷拍 | 韩日精品视频 | 少妇视频在线播放 | 欧洲精品二区 | www夜夜 | 精品视频999 | 色男人网 | 中文字幕精品久久 | 人人妻人人澡人人爽人人dvd | 亚洲男女视频 | 琪琪电影午夜理论片八戒八戒 | 夜夜添无码一区二区三区 | 中国黄色三级 | 国产精品99久久久久久久久久久久 | 久久中文字幕高清 | 成人试看120秒体验区 | 婷婷六月天在线 | 亚洲理论片在线观看 | 操极品女神| 丰满肥臀噗嗤啊x99av | 免费的a级片 | 国产视频1区2区3区 国产欧美一区二区精品性色99 | 国产suv精品一区 | 伊人一级片 | 好紧好爽再浪一点视频 | 欧美激情免费在线 | 亚洲午夜精品久久久久久app | 人妻互换一二三区激情视频 |