一、需求背景
在处理大量图片数据集时,我们经常需要从成百上千张图片中筛选出包含人脸的图片。例如:
手动筛选效率极低,而普通的图片管理工具又缺乏精准的人脸识别能力。今天,我将分享一套基于Python的批量人脸图片筛选系统,结合了YOLOv8人脸检测和感知哈希去重两大核心技术,轻松解决这个痛点。
二、技术栈选择
1. 人脸检测引擎:YOLOv8
2. 图片去重算法:感知哈希(pHash)
三、系统架构设计
整个系统分为两个核心模块,形成完整的处理流水线:
📁 原始图片库 → [模块1:人脸检测] → [模块2:图片去重] → 📁 人脸图片库
模块1:人脸检测与筛选
- • 技术点:YOLOv8预训练模型、置信度阈值过滤
模块2:图片去重与迁移
四、核心代码解析
1. YOLOv8人脸检测实现
import os
import shutil
from ultralytics import YOLO
# 核心参数配置
SOURCE_IMG_DIR = r"D:\img_todo\all_img_result"
HAVE_FACE_DIR = r"D:\img_todo\good"
NO_FACE_DIR = r"D:\img_todo\bad"
CONF_THRESHOLD = 0.9 # 90%置信度阈值
# 加载人脸检测专用预训练模型(公众号回复face.pt获取下载链接)
model = YOLO('yolov8x_person_face.pt')
# 遍历处理所有图片
for file_name in os.listdir(SOURCE_IMG_DIR):
file_path = os.path.join(SOURCE_IMG_DIR, file_name)
# 执行人脸检测
results = model(file_path, conf=CONF_THRESHOLD, verbose=False)
det_boxes = results[0].boxes
# 根据检测结果分类图片
if len(det_boxes) > 0:
shutil.move(file_path, os.path.join(HAVE_FACE_DIR, file_name))
print(f"✅ 检测到人脸 → 已移动至人脸文件夹")
else:
shutil.move(file_path, os.path.join(NO_FACE_DIR, file_name))
print(f"❌ 无有效人脸 → 已移动至非人脸文件夹")
技术亮点:
- • 使用90%的高置信度阈值,确保检测结果的准确性
2. 图片去重与性能优化
import os
import imagehash
from PIL import Image
import ctypes
# 配置参数
HASH_SIZE = 8 # 哈希计算尺寸
# 释放文件缓存,解决Windows系统性能问题
def release_file_cache():
try:
if os.name == "nt":
ctypes.windll.kernel32.SetErrorMode(0x0001)
ctypes.windll.psapi.EmptyWorkingSet(ctypes.windll.kernel32.GetCurrentProcess())
except:
pass
# 获取图片哈希值与尺寸
def get_img_hash_and_size(img_path):
img = None
try:
img = Image.open(img_path)
phash = str(imagehash.phash(img.convert('L'), hash_size=HASH_SIZE))
size = img.size
return phash, size
except Exception as e:
return None, None
finally:
if img:
img.close()
del img
release_file_cache()
技术亮点:
- • 针对Windows系统的文件缓存优化,避免句柄泄漏
五、系统整合与使用方法
1. 完整工作流程
- • 运行
drop_duplicates.py脚本,对原始图片库进行去重
- • 运行
face_detect.py脚本,对去重后的图片进行人脸检测
2. 参数配置说明
# 图片去重配置
SOURCE_FOLDER = r"D:\img_todo\all_img" # 原始图片文件夹路径
TARGET_FOLDER = r"D:\img_todo\all_img_result" # 去重后图片的输出路径
HASH_SIZE = 8 # 哈希计算精度(8-16之间选择)
# 人脸检测配置
SOURCE_IMG_DIR = r"D:\img_todo\all_img_result" # 去重后的图片目录
HAVE_FACE_DIR = r"D:\img_todo\good" # 有人脸图片输出目录
NO_FACE_DIR = r"D:\img_todo\bad" # 无有效人脸图片输出目录
CONF_THRESHOLD = 0.9 # 人脸检测置信度阈值(≥90%才判定为人脸)
MODEL_PATH = 'yolov8x_person_face.pt' # YOLOv8人脸检测模型路径
3. 运行命令说明
# 1. 运行图片去重脚本
python drop_duplicates.py
# 2. 运行人脸检测脚本(需先安装依赖)
pip install ultralytics pillow
python face_detect.py
4. 模型依赖说明
- • YOLOv8人脸检测模型:需要下载
face.pt模型文件到脚本同一目录(公众号回复face.pt获取下载链接)
六、性能与效率分析
1. 检测速度
- • 单张图片检测:约0.1-0.3秒(取决于硬件配置)
2. 准确率保障
3. 系统稳定性
- • 完善的异常处理机制,单张图片错误不影响整体流程
七、实际应用场景
- 1. 个人照片库整理:从 thousands 张生活照片中提取包含人脸的合影
- 2. 数据集构建:为机器学习项目快速筛选人脸训练数据
- 4. 电商图片优化:从产品图片中筛选出包含模特的展示图
八、代码优化建议
功能扩展
九、总结
这套批量人脸图片筛选系统结合了当前最先进的YOLOv8目标检测技术和感知哈希算法,能够高效、准确地从海量图片中筛选出包含人脸的图片。系统具备以下技术亮点:
- 1. 智能设备适配:自动检测并选择最佳运行设备(CUDA GPU、Mac MPS或CPU),充分利用硬件性能
- 2. 精准人脸检测:采用90%置信度阈值,确保筛选结果的准确性
- 3. 高效批量处理:支持海量图片并行处理,大幅提升工作效率
- 4. 完善的异常处理:单张图片处理失败不影响整体流程,确保系统稳定性
系统设计简洁,代码结构清晰,适合技术人员快速部署和二次开发。
无论是个人照片整理,还是专业的数据集构建,这套系统都能大大提高工作效率,是图片处理领域的实用工具。
yolo官方文档: https://docs.ultralytics.com/zh/
获取完整代码:关注「木子打杂spider」公众号,回复「人脸筛选」即可获取完整代码包。