行人跟踪之身份识别(一)

行人跟踪之身份识别(一),第1张

不知道有没有二 先写了一再说。


这篇博客记录下我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_path
        self.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.灰度图,后缀为 .png
        2.图像大小相同
        params:
            data:指定生成的人脸数据的保存路径
        '''

        img_height = 480
        img_width = 720
        thread = 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)

        # 人脸检测q
            face = 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'):
                break
        cv2.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 += 1
        images = 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:[email protected]/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:
                        continue

                cv2.imshow('Dynamic', frame)

                # 按下q键退出
                if cv2.waitKey(100) & 0xff == ord('q'):
                    break
        cap.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() 即可识别

					
										


					

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/567907.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存