企业网站系统cms,合肥网站建设市场,wordpress网店模板制作,成都网站制作培训人脸检测 环境安装源设置conda 环境安装依赖库 概述数据集wider_face转yolo环境依赖标注信息格式转换图片处理生成 train.txt 文件 数据集展示数据集加载和处理 参考文章 环境
安装源设置
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/f… 人脸检测 环境安装源设置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 python3.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
概述
人脸检测属于目标检测领域目标检测领域分两大类通用目标检测n1分类特定类别目标检测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 Imageparent_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 0while i len(lines):image_path lines[i].strip() # Get the relative path of imagenum_boxes int(lines[i 1].strip()) # Get the number of boxes# Path of the label filelabel_path os.path.join(output_dir, os.path.basename(image_path).replace(.jpg, .txt))os.makedirs(os.path.dirname(label_path), exist_okTrue)# Get the Absolute Path of the imageimage_abs_path os.path.join(image_dir, image_path)# Open the image to get the real size of itwith Image.open(image_abs_path) as img:img_width, img_height img.size# Create the file and write data inwith 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 coordinatesx_center / img_widthy_center / img_heightwidth / img_widthheight / img_height# The class is defaulted by 0label_file.write(f0 {x_center} {y_center} {width} {height}\n)# Update the index and jump to the next imagei 2 (1 if num_boxes 0 else num_boxes)if __name__ __main__:# Modify the additional section by your own pathinput_path parent_pathwider_face_split/output_path parent_pathwider_for_yolo/input_file_pre wider_face_input_file_sub _bbx_gt.txtif not os.path.exists(output_path):os.makedirs(output_path)# Train and Validationdatasetfile [train, val]for category in datasetfile:convert_to_yolo_format(input_path input_file_pre category input_file_sub,output_path category /labels,parent_pathfWIDER_{category}/images)
图片处理
wider_face对不同情景的图片做了分类YOLO要求训练图片在一个文件夹因此训练前需要将数据集所有图片copy到一个文件夹下
import os
import shutildef 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(fCopied: {src_path} - {dest_path})else:print(fSkipped (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 npif __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.txtpath_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,hx np.array([x.split() for x in lines], dtypenp.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:# breakcv2.destroyAllWindows()数据集加载和处理
参考文章
WIDER FACE数据集转YOLO格式