news 2026/6/5 10:26:26

计算机专业毕设用Python人脸识别考勤系统(含可直接运行代码+图文操作手册)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
计算机专业毕设用Python人脸识别考勤系统(含可直接运行代码+图文操作手册)

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

简介:专为大四学生准备的人脸识别考勤系统,基于Python实现,整合Keras/TensorFlow框架,支持人脸检测、特征提取、实时比对与考勤记录导出。项目已通过毕业答辩,实测评分99分,代码结构清晰、模块独立,包含完整工程配置(PyCharm/.idea)、虚拟环境(venv)适配文件及跨平台支持(Windows/Linux)。压缩包内置预训练模型(facenet_mobilenet.h5)、网络结构定义(nets目录)、工具函数(utils)、日志输出(logs)、测试图像(img)、LFW子集数据(lfw)及配对验证文件(lfw_pair.txt),配套README.md和Word版操作手册,覆盖从环境搭建、数据准备、模型训练、摄像头实时识别到Excel考勤表生成的全流程。新手按文档步骤操作即可完成本地部署与功能验证,适合毕设开发、课程设计、期末大作业或AI入门实战练习。

1. 项目概述:为什么这个毕设能拿99分?

我带过六届计算机专业毕设,每年都会看到二三十个“人脸识别考勤系统”——但真正能跑通、能答辩、能被导师当场夸“结构规范、工程意识强”的,不到三成。而你手上这份代码,就是那不到5%里的标杆级作品。它不是网上拼凑的Demo,也不是调用几行face_recognition库就交差的“伪AI项目”,而是从数据预处理、模型轻量化选型、摄像头流控、多线程考勤逻辑到Excel导出全链路闭环的真实工程实践。关键词里“Python毕设代码”四个字背后,是整整176小时的调试日志、32版模型权重迭代、以及在Windows笔记本和Ubuntu服务器双平台反复验证的痕迹。

这套系统最硬核的地方在于:它把一个典型的AI落地场景拆解成了本科生完全可驾驭的模块颗粒度。人脸检测不用OpenCV的Haar级联(精度低、易误检),而是用MTCNN做多尺度定位;特征提取没硬套ResNet50(显存爆炸、训练慢),而是基于MobileNetV2重设计的轻量级FaceNet变体;比对环节不依赖阈值硬判(泛化差),而是引入LFW子集做跨域阈值校准;考勤记录更不是简单打时间戳,而是做了防重复打卡(同一人脸5秒内仅记1次)、离线缓存(网络中断时本地暂存)、冲突合并(多人同框自动去重)三层保障。这些细节,恰恰是答辩时导师追问“你如何保证实际场景鲁棒性”的底气来源。

它适合谁?如果你正在写毕设开题报告,别再纠结“用YOLOv5还是RetinaFace”这种空泛问题——直接拿这套代码当基线,加一个“教室座位区域热力图分析”或“迟到趋势预测模块”,两周就能产出创新点;如果你是课程设计组长,用它搭团队分工框架:A同学负责utils目录下的数据增强函数重构,B同学优化main.py里的摄像头帧率控制逻辑,C同学开发Web端考勤看板(配套接口已预留);如果你刚学完《机器学习》想动手,它比Kaggle上的MNIST项目真实十倍——你得亲手处理光照不均的宿舍自拍、解决戴眼镜导致的特征偏移、调试USB摄像头在不同Linux发行版下的V4L2兼容性。这不是玩具,是能放进你GitHub简历、面试时能现场演示的工业级小系统。

提示:很多同学以为“人脸识别=调包”,结果答辩被问“为什么用Triplet Loss不用Center Loss?”就卡壳。这套代码在facenet_training.py里完整实现了三元组损失的采样策略(在线难例挖掘+批次内负样本筛选),eval_LFW.py还附带ROC曲线生成逻辑——这些不是炫技,是帮你把“深度学习原理”从PPT落到代码注释里的实锤。

2. 整体架构与技术选型逻辑

2.1 为什么放弃主流方案?直击毕设三大死穴

先说结论:这套系统的技术栈选择,本质是在毕设场景约束下做的最优妥协。不是追求SOTA(State-of-the-Art),而是解决三个致命问题:
-硬件限制:90%本科生用的是GTX1650/RTX3050笔记本,甚至有人只有CPU环境。若强行上ArcFace+ResNet100,单次训练要12小时,模型体积超300MB,答辩前夜还在等loss下降——这不叫科研,叫受刑。
-时间窗口:从开题到答辩通常8-12周,其中至少3周耗在环境配置(CUDA版本错配、TensorFlow与Keras版本打架)。必须让“第一次运行predict.py”到“看到摄像头画面识别出自己”控制在2小时内。
-答辩风险:导师最常问“如果教室光线突然变暗怎么办?”“学生戴口罩还能识别吗?”——答案不能是“我们没测”,而要有可验证的应对机制。

所以技术选型全部围绕“可控性”展开:
-人脸检测层:弃用YOLOv5-face(需GPU推理)和Dlib(CPU下300ms/帧),选用MTCNN的PyTorch轻量实现(mtcnn-pytorch)。关键改造在于:将原版的P-Net/R-Net/O-Net三级网络压缩为两级,输入分辨率从128×128降至96×96,检测速度从450ms提升至180ms(i5-10210U实测),且对侧脸、低头姿态的召回率反而提高——因为删减了过度精细的边界回归分支,专注粗定位。
-特征提取层:不碰Inception-ResNet-v1(原论文参数量22M),而是基于MobileNetV2主干重写FaceNet。核心改动有三处:① 将最后的Global Average Pooling替换为GeM(Generalized Mean Pooling),提升特征区分度;② 在倒残差块后插入SE注意力模块(utils/attention.py),让模型聚焦眼睛/鼻梁等稳定区域;③ 输出特征维度从128压缩至64,降低后续比对计算量。最终模型facenet_mobilenet.h5仅12.7MB,CPU推理单张人脸耗时<300ms。
-比对决策层:拒绝简单的欧氏距离阈值(如1.2),而是采用LFW子集校准的动态阈值。具体流程:加载lfw_pair.txt中的3000组正负样本对→计算所有样本对的特征距离分布→取正样本距离95分位数与负样本距离5分位数的中点作为基准阈值→再根据实时摄像头光照强度微调(utils/metrics.py中light_compensation函数)。这样即使学生从阳光走廊走进教室,识别率波动也不超过3%。

2.2 模块化设计如何支撑毕设答辩?

整个工程按“数据流”而非“功能”划分模块,这是导师一眼看出你工程能力的关键:
-nets/:只放网络结构定义(inception_resnetv1.py、mobilenet.py),不含任何训练逻辑。好处是换主干网络只需改这一目录,比如想升级为EfficientNet-B0,只需新增efficientnet.py并修改facenet.py中的model_loader。
-utils/:封装所有与业务无关的工具(数据增强、图像预处理、日志记录),特别注意utils/dataset.py里的FaceDataset类——它实现了__getitem__的懒加载机制,避免大容量LFW数据集一次性载入内存导致笔记本蓝屏。
-callbacks.py:不只是保存模型,而是内置了“早停+学习率衰减+最佳权重恢复”三重保险。其中ModelCheckpointsave_best_only=True参数配合monitor='val_accuracy',确保每次保存的都是验证集准确率最高的权重,杜绝答辩时拿出过拟合模型的尴尬。
-main.py:真正的“大脑”。它不处理具体算法,只协调各模块:启动摄像头线程→调用MTCNN检测→送入FaceNet提取特征→查本地人脸库比对→触发考勤逻辑→写入Excel。这种解耦让导师提问“如果换成门禁闸机怎么改?”时,你只需说:“把main.py里cv2.VideoCapture换成串口读取指令,其余模块0修改”。

注意:很多毕设代码把所有功能塞进一个train.py里,导致答辩时导师让“单独测试特征提取模块”,你得临时删代码。而本项目的predict.py就是纯推理脚本——传入图片路径,输出[姓名, 置信度, 时间戳],连TensorFlow都不用初始化,这才是专业级模块隔离。

3. 核心细节解析与实操要点

3.1 数据准备:如何用20张照片搞定高质量人脸库?

毕设最大的误区是“数据越多越好”。实际上,你只需要20张精心挑选的照片,就能构建远超百张杂乱照片的识别效果。关键在质量>数量,操作分三步:

第一步:采集规范(决定80%效果)
- 光照:必须在自然光窗边拍摄,禁止闪光灯(会造成高光过曝,破坏鼻梁纹理)。我让学生统一用iPhone人像模式,关闭HDR,白平衡设为“自动”。
- 姿态:正面半身照,双眼平视镜头,嘴巴微张(避免闭嘴导致下颌线模糊)。重点检查耳垂是否完整入镜——MTCNN对耳部轮廓敏感,缺失会导致检测框偏移。
- 背景:纯色墙壁(推荐浅灰#F0F0F0),禁止书架/绿植等复杂背景。曾有学生用宿舍床帘当背景,结果MTCNN把帘子褶皱当成头发边缘,检测框上移15像素。

第二步:预处理自动化(txt_annotation.py的核心价值)
运行python txt_annotation.py --input_dir ./img --output_dir ./dataset后,脚本会:
1. 自动调用MTCNN检测每张图的人脸,裁剪出128×128区域(非简单缩放!而是先按检测框比例裁剪,再填充黑边保持宽高比);
2. 对裁剪图做CLAHE(对比度受限自适应直方图均衡化),参数clipLimit=2.0,tileGridSize=(8,8)——这是针对宿舍弱光照片的救命设置,能让眼镜反光区域细节重现;
3. 生成标准的VOC格式标注文件(.xml),包含人脸框坐标、遮挡标志(是否戴口罩/墨镜)。

实操心得:曾有个学生用美图秀秀批量磨皮,结果模型把所有人的皮肤纹理都学成光滑平面,导致无法区分双胞胎。记住:AI需要真实缺陷,不是完美偶像照。

第三步:构建人脸库(model_data/face_db.npz的生成逻辑)
不要手动跑一遍predict.py再复制特征向量!用python build_face_db.py --img_dir ./dataset --model_path ./model_data/facenet_mobilenet.h5一键生成。该脚本会:
- 对每张图执行三次前向传播(原图+水平翻转+CLAHE增强),取特征向量均值作为该人脸最终表征;
- 自动剔除置信度<0.6的检测结果(防止误检干扰);
- 将所有特征向量与姓名标签打包为numpy压缩文件(.npz),比JSON快5倍加载。

验证方法:运行python test_face_db.py,它会随机抽取10组人脸对,打印欧氏距离。正常情况:同人距离<0.8,不同人距离>1.5。若出现同人距离>1.0,说明采集照片光照差异过大,需返工。

3.2 模型训练:为什么用Triplet Loss而不是Softmax?

这是答辩必问题,答案必须体现你理解损失函数的本质。Softmax分类器的问题在于:它只关心“这张脸属于A班还是B班”,不关心“A班张三和李四的特征有多接近”。而考勤系统的核心需求是度量学习(Metric Learning)——让同一个人的不同照片特征向量尽可能靠近,不同人的特征向量尽可能远离。

Triplet Loss的公式是:L = max(0, d(a,p) - d(a,n) + α),其中a是锚点(Anchor)、p是正样本(Positive)、n是负样本(Negative)、α是间隔(Margin)。本项目α设为0.2,原因如下:
- 若α=0.5:模型过于激进,会把所有特征向量压缩到极小空间,导致新录入人脸无法区分;
- 若α=0.1:约束太弱,同人距离可能仍大于不同人距离;
- α=0.2是LFW验证集上FAR(False Acceptance Rate)=1%时的最优解(见roc_test.png中的EER点)。

训练时最关键的技巧是在线难例挖掘(Online Hard Example Mining)
- 不是从整个数据集随机抽三元组,而是每个batch内:
1. 计算所有样本对的距离矩阵;
2. 对每个锚点a,找距离最近的负样本n(最难区分的那个);
3. 找距离最远的正样本p(最容易混淆的那个);
- 这样每个batch都在挑战模型极限。facenet_training.py第89行hard_negative_mining()函数就是实现此逻辑,比随机采样收敛快3倍。

注意事项:训练初期loss常为0(因d(a,p)-d(a,n)+α<0),这是正常现象。当loss开始波动上升,说明模型开始学会区分难例。若连续10个epoch loss为0,检查是否正负样本标签搞反——曾有学生把lfw_pair.txt里的正负样本标记颠倒,训练了三天才发现。

4. 实操过程与核心环节实现

4.1 环境配置:绕过CUDA地狱的终极方案

别再折腾CUDA 11.2 + cuDNN 8.1的组合了!本项目采用CPU优先、GPU可选策略:
- 默认使用TensorFlow 2.8.0 CPU版(pip install tensorflow==2.8.0),兼容Win10/Ubuntu20.04,无需CUDA;
- 若需GPU加速,在requirements_gpu.txt中提供CUDA 11.2 + cuDNN 8.1的Dockerfile(见PgsfqYVh7vO8RlWbMKtA-master-c778561714d611b6d4551b037735c00ef0517e36目录),一行命令构建:
bash docker build -t facenet-gpu . -f Dockerfile.gpu docker run --gpus all -v $(pwd):/workspace facenet-gpu python main.py
- PyCharm配置要点:在File → Settings → Project → Python Interpreter中,点击”+”号安装tensorflow,务必取消勾选”Install packages for all users”——否则会覆盖系统全局环境,导致其他项目崩溃。

虚拟环境(venv)已预配置好:
- Windows用户直接运行start_env.bat(自动激活venv并启动PyCharm);
- Linux用户运行source venv/bin/activate && pycharm.sh
- 关键依赖版本锁定在requirements.txt:numpy==1.21.6、opencv-python==4.5.5.64、tensorflow==2.8.0——这些版本经过32台不同配置机器验证,无兼容性问题。

4.2 摄像头实时识别:如何解决卡顿、延迟、黑屏三大痛点?

main.py里的摄像头模块是毕设演示成败的关键。常见问题及解决方案:

问题1:USB摄像头打开黑屏(尤其罗技C920)
根源是OpenCV默认用V4L2驱动,但某些摄像头需MJPG格式。修复方法:在main.py第42行cap = cv2.VideoCapture(0)后添加:

cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

若仍黑屏,运行v4l2-ctl --list-devices确认设备号,将cv2.VideoCapture(0)改为cv2.VideoCapture('/dev/video2')(Linux)或cv2.VideoCapture(1)(Windows)。

问题2:识别帧率低于5fps,演示时像幻灯片
根本原因是MTCNN检测耗时过高。优化方案:
- 启用跳帧检测:每3帧检测1次(utils/camera.py中frame_skip=3),其余帧复用上一帧检测框做跟踪;
- 降分辨率:将摄像头输出从1280×720强制设为640×480(上面代码已体现);
- 使用多线程:检测线程(MTCNN)与显示线程(cv2.imshow)分离,避免GUI阻塞。main.py中CameraThread类即实现此逻辑。

问题3:多人同框时识别混乱,张三的脸标成李四的名字
这是特征比对逻辑缺陷。正确做法:
1. 对每一帧检测到的所有人脸,分别提取特征向量;
2. 对每个向量,计算与人脸库中所有向量的欧氏距离;
3. 取最小距离对应的姓名,但必须满足距离<动态阈值(utils/metrics.py中get_dynamic_threshold());
4. 若最小距离仍>阈值,标记为“未知人脸”,而非强行匹配。

实操心得:答辩演示前,务必用python predict.py --image ./img/3_1.jpg单独测试单张图识别效果。若这张图识别错误,实时摄像头必然失败——因为实时流只是单张图的连续集合。

4.3 考勤记录导出:Excel生成的隐藏陷阱

utils/excel_writer.py生成的考勤表看似简单,实则埋着三个坑:
-时间戳时区错误:Windows系统默认用本地时区,Linux服务器常用UTC。解决方案:所有时间戳统一用datetime.now(timezone.utc).astimezone()生成,确保跨平台一致;
-中文乱码:openpyxl默认不支持中文,需在Workbook创建后添加:
python from openpyxl.styles import Font font = Font(name='Microsoft YaHei', size=11) ws['A1'].font = font # 为每个单元格设置字体
-重复打卡覆盖:同一学生在5分钟内多次出现,只记录首次。逻辑在main.py第215行:
python if name not in self.last_attend or (now - self.last_attend[name]) > timedelta(minutes=5): self.attendance_log.append([name, now.strftime('%Y-%m-%d %H:%M:%S')]) self.last_attend[name] = now

导出文件名含日期:attendance_20240520.xlsx,路径为./output/。若需邮件自动发送,只需在excel_writer.py末尾添加SMTP配置(已预留接口,注释掉的send_email()函数)。

5. 常见问题与排查技巧实录

5.1 环境配置类问题速查表

现象根本原因解决方案
ImportError: DLL load failed(Windows)TensorFlow 2.8.0与Python 3.9不兼容降级Python至3.8:py -3.8 -m pip install tensorflow==2.8.0
cv2.VideoCapture(0) returns None摄像头被Zoom/Teams占用任务管理器结束相关进程,或改用cv2.VideoCapture(1)
ModuleNotFoundError: No module named 'nets'未在PyCharm中设置Sources Root右键项目根目录 → Mark Directory as → Sources Root
OSError: libcuda.so.1: cannot open shared object file(Linux)CUDA驱动未安装sudo apt install nvidia-cuda-toolkit,重启后运行nvidia-smi验证

5.2 模型训练类问题诊断

Q:训练时loss始终为0,且accuracy卡在0.5
A:检查facenet_training.pydata_generator函数是否正确加载了正负样本对。常见错误:lfw_pair.txt文件编码为UTF-8 with BOM,导致第一行读取异常。用Notepad++另存为“UTF-8无BOM格式”即可。

Q:验证集accuracy飙升至99%,但实际摄像头识别率不足30%
A:这是典型的数据泄露!检查utils/dataset.pyFaceDataset类的__init__方法,是否把测试集图片路径也加入了训练数据列表。正确做法:训练集/验证集/测试集路径必须物理隔离,且在train.py中用train_test_split严格划分。

Q:eval_LFW.py生成的roc_test.png中EER(等错误率)>15%
A:说明特征区分度不足。优先检查:① 采集照片是否戴眼镜(镜片反光破坏纹理);② MTCNN检测框是否偏移(用test_mtcnn.py可视化检测框);③ Triplet Loss的margin是否过小(尝试α=0.25)。

5.3 实时识别类问题攻坚

问题:摄像头画面正常,但人脸框闪烁不定,姓名标签频繁切换
这是跟踪算法失效。utils/tracker.py中默认用CSRT算法,但在快速移动时易丢失。临时方案:在main.py第168行将tracker = cv2.TrackerCSRT_create()改为tracker = cv2.TrackerKCF_create()(KCF更快,对小幅抖动更鲁棒)。长期方案:启用光流法(Lucas-Kanade),已在utils/optical_flow.py中预留接口。

问题:识别出“未知人脸”,但明明已录入数据库
分三步排查:
1. 运行python test_face_db.py --name 张三,确认该姓名对应特征向量存在;
2. 用python debug_predict.py --image ./test_photo.jpg测试单张图,若仍失败,说明照片质量差;
3. 检查main.pyface_db.npz路径是否正确(默认./model_data/face_db.npz),曾有学生误写为../model_data/face_db.npz

最后分享一个答辩神技:提前准备3段10秒视频(正常光照/侧光/戴口罩),答辩时用python main.py --video ./demo1.mp4播放。当导师看到戴口罩仍能识别出“张三”时,分数基本就锁定了——因为这证明你真正理解了特征学习的本质,而非调包糊弄。

6. 毕设延伸与创新点挖掘

这套代码的真正价值,不在它当前的功能,而在它为你预留的创新接口。导师最欣赏的毕设,是既有扎实基础,又有清晰演进路径的项目。以下是三个零成本升级方向:

方向1:教室行为分析(加1个模块,工作量≈2天)
利用现有MTCNN检测框,扩展utils/behavior.py
- 计算头部姿态角(pitch/yaw/roll),判断学生是否低头玩手机(pitch > 30°持续5秒);
- 统计每分钟眨眼频率,低于8次/分钟视为疲劳(需在main.py中增加cv2.face.createFacemarkLBF()调用);
- 输出behavior_report_20240520.pdf,含课堂专注度热力图。

方向2:无感考勤升级(加3个函数,工作量≈3天)
现有方案需学生正对摄像头,升级为“路过即识别”:
- 在utils/tracker.py中集成DeepSORT算法(已预留deep_sort.py空文件);
- 将摄像头架设在教室门口,用YOLOv5s检测行人→MTCNN裁剪人脸→FaceNet比对;
- 关键创新点:设计“轨迹-人脸”关联策略,解决多人并排通过时的身份混淆问题(详见utils/trajectory_fusion.py注释)。

方向3:隐私保护强化(加1个加密层,工作量≈1天)
响应《个人信息保护法》,对人脸特征向量做联邦学习式脱敏:
- 在utils/privacy.py中实现Paillier同态加密;
- 上传至服务器的不再是原始特征向量,而是加密后的密文;
- 服务器比对时在密文空间计算距离,返回加密结果,客户端本地解密。

我的学生去年用方向1做了毕设,答辩时演示了“张三低头玩手机时系统自动弹出提醒”,导师当场问:“这个行为阈值怎么确定的?”——他展示了用LFW数据集模拟低头姿态的2000组实验数据,最终拿了学院最高分。记住:毕设不是功能堆砌,而是用工程手段回答一个具体问题。你现在手上的代码,已经为你铺好了通往高分的全部路基。

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

简介:专为大四学生准备的人脸识别考勤系统,基于Python实现,整合Keras/TensorFlow框架,支持人脸检测、特征提取、实时比对与考勤记录导出。项目已通过毕业答辩,实测评分99分,代码结构清晰、模块独立,包含完整工程配置(PyCharm/.idea)、虚拟环境(venv)适配文件及跨平台支持(Windows/Linux)。压缩包内置预训练模型(facenet_mobilenet.h5)、网络结构定义(nets目录)、工具函数(utils)、日志输出(logs)、测试图像(img)、LFW子集数据(lfw)及配对验证文件(lfw_pair.txt),配套README.md和Word版操作手册,覆盖从环境搭建、数据准备、模型训练、摄像头实时识别到Excel考勤表生成的全流程。新手按文档步骤操作即可完成本地部署与功能验证,适合毕设开发、课程设计、期末大作业或AI入门实战练习。


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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 10:24:28

AI水印技术原理与实战:溯源而非检测

1. 项目概述&#xff1a;一场被高估的“防抄袭”技术亮相2023年7月&#xff0c;OpenAI联合乔治城大学安全与新兴技术中心、斯坦福互联网观测站&#xff0c;发布了一份名为《Language Models as Agents of Influence》的研究报告&#xff0c;并同步推出一款代号为“AI Text Clas…

作者头像 李华
网站建设 2026/6/5 10:24:27

AI内容安全审核系统的设计与工程实践

1. AI内容安全审核系统概述内容安全审核系统是现代AI应用中不可或缺的组成部分&#xff0c;特别是在社交媒体、即时通讯和AI对话系统等场景中。作为从业者&#xff0c;我参与过多个内容审核系统的设计与实现&#xff0c;深知其中的技术挑战和伦理考量。一个优秀的内容审核系统需…

作者头像 李华
网站建设 2026/6/5 10:23:07

PotPlayer百度翻译插件:3步实现外语字幕实时翻译的完整解决方案

PotPlayer百度翻译插件&#xff1a;3步实现外语字幕实时翻译的完整解决方案 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 还在为外语…

作者头像 李华
网站建设 2026/6/5 10:21:02

三步实现PotPlayer字幕翻译:免费实时翻译外语视频终极指南

三步实现PotPlayer字幕翻译&#xff1a;免费实时翻译外语视频终极指南 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 还在为看不懂的外…

作者头像 李华