Opencv+Yolov5 は、パンチカード評価システム アルゴリズムの中核である同僚の顔認識モデルをトレーニングします

プラン

Opencv はまず各同僚に自動的にタグを付けて人的資源と物的リソースを削減し、次に Yolov5 を使用してモデル操作をトレーニングします。

プロジェクト構造

xml ファイルは、Anaconda の cv モジュールのインストール ディレクトリから見つかります。推奨される検索ディレクトリは次のとおりです。

 

コード [opencv 記事]

コレクション.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()

収集プロセス中に干渉が発生し、収集された同僚の写真とタグをクリアする必要がある場合は、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}个文件")

コード [Yolov5 記事]

収集が完了すると、person_face_detected ファイルにはすべての同僚のトレーニング セットとテスト セットが含まれます。このフォルダーを Yolov5/data フォルダーにコピーし、person_face_detected.yaml を作成してください。同じディレクトリ内のファイル形式を参照してください。その他の yaml ファイル

コマンドラインでyolov5フォルダーを開きます。

トレーニングコマンドを実行する

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

例外がない場合は、次のインターフェイスが表示されるはずです。

例外が発生した場合は、私の以前のブログ投稿を参照してください。役立つことが期待されます。

おすすめ

転載: blog.csdn.net/qq_36694133/article/details/130911630