行人跟踪之身份识别(一)
不知道有沒有二 先寫了一再說。
這篇博客記錄下我7天對yolov5+deepsort的改造,不,應該說是小改動。
場景:單海康螢石攝像頭下的身份識別+人物跟蹤。
環境gpu 3070? ? cuda 11.3? ?torch1.10 trochvision 11?
不知道有沒有大佬推薦其他方法,本人采用人臉識別+yolov5+deepsort為 人臉識別為opencv中的
cv2.face.EigenFaceRecognizer_create和cv2.CascadeClassifier方法去對人臉進行檢測和識別不說其他上環境:pycocotools安裝包,我transformer那篇文章有:
absl-py==1.0.0 cachetools==5.0.0 certifi==2021.10.8 charset-normalizer==2.0.12 colorama==0.4.4 cycler==0.11.0 Cython==0.29.28 easydict==1.9 faiss-cpu==1.7.1 flatbuffers==2.0 fonttools==4.31.2 google-auth==2.6.2 google-auth-oauthlib==0.4.6 grpcio==1.45.0 idna==3.3 importlib-metadata==4.11.3 joblib==1.1.0 kiwisolver==1.4.2 lib==4.0.0 Markdown==3.3.6 matplotlib==3.5.1 numpy==1.22.3 oauthlib==3.2.0 onnxruntime-gpu==1.11.0 opencv-contrib-python==4.4.0.44 opencv-python==4.5.5.64 packaging==21.3 pandas==1.4.1 Pillow==9.0.1 protobuf==3.19.4 pyasn1==0.4.8 pyasn1-modules==0.2.8 pycocotools @ file:///D:/software/pycocotools-2.0.4.tar.gz pyparsing==3.0.7 python-dateutil==2.8.2 pytz==2022.1 PyYAML==5.4.1 requests==2.27.1 requests-oauthlib==1.3.1 rsa==4.8 scikit-learn==1.0.2 scipy==1.8.0 seaborn==0.11.2 six==1.16.0 tabulate==0.8.9 tensorboard==2.8.0 tensorboard-data-server==0.6.1 tensorboard-plugin-wit==1.8.1 termcolor==1.1.0 threadpoolctl==3.1.0 torch @ file:///D:/software/torch-1.10.0%2Bcu113-cp38-cp38-win_amd64.whl torchvision @ file:///D:/software/torchvision-0.11.0%2Bcu113-cp38-cp38-win_amd64.whl tqdm==4.63.1 typing_extensions==4.1.1 urllib3==1.26.9 Werkzeug==2.1.0 wincertstore==0.2 yacs==0.1.8 zipp==3.7.0人臉準備訓練和識別代碼:
# -*- coding: utf-8 -*- """ Created on Sat Oct 27 11:43:47 2018@author: Administrator """ ''' 調用opencv的庫實現人臉識別 ''' import time import cv2 import numpy as np import os import threading from rtsp import myThread thread_lock = threading.Lock() thread_exit=False import shutil # from camera_catch import camera_service class person_face():def __init__(self, name="yyy", xml_path=None, root_dir=None):self.name =name# 根目錄self.root_dir = r"E:\workspace\person_tracking\data\face"#文件夾名以人名命名self.face_dir =os.path.join(self.root_dir,name)# self.root_dir = root_dir# self.xml_path =xml_pathself.xml_path =r'E:\workspace\person_tracking\data\haarcascade_frontalface_default.xml'# self.face_casecade = cv2.CascadeClassifier(self.xml_path)global thread_exit# 采集自己的人臉數據def generator(self):'''打開攝像頭,讀取幀,檢測該幀圖像中的人臉,并進行剪切、縮放生成圖片滿足以下格式:1.灰度圖,后綴為 .png2.圖像大小相同params:data:指定生成的人臉數據的保存路徑'''img_height = 480img_width = 720thread = myThread(img_height, img_width)thread.start()if not os.path.exists(self.face_dir):os.mkdir(self.face_dir)# 創建一個級聯分類器# face_casecade = cv2.CascadeClassifier(r'D:\anaconda3\envs\opencv4.5\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')face_casecade = cv2.CascadeClassifier(self.xml_path)while not thread_exit:thread_lock.acquire()frame = thread.get_frame()thread_lock.release()gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 人臉檢測qface = face_casecade.detectMultiScale(gray_img, 1.3, 5)for (x, y, w, h) in face:# 在原圖上繪制矩形cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)# 調整圖像大小new_frame = cv2.resize(frame[y:y + h, x:x + w], (92, 112))# 保存人臉cv2.imwrite('%s/%s.png' % (self.face_dir, str(time.time())), new_frame)cv2.imshow('Dynamic', frame)# 按下q鍵退出if cv2.waitKey(100) & 0xff == ord('q'):breakcv2.destroyAllWindows()# 載入圖像 讀取ORL人臉數據庫,準備訓練數據def LoadImages(self):'''加載圖片數據用于訓練params:data:訓練數據所在的目錄,要求圖片尺寸一樣ret:images:[m,height,width] m為樣本數,height為高,width為寬names:名字的集合labels:標簽'''images = []names = []labels = []label = 0# 遍歷所有文件夾for subdir in os.listdir(self.root_dir):subpath = os.path.join(self.root_dir, subdir)# print('path',subpath)# 判斷文件夾是否存在if os.path.isdir(subpath):# 在每一個文件夾中存放著一個人的許多照片names.append(subdir)# 遍歷文件夾中的圖片文件for filename in os.listdir(subpath):imgpath = os.path.join(subpath, filename)img = cv2.imread(imgpath, cv2.IMREAD_COLOR)gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# cv2.imshow('1',img)# cv2.waitKey(0)images.append(gray_img)labels.append(label)label += 1images = np.asarray(images)# names=np.asarray(names)labels = np.asarray(labels)return images, labels, names# 檢驗訓練結果def FaceRec(self):# 加載訓練的數據X, y, names = self.LoadImages()# print('x',X)model = cv2.face.EigenFaceRecognizer_create()model.train(X, y)# 打開攝像頭url = "rtsp://user:pasword@192.168.x.x/Streaming/Channels/1"cap = cv2.VideoCapture(url)cv2.namedWindow('Dynamic')# 創建級聯分類器face_casecade = cv2.CascadeClassifier(self.xml_path)while (True):# 讀取一幀圖像# ret:圖像是否讀取成功# frame:該幀圖像ret, frame = cap.read()# 判斷圖像是否讀取成功# print('ret',ret)if ret:# 轉換為灰度圖gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 利用級聯分類器鑒別人臉faces = face_casecade.detectMultiScale(gray_img, 1.3, 5)# 遍歷每一幀圖像,畫出矩形for (x, y, w, h) in faces:frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) # 藍色roi_gray = gray_img[y:y + h, x:x + w]try:# 將圖像轉換為寬92 高112的圖像# resize(原圖像,目標大小,(插值方法)interpolation=,)roi_gray = cv2.resize(roi_gray, (92, 112), interpolation=cv2.INTER_LINEAR)params = model.predict(roi_gray)print('Label:%s,confidence:%.2f' % (params[0], params[1]))'''putText:給照片添加文字putText(輸入圖像,'所需添加的文字',左上角的坐標,字體,字體大小,顏色,字體粗細)'''cv2.putText(frame, names[params[0]], (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)except:continuecv2.imshow('Dynamic', frame)# 按下q鍵退出if cv2.waitKey(100) & 0xff == ord('q'):breakcap.release()cv2.destroyAllWindows()if __name__ == '__main__':data = r"E:\workspace\person_tracking\data\face"serve= person_face()# LoadImages(data)# image = camera_service()# generator(image,"ybj")serve.generator()上完代碼上模型文件:
鏈接:https://pan.baidu.com/s/1cRVmq7qVKfJg8yDo7sLWNg?
提取碼:face?
放到自己的位置,修改路徑即可
如果按我上面的步驟報錯:
cascadedetect.cpp:1658: error: (-215:Assertion failed) !empty() in function ‘cv::CascadeClassifier::detectMultiScale’
不用想肯定是xml 文件路徑的問題或者xml文件的問題,解決方法:
anaconda3\envs\opencv4.5\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml
到你的環境下,這個文件其實已經生成了,拿出來替換掉即可
運行步驟,先跑generator() 生成圖像集,再跑FaceRec() 即可識別
總結
以上是生活随笔為你收集整理的行人跟踪之身份识别(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序中使用wx.showToast
- 下一篇: C++primer Plus课本代码(第