Opencv+Yolov5 entrena el modelo de reconocimiento facial de colegas, el núcleo del algoritmo del sistema de evaluación de tarjetas perforadas

plan

Opencv primero etiqueta automáticamente a cada colega para reducir la mano de obra y los recursos materiales, y luego usa Yolov5 para las operaciones del modelo de entrenamiento.

estructura del proyecto

El archivo xml se encuentra en el directorio de instalación del módulo cv en Anaconda, el siguiente es el directorio de búsqueda recomendado

 

Código [artículos opencv]

colección.py

# 导入cv模块
import cv2 as cv
# 导入time模块
import time

# 获取本地摄像头
capture = cv.VideoCapture(0)
# 人脸分类器路径
classifier_path = "haarcascade_frontalface_default.xml"
# 导入人脸分类器
face_classifier = cv.CascadeClassifier(classifier_path)
face_classifier.load(classifier_path)

name_dict = {
    "wujie": 0,
    "moshiyu": 1,
    "wengli": 2,
    "wangchaolong": 3,
    "xiongjiyuan": 4,
    "wangxuefei": 5,
    "leitao": 6,
    "wangzhi": 7,
    "xumeifang": 8,
    "wangjun": 9,
    "wuxingqiao": 10
}

print("采集图片开始")

name = input("请输入你名字的完整拼音表式[如吴杰就输入wujie]:")
name = name.lower()
# 花名册里没有此同事名字
if name not in name_dict:
    print("名字拼音输入出错,程序结束")
    exit(0)

# 人物分类
count_of_type = name_dict[name]

# 打开花名册查看该同事是否已经采集过图片了
with open("name.txt", "r") as file:
    lines = file.readlines()
    for line in lines:
        if line == name + "\n":
            print("你已经采集过图片了,程序结束")
            exit(0)

with open("name.txt", "a") as file:
    file.write(name + "\n")

# 已采集图片数量
count_of_frame = 0
# 最大采集图片数量
max_count = 600

# 死循环
while True:
    # 获取一帧图片
    ret, frame = capture.read()
    # 获取失败就退出循环
    if ret is False:
        break
    # 将图片转换成灰度图,因为此人脸分类器只会对灰度图进行识别
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 获取识别出来的框
    face_rects = face_classifier.detectMultiScale(gray)

    # 给图片命名,与时间相关可以使其不重复
    preffix = str(time.time()).replace('.', '_')
    # 图片名字长度均为18
    while len(preffix) < 18:
        preffix += '0'

    # 图片名称与同事名字相对应,以便后期删除标注的维护
    preffix = name + "_" + preffix

    # 前500张为训练集
    if count_of_frame < 500:
        image_src = "person_face_detected/train/images/" + preffix + '.jpg'
        image_label = "person_face_detected/train/labels/" + preffix + '.txt'
    # 后100张为测试集
    else:
        image_src = "person_face_detected/val/images/" + preffix + '.jpg'
        image_label = "person_face_detected/val/labels/" + preffix + '.txt'

    # 600张图片收集完成后退出采集
    if count_of_frame >= max_count:
        print(f"采集图片已达{max_count}张,自动退出采集")
        break

    # 识别出结果的情况下
    if len(face_rects) > 0:
        # 保存图片
        cv.imwrite(image_src, frame)
        # 记录采集数量增加1张
        count_of_frame += 1
        print(f"已采集图片{count_of_frame}张")
        # 保存yolo格式的标注
        with open(image_label, 'a', encoding='gbk') as file:
            for face_rect in face_rects:
                x, y, w, h = face_rect
                # 给每个识别到的图片绘制一个框,方便实时检验人脸识别的效果
                cv.rectangle(frame, (x, y), (x + h, y + w), (255, 0, 0), 3)
                # 归一化
                x, y, w, h = float(x) / 640, float(y) / 480, float(w) / 640, float(h) / 480
                xc = (x + x + w) / 2
                yc = (y + y + h) / 2
                # yolo标注方式为[类别代号,中心点,宽,高],其中使用空格进行分隔
                file.write(f"{count_of_type} {xc} {yc} {w} {h}")
    # 把图片显示出来
    cv.imshow("", frame)

    # 接收用户的按键
    key = cv.waitKey(1) & 0xFF
    # 按键为esc则提前退出采集程序
    if key == 27:
        break

# 释放摄像头
capture.release()
# 关闭所有的窗口
cv.destroyAllWindows()

Si hay interferencia durante el proceso de recopilación y necesita borrar las imágenes y etiquetas de colegas que se han recopilado, ejecute clear.py

import os

name_dict = {
    "wujie": 0,
    "moshiyu": 1,
    "wengli": 2,
    "wangchaolong": 3,
    "xiongjiyuan": 4,
    "wangxuefei": 5,
    "leitao": 6,
    "wangzhi": 7,
    "xumeifang": 8,
    "wangjun": 9,
    "wuxingqiao": 10
}

name = input("请输入要清除的同事的完整拼音表式[如吴杰就输入wujie]:")
name = name.lower()
# 花名册里没有此同事名字
if name not in name_dict:
    print("名字拼音输入出错,程序结束")
    exit(0)

flag = False
lines = None

# 打开花名册查看该同事是否已经采集过图片了
with open("name.txt", "r") as file:
    lines = file.readlines()
    for line in lines:
        if line == name + "\n":
            flag = True

if flag is True:
    lines.remove(name + "\n")
    with open("name.txt", "w") as file:
        for line in lines:
            file.write(line)
else:
    print("该同事没有进行过采集操作,清除程序结束")
    exit(0)

count = 0

# 清除train文件夹中该同事的image和label
dir = "person_face_detected/train/images/"
for filename in os.listdir(dir):
    if filename.startswith(name):
        print(filename)
        os.remove(dir + filename)
        count += 1

dir = "person_face_detected/train/labels/"
for filename in os.listdir(dir):
    if filename.startswith(name):
        print(filename)
        os.remove(dir + filename)
        count += 1

# 清除val文件夹中该同事的image和label
dir = "person_face_detected/val/images/"
for filename in os.listdir(dir):
    if filename.startswith(name):
        print(filename)
        os.remove(dir + filename)
        count += 1

dir = "person_face_detected/val/labels/"
for filename in os.listdir(dir):
    if filename.startswith(name):
        print(filename)
        os.remove(dir + filename)
        count += 1

print(f"删除完毕,图片加标签总共{count}个文件")

Código [artículos de Yolov5]

Una vez completada la recopilación, su archivo person_face_detected contiene el conjunto de entrenamiento y el conjunto de prueba de todos los colegas. Copie esta carpeta en la carpeta Yolov5/data y escriba un archivo person_face_detected.yaml. Consulte el formato de archivo en el mismo directorio. Otros archivos yaml

Abra la carpeta yolov5 con la línea de comando

Ejecutar el comando de entrenamiento

python train.py --data data/person_face_detected.yaml --epoch 300 --device 0 --batch-size 1

Si no hay ninguna excepción, debería ver la siguiente interfaz

Si encuentra una excepción, puede consultar mi publicación de blog anterior, con la esperanza de brindarle ayuda.

Supongo que te gusta

Origin blog.csdn.net/qq_36694133/article/details/130911630
Recomendado
Clasificación