ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于YOLOv8与ResNet50的教室人脸识别系统部署实战

基于YOLOv8与ResNet50的教室人脸识别系统部署实战 简介基于YOLOv8的教室人脸识别项目资源面向需要落地人脸检测与识别场景的开发者、研究人员及校园信息化人员。这套方案以实时准确为目标覆盖数据配置、模型训练与推理全流程可应用于课堂考勤、人员定位、校园安防联动等实际场景即使在光线较暗或面部部分遮挡时也能保持较高识别率。压缩包内共58个文件、约128.55MB包含pt预训练权重、py训练与工具脚本、yaml配置、xml标注及jpg/png示例图片其中预训练模型和配置可直接用于快速启动脚本与标注数据则便于理解数据组织方式和二次开发。已有695人学习下载。通过这套资料可掌握YOLOv8在教室视频流中的人脸识别流程、模型调用与结果解析方法借助示例图片与标注文件可快速验证识别效果并通过修改训练脚本和配置完成自定义场景部署从而支持课堂考勤、人员定位等落地实践尤其适合具备一定深度学习基础、希望快速复现或扩展到其他目标识别任务的读者。1. 项目概述1.1 为什么在教室场景做人脸识别我选了YOLOv8这条路教室人脸识别这个需求这几年在学校、培训机构、在线教育公司里出现频率极高。点名考勤、课堂行为分析、无人值守自习室都会用到。但真正落地的难点从来不是“能不能认出来”而是“在教室这种复杂场景下能不能稳定认出来”。灯光变化、学生低头写字、前后排遮挡、多人同时入镜每一帧都可能毁掉识别结果。我最初考虑过传统方案OpenCV的Haar级联或LBP检测人脸再配合特征脸或LBPH做识别。这套方案胜在轻量但教室里稍微出现侧脸、暗光、戴眼镜反光检测框就开始乱跳误检率让人崩溃。Haar级联本质上是滑动窗口加级联分类器对正面人脸有效一旦目标在画面里占比小、角度偏漏检率直线上升根本没有商用的稳定性。后来我把检测部分换成YOLOv8识别部分再接一个独立的特征提取网络。也就是用YOLOv8负责“人在哪、脸在哪”用另一个模型负责“这是谁”。这两个问题拆开处理之后整个系统的正确率和鲁棒性都有了质的提升。这也是目前工业界做人脸应用的主流做法检测和识别解耦各干各的出了问题也方便单独排查。1.2 这套方案的适用范围与能力边界这套方案解决的第一个核心问题是教室场景下的动态人脸定位。YOLOv8作为单阶段目标检测器直接回归出人脸框的位置和置信度比传统方法快得多也比两阶段方法更适合教室这种多人场景的实时推理需求。第二个核心问题是人脸身份的向量化表示。我用了ResNet50作为backbone做人脸特征提取把每张人脸图映射成一个128维的特征向量。两个向量之间的余弦相似度大于设定的阈值就判定为同一个人。这个思路很多人可能第一反应是“直接用YOLOv8跑一个分类头不就行了”答案是不行。YOLOv8是一个通用目标检测器它的强项是定位和粗粒度分类不适合直接做细粒度的人脸身份判别。而且分类头是封闭集只能识别训练时见过的人教室每学期都可能转来转生封闭集的方案维护成本太高。用特征向量做开放集识别新增一个人只需要往向量库里添加一个向量完全不需要重新训练模型这是我认为最灵活的方案。如果只是想快速演示或者教室就固定在20人以内且不常变动那其实不需要自己训练模型直接用我已经提供的预训练权重加源码改一改摄像头IP和教室编号就能跑通。但如果目标是做到课堂考勤级的稳定性那至少要用本班学生的照片构建特征库并且微调一下检测模型的置信度阈值。下面是这套方案的能力边界确认一下是否匹配你的场景再动手场景要素支持情况说明摄像头视角支持固定视角教室摄像头一般固定安装画面范围稳定对检测非常有利人数上限10人以下实时30人以下准实时YOLOv8n在普通GPU上单人耗时约10-20ms人数不影响检测耗时但识别阶段需要按人数排队光照变化中等鲁棒性白天靠窗侧光和夜晚日光灯场景实测可用极端背光需要调曝光遮挡情况前后排遮挡影响较大低头、抬手遮挡会漏检需要靠连续帧投票补偿硬件要求GTX 1660Ti以上即可流畅跑不需要A100级别的算力Intel CPU也能跑但帧率会掉到个位数2. 核心技术思路与模型选型解构2.1 检测与识别为什么要解耦很多人第一次接触这个项目时会以为人脸识别的全流程就是一个模型从输入图像直接输出“这是张三”的结果。实际工程里我强烈不建议这么干。原因有两点。第一检测和识别的任务目标根本不同。检测只回答“画面里哪里有脸”它需要的是空间定位能力。识别回答的是“这张脸是谁”它需要的是判别性和泛化能力。把两个任务硬塞进一个模型要么模型体积膨胀严重要么两个任务互相干扰结果就是都做不好。第二从工程维护角度看解耦之后检测模型和识别模型可以独立升级。比如教室里换了广角摄像头画面范围变大导致漏检增多这时候只需要重新优化检测模型识别模型完全不用动。如果学生换了发型或者戴了口罩只需要针对识别模型做数据补充。两个模块互不牵连排错链路也清晰得多——识别不对就先查检测框准不准再查特征向量比对结果对不对。具体到技术实现YOLOv8输出的是检测框坐标、置信度、类别ID。我拿到这些人脸框后按坐标从原图上裁剪出人脸区域做对齐和归一化再送进ResNet50提取特征。这一步顺序不能反如果你先整图提取特征不仅计算量爆炸而且背景干扰会严重污染身份特征余弦相似度直接乱套。2.2 YOLOv8网络结构里真正有用的几个细节YOLOv8本身不是专门给人脸设计的它的官方预训练权重是在COCO数据集上训练的包含80个类其中第0类就是person并不是人脸。所以要么用专门的人脸检测权重要么自己训练一个单类人脸检测模型。我的做法是提供了两个权重一个是经过微调的YOLOv8n人脸检测权重一个是COCO预训练的原始权重。人脸识别场景直接加载前者省去自己标注和训练的流程。YOLOv8n是官方系列里最小的模型参数只有3.2M计算量8.7GFLOPs。之所以不选更大的YOLOv8s或YOLOv8m是因为教室场景中摄像头位置固定人脸尺寸变化范围有限小模型已经能取得不错的准确率而且实时性更好。实测下来YOLOv8n的检测精度在自建教室数据集上mAP能到0.92以上肉眼几乎分辨不出和YOLOv8s的差距。模型结构上YOLOv8的backbone使用C2f模块替换了之前的C3模块。C2f在特征提取阶段使用了更多的梯度流分支能把不同层的梯度信息更好地融合起来。这对小尺寸人脸特别有价值因为人脸框在画面中的像素占比往往很小如果浅层空间细节和深层语义信息不能有效融合检测头很难同时兼顾定位精度和分类置信度。2.3 ResNet50预训练模型做特征提取为什么够用人脸识别最著名的一套结构是FaceNet用Inception-ResNet做backbone再配合三元组损失函数训练。但FaceNet的预训练权重不太好在公开渠道获得而且它的输入限制是160x160或112x112对低分辨率人脸并不友好。我最终选用ResNet50在ImageNet上的预训练权重然后在LFW数据集上做了二次微调。LFW是人脸识别领域最常用的公开数据集之一包含上万张真实场景下的人脸照片。二次微调的核心是替换掉ResNet50最后的1000类分类头改成128维特征输出层并用ArcFace损失函数训练。ArcFace在特征空间中加大类间距离、缩小类内距离对人脸识别这种类内变化极大的任务效果非常显著。有人可能担心ImageNet预训练模型迁移到人脸任务上会不会不够好。我的实测结论是完全够用。LFW测试集上微调后的ResNet50特征提取器识别准确率在98.3%左右而ResNet101版本能提升到98.7%但对教室考勤这种场景98.3%已经足够多了0.4个百分点不值得多花将近一倍的显存和推理时间。2.4 预训练模型的分类说明提供两个必须分开使用的模型千万别搞混模型文件用途输入尺寸输出yolov8n-face.pt检测人脸框640x640检测框坐标、置信度resnet50_arcface.pt提取人脸特征向量112x112128维特征向量这两者不能互相替代。如果误用COCO预训练的YOLOv8直接推理人脸只能检测到person而不是face裁剪下来的人脸区域包含大量非人脸像素识别精度会断崖式下降。如果误用未微调的ResNet50做特征提取在ImageNet类间差异下的特征分布完全不适配人脸类内差异准确率可能连70%都不到。这算是这个项目里最典型的新手坑。3. 环境构建与源码结构说明3.1 环境依赖与版本锁定环境配置上Python版本建议3.9到3.10之间太新或太旧都可能遇到依赖冲突。PyTorch我用的2.1.0搭配CUDA 11.8这个组合在GTX 1660Ti到RTX 4090上都是稳定经过验证的。Ultralytics版本锁定8.0.0以上即可。装环境的时候我强烈建议用conda建独立环境否则torch、opencv、ultralytics之间很容易因为版本互相扯皮。整套依赖安装命令如下conda create -n face_recognition python3.9 conda activate face_recognition pip install torch2.1.0 torchvision0.16.0 --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics opencv-python numpy pillow scikit-learn3.2 源码结构与功能模块项目的源码目录我做了模块化拆分每个文件职责单一方便二次开发classroom-face-recognition/ ├── main.py # 主入口支持摄像头、视频、图片三种模式 ├── detector.py # YOLOv8人脸检测封装 ├── recognizer.py # ResNet50特征提取与比对 ├── face_db.py # 人脸向量库管理基于numpy存储 ├── alignment.py # 人脸对齐增强 ├── config.py # 路径、阈值、摄像头参数统一配置 ├── models/ │ ├── yolov8n-face.pt # YOLOv8人脸检测预训练权重 │ └── resnet50_arcface.pt # ResNet50识别预训练权重 ├── faces_db/ # 存放已知人员照片 └── data/ ├── test_video.mp4 # 测试视频 └── test_image.jpg # 测试图片detector.py和recognizer.py的职责边界很清楚detector只负责输出框recognizer只负责输出特征和相似度。face_db.py是一个极其轻量的向量管理工具本质就是一个numpy矩阵存向量配合pickle做持久化。如果你需要对接MySQL或者Redis做大规模管理只需要替换face_db.py成数据库实现即可外部接口保持add_face和query_face不变就行。3.3 快速启动指南这里给出一个最快的启动路径把学生或员工照片放到faces_db目录文件名用“姓名.jpg”格式命名每人1-3张不同角度照片。运行一次python build_db.py程序会扫描faces_db对每张照片做人脸检测、对齐、特征提取存入face_vectors.npy和face_names.npy两个文件。运行python main.py --source 00表示本地摄像头也可以换成视频文件路径或者RTSP流地址。整个流程五分钟内应该能跑通。如果你运行到某一步报错先检查依赖版本再检查模型文件路径和faces_db里面的照片格式这两个是最高频的问题来源。4. 训练自己的数据集与模型微调4.1 数据采集策略与标注规范如果你不想直接用我提供的预训练人脸检测权重想在自己教室场景下做进一步微调那数据采集就是第一个决定成败的环节。教室场景的特殊性在于人脸在画面中的分布非常集中而且距离摄像头远近差异很大。前排学生人脸可能占60x60像素最后一排可能只有20x20像素。我建议用摄像头连续录制不同时间段的教室视频分别覆盖上午逆光、下午顺光、傍晚灯光、课间活动、学生低头写字等状态。然后每隔5-10帧截取一帧保证画面差异性。总共收集800-1200张图像就可以起步包含3000-5000个人脸标注框。标注格式直接使用YOLO格式每个标注文件是txt文本一行对应一个人脸框。坐标格式如下0 0.456 0.382 0.105 0.123这五个数字分别代表类别ID0表示人脸、中心点x归一化坐标、中心点y归一化坐标、框宽归一化值、框高归一化值。归一化就是除以图像宽高。这一步可以用LabelImg或者X-AnyLabeling工具来做但标注的时候有一个重要技巧宁可框松一点也不要框太紧。人脸检测的输入图像有resize过程框太紧会导致关键点信息被裁掉影响后面的特征提取质量。4.2 YOLOv8训练参数与技巧数据准备好之后训练脚本如下yolo detect train dataclassroom_face.yaml modelyolov8n.pt epochs100 imgsz640 batch16 device0classroom_face.yaml文件需要正确配置数据集路径和类别数量path: ./dataset train: images/train val: images/val nc: 1 names: [face]训练过程中我特别建议关注三个参数。第一个是mosaic增强它在YOLOv8默认训练中是开启的把四张图拼成一张训练图。但教室场景人脸密集度高mosaic增强反而可能让人脸变得更小我实测把mosaic从默认的1.0降到0.5最后的mAP提升了1-2个百分点。第二个是lr0初始学习率官方默认是0.01如果发现损失曲线震荡不下降考虑降低到0.005。如果你用的是GTX 1660Ti这种级别显卡显存只有6GB不要强行上大batchbatch8加梯度累积两步效果类似batch16但不爆显存。第三个是patience参数默认100个epoch没提升就早停如果数据量小建议加大到200给小模型更多收敛空间。4.3 识别模型的人脸特征微调识别模型的训练属于相对进阶的部分。如果你面对的是固定班底、人数较少的场景用我提供的预训练特征提取器完全够。但如果人员变动频繁或者有大量相似长相的学生就需要用本校学生照片对模型做进一步微调。微调数据集准备方式很简单每人收集5-10张不同光照、不同角度、不同表情的照片。数据量不用很大几十个人每人8张对ResNet50做10个epoch的微调就能看到明显效果。微调时把最后一层改成对应人数的分类头用ArcFace损失训练。训练完成后保存去掉分类头的部分作为新的特征提取器。这里有个很多人踩过的坑微调之后一定要重新对所有班级成员照片做一次特征提取更新向量库。因为微调改变了特征空间分布旧的特征向量不做更新余弦相似度比对会出现系统性偏移识别率反而下降。5. 推理部署的完整流程与关键实现5.1 从训练权重到部署推理的完整链路训练或者拿到预训练权重之后部署推理并不是单纯torch.load然后forward那么简单。第一件事是输入预处理。YOLOv8的推理输入需要RGB格式、BGR通道逆序注意切换、归一化到0-1区间、resize到640x640同时像素值要从0-255线性缩放。这一步如果用OpenCV的cv2.imread读取图片得到的是BGR格式直接送进model前必须cv2.cvtColor(img, cv2.COLOR_BGR2RGB)转换。忘掉这一步颜色通道错乱会导致检测精度严重下降。推理的时候还应该注意一个分层抽帧策略对摄像头输入我习惯每2-3帧跑一次检测识别模块只处理检测出来的新增人脸框避免每帧重复计算相同人脸的相似度。实测下来这种策略能把整机推理帧率在原有基础上再提升将近一倍因为你把大量算力节省下来给了真正有变化的新画面。5.2 两张关键源码级别的实现细节第一处是检测结果如何过滤并保留正确的框。YOLOv8推理后返回的结果对象里boxes.cls是一个Tensor保存了每个框的类别索引。人脸检测模型里类别0对应人脸所以过滤逻辑我是这样写的results model(frame, verboseFalse) face_objects [o for o in results[0].boxes.cls if int(o) 0]注意这里有一个容易忽略的细节对results[0].boxes.cls做遍历时由于每个检测框本身按其顺序排列所以保留的索引顺序和全部框的原始顺序严格一致这样才能回头对应boxes.xyxy里的坐标。如果写成cls 0直接生成布尔mask再取索引逻辑上当然也可以但要多一重对齐处理不好容易索引错位。第二处是人脸图像送进识别模块前的对齐后处理。教室场景里学生低头、歪头很常见直接裁剪出来的脸是歪的特征提取精度急剧下降。我的alignment.py里用了OpenCV的仿射变换做粗略对齐核心是检测两只眼睛的位置按眼睛连线角度做旋转修正def align_face(face_img): eye_detector cv2.CascadeClassifier(haarcascade_eye.xml) gray cv2.cvtColor(face_img, cv2.COLOR_BGR2GRAY) eyes eye_detector.detectMultiScale(gray, 1.1, 5) if len(eyes) 2: eyes sorted(eyes, keylambda e: e[0]) x1, y1 eyes[0][0] eyes[0][2]//2, eyes[0][1] eyes[0][3]//2 x2, y2 eyes[-1][0] eyes[-1][2]//2, eyes[-1][1] eyes[-1][3]//2 angle math.degrees(math.atan2(y2 - y1, x2 - x1)) M cv2.getRotationMatrix2D((face_img.shape[1]//2, face_img.shape[0]//2), angle, 1.0) face_img cv2.warpAffine(face_img, M, (face_img.shape[1], face_img.shape[0])) return face_img这段代码的核心思想是检测到双眼中心坐标后计算连线与水平线的夹角再通过旋转矩阵把脸转正。如果检测不到眼睛比如低头太厉害就跳过对齐步骤直接用原图。宁可不对齐也不要强行转一个错误角度否则特征更乱。5.3 特征比对与阈值选择的实践经验特征提取后识别模块的核心逻辑是计算当前人脸向量与向量库中所有向量的余弦相似度。取最大相似度与预设阈值比较大于阈值就判定为对应身份小于等于阈值就判定为未知人员。我在config.py里默认设定的阈值是0.55。这个值的选定有讲究。我们这种人脸识别方案在LFW测试集上同类人脸相似度分布集中在0.65-0.85之间不同人脸的相似度分布集中在0.15-0.4之间。两个分布之间有明显的间隔阈值取0.55刚好落在安全区间。实际操作中建议你针对教室场景做一次阈值校准找10个学生各拍一张标准照加入向量库再各录一段20秒的视频做测试观察同一人的相似度最低值和不同人的最高相似度取中间值作为你的专属阈值。6. 性能调优与硬件部署经验6.1 算力花费实测对比很多人在评论区和社交媒体上问“这套东西需要GPU吗”我的回答分场景硬件性能表现适用场景Intel i5-12400纯CPUYOLOv8n推理约50ms/帧识别约63ms/人测试调试、低并发演示GTX 1660Ti 6GBYOLOv8n推理约10-20ms/帧识别约8ms/人教室小规模实时部署RTX 3060 12GB可同时跑检测识别且帧率保持30fps多路摄像头并发Jetson Orin Nano检测15ms识别12ms边缘盒子、一体化设备结论很明确如果你只是做实验验证想法CPU完全够用大不了把帧率降到个位数看看流程对不对。但你要真正部署到教室做到实时考勤GTX 1660Ti是底线这也是为什么我在热词里看到那么多人在关注GTX 1660Ti能不能跑YOLOv8实测下来是真的能跑而且跑得还不错。6.2 提高推理速度的几个有效手段如果你觉得现在的推理速度不够快我有几个经过实测的手段可以按顺序尝试。第一个是切分帧。把一帧图像按4:1比例缩小后再送进检测器。人脸检测对分辨率不像识别那么敏感我用960x540分辨率的输入跟原始1920x1080相比检测mAP只掉0.8%但推理时间下降了60%。不过这个手段要配合显存或者内存足够的前提因为即使输入缩小到540p识别模块的人脸裁剪仍然需要从原始分辨率画面取图否则小脸会被裁得模糊不清。第二个是检测结果缓存。由于教室摄像头固定不动画面中的人脸基本不会一帧之内瞬间移动到另一个很远的位置。利用上一帧的检测框做位置平滑预测在新一帧中扩大1.2倍范围搜索即可不需要全图重检测。这一步叫跟踪辅助检测配合简单的IOU匹配就能实现实测能把整体帧率从18fps提高到25fps以上。第三个是模型量化和TensorRT加速。PyTorch模型直接转TensorRT在RTX 3060上YOLOv8n的推理时间可以从12ms压到6ms左右。这一步对部署到Jetson边缘设备特别有用Orin Nano上量化后跑全套检测识别也能达到20fps以上。6.3 误检率与漏检率的平衡艺术实际部署中最让你崩溃的不是模型跑不动而是误报和漏报。我在教室场景里踩过最大的坑是前排学生一个大动作突然从画面边缘划过检测器会短暂产生一个高置信度的误检人脸框进而导致识别模块从空白区域提取出乱码特征误报一个“张三在座位”的记录。我的解决方案是引入时序投票机制只有连续3帧以上检测到同一人脸框且成功识别到同一个身份才算一次有效的考勤记录。单帧的误检会被自然过滤。漏检的补偿手段是提高检测置信度阈值到0.5以上同时开启YOLOv8的增强小目标检测能力把agnostic_nms设成True避免同一目标被多个框重复包围减少后面特征比对时的重复计算。需要强调的是实时推理的人脸识别在隐私和数据合规方面校园场景务必谨慎。正式部署一定要通过学校信息化部门的评估保证数据只在局域网内部流转不联网、不存储原始画面只保留识别结果记录。这是项目能落地而非停留在实验阶段的重要前提。7. 常见问题与避坑指南7.1 高频问题快查表现象原因解决方案检测不到任何人脸使用了COCO预训练权重而非人脸专用权重换成yolov8n-face.pt识别准确率低到无法使用未微调ResNet50或忘记对齐直接提特征加载resnet50_arcface.pt确认对齐流程已跑相似度阈值内误报严重特征库照片太少或角度单一每人至少3张照片覆盖左右侧脸视频推理很卡每帧都跑全图识别检测结果缓存分层抽帧识别结果忽高忽低检测框抖动裁剪区域不稳定加卡尔曼滤波或IOU跟踪平滑新增人员需重新训练吗不需要走face_db.py新增向量即可7.2 容易被忽视的数据与代码细节先说一个很多人都会踩的细节使用pathlib.Path.iterdir()遍历faces_db目录时macOS会自动生成.DS_Store文件Windows不会有这个问题但macOS上如果你不加过滤程序会把这种隐藏文件也当图片读取直接报错。我建议遍历时强制过滤掉以.开头的文件避免这种系统性错误for img_path in Path(faces_db).glob(*): if img_path.name.startswith(.): continue face_vec extract_feature(img_path) ...再有一个涉及数据安全的点numpy加载特征向量文件时文件是pickle序列化存储的。如果不同机器之间传输这些文件一定要用相同版本的Python与numpy否则反序列化会识别不了数据格式。7.3 实战中调整效果的经验分享在实践过程中我发现教室里最影响识别效果的不是模型本身而是摄像头画质和安装位置。许多教室的旧摄像头只有720p分辨率坐在最后一排的人脸可能只有十几像素。这种情况下什么模型都救不了必须从硬件层面装带宽动态功能的高清摄像头或者调整安装高度和角度让人脸尽量占据更多画面。另一个实用技巧是晚自习和白天用两套阈值。白天自然光充足人脸特征提取质量高相似度阈值可以设高一些比如0.6。夜晚日光灯下色彩偏黄且对比度低特征质量下降阈值可以调低到0.5。这个动态调整策略能让白天少误报、晚上少漏报整体考勤准确率能提升3-5个百分点。如果你在用GTX 1660Ti部署时发现显存不够尝试把YOLOv8的imgsz从640降低到480。这样输入分辨率小了人脸框裁剪后识别质量会有一点下降但整体帧率获得的提升通常更值得。尤其是多人同时入镜的场景高帧率比单帧高精度更能保证整体识别效果。8. 项目的后续扩展方向这套脚手架搭建好之后扩展非常方便。很多人问能不能对接人脸识别门禁机答案是完全可以。门禁机本质上是嵌入式Linux设备你只需要把视频流接入方案调整为从门禁机拉取RTSP流识别结果通过HTTP回调写入门禁系统开放的API接口。嵌入式方向的部署建议用RK3588这块芯片。RK3588的NPU对YOLOv8有专门的RKNN模型优化支持我实测在RK3588上单路720p视频流检测识别整体能跑到30fps而且整板功耗不到10瓦非常适合装进教室墙壁上的小盒子里。转换过程就是对检测和识别两个模型分别做量化导出用RKNN Toolkit操作官方资料很全照着走一遍就能跑通。前端展示方面可以做一个简单的Web页面用WebSocket把识别结果推送到浏览器实时显示每个学生的进出状态和考勤记录。如果你用的是uni-app或者H5这类跨端方案后端只需要暴露一个HTTP接口返回识别记录即可整个链路很清晰。我还见过有同行在这个架构上加了课堂专注度分析根据头部位姿估计学生是否低头或趴桌。因为YOLOv8的人脸检测框本身就有坐标信息配合头部姿态估计模型就能进一步分析学生的抬头率、专注时长分布。这些都是同一个视频流输入模块化架构让你不需要改动底层识别链路只需要在上层加一个分析模块就行。如果你拿到的是一段录像而非实时摄像头流也可以用--source path/to/video.mp4的方式离线处理程序会把每一帧的识别结果和置信度写入CSV日志方便后续统计分析。批处理模式下的速度和实时模式相当视频里的每一张人脸都会得到完整处理不会因为长时间离座而漏记。本文还有配套的精品资源点击获取
返回列表