当前位置: 首页 > news >正文

AI 实战2 - face -detect

人脸检测

  • 环境
    • 安装源设置
    • conda 环境安装依赖库
  • 概述
  • 数据集
    • wider_face转yolo
      • 环境依赖
      • 标注信息格式转换
      • 图片处理
      • 生成 train.txt 文件
    • 数据集展示
    • 数据集加载和处理
  • 参考文章

环境

安装源设置

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --set show_channel_urls yes
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

conda 环境安装依赖库

conda create -n facePay python=3.7
conda activate facePay
conda install pytorch-cpu -c pytorch
#使用conda install pytorch-cpu会快很多
pip3 install torchvision -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install bcolz
pip install scikit-learn
pip install tqdm
pip install easydict

概述

人脸检测属于目标检测领域,目标检测领域分两大类:通用目标检测(n+1分类),特定类别目标检测(2分类)
人脸检测算法:Faster-RCNN系列,YOLO系列,级联CNN系列
评价指标:召回率,误检率,检测速度

数据集

yolo 通过txt文件标注,标注内容:0 0.15 0.33 0.14 0.22
对应:类别 归一化后中心点坐标 [x,y,w,h]

wider_face转yolo

环境依赖

# PIL 安装
pip install -U Pillow -i https://pypi.tuna.tsinghua.edu.cn/simple
conda install Pillow
# pip 安装会报错,conda 安装正常

标注信息格式转换

import os
from PIL import Image

parent_path = "/home/ai/wider_face_split/"

def convert_to_yolo_format(input_file, output_dir, image_dir):
    with open(input_file, 'r') as f:
        lines = f.readlines()

    i = 0
    while i < len(lines):
        image_path = lines[i].strip()  # Get the relative path of image
        num_boxes = int(lines[i + 1].strip())  # Get the number of boxes
        # Path of the label file
        label_path = os.path.join(output_dir, os.path.basename(image_path).replace('.jpg', '.txt'))
        os.makedirs(os.path.dirname(label_path), exist_ok=True)

        # Get the Absolute Path of the image
        image_abs_path = os.path.join(image_dir, image_path)

        # Open the image to get the real size of it
        with Image.open(image_abs_path) as img:
            img_width, img_height = img.size

        # Create the file and write data in
        with open(label_path, 'w') as label_file:
            for j in range(num_boxes):
                # Fetch the box data (x_min, y_min, width, height)
                box_data = list(map(int, lines[i + 2 + j].strip().split()))
                x_min, y_min, width, height = box_data[:4]

                # Calculate the center coordinate (x_center, y_center)
                x_center = (x_min + width / 2)
                y_center = (y_min + height / 2)

                # Convert to the relative coordinates
                x_center /= img_width
                y_center /= img_height
                width /= img_width
                height /= img_height

                # The class is defaulted by 0
                label_file.write(f"0 {x_center} {y_center} {width} {height}\n")

        # Update the index and jump to the next image
        i += 2 + (1 if num_boxes == 0 else num_boxes)


if __name__ == "__main__":
    # Modify the additional section by your own path
    input_path = parent_path+"wider_face_split/"
    output_path = parent_path+"wider_for_yolo/"

    input_file_pre = "wider_face_"
    input_file_sub = "_bbx_gt.txt"

    if not os.path.exists(output_path):
        os.makedirs(output_path)

    # Train and Validation
    datasetfile = ["train", "val"]
    for category in datasetfile:
        convert_to_yolo_format(input_path + input_file_pre + category + input_file_sub,
                               output_path + category + "/labels",
                               parent_path+f"WIDER_{category}/images")

图片处理

wider_face对不同情景的图片做了分类,YOLO要求训练图片在一个文件夹,因此训练前需要将数据集所有图片copy到一个文件夹下

import os
import shutil


def copy_images(src_dir, dest_dir):
    # 确保目标目录存在
    if not os.path.exists(dest_dir):
        os.makedirs(dest_dir)

    # 递归查找所有图片
    for root, _, files in os.walk(src_dir):
        for file in files:
            if file.lower().endswith(('.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.webp')):
                src_path = os.path.join(root, file)
                dest_path = os.path.join(dest_dir, file)

                # 如果目标文件已存在,可以选择覆盖或跳过
                if not os.path.exists(dest_path):
                    shutil.copy2(src_path, dest_path)  # 保留原文件元数据
                    print(f"Copied: {src_path} -> {dest_path}")
                else:
                    print(f"Skipped (already exists): {dest_path}")


# 配置源文件夹和目标文件夹路径
train_source_folder = r"/home/a/wider_face_split/WIDER_train/images"
train_destination_folder = r"/home/a/wider_face_split/WIDER_train/data"
val_source_folder = r"/home/a/wider_face_split/WIDER_val/images"
val_destination_folder = r"/home/a/wider_face_split/WIDER_val/data"

# 执行复制
copy_images(train_source_folder, train_destination_folder)
copy_images(val_source_folder, val_destination_folder)

生成 train.txt 文件

ls -al images/ | awk '{print $NF}' > ../train.txt

数据集展示

import cv2
import os
import numpy as np

if __name__ == "__main__":
    # 第一步:指定文件路径
    root_path ='/home/neucore/develop/code/pre_research/dl/face_ai/study/yoloDataset/train/images/'
    path = '/home/neucore/develop/code/pre_research/dl/face_ai/study/yoloDataset/train.txt'
    path_voc_names = '/home/neucore/develop/code/pre_research/dl/face_ai/study/yoloDataset/face.names'

    # 第二步:获取目标类别
    with open(path_voc_names ,'r') as f:
        lable_map = f.readlines()
    for i in range(len(lable_map)):
        lable_map[i] = lable_map[i].strip()
        print(i, lable_map[i])

    # 第三步:获取图像数据和标注信息
    with open(path ,'r') as file:
        img_files = file.readlines()
        # img_files = os.path.join(root_path, img_files[i][0:])

    for i in range(len(img_files)):
        img_files[i] = img_files[i].strip()
        # 图像的绝对路径, [0:]表示去掉多少个字节,[2:]表示去掉前两个字符
        img_files[i] = os.path.join(root_path, img_files[i][0:])
        # print(i, img_files[i])

    label_files = [x.replace('images','labels').replace ('.jpg','.txt') for x in img_files]
    # print(label_files)

    #第四步:将标注信息给制在图像上
    #读取图像并对标注信息进行绘

    # for i in range(len(img_files)):
    for i in range (3):
        print (img_files[i])

        # 图像读取,获取宽高
        img =cv2.imread(img_files[i])
        if img is None:
            print("Error: Image not found or path is incorrect.")

        w = img.shape[1]
        h = img.shape[0]
        # 标签文件的绝对路径
        print(i, label_files[i])

        if os.path.isfile(label_files[i]):
            # 获取每一行的标注信息
            with open(label_files[i], 'r') as file:
                lines = file.read().splitlines()
            # 获取每一行的标准信息(class,x,y,w,h)
            x = np.array([x.split() for x in lines], dtype=np.float32)

        for k in range(len(x)):
            anno = x[k]
            label = int(anno[0])

            # 获取框的坐标值,左上角坐标和右下角坐标
            x1 = int((float(anno[1]) - float(anno[3])/2) * w)
            y1 = int((float(anno[2]) - float(anno[4])/2) * h)
            x2 = int((float(anno[1]) + float(anno[3])/2) * w)
            y2 = int((float(anno[2]) + float(anno[4])/2) * h)

            # 将标注框绘制在图像上
            cv2.rectangle(img, (x1,y1), (x2,y2), (255,30,30), 2)
            # 将标注类别绘制在图像上
            cv2.putText(img, ("%s"%(str(lable_map[label]))), (x1,y1),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1)
    
        cv2.imshow('img', img)
        cv2.waitKey()
        # if cv2.waitKey(1) == 27:
        #     break
    cv2.destroyAllWindows()

数据集加载和处理

参考文章

WIDER FACE数据集转YOLO格式

相关文章:

  • Open3D解决SceneWidget加入布局中消失的问题
  • composer 错误汇总
  • 排序算法(3):
  • Dify Workflows MCP Server (TypeScript)设计与实战
  • 人工智能之数学基础:线性代数中矩阵的运算
  • 极简本地体验deepseek大模型教程
  • 蓝牙接近开关模块感应开锁手机靠近解锁支持HID低功耗
  • Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)
  • 爱普生可编程晶振 SG-8101CE 在智能家居领域展现出的优势
  • 【机器学习】逻辑回归(Logistic Regression)
  • 散户如何实现自动化交易下单——篇1:体系介绍与获取同花顺资金账户和持仓信息
  • mysql安装教程,超详细图文教程(附安装包)MySQL8.0安装教程
  • virtualbox安装ubuntu,配置静态ip
  • UnrealEngine UE5 可视化 从地球观察火星 金星 土星 运动轨迹
  • 【Android】安卓付款密码输入框、支付密码输入框
  • 基于PLC的智能窗控制系统设计
  • Spring Boot 拦截器(Interceptor)
  • 目标检测——数据处理
  • 嵌入式晶振细究
  • 《深度揭秘:生成对抗网络如何重塑遥感图像分析精度》
  • 网站建设外出考察信息/优惠活动推广文案
  • 网站备案怎么弄/信阳seo公司
  • 广州做网络服装的网站建设/线下推广渠道和方式
  • 免费推广中文黄页网/做seo必须有网站吗
  • 旅游网站建设方案2019/子域名网址查询
  • 网站建设的目标是/百度seo排名优化软件分类