YOLO 网络调参侠(入门):以人脸识别模型为例

目录

一、YOLO 网络训练文件组织说明

(一)cfg 文件夹:存放可采用的模型

如 yolov4-tiny.cfg 模型,在 YOLO 网络结构中最为简易。

模型需要根据标签分类个数不同修改 YOLO 网络的部分结构参数,步骤如下:

  1. 在文件中查找 yolo 字段
  2. 将 yolo 字段下方第一个 classes 参数修改为当前训练的标签分类个数。如当标签个数为 10 时:classes = 10
  3. 将 yolo 字段上方第一个 filters 参数改为: $(5 + classes)*3$的值,其中 classes 为当前训练的标签分类个数。如当标签个数为 10 时:filters = 45
    其中表达式中的 5 表示标注矩形的 x1(左上顶点横坐标),y1(左上顶点纵坐标),x2(右下顶点横坐标),y2(右下顶点纵坐标),p(目标识别概率)
  4. 对其他查找到的 yolo 字段进行相同处理

(二)datasets 文件夹:存放数据集

(1)datasets/faces 文件夹:faces 数据集的图片和标签(分为训练集和验证集)

需要注意的是训练集和验证集的图片名称和标签文件名称必须一一对应(双射),否则无法将图片与其对应的标签成功匹配。

datasets/faces/images/train 文件夹:faces 数据集的训练图像
datasets/faces/images/valid 文件夹:faces 数据集的验证图像
datasets/faces/labels/train 文件夹:faces 数据集的训练标签
datasets/faces/labels/valid 文件夹:faces 数据集的验证标签

(2)datasets/faces.data 文件:faces 数据集的“使用说明”

包含数据集的标签种类数、训练集路径、检验集路径、标签号对应标签名文件的路径。指定使用的数据集时指定该文件路径即为指定相应的数据集

(3)datasets/faces.names 文件:数据集的标签号对应的标签名

每一行存放一个标签名,标签号加一所在行的标签名即为该标签号所对应的标签名

(4)datasets/train.txt 文件:数据集要训练图片的列表

文件中列有所有待训练的图片路径。可以写一个 python 文件自动创建写入:train_list_generator.py

(三)imgs 文件夹:存放待侦测的图片

将待侦测的图像放入

(四)outputs 文件夹:存放侦测完毕的输出图片

存放侦测完毕的图像,由 detect.py 文件创建

(五)uitls 文件夹:所需的各种包

(六)weights 文件夹:存放初始、训练得到的权重(参数)

包含初始权重(yolov4-tiny.pt),最近训练出来的权重(last.pt),效果最优权(best.pt)重等

(七)models.py 文件:模型文件

(八)detact.py 文件:调用模型侦测图片

通过运行 run_detact.bat 文件输入相应参数侦测图片

(九)test.py 文件:检测文件

通过运行 run_test.bat 文件输入相应参数检测模型

(十)train.py 文件:训练文件

通过运行 run_train.bat 文件输入相应参数训练模型

(十一)run_detect.bat 文件:脚本文件侦测图片

可设置使用模型、采用权重、标号对应标签名文件、侦测图片路径等参数

(十二)run_test.bat 文件:脚本文件检测模型

可设置批次大小、使用模型、采用权重、训练的数据集、重叠度、自信度等参数

(十三)run_train.bat 文件:脚本文件训练模型

可设置批次大小、训练次数、使用模型、初始训练权重、训练的数据集等参数

(十四)train_list_generator.py 文件:生成 train.txt 文件

自动将数据集中所有图片写入训练图片列表 train.txt 中

import os


def train_list_generator(in_path, out_path):
    if not (os.path.exists(in_path) and os.path.isdir(in_path)):
        # 输入的不是路径,而且路径不存在
        return False
    # 判定输出路径是否存在
    if not os.path.exists(out_path):
        # 不存在创建输出路径
        os.mkdir(out_path)
    # 得到输出文件路径并打开
    out_file = os.path.join(out_path, F"train.txt")
    out_fd = open(out_file, "w")
    # 遍历文件进行转换
    all_img_files = os.listdir(in_path)
    for img_file in all_img_files:
        path_file = os.path.join(in_path, img_file)
        out_fd.write(path_file + '\n')
        print(F"完成{path_file}图片的写入!")
    out_fd.close()
    print(F"图片写入全部完成!")


if __name__ == "__main__":
    train_list_generator("datasets/faces/images/train", "datasets")

二、YOLO 网络识别模型 API 封装

(一)setup.py 文件:运行一键安装

(二)yolov4 文件夹:存放 yolo 模型及相关识别文件

(1)yolov4/data 文件夹:存放 yolo 模型

yolov4/data/faces.names 文件:数据集的标签号对应的标签名

每一行存放一个标签名,标签号加一所在行的标签名即为该标签号所对应的标签名,可与训练模型保持一致

yolov4/data/faces.pt 文件:训练好的识别模型的参数

模型训练最终的目标文件就是这个模型参数

yolov4/data/yolov4-tiny.cfg 文件:yolo 网络结构配置文件

需要与模型训练使用相同的网络结构配置文件,否则需要再根据标签个数修改相应参数,步骤同上

(2)yolov4/uitls 文件:包含 yolo 模型实现所需要的的各种包

(3)yolov4/facedet.py 文件:对外调用接口

通过调用该文件中的 FaceDetector 实现对图像的识别、图片标注。

在使用不同的模型、权重参数、标签名进行识别时需要修改相应的参数,如下。

def __init__(self):
        super(FaceDetector, self).__init__()
        # 条件1:文件准备
        current_dir = os.path.dirname(__file__)
        self.cfg_file = os.path.join(current_dir, "data/yolov4-tiny-5.cfg") # 选择要使用的网络结构配置文件的地址
        self.mod_file = os.path.join(current_dir, "data/faces5.pt") # 选择要使用的网络模型的权重参数文件的地址
        self.names_file = os.path.join(current_dir, "data/faces5.names") # 选择要使用的标签名转换文件的地址

调用方式如下:

from yolov4/facedet import FaceDetector

detector = FaceDetector()

(4)yolov4/models 文件:模型文件

不需要调整参数