目標檢測和識別:Python+OpenCV+Yolov3[轉]


目標檢測和識別:Python+OpenCV+Yolov3

1 說明:

=====

1.1 熟悉Python+OpenCV+Yolov3的目標檢測和識別,以上三個都是強大的計算機視覺編程語言和庫。

1.2 本代碼注釋清楚,小白秒懂。

1.3 圖片來源今日頭條正版免費圖庫。

1.4 原圖:

目標檢測和識別:Python+OpenCV+Yolov3

 

目標檢測和識別:Python+OpenCV+Yolov3

 

目標檢測和識別:Python+OpenCV+Yolov3

 

目標檢測和識別:Python+OpenCV+Yolov3

 

1.5 效果圖:

目標檢測和識別:Python+OpenCV+Yolov3

 

目標檢測和識別:Python+OpenCV+Yolov3

 

目標檢測和識別:Python+OpenCV+Yolov3

 

目標檢測和識別:Python+OpenCV+Yolov3

 

2 准備:

=====

2.1 環境:python3.8+OpenCV4.2.0

2.2 三個文件:yolov3.cfg、coco.names和yolov3.weights.

Weight file:這是訓練有素的模型,是檢測物體的算法的核心。

Cfg file: 它是配置文件,其中包含算法的所有設置。

Name files: 包含算法可以檢測到的對象的名稱。

2.2.1 yolov3.cfg和coco.names,簡單。

https://github.com/jielingao/yolov3 #下載地址

2.2.2 yolov3.weights文件較大,下載較慢。

#文件很大,官網下載很慢 https://pjreddie.com/media/files/yolov3.weights #感謝網友提供,指定下載yolov3.weights,較快 https://pan.baidu.com/s/1__zDF-pC-0eXcZc1gm6kFA #提取碼:jnhn (永久有效)

3 注釋版的代碼main.py:

==================

3.1 第1步:導入模塊

import cv2 import numpy as np

3.2 第2步:加載yolov3文件(3個文件,注意路徑)

#權重和配置 net = cv2.dnn.readNet('/home/xgj/Desktop/pyyolo/yolov3.weights', '/home/xgj/Desktop/pyyolo/yolov3.cfg') #定義一個空的列表存放名字 classes = [] #打開文件並讀取 with open('/home/xgj/Desktop/pyyolo/coco.names','r') as f: classes = [ line.strip() for line in f.readlines() ] layer_names = net.getLayerNames() outputlayers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]

3.3 第3步:相關設置顏色和讀取圖片

# 顏色設置:隨機色 colors= np.random.uniform(0,255,size=(len(classes),3)) #字體設置 font = cv2.FONT_HERSHEY_PLAIN #讀取需要檢測圖片,注意路徑 img = cv2.imread('/home/xgj/Desktop/pyyolo/pic4.jpeg') #獲取圖片的高、寬和通道 height,width,channels = img.shape

3.4 第4步:偵測物體

# Blob用於提取圖片中的特征並調整其大小。 YOLO接受三種尺寸: #320×320 很小,所以精度較低,但速度快 #609×609 很大,因此精度高、但速度慢 #416×416位於中間,兩者的折中。 blob = cv2.dnn.blobFromImage(img,0.00392,(416,416),(0,0,0),True,crop=False) net.setInput(blob)  #Outs是一個數組,包含有關所檢測對象的所有信息,它們的位置以及對檢測的置信度的信息 outs = net.forward(outputlayers)  #初始化定義三個空列表 class_ids=[] #有時候叫Label:它是檢測到的對象的名稱 confidences=[] #從0到1的檢測置信度。 boxes=[] #包含圍繞檢測到的對象的矩形的坐標。  #遍歷列表讀取,存入三個列表中 for out in outs: for detection in out: scores = detection[5:] class_id = np.argmax(scores) confidence = scores[class_id] if confidence > 0.5:  #onject detected center_x= int(detection[0]*width) center_y= int(detection[1]*height) w = int(detection[2]*width) h = int(detection[3]*height) x=int(center_x - w/2) y=int(center_y - h/2)  #存入列表中 boxes.append([x,y,w,h]) #put all rectangle areas confidences.append(float(confidence)) #how confidence was that object detected and show that percentage class_ids.append(class_id) #name of the object tha was detected  #執行檢測時,碰巧我們在同一物體上有更多的BOX,因此我們應該使用另一個函數來消除這種“噪音”。 稱為非最大限制 indexes = cv2.dnn.NMSBoxes(boxes,confidences,0.4,0.6)

3.5 第5步:繪制框

font = cv2.FONT_HERSHEY_PLAIN for i in range(len(boxes)): if i in indexes: x,y,w,h = boxes[i] label = str(classes[class_ids[i]]) color = colors[i] cv2.rectangle(img,(x,y),(x+w,y+h),color,2)  #顯示顏色255,255,255=白色;綠色=0,255,0  #3為字體大小,默認為1 cv2.putText(img,label,(x,y+30),font,3,(0,255,0),2)

3.6 第6步:顯示效果圖片

 cv2.imshow("Image",img) cv2.waitKey(0) cv2.destroyAllWindows()

4 小結:

=====

4.1 猴子沒有檢測出來,小bug。

4.2 漏掉一個人,沒檢測出來,小bug。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM