歡迎您光臨本站 註冊首頁

OpenCV+python實現實時目標檢測功能

←手機掃碼閱讀     madbeef @ 2020-06-26 , reply:0

環境安裝
 

  1. 安裝Anaconda,官網鏈接Anaconda

  2. 使用conda創建py3.6的虛擬環境,並激活使用

  conda create -n py3.6 python=3.6 //創建  	conda activate py3.6 //激活

 

在這裡插入圖片描述

3.安裝依賴numpy和imutils

  //用鏡像安裝  pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy  pip install -i https://pypi.tuna.tsinghua.edu.cn/simple imutils

 

4.安裝opencv

(1)首先下載opencv(網址:opencv),在這裡我選擇的是opencv_python‑4.1.2+contrib‑cp36‑cp36m‑win_amd64.whl 。
 (2)下載好後,把它放到任意盤中(這裡我放的是D盤),切換到安裝目錄,執行安裝命令:pip install opencv_python‑4.1.2+contrib‑cp36‑cp36m‑win_amd64.whl

代碼

首先打開一個空文件命名為real_time_object_detection.py,加入以下代碼,導入你所需要的包。

  # import the necessary packages  from imutils.video import VideoStream  from imutils.video import FPS  import numpy as np  import argparse  import imutils  import time  import cv2

 

2.我們不需要圖像參數,因為在這裡我們處理的是視頻流和視頻――除了以下參數保持不變:
 �Cprototxt:Caffe prototxt 文件路徑。
 �Cmodel:預訓練模型的路徑。
 �Cconfidence:過濾弱檢測的最小概率閾值,默認值為 20%。

  # construct the argument parse and parse the arguments  ap = argparse.ArgumentParser()  ap.add_argument("-p", "--prototxt", required=True,  	help="path to Caffe 'deploy' prototxt file")  ap.add_argument("-m", "--model", required=True,  	help="path to Caffe pre-trained model")  ap.add_argument("-c", "--confidence", type=float, default=0.2,  	help="minimum probability to filter weak detections")  args = vars(ap.parse_args())

 

3.初始化類列表和顏色集,我們初始化 CLASS 標籤,和相應的隨機 COLORS。

  # initialize the list of class labels MobileNet SSD was trained to  # detect, then generate a set of bounding box colors for each class  CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat",  	"bottle", "bus", "car", "cat", "chair", "cow", "diningtable",  	"dog", "horse", "motorbike", "person", "pottedplant", "sheep",  	"sofa", "train", "tvmonitor"]  COLORS = np.random.uniform(0, 255, size=(len(CLASSES), 3))

 

4.加載自己的模型,並設置自己的視頻流。

  # load our serialized model from disk  print("[INFO] loading model...")  net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])    # initialize the video stream, allow the cammera sensor to warmup,  # and initialize the FPS counter  print("[INFO] starting video stream...")  vs = VideoStream(src=0).start()  time.sleep(2.0)  fps = FPS().start()

 

首先我們加載自己的序列化模型,並且提供對自己的 prototxt文件 和模型文件的引用
 net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])
 下一步,我們初始化視頻流(來源可以是視頻文件或攝像頭)。首先,我們啟動 VideoStreamvs = VideoStream(src=0).start(),隨後等待相機啟動time.sleep(2.0),最後開始每秒幀數計算fps = FPS().start()。VideoStream 和 FPS 類是 imutils 包的一部分。

5.遍歷每一幀

  # loop over the frames from the video stream  while True:  	# grab the frame from the threaded video stream and resize it  	# to have a maximum width of 400 pixels  	frame = vs.read()  	frame = imutils.resize(frame, width=400)    	# grab the frame from the threaded video file stream  	(h, w) = frame.shape[:2]  	blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)),  		0.007843, (300, 300), 127.5)    	# pass the blob through the network and obtain the detections and  	# predictions  	net.setInput(blob)  	detections = net.forward()

 

首先,從視頻流中讀取一幀frame = vs.read(),隨後調整它的大小imutils.resize(frame, width=400)。由於我們隨後會需要寬度和高度,接著進行抓取(h, w) = frame.shape[:2]。最後將 frame 轉換為一個有 dnn 模塊的 blob,cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)),0.007843, (300, 300), 127.5)
 現在,我們設置 blob 為神經網絡的輸入net.setInput(blob),通過 net 傳遞輸入detections = net.forward()

6.這時,我們已經在輸入幀中檢測到了目標,現在看看置信度的值,來判斷我們能否在目標周圍繪製邊界框和標籤。

  # loop over the detections  	for i in np.arange(0, detections.shape[2]):  		# extract the confidence (i.e., probability) associated with  		# the prediction  		confidence = detections[0, 0, i, 2]    		# filter out weak detections by ensuring the `confidence` is  		# greater than the minimum confidence  		if confidence > args["confidence"]:  			# extract the index of the class label from the  			# `detections`, then compute the (x, y)-coordinates of  			# the bounding box for the object  			idx = int(detections[0, 0, i, 1])  			box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])  			(startX, startY, endX, endY) = box.astype("int")    			# draw the prediction on the frame  			label = "{}: {:.2f}%".format(CLASSES[idx],  				confidence * 100)  			cv2.rectangle(frame, (startX, startY), (endX, endY),  				COLORS[idx], 2)  			y = startY - 15 if startY - 15 > 15 else startY + 15  			cv2.putText(frame, label, (startX, y),  				cv2.FONT_HERSHEY_SIMPLEX, 0.5, COLORS[idx], 2)

 

在 detections 內循環,一個圖像中可以檢測到多個目標。因此我們需要檢查置信度。如果置信度足夠高(高於閾值),那麼將在終端展示預測,並以文本和彩色邊界框的形式對圖像作出預測。
 在 detections 內循環,首先我們提取 confidence 值,confidence = detections[0, 0, i, 2]。如果 confidence 高於最低閾值(if confidence > args["confidence"]:),那麼提取類標籤索引(idx = int(detections[0, 0, i, 1])),並計算檢測到的目標的座標(box = detections[0, 0, i, 3:7] * np.array([w, h, w, h]))。然後,我們提取邊界框的 (x, y) 座標((startX, startY, endX, endY) = box.astype("int")),將用於繪製矩形和文本。接著構建一個文本 label,包含 CLASS 名稱和 confidence(label = "{}: {:.2f}%".format(CLASSES[idx],confidence * 100))。還要使用類顏色和之前提取的 (x, y) 座標在物體周圍繪製彩色矩形(cv2.rectangle(frame, (startX, startY), (endX, endY),COLORS[idx], 2))。如果我們希望標籤出現在矩形上方,但是如果沒有空間,我們將在矩形頂部稍下的位置展示標籤(y = startY - 15 if startY - 15 > 15 else startY + 15)。最後,我們使用剛才計算出的 y 值將彩色文本置於幀上(cv2.putText(frame, label, (startX, y),cv2.FONT_HERSHEY_SIMPLEX, 0.5, COLORS[idx], 2))。

7.幀捕捉循環剩餘的步驟還包括:展示幀;檢查 quit 鍵;更新 fps 計數器。

  	# show the output frame  	cv2.imshow("Frame", frame)  	key = cv2.waitKey(1) & 0xFF    	# if the `q` key was pressed, break from the loop  	if key == ord("q"):  		break    	# update the FPS counter  	fps.update()

 

上述代碼塊簡單明瞭,首先我們展示幀(cv2.imshow("Frame", frame)),然後找到特定按鍵(key = cv2.waitKey(1) & 0xFF),同時檢查「q」鍵(代表「quit」)是否按下。如果已經按下,則我們退出幀捕捉循環(if key == ord("q"):break),最後更新 fps 計數器(fps.update())。

8.退出了循環(「q」鍵或視頻流結束),我們還要處理以下。

  # stop the timer and display FPS information  fps.stop()  print("[INFO] elapsed time: {:.2f}".format(fps.elapsed()))  print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))    # do a bit of cleanup  cv2.destroyAllWindows()  vs.stop()

 

運行文件目錄有以下文件:

在這裡插入圖片描述

到文件相應的目錄下:cd D:目標檢測object-detection執行命令:python real_time_object_detection.py --prototxt MobileNetSSD_deploy.prototxt.txt --model MobileNetSSD_deploy.caffemodel

在這裡插入圖片描述

演示

這裡我把演示視頻上傳到了B站,地址鏈接目標檢測

補充

項目github地址object_detection鏈接。
 本項目要用到MobileNetSSD_deploy.prototxt.txtMobileNetSSD_deploy.caffemodel,可以去github上下載項目運行。

 


[madbeef ] OpenCV+python實現實時目標檢測功能已經有260次圍觀

http://coctec.com/docs/python/shhow-post-239778.html