日韩性视频-久久久蜜桃-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进行目标检测的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 久久婷婷久久 | 成人在线观看www | 三上悠亚一区二区在线观看 | 中文字幕第八页 | 午夜极品 | 在线观看视频一区二区 | 国产精品青青草 | 免费午夜av | 小早川怜子一区二区三区 | 国产在线精品一区二区 | 日韩久久久久久久久久久 | av成人在线看 | 青青青视频在线 | 欧美日韩国产一级片 | 91黄色免费 | 欧美精品在欧美一区二区少妇 | 天天干天天摸 | 欧美激情精品 | 国产一区欧美 | 伊人一区二区三区四区 | 日韩av一区二区在线播放 | 日韩欧美一区二区在线 | 国产人妻精品一区二区三区不卡 | 国产熟女一区二区丰满 | 神马福利视频 | 中文字幕一区二区人妻电影丶 | 国产一区视频在线播放 | 日本黄色一级网站 | 日本大乳奶做爰 | 欧美精品在线观看一区二区 | 51精品国产人成在线观看 | 女优一区二区三区 | 日韩久久久久久久久 | 欧美性福利 | 亚洲精品乱码久久久久久黑人 | 男人操女人的免费视频 | 国产午夜在线一区二区三区 | 女主播在线观看 | 久色99| 黄色福利站 | 天天看夜夜爽 | 91丨porny丨九色 | 波多野结衣伦理 | 强行无套内谢大学生初次 | av日韩不卡 | 亚洲成人中文字幕在线 | 99热影院 | 91超碰国产在线 | 依人成人综合网 | 国产精品一区二区av日韩在线 | 亚洲不卡电影 | 久久久久久久偷拍 | 亚洲精品国产精品乱码 | 黑人一级视频 | 这里精品 | 精品玖玖玖 | 成人午夜剧场视频网站 | 可以看污的网站 | 欧美亚洲一区二区三区四区 | 中文字幕在线观看播放 | 久久怡春院 | 中文字幕在线视频不卡 | 日韩专区中文字幕 | 国产调教打屁股xxxx网站 | 欧美日韩亚 | 91网站免费观看 | 成人免费在线播放 | 日本欧美一本 | 久久久女人 | 高清视频免费在线观看 | 久久艹艹 | 免费看aaaaa级少淫片 | 国产污污视频在线观看 | 丰满人妻一区二区三区免费视频 | 国内外成人在线视频 | 亚洲精品乱码久久久久久久久久久久 | 花房姑娘免费全集 | 玉丸(双性调教) | 国产交换配乱淫视频免费 | 亚洲激情文学 | 自拍99页 | 97se.com| 又黄又爽一区二区三区 | 热久久久久| 日韩国产精品一区 | 九九久久国产精品 | 亚洲精品高潮久久久久久久 | 韩国一级淫片免费看 | 久一久久 | 日本不卡高清视频 | 国产乱论视频 | 娇小6一8小毛片 | 岛国av在线免费 | 亚洲女女做受ⅹxx高潮 | 欧美亚洲综合久久 | 特级西西人体4444xxxx | 亚洲 欧美 精品 | 久久女人 | 亚洲视频区 |