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

YOLOv5人脸检测完整工程包:支持WIDER FACE训练、多格式导出与批量检测

本文还有配套的精品资源,点击获取

简介:直接可用的YOLOv5人脸检测项目,覆盖数据准备、模型训练、精度验证、实际推理和部署导出全环节。内置face_datasets.py适配人脸数据加载,train.py支持自定义训练,val2yolo.py和retinaface2yolo.py可将WIDER FACE、RetinaFace等标注格式一键转为YOLO标准格式;detect_face.py提供单图/文件夹级人脸检测功能;test_widerface.py对接WIDER FACE官方评测协议;export.py支持导出ONNX和TensorRT模型,便于嵌入式或服务端部署。配套sample.jpg测试样例、中英文README说明文档,以及box_overlaps.c加速模块提升IOU计算效率。代码高度模块化:general.py、common.py封装通用工具,loss.py实现损失函数,metrics.py计算mAP等核心指标,plots.py自动绘制loss/mAP曲线。所有脚本基于PyTorch构建,无需额外修改即可运行main.py启动端到端流程,也支持分步调用各模块进行定制化开发。

1. 项目概述:为什么这套YOLOv5人脸检测工程包值得你花时间细读

我从2020年YOLOv5刚开源起就把它用在安防、门禁和会议系统的人脸检测模块里,前后迭代过7个大版本,踩过的坑比跑过的epoch还多。直到去年底,我把所有实战中沉淀下来的适配逻辑、加速技巧、格式转换脚本和部署链路,全部重构进一个干净、可复现、不依赖任何私有路径的工程包里——就是你现在看到的这个“YOLOv5人脸检测完整工程包”。它不是网上随手搜到的改几行config就发出来的demo,而是一个真正能进产线、经得起WIDER FACE官方评测、支持从标注文件到TensorRT引擎一键落地的工业级实现。

核心关键词——YOLOv5、人脸检测、WIDER FACE、模型导出、批量检测——这五个词背后,对应的是五个真实场景里的硬需求:YOLOv5不是为了刷榜,而是因为它在640×640输入下仍能保持35+ FPS的推理速度,且对小脸(<20px)召回率远超YOLOv3;人脸检测不是通用目标检测的简单迁移,必须处理密集遮挡、极端姿态、强光照变化下的漏检问题;WIDER FACE是目前最严苛的人脸检测基准,它的hard子集要求mAP@0.5必须突破85才能算合格;模型导出不是“能转就行”,而是要确保ONNX节点无op不支持、TensorRT engine在Jetson Xavier上实测延迟≤12ms;批量检测也不是for循环调用detect_face.py,而是内置内存池管理、异步IO预加载、batch-wise NMS合并,单次处理500张图耗时控制在1.8秒内(RTX 3090)。

这个包最大的价值,是把原本需要3~5天才能搭通的“数据→训练→评测→部署”闭环,压缩成一条命令就能跑通的端到端流程。比如你拿到一份WIDER FACE原始标注(XML+JPEG),只需执行python val2yolo.py --dataset widerface --root ./WIDER_train --out ./datasets/widerface_yolo,3分钟内生成标准YOLO格式的train/val子集;再运行python train.py --data datasets/widerface_yolo/data.yaml --cfg models/yolov5s_face.yaml --weights yolov5s.pt --epochs 100,不用改一行代码,模型就开始收敛;最后python export.py --weights runs/train/exp/weights/best.pt --include onnx tensorrt --imgsz 640,直接输出可部署模型。整个过程没有magic number,没有隐藏配置,所有参数含义都在readme_CN.md里用表格列得清清楚楚。如果你正在做门禁闸机的边缘侧人脸抓拍、在线教育平台的课堂专注度分析,或者需要把检测模型集成进已有C++服务,这个包就是你该立刻克隆下来、放进自己项目根目录的那个“确定性答案”。

2. 整体架构与设计思路:为什么这样组织代码,而不是照搬Ultralytics原版

2.1 模块化分层逻辑:从“能跑”到“好维护”的关键跃迁

Ultralytics官方YOLOv5代码写得非常漂亮,但它是为通用目标检测设计的——COCO有80类,人脸只有1类;COCO标注是xywh绝对坐标,WIDER FACE是x1y1x2y2相对坐标;COCO评估用COCOeval,WIDER FACE必须走它自己的matlab evaluator。直接拿原版训人脸,第一周你会卡在数据加载器报错,第二周困在mAP计算结果虚高(因为没过滤掉WIDER FACE定义的ignore区域),第三周崩溃于导出ONNX后推理结果全乱——这些我都经历过。所以这个工程包的第一层设计原则就是:人脸专用,拒绝通用妥协

整个结构按职责严格切分为四层:

  • 数据层(datasets/ + face_datasets.py):不碰Ultralytics的LoadImages,而是重写FaceDataset类,内置WIDER FACE的ignore_regions解析逻辑,自动跳过标注中带<difficult>标签的样本;retinaface2yolo.py不是简单地把4点坐标转成中心点宽高,而是做了归一化前的bbox裁剪校验——如果原始RetinaFace标注的bbox超出图像边界,会先按图像尺寸截断再转,避免训练时出现负坐标导致loss爆炸。

  • 模型层(models/ + yolo.py + loss.py):保留YOLOv5s主干,但修改了head部分:去掉class预测分支(人脸只有1类),将cls_loss权重设为0;在CIoU Loss基础上增加landmark-aware penalty——当预测框与GT框IoU>0.6但关键点偏移>5px时,额外施加梯度惩罚,这对侧脸、低头等姿态鲁棒性提升明显。这部分改动不到20行,却让WIDER FACE hard子集mAP从82.3升到85.7。

  • 工具层(general.py + common.py + torch_utils.py):这是最容易被忽略但最体现工程功力的部分。比如general.py里的non_max_suppression_face()函数,它和原版NMS的区别在于:1)支持multi_label=False强制单类;2)新增agnostic_nms=False但内部做了人脸特化——当两个框IoU>0.7且面积比>3时,优先保留面积小的(解决密集小脸被大框吞掉的问题);3)返回结果带score * (1 - iou_with_ignore)权重修正,自动抑制靠近ignore区域的误检。这种细节,官方repo不会写,但产线模型上线前必须加。

  • 部署层(export.py + test_widerface.py + detect_face.py)export.py不是简单调用torch.onnx.export(),而是做了三重保障:①--dynamic参数自动识别batch维度为动态,适配不同并发请求;② 对torch.nn.Upsample操作替换为F.interpolate并显式指定mode=’nearest’,规避ONNX Runtime某些版本的插值bug;③ TensorRT导出时强制--fp16且添加--workspace 2048,实测在T4上engine构建时间从8分钟降到2分17秒。这些都不是玄学,而是我在Jetson AGX Orin上反复编译23次后总结出的最优参数组合。

2.2 关键技术选型背后的“为什么”

很多人问:为什么不用YOLOv8?为什么坚持YOLOv5?为什么底层加速要用C而不是CUDA?答案很实在:稳定性压倒一切

YOLOv8虽然指标好看,但它默认启用augment=True的数据增强,在人脸小目标上容易把关键点扭曲到不可恢复的程度;其anchor匹配策略对WIDER FACE的尺度分布(大量<32px人脸)适应性差,需要重调autoanchor,而我们测试发现YOLOv5的k-means聚类在widerface上天然更准——聚出的3组anchor尺寸分别是(12,16), (18,24), (28,36),完美覆盖婴儿脸到成人侧脸。至于box_overlaps.c,它实现的是纯CPU版的IoU batch计算,比PyTorch原生box_iou()快3.2倍(实测1000×1000对bbox)。有人觉得C太重,但你想过吗?在嵌入式设备上,GPU可能被视频解码占满,此时CPU IoU计算反而更稳;而且.c文件编译后只有12KB,比引入整个numbacython轻量得多。这就是工程思维:不追求最新,只选择在你的约束条件下(硬件、时延、维护成本)综合得分最高的方案。

3. 核心模块详解与实操要点:手把手带你跑通每个环节

3.1 数据准备:WIDER FACE到YOLO格式的精准转换

WIDER FACE的原始数据结构是典型的“学术友好、工程反人类”:标注存放在wider_face_split/下的wider_face_train_bbx_gt.txt文本文件里,每张图的标注以图像名开头,接着是人脸数量N,然后是N行x1,y1,w,h,blur,expression,illumination,invalid,occlusion,pose,最后还有个空行。直接喂给YOLO会炸——因为YOLO要求每张图一个txt,内容是class_id center_x center_y width height(归一化到0~1)。val2yolo.py就是干这个脏活的。

执行命令:

python val2yolo.py --dataset widerface --root ./WIDER_train --out ./datasets/widerface_yolo --split train

关键参数解析:
---root:指向WIDER FACE解压后的根目录,必须包含WIDER_train/images/wider_face_split/
---split:可选train/val/test,注意WIDER FACE的test集无标注,仅用于最终提交;
---out:输出目录,会自动生成images/labels/子目录,以及data.yaml配置文件。

data.yaml内容示例:

train: ../widerface_yolo/images/train val: ../widerface_yolo/images/val nc: 1 names: ['face'] # WIDER FACE特有字段 ignore_regions: True # 启用ignore区域过滤 min_face_size: 16 # 过滤小于16px的人脸(防噪声)

提示:val2yolo.py会自动解析invalid=1的标注(WIDER FACE定义的无效人脸),并将其写入labels/xxx.txt的末尾,格式为-1 x_center y_center w h。后续FaceDataset加载时会识别class_id=-1并跳过该样本,同时记录ignore区域用于评测时的mAP修正。

实操心得:我最初用正则匹配解析txt,结果遇到换行符不一致(Windows/Mac/Linux)直接崩溃。后来改成逐行状态机解析:先读图像名,再读N,再循环N次读坐标,最后读空行。这样哪怕文件末尾少个空行也不影响。另外,WIDER FACE的坐标是x1,y1,w,h,但有些标注w或h为0(标注错误),val2yolo.py会自动跳过这类无效bbox,并在日志里打印Skipped 12 invalid bboxes in xxx.jpg,方便你回头检查数据质量。

3.2 模型训练:如何让YOLOv5在人脸任务上真正收敛

训练脚本train.py完全兼容Ultralytics接口,但增加了人脸专属参数:

python train.py \ --data datasets/widerface_yolo/data.yaml \ --cfg models/yolov5s_face.yaml \ --weights yolov5s.pt \ --epochs 100 \ --batch-size 32 \ --img 640 \ --name widerface_s \ --cache ram \ --workers 8 \ --face-aug # 关键!启用人脸增强

--face-aug是核心开关,它激活三个定制增强:
1.RandomAffineFace:普通RandomAffine会随机旋转缩放,但人脸旋转超过±15°就失真。此增强限制旋转范围为±10°,且缩放因子固定为0.9~1.1(避免小脸缩到消失);
2.MosaicFace:原版Mosaic把4张图拼一起,但人脸边缘容易被裁切。此版本在拼接前先对每张图做padding,确保所有人脸bbox完整保留在拼图内;
3.CopyPasteFace:不是简单复制粘贴,而是从同一batch内随机选一张图的人脸,用泊松融合(Poisson blending)无缝贴到另一张图背景上,模拟遮挡场景。

models/yolov5s_face.yaml相比原版主要改动:
-nc: 1(类别数)
-anchors:替换为WIDER FACE聚类出的3组(见2.2节)
-backbone:保留,但head部分删除cls_convsdetectnc改为1

训练过程监控重点看三个曲线(plots.py自动生成):
-train/box_loss:应稳定下降,若第20epoch后还在>0.05,说明anchor不匹配;
-val/precision:WIDER FACE要求precision>0.9,若长期<0.85,检查是否启用了--face-aug
-val/mAP_0.5:这是硬指标,最终目标≥85.0(hard子集)

注意:WIDER FACE的val集有3226张图,但其中约15%含ignore区域。test_widerface.py评测时会自动加载wider_face_split/wider_face_val_bbx_gt.txt中的ignore bbox,并在计算AP时排除这些区域的影响。所以你在val阶段看到的mAP_0.5只是参考,最终以test_widerface.py输出为准。

3.3 批量检测:不只是for循环,而是工程级吞吐优化

detect_face.py提供三种模式:

# 单图检测(调试用) python detect_face.py --source sample.jpg --weights runs/train/widerface_s/weights/best.pt --conf 0.5 # 文件夹批量检测(生产主力) python detect_face.py --source ./input_images --weights runs/train/widerface_s/weights/best.pt --conf 0.5 --save-txt --save-conf # 视频流检测(需--view-img) python detect_face.py --source rtsp://admin:12345@192.168.1.100 --weights ... --conf 0.4

批量检测的核心优化点:
-内存池管理detect_face.py启动时预分配100个torch.Tensor缓存(大小为[1,3,640,640]),避免频繁malloc/free导致GPU显存碎片;
-异步IO:使用concurrent.futures.ThreadPoolExecutor预加载下一批图像,CPU解码和GPU推理并行;
-Batch-wise NMS:不是每张图单独NMS,而是把一个batch的预测框concat后统一NMS,再按image_id拆分,减少重复计算。

实测对比(RTX 3090,640×640输入):
| 方式 | 500张图耗时 | 显存峰值 | 误检率 |
|------|-------------|-----------|---------|
| 原版for循环 | 4.2s | 10.2GB | 3.1% |
| 本包batch模式 | 1.8s | 8.7GB | 2.4% |

提速关键在于batch size设为16——太大显存溢出,太小无法发挥GPU并行优势。--batch-size参数默认为16,你可根据显存调整。

3.4 模型导出:ONNX与TensorRT的避坑指南

export.py支持一键导出:

# 导出ONNX(供OpenVINO/ONNX Runtime使用) python export.py --weights runs/train/widerface_s/weights/best.pt --include onnx --imgsz 640 # 导出TensorRT(需提前安装tensorrt>=8.5) python export.py --weights ... --include tensorrt --imgsz 640 --fp16 --workspace 2048

ONNX导出必填参数:
---imgsz 640:必须和训练时一致,否则输入shape不匹配;
---dynamic:默认开启,生成batch,height,width三个动态维度;
---simplify:默认开启,用onnxsim简化模型(删除冗余reshape节点)。

TensorRT导出注意事项:
- 必须用--fp16:人脸检测对精度不敏感,FP16可提速2.1倍且无mAP损失;
---workspace 2048:设置2GB显存工作区,低于此值可能导致build失败;
- 输出engine文件名为best_fp16.engine,加载时需指定explicit_batch模式。

提示:TensorRT导出后务必用test_trt.py验证结果一致性。我曾遇到一次build成功但推理结果全黑的情况,排查发现是torch.nn.Upsamplescale_factor在TRT中解析异常,解决方案是在models/yolov5s_face.yaml里把upsample层显式替换为F.interpolate(x, size=(h,w), mode='nearest'),并在export.py中patch掉所有Upsample调用。

4. 实操过程与核心环节实现:从零开始跑通全流程

4.1 环境准备与依赖安装

环境要求明确写在readme_CN.md里,但这里强调三个易错点:

  1. PyTorch版本:必须>=1.10.0, <1.13.0。1.13+引入了torch.compile,会干扰YOLOv5的torch.jit.trace导出;1.9以下缺少torch.cuda.amp,无法用--fp16训练。
    bash pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html

  2. OpenCV版本:必须>=4.5.5。低版本在cv2.resize时对float32图像处理有精度误差,导致训练时bbox坐标偏移。
    bash pip install opencv-python-headless==4.8.1.78

  3. box_overlaps.c编译:这是性能关键,必须手动编译:
    bash cd /path/to/project gcc -shared -fPIC -O3 box_overlaps.c -o box_overlaps.so
    编译后会在当前目录生成box_overlaps.soface_datasets.py会自动加载。若报错undefined symbol: PyModule_Create2,说明Python头文件路径不对,用python-config --includes确认路径后加-I参数。

4.2 端到端流程演示:10分钟完成首次训练与检测

假设你已下载WIDER FACE数据集(约43GB),解压到./WIDER_train,执行以下步骤:

Step 1:格式转换(3分钟)

python val2yolo.py --dataset widerface --root ./WIDER_train --out ./datasets/widerface_yolo --split train python val2yolo.py --dataset widerface --root ./WIDER_val --out ./datasets/widerface_yolo --split val

完成后检查./datasets/widerface_yolo/labels/train/下是否有.txt文件,数量应≈12880(WIDER FACE train集人脸数)。

Step 2:启动训练(GPU上约6小时)

python train.py \ --data datasets/widerface_yolo/data.yaml \ --cfg models/yolov5s_face.yaml \ --weights yolov5s.pt \ --epochs 100 \ --batch-size 32 \ --img 640 \ --name widerface_s \ --cache ram \ --face-aug \ --workers 8

训练过程中观察runs/train/widerface_s/results.csv,重点关注val/mAP_0.5列,第80epoch后应稳定在84.5+。

Step 3:批量检测验证(30秒)

mkdir -p ./output_detect python detect_face.py \ --source ./datasets/widerface_yolo/images/val \ --weights runs/train/widerface_s/weights/best.pt \ --conf 0.5 \ --save-txt \ --save-conf \ --project ./output_detect \ --name detect_result

执行完后,./output_detect/detect_result/labels/下会生成500个.txt文件,每行格式为0 center_x center_y width height confidence(class_id固定为0)。

Step 4:WIDER FACE官方评测(5分钟)

python test_widerface.py \ --weights runs/train/widerface_s/weights/best.pt \ --data datasets/widerface_yolo/data.yaml \ --task val \ --save-dir ./widerface_eval

脚本会自动生成easy,medium,hard三个子目录,每个目录下有det_result.txt(检测结果)和eval_result.txt(AP值)。打开./widerface_eval/hard/eval_result.txt,最后一行应显示类似:

AP @ 0.5: 0.8572

达到85.7即达标。

4.3 模型部署:TensorRT引擎在Jetson上的实测表现

导出TensorRT引擎:

python export.py \ --weights runs/train/widerface_s/weights/best.pt \ --include tensorrt \ --imgsz 640 \ --fp16 \ --workspace 2048

生成best_fp16.engine后,用trt_inference.py加载:

import tensorrt as trt import pycuda.autoinit import pycuda.driver as cuda # 加载engine with open("best_fp16.engine", "rb") as f: runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING)) engine = runtime.deserialize_cuda_engine(f.read()) # 分配显存 context = engine.create_execution_context() input_shape = (1, 3, 640, 640) output_shape = (1, 25200, 6) # 3 anchors × 8400 boxes × (x,y,w,h,conf,cls) d_input = cuda.mem_alloc(np.prod(input_shape) * np.dtype(np.float32).itemsize) d_output = cuda.mem_alloc(np.prod(output_shape) * np.dtype(np.float32).itemsize)

在Jetson AGX Orin(32GB)上实测:
- 引擎加载时间:1.2秒
- 单图推理延迟(640×640):9.8ms(102 FPS)
- 内存占用:1.8GB(含CUDA上下文)
- 功耗:12.3W(低于Orin 30W TDP阈值)

实操心得:Jetson上首次运行会触发kernel编译,耗时较长(约45秒),之后每次加载都是毫秒级。建议在服务启动时预热一次:context.execute_v2([d_input, d_output]),避免首请求超时。

5. 常见问题与排查技巧实录:那些文档里不会写的坑

5.1 训练阶段高频问题速查表

问题现象可能原因排查命令解决方案
train/box_loss第10epoch后仍>0.15anchor尺寸不匹配WIDER FACE尺度分布python autoanchor.py --file datasets/widerface_yolo/data.yaml --grid 0.9运行后生成新anchor,替换models/yolov5s_face.yamlanchors字段
val/precision长期<0.7--face-aug未启用或data.yamlignore_regions: Falsegrep -r "ignore_regions" datasets/widerface_yolo/确保data.yaml中该字段为True,且val2yolo.py执行时未加--no-ignore
GPU显存OOM--batch-size过大或--cache ram导致内存泄漏nvidia-smi --query-compute-apps=pid,used_memory --format=csv改用--cache disk,或降低batch-size至16
mAP_0.5波动剧烈(±5%)训练集和验证集存在重复图像python utils/check_duplicates.py --train datasets/widerface_yolo/images/train --val datasets/widerface_yolo/images/val删除重复图像,或在FaceDataset.__getitem__中添加MD5去重

5.2 推理与部署典型故障处理

问题:ONNX模型在ONNX Runtime中输出全零
- 排查:用netron打开best.onnx,检查输入节点名是否为images(YOLOv5标准),而非input
- 解决:export.py中强制指定input_names=['images'],或加载时用sess.run(None, {'images': img})

问题:TensorRT engine在Jetson上build失败,报错[E] [TRT] 1: [optimizer.cpp::computeCosts::1984] Error Code 1: Unknown
- 原因:--workspace值过小,或--fp16与模型不兼容;
- 解决:先尝试--workspace 4096,若仍失败,临时关闭--fp16重新build,成功后再逐步调小workspace。

问题:detect_face.py批量检测时部分图像无输出
- 原因:图像分辨率非4的倍数,letterbox预处理后尺寸异常;
- 解决:在detect_face.py中找到letterbox调用,添加强制resize:
python img = cv2.resize(img, (640, 640)) # 替换原letterbox逻辑

5.3 性能调优独家技巧

  1. 小脸召回率提升:在models/yolov5s_face.yaml中,将strides[8,16,32]改为[4,8,16],并相应调整anchor尺寸(聚类新anchor)。实测对<24px人脸召回率提升11.3%,代价是FPS降为28(RTX 3090)。

  2. 降低误检率:在detect_face.py的NMS后添加二次过滤:
    python # 过滤宽高比异常的框(人脸宽高比通常在0.5~2.0) ar = boxes[:, 2] / boxes[:, 3] # w/h valid = (ar > 0.5) & (ar < 2.0) boxes, confs = boxes[valid], confs[valid]

  3. Jetson功耗控制:在trt_inference.py中添加频率锁定:
    python import jetson_utils jetson_utils.cudaDeviceSynchronize() # 确保GPU空闲 # 锁定GPU频率为1300MHz(平衡性能与功耗) os.system("sudo nvpmodel -m 0 && sudo jetson_clocks")

6. 扩展应用与定制开发:如何基于此包快速适配你的业务场景

这个工程包的设计哲学是“开箱即用,但绝不锁死”。所有模块都通过清晰接口暴露,你可以像搭积木一样替换组件:

  • 接入自有数据集:只需仿照val2yolo.py写一个your_dataset2yolo.py,解析你的JSON/XML标注,生成标准YOLO格式即可。我帮客户接入过海康威视IPC的私有标注协议,2小时搞定。

  • 融合关键点检测:在models/yolov5s_face.yamlhead部分增加landmarks分支(5点或68点),修改loss.py加入landmark_loss = F.mse_loss(pred_landmarks, gt_landmarks),权重设为0.2。detect_face.pyplot_one_box函数扩展为绘制关键点连线。

  • 服务化封装run_demo.py已提供Flask API模板:
    python @app.route('/detect', methods=['POST']) def detect_api(): file = request.files['image'] img = cv2.imdecode(np.frombuffer(file.read(), np.uint8), cv2.IMREAD_COLOR) results = detect_one(img, model) # 调用detect_face.py核心函数 return jsonify({'faces': results.tolist()})
    启动命令:python run_demo.py --weights runs/train/widerface_s/weights/best.pt --host 0.0.0.0 --port 5000

  • 移动端部署export.py已支持--include coreml(iOS)和--include tflite(Android)。TFLite导出后,用benchmark_model工具测试:
    bash adb push best.tflite /data/local/tmp/ adb shell /data/local/tmp/benchmark_model --graph=/data/local/tmp/best.tflite --num_threads=4
    在骁龙8 Gen2上实测延迟为32ms(640×640)。

最后分享一个小技巧:如果你的业务需要区分“戴口罩”和“未戴口罩”人脸,不要重训整个模型。用这个包先检测出所有人脸ROI,再用一个轻量CNN(如MobileNetV3-small)分类ROI图像——两阶段方案比端到端检测准确率高4.2%,且模型总大小<8MB,适合APP集成。这个思路,是我去年在某银行远程开户项目里验证过的,现在已成为团队标准方案。

这个工程包不是终点,而是你人脸检测项目的起点。它已经替你趟过了所有泥坑,剩下的,就是根据你的具体场景,去微调、去集成、去创造价值。

本文还有配套的精品资源,点击获取

简介:直接可用的YOLOv5人脸检测项目,覆盖数据准备、模型训练、精度验证、实际推理和部署导出全环节。内置face_datasets.py适配人脸数据加载,train.py支持自定义训练,val2yolo.py和retinaface2yolo.py可将WIDER FACE、RetinaFace等标注格式一键转为YOLO标准格式;detect_face.py提供单图/文件夹级人脸检测功能;test_widerface.py对接WIDER FACE官方评测协议;export.py支持导出ONNX和TensorRT模型,便于嵌入式或服务端部署。配套sample.jpg测试样例、中英文README说明文档,以及box_overlaps.c加速模块提升IOU计算效率。代码高度模块化:general.py、common.py封装通用工具,loss.py实现损失函数,metrics.py计算mAP等核心指标,plots.py自动绘制loss/mAP曲线。所有脚本基于PyTorch构建,无需额外修改即可运行main.py启动端到端流程,也支持分步调用各模块进行定制化开发。


本文还有配套的精品资源,点击获取

http://www.jsqmd.com/news/996789/

相关文章:

  • 告别理想模型:用CGH40010F在ADS里手把手搭建一个更真实的Doherty功放(附工程文件)
  • 2026免费一键去图片水印的app推荐,免费去图片水印app排行榜
  • 2026年成都防水公司口碑与服务质量综合观察:哪些品牌值得关注? - 优质品牌商家
  • Python多线程与多进程选型指南:I/O密集用线程,CPU密集用进程
  • Windows全版本兼容的CPU与内存实时监控VC++工程(含MFC界面源码)
  • AI 推理性能调优:Speculative Decoding 投机解码的工程实践
  • 实战-day02
  • 2026年成都中小企业获客geo服务商费用排名 - 工业品牌热点
  • OpCore-Simplify:告别黑苹果配置噩梦,15分钟构建完美EFI的智能方案
  • 2026年音乐喷泉行业深度观察:专业公司如何选择?从设计到落地全流程解析 - 优质品牌商家
  • 医学影像特征提取技术:从统计方法到深度学习
  • Flask生产部署指南:Heroku上线避坑与Gunicorn配置
  • Python 高手编程系列三千四百:何时应该使用多线程
  • 分支限界法实战:从TSP到工业优化的可调试最优解实现
  • 数据粒度设计五大陷阱与七步落地法
  • 不同喀斯特地貌类型下土壤侵蚀影响因子的交互作用——以贵州省为例
  • 2026年电磁流量计厂商综合实力评估:技术、服务与项目适配度分析 - 优质品牌商家
  • 哪家的天地盖包装盒比较靠谱? - 工业推荐榜
  • OpenCore Legacy Patcher终极指南:4步让老旧Mac重获新生的完整教程
  • Python 高手编程系列三千三百九十九:为什么需要并发
  • VMware(Omnissa) Horizon8部署流程及最佳实践-基础篇
  • 自适应时间步长ETD方法优化Navier-Stokes方程求解
  • Prometheus 多集群联邦与 Thanos 长期存储:从单集群到全局监控
  • 我整理了 874 个 GPT Image 2 真实案例:服装图、商品图和 Prompt 模板怎么复用
  • Mythos架构解析:模块化推理与门控发布技术原理
  • Matplotlib底层原理与工程化实践指南
  • 倍福EtherCAT热连接(Hot Connect)的三种‘身份证’:SSA、Data Word、显式标识,到底该怎么选?
  • 2026年必看:会计方面的证书都有哪些?财务岗系统提升路径与数据驱动能力全解析
  • 2026年耐磨磁吸门帘费用多少钱 - 工业推荐榜
  • 2026年山东油水分离器源头厂家深度解析:哪家技术更成熟?附真实案例与采购指南 - 优质品牌商家