资讯动态

Windows下Python 3.7安装Dlib 19.17.0及人脸识别全流程实战

发布时间:2026/9/3 5:11:33 来源:尧图企业网站定制
简介本资源是一套面向Python初学者与人工智能课程设计者的Windows平台人脸识别实践方案聚焦dlib库在人脸检测、关键点定位与特征向量提取中的典型应用。压缩包共含多个核心文件以Python源码.py、预编译dlib二进制库.whl或.dll依赖及配套说明文档为主整体大小为7.26MB结构简洁开箱即用。已有5746人下载学习广泛用于高校计算机视觉实验、AI课程大作业及小型门禁/考勤系统原型开发。读者可直接部署运行完整识别流程从HOG或深度学习模型的人脸检测到68个面部特征点精确定位再到基于欧氏距离的比对识别同时获得Python 3.7环境下dlib-19.17.0-win_amd64的稳定适配版本规避编译难题并通过代码注释与模块划分理解各环节技术逻辑显著降低入门门槛。1. 项目背景与核心需求为什么是Dlib 19.17.0 Python 3.7如果你在Windows 64位系统上尝试用Python搭建一个人脸识别相关的项目无论是做门禁模拟、表情分析还是简单的活体检测那么你大概率会碰到一个绕不开的“拦路虎”Dlib库的安装。这个标题里提到的dlib-19.17.0-cp37-cp37m-win_amd64.zip不是一个普通的压缩包它几乎是Windows平台上Python 3.7环境进行人脸识别开发的“官方救星包”。很多新手甚至一些有经验的开发者都曾在这个环节上耗费数小时甚至数天时间。为什么Dlib这么特殊因为它是一个用C编写的、高度优化的机器学习工具包其核心的计算机视觉和机器学习算法尤其是人脸检测和对齐的HOG和CNN模型都依赖于底层的C编译和数学库如BLAS、LAPACK。在Linux或macOS上通过包管理器如apt-get, brew可以相对轻松地安装这些依赖并编译Dlib。但在Windows上缺少一个统一的C构建环境和科学计算库导致直接使用pip install dlib几乎总是以失败告终错误信息通常是关于CMake、Visual C Build Tools或者找不到Boost.Python。于是社区里的大神们比如著名的Davis KingDlib的作者以及一些贡献者会预先针对特定的Python版本和Windows架构将Dlib及其所有复杂的C依赖编译好打包成.whl文件Wheel格式。dlib-19.17.0-cp37-cp37m-win_amd64.zip这个文件名就包含了所有关键信息dlib-19.17.0: 库的版本号。19.17.0是一个比较经典且稳定的版本许多成熟的项目都基于此版本开发。cp37: 这表示它适用于CPython 3.7。cp代表CPython37代表3.7版本。Python版本必须严格匹配cp38的包无法在Python 3.7上使用反之亦然。cp37m: 这个m标志意味着该Python构建版本启用了pymalloc并具有调试符号通常指在Windows上使用--with-pydebug编译的版本。对于从python.org下载的官方Windows Python 3.7安装程序通常对应的就是cp37mABI标签。这是确保兼容性的关键细节。win_amd64: 这明确指定了平台是64位的Windows。amd64是x86-64架构的另一种称呼涵盖了Intel和AMD的64位处理器。所以这个压缩包的本质是一个预编译的二进制Wheel文件。它的存在就是为了让Windows用户能够绕过令人头疼的编译过程直接安装一个“开箱即用”的Dlib。接下来我将详细拆解如何正确使用它并基于此构建一个基础但完整的人脸识别流程。2. 环境准备与Dlib安装避开所有常见陷阱在开始写代码之前一个干净、匹配的环境是成功的一半。很多问题都源于环境配置的疏忽。2.1 Python环境与包管理器的选择首先确保你的系统是Windows 64位。在“此电脑”上右键选择“属性”可以查看系统类型。对于Python我强烈建议使用Python 3.7.x的官方安装程序。虽然Anaconda也可以但预编译的cp37mwheel有时与Anaconda的环境存在细微的ABI不兼容风险。从python.org下载Windows x86-64 executable installer是最稳妥的选择。安装时务必勾选“Add Python 3.7 to PATH”这能避免后续在命令行中频繁输入完整路径的麻烦。安装完成后打开命令提示符CMD或 PowerShell输入python --version和pip --version确认版本。你的输出应该类似于Python 3.7.13和pip 22.x.x from ...。这里有一个关键点如果你的系统里安装了多个Python版本比如同时有3.8和3.7你需要确保在命令行中调用的python和pip命令指向的是3.7版本。可以通过where python命令查看所有可执行文件的位置排在最前面的就是当前终端会调用的那个。如果不对你可能需要使用完整的路径如C:\Python37\python.exe或者使用Python的虚拟环境。2.2 获取与安装预编译的Dlib Wheel文件标题中的.zip文件通常需要你从可靠的来源手动下载。一个著名的来源是 Christoph Gohlke 维护的 Unofficial Windows Binaries for Python Extension Packages 页面搜索即可找到。在这个页面上找到Dlib部分下载对应cp37和win_amd64的.whl文件。有时下载下来就是.whl有时可能是.zip压缩了.whl文件解压即可。假设你下载的文件名为dlib-19.17.0-cp37-cp37m-win_amd64.whl并将其放在D:\Downloads目录下。安装步骤打开命令提示符CMD强烈建议以管理员身份运行尤其是如果你将Python安装到了系统目录如C:\Program Files。这可以避免权限错误。使用pip直接安装这个wheel文件pip install D:\Downloads\dlib-19.17.0-cp37-cp37m-win_amd64.whl或者如果你已经将终端导航到文件所在目录cd D:\Downloads pip install dlib-19.17.0-cp37-cp37m-win_amd64.whl安装过程的核心原理与避坑点pip install一个本地的.whl文件其过程就是解压这个预编译包将其中的二进制文件.pyd文件即Windows上的Python C扩展和Python模块复制到你的Python安装目录的site-packages中。这个过程不涉及任何编译因此速度极快成败关键在于版本匹配。常见错误1... is not a supported wheel on this platform.这几乎100%是因为版本不匹配。请再次核对Python是否是3.7系统是否是64位文件名中的cp37m和win_amd64是否与你的环境一致从python.org安装的官方Python 3.7通常就是cp37m。常见错误2权限拒绝Permission denied。请以管理员身份运行CMD。如果问题依旧可能是因为你的Python安装在受保护的目录或者当前用户没有写入权限。可以尝试使用--user标志安装到用户目录pip install --user D:\...\dlib-19.17.0...whl。验证安装安装完成后在Python交互环境中测试导入不报错即成功。python -c import dlib; print(dlib.__version__)应该输出19.17.0。2.3 安装配套的OpenCVDlib负责核心的人脸检测、特征点定位和模型推理但图像的读取、显示、预处理等操作我们通常依赖OpenCVOpen Source Computer Vision Library。在Python中它叫opencv-python。安装非常简单因为OpenCV提供了官方的预编译Wheelpip install opencv-python这条命令会安装OpenCV的主模块。如果你还需要额外的贡献模块如SIFT、SURF等专利算法或深度神经网络模块DNN可以安装opencv-contrib-python但大多数基础人脸识别应用opencv-python足够了。注意OpenCV和Dlib对图像数据的存储格式NumPy数组有高度兼容性但它们默认的通道顺序不同OpenCV使用BGR顺序而Dlib和大多数其他图像处理库如Matplotlib使用RGB。这是一个经典的“坑”。在使用Dlib处理从OpenCV读取的图像前通常需要转换rgb_image cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB)。3. 人脸识别流程的核心四步从图像到特征环境就绪后我们来拆解一个标准的人脸识别系统如门禁机背后的核心流程。它远不止是“检测到一张脸”而是一个包含多个环节的流水线。3.1 第一步人脸检测Face Detection这是所有后续工作的基础。目标是在一张图片中找到所有人脸的位置用矩形框表示。Dlib在此提供了两种主流算法1. HOG方向梯度直方图结合线性分类器与图像金字塔这是Dlib最常用、速度较快且无需GPU的方法。dlib.get_frontal_face_detector()返回的就是这个检测器。原理它计算图像的梯度方向形成特征描述子HOG特征然后使用一个预先训练好的线性SVM分类器来判断某个滑动窗口内是否包含人脸。为了检测不同大小的人脸它会构建一个图像金字塔不断缩放原图在每一层金字塔上进行滑动窗口检测。特点对正面和接近正面的人脸检测效果很好速度极快但对于侧脸、大角度旋转或严重遮挡的人脸效果会下降。代码示例import dlib import cv2 # 初始化检测器 detector dlib.get_frontal_face_detector() # 读取图片并转换颜色通道 image cv2.imread(group_photo.jpg) rgb_image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 执行检测。第二个参数 1 是上采样upsample次数。 # 上采样可以放大图像有助于检测更小的人脸但会增加计算量。 dets detector(rgb_image, 1) print(f检测到 {len(dets)} 张人脸。) # 在原图BGR格式上绘制矩形框 for i, d in enumerate(dets): left, top, right, bottom d.left(), d.top(), d.right(), d.bottom() cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2) cv2.putText(image, fFace {i1}, (left, top-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2) cv2.imshow(Face Detection (HOG), image) cv2.waitKey(0) cv2.destroyAllWindows()2. CNN卷积神经网络人脸检测器这是一个基于Max-Margin Object Detection (MMOD)算法的深度学习模型。你需要先下载预训练模型文件如mmod_human_face_detector.dat。原理使用深度卷积网络直接对图像进行端到端的检测输出人脸区域。它比HOG方法强大得多能检测各种角度、遮挡和光照条件下的人脸但计算代价也高得多通常需要GPU支持才能达到实时。特点精度极高鲁棒性强但速度慢资源消耗大。代码示例import dlib cnn_detector dlib.cnn_face_detection_model_v1(mmod_human_face_detector.dat) dets cnn_detector(rgb_image, 1) # dets是一个mmod_rectangles对象列表 for det in dets: # CNN检测器返回的rect对象有一个rect属性 d det.rect # ... 绘制矩形框的代码同上如何选择对于实时门禁系统如果硬件允许有不错的GPU追求高检出率选CNN。对于大多数开发、测试或对实时性要求不极端如处理静态图片、视频回放的场景HOG检测器是更平衡、更实用的选择。3.2 第二步人脸对齐Face Alignment检测到人脸框后下一步是进行人脸对齐也叫特征点定位。这是提升后续识别精度至关重要的一步。因为人脸可能倾斜、旋转直接裁剪出的人脸区域姿态不一致会影响特征提取。Dlib使用一个预训练的68点形状预测器Shape Predictor来定位人脸的关键特征点如眉毛、眼睛、鼻子、嘴巴、轮廓。你需要下载模型文件shape_predictor_68_face_landmarks.dat。原理形状预测器是一种回归树集合Ensemble of Regression Trees模型。它以人脸区域图像为输入迭代地预测出68个特征点的坐标最终输出一个shape对象其中包含所有点的位置。作用通过这68个点我们可以计算人脸的几何变换如旋转、缩放将人脸“摆正”到一个标准姿态这个过程就是对齐。对齐后的人脸眼睛、嘴巴等部位处于图像中相对固定的位置使得不同图片中同一个人的脸更具可比性。代码示例import dlib import cv2 import numpy as np # 加载形状预测器模型 predictor dlib.shape_predictor(shape_predictor_68_face_landmarks.dat) # 假设我们已经有了一个检测到的人脸矩形框 d shape predictor(rgb_image, d) # 注意这里传入的是RGB图像 # shape是一个包含68个点的对象 # 我们可以遍历这些点并在图像上画出来 for i in range(shape.num_parts): point shape.part(i) cv2.circle(image, (point.x, point.y), 2, (0, 0, 255), -1) # 用红色小圆点标记 # 一个简单的对齐思路根据眼睛位置旋转人脸。 # 通常取左眼点36-41的中心和右眼点42-47的中心的坐标。 left_eye_center np.mean([(shape.part(i).x, shape.part(i).y) for i in range(36, 42)], axis0) right_eye_center np.mean([(shape.part(i).x, shape.part(i).y) for i in range(42, 48)], axis0) # 计算眼睛连线的角度 dy right_eye_center[1] - left_eye_center[1] dx right_eye_center[0] - left_eye_center[0] angle np.degrees(np.arctan2(dy, dx)) # 计算两眼之间的中点作为旋转中心 eyes_center ((left_eye_center[0] right_eye_center[0]) // 2, (left_eye_center[1] right_eye_center[1]) // 2) # 获取旋转矩阵并执行仿射变换 M cv2.getRotationMatrix2D(eyes_center, angle, scale1) aligned_face cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) cv2.imshow(Landmarks and Aligned Face, np.hstack([image, aligned_face])) cv2.waitKey(0)在实际应用中对齐操作会更精细可能包括裁剪、缩放至统一尺寸如150x150像素为下一步特征提取做准备。3.3 第三步特征提取Feature Extraction / Face Encoding这是人脸识别系统的“大脑”。对齐后的人脸图像被送入一个深度神经网络该网络将其映射到一个高维空间中的一个点一个向量这个向量被称为“人脸特征编码”或“人脸嵌入”。同一个人的不同照片其编码在空间中的距离会很近不同人的编码则相距较远。Dlib使用基于ResNet的深度度量学习模型来实现这一功能。你需要下载预训练模型dlib_face_recognition_resnet_model_v1.dat。原理该模型在大型人脸数据集如VGGFace2上训练学习一个函数f(face_image) - 128D_vector。这个128维的向量捕捉了人脸的身份特征对光照、表情、轻微姿态变化具有一定的鲁棒性。代码示例import dlib import numpy as np # 加载人脸识别模型 face_encoder dlib.face_recognition_model_v1(dlib_face_recognition_resnet_model_v1.dat) # 假设我们有一个对齐并裁剪好的人脸图像 aligned_face_rgb (RGB格式尺寸不限但模型内部会调整) # 首先需要将这个人脸图像转换为dlib要求的格式一个dlib矩阵对象。 # 更常见的做法是直接使用检测到的矩形框 d 和形状 shape 来计算编码。 face_descriptor face_encoder.compute_face_descriptor(rgb_image, shape) # face_descriptor 是一个dlib.vector对象可以转换为NumPy数组 encoding np.array(face_descriptor) print(f人脸编码的维度{encoding.shape}) # 应该是 (128,) print(f编码示例前5个值{encoding[:5]})关键点compute_face_descriptor函数内部已经包含了对齐的步骤它需要shape信息。因此在实际流水线中我们不需要像上面示例那样手动做复杂的几何对齐只需要提供原始图像和68个特征点模型会自己处理。这大大简化了流程。3.4 第四步比对与识别Comparison and Recognition得到128维的人脸编码后识别就变成了一个距离计算问题。我们有一个已知人脸的编码数据库“注册库”。当有新的人脸需要识别时计算其编码与数据库中所有编码的距离通常是欧氏距离或余弦距离然后根据阈值判断。欧氏距离L2距离distance np.linalg.norm(encoding1 - encoding2)余弦相似度similarity np.dot(encoding1, encoding2) / (np.linalg.norm(encoding1) * np.linalg.norm(encoding2))距离可以定义为1 - similarity。Dlib官方示例和社区常用欧氏距离。需要设定一个阈值如0.6。距离小于阈值则认为是同一个人大于阈值则认为是不同人。构建简易人脸识别系统的代码框架import dlib import cv2 import numpy as np import pickle import os class SimpleFaceRecognizer: def __init__(self, threshold0.6): self.detector dlib.get_frontal_face_detector() self.predictor dlib.shape_predictor(shape_predictor_68_face_landmarks.dat) self.encoder dlib.face_recognition_model_v1(dlib_face_recognition_resnet_model_v1.dat) self.known_encodings [] self.known_names [] self.threshold threshold def register_face(self, image_path, name): 注册一张人脸到数据库 image cv2.imread(image_path) if image is None: print(f无法读取图片{image_path}) return rgb cv2.cvtColor(image, cv2.COLOR_BGR2RGB) dets self.detector(rgb, 1) if len(dets) ! 1: print(f图片 {image_path} 中未检测到或检测到多张人脸请使用只包含一张清晰人脸的图片。) return shape self.predictor(rgb, dets[0]) encoding np.array(self.encoder.compute_face_descriptor(rgb, shape)) self.known_encodings.append(encoding) self.known_names.append(name) print(f成功注册{name}) def recognize_face(self, image): 识别一张图片中的人脸 rgb cv2.cvtColor(image, cv2.COLOR_BGR2RGB) dets self.detector(rgb, 1) results [] for d in dets: shape self.predictor(rgb, d) encoding np.array(self.encoder.compute_face_descriptor(rgb, shape)) name Unknown min_distance float(inf) if self.known_encodings: distances np.linalg.norm(self.known_encodings - encoding, axis1) min_index np.argmin(distances) min_distance distances[min_index] if min_distance self.threshold: name self.known_names[min_index] results.append((d, name, min_distance)) return results def save_database(self, filepathface_database.pkl): 保存已知人脸数据库到文件 with open(filepath, wb) as f: pickle.dump({encodings: self.known_encodings, names: self.known_names}, f) def load_database(self, filepathface_database.pkl): 从文件加载已知人脸数据库 if os.path.exists(filepath): with open(filepath, rb) as f: data pickle.load(f) self.known_encodings data[encodings] self.known_names data[names] print(f数据库已加载共有 {len(self.known_names)} 条记录。) else: print(数据库文件不存在将新建一个。) # 使用示例 if __name__ __main__: recognizer SimpleFaceRecognizer(threshold0.55) # 阈值可以调整越低越严格 # 1. 注册阶段只需运行一次 recognizer.register_face(person1_photo1.jpg, Alice) recognizer.register_face(person1_photo2.jpg, Alice) # 同一个人多张照片可以提高鲁棒性 recognizer.register_face(person2_photo1.jpg, Bob) recognizer.save_database() # 2. 识别阶段 recognizer.load_database() # 如果重启程序先加载数据库 test_image cv2.imread(test_group_photo.jpg) recognitions recognizer.recognize_face(test_image) for rect, name, distance in recognitions: left, top, right, bottom rect.left(), rect.top(), rect.right(), rect.bottom() label f{name} ({distance:.2f}) cv2.rectangle(test_image, (left, top), (right, bottom), (0, 255, 0), 2) cv2.putText(test_image, label, (left, top-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2) cv2.imshow(Recognition Result, test_image) cv2.waitKey(0)这个框架实现了一个完整的人脸识别流程包括注册和识别。阈值threshold是关键参数需要根据实际场景调整。在光线良好、人脸正对摄像头的情况下0.5-0.6是常用范围。如果环境复杂可能需要适当提高阈值以减少误识但可能会增加拒识。4. 实战优化与高级话题超越基础Demo一个能实际运行的Demo和一套稳定可用的系统之间还有很长的路要走。以下是基于Dlib构建更健壮系统时必须考虑的几点。4.1 性能优化让识别“快”起来Dlib的HOG检测器在CPU上已经很快但特征提取ResNet模型是计算瓶颈。在实时视频流如门禁机中全帧率处理每一帧是不现实的。策略一降低处理频率。不要每帧都做人脸检测和识别。可以每N帧例如5帧处理一次或者只在检测到运动使用OpenCV的背景减除后才启动人脸识别流程。策略二多尺度检测的取舍。detector(rgb_image, 1)中的1是上采样次数。增加它能检测更小人脸但计算量呈指数增长。对于固定机位的门禁人脸大小相对稳定可以尝试设置为0。策略三人脸跟踪Face Tracking。对于视频流连续帧之间人脸位置变化很小。可以在第一帧检测到人脸后使用跟踪算法如OpenCV的KCF, MOSSE或Dlib自带的correlation_tracker在后续帧中跟踪人脸位置避免每一帧都重新运行昂贵的检测和特征点定位只需对跟踪到的人脸区域进行特征提取和比对。这能极大提升帧率。策略四模型与硬件。如果条件允许使用CNN检测器配合GPUCUDA能获得更好的检出率和速度。Dlib支持CUDA加速但需要编译支持CUDA的版本这对于Windows用户来说又是一个挑战通常需要寻找别人编译好的特定版本。4.2 活体检测Liveness Detection防止照片欺骗这是人脸识别门禁机等安全场景的必备功能。攻击者可能用打印的照片、手机屏幕播放的视频来冒充真人。Dlib本身不提供活体检测功能需要结合其他方法眨眼检测利用Dlib的68点模型计算眼睛纵横比Eye Aspect Ratio, EAR。真人会无意识眨眼而静态照片不会。通过连续多帧计算EAR的变化可以判断是否为活体。嘴部动作检测类似眨眼可以提示用户“请张嘴”或“请念数字”通过特征点运动来判断。纹理分析皮肤纹理微小的毛孔、皱纹在真人脸上和纸张/屏幕上有显著差异。可以使用局部二值模式LBP或更深的网络来分析。3D结构光/红外成像这是硬件方案通过获取人脸的深度信息来区分2D平面和3D实体安全性最高但成本也高。一个简单的软件活体检测眨眼示例def eye_aspect_ratio(eye_points): 计算眼睛纵横比eye_points是6个(x,y)坐标的列表 # 计算垂直距离 A np.linalg.norm(eye_points[1] - eye_points[5]) B np.linalg.norm(eye_points[2] - eye_points[4]) # 计算水平距离 C np.linalg.norm(eye_points[0] - eye_points[3]) ear (A B) / (2.0 * C) return ear # 在视频循环中 left_eye_points np.array([(shape.part(i).x, shape.part(i).y) for i in range(42, 48)]) right_eye_points np.array([(shape.part(i).x, shape.part(i).y) for i in range(36, 42)]) left_ear eye_aspect_ratio(left_eye_points) right_ear eye_aspect_ratio(right_eye_points) avg_ear (left_ear right_ear) / 2.0 # 设定阈值当EAR低于阈值一段时间后回升计为一次眨眼4.3 数据库管理与大规模识别上面的示例将编码存储在内存的列表里这仅适用于几十到几百人的小规模场景。对于成千上万的人脸库需要使用向量数据库如FAISSFacebook AI Similarity Search、Annoy、Milvus等。它们专门为高效搜索高维向量而设计支持在毫秒级别内从百万级库中找出最相似的向量。建立索引将人脸编码存入向量数据库时会建立索引结构如IVFFlat, HNSW。在识别时通过索引进行近似最近邻搜索而不是暴力计算与库中所有编码的距离。持久化与更新设计数据库 schema不仅要存储编码向量还要关联人员ID、姓名、注册时间、照片路径等信息。并提供便捷的增删改查接口。4.4 光照与姿态的鲁棒性处理Dlib的ResNet模型对常见变化已有一定鲁棒性但在极端情况下仍需预处理光照归一化使用直方图均衡化CLAHE效果更好来缓解光照不均。姿态估计与正面化如果检测到人脸侧转角度过大可通过68点模型的3D姿态估计算法计算可以尝试进行3D旋转将人脸“转正”或者直接拒绝识别要求用户调整姿态。多样本注册在注册阶段采集同一个人在不同光照、轻微不同姿态下的多张照片提取多个编码取平均或全部存入数据库。在识别时用新编码与所有这些“模板”编码进行比较取最小距离可以显著提高识别率。5. 项目部署与工程化考量将你的Python脚本变成一个可以长期稳定运行的服务或应用还需要考虑以下方面依赖冻结使用pip freeze requirements.txt生成依赖列表确保在其他机器上能复现完全相同的环境。对于Dlib这种特殊包需要在requirements.txt中指定wheel文件的本地路径或准确的版本号。错误处理与日志添加完善的try-except块处理图像读取失败、检测不到人脸、模型文件丢失等各种异常。使用Python的logging模块记录运行日志便于排查问题。配置化将阈值、模型文件路径、数据库路径等参数写入配置文件如config.yaml或.env文件而不是硬编码在脚本中。Web服务化使用Flask或FastAPI将你的识别功能封装成REST API。前端如门禁机的触摸屏界面或Web页面通过调用API上传图片或视频帧获取识别结果。与硬件集成门禁机通常涉及摄像头控制如OpenCV的V4L2驱动、继电器控制用于开门、显示屏输出等。在Windows上可能需要使用pySerial控制串口设备或寻找特定的SDK来控制硬件。最后我想分享一个我自己的踩坑经验在Windows上使用多进程multiprocessing并行处理视频流或多路摄像头时如果子进程中导入了Dlib可能会遇到奇怪的崩溃或内存错误。这是因为Dlib或它底层依赖的某些C库在多进程环境下初始化有问题。一个可行的解决方案是使用“spawn”启动方法multiprocessing.set_start_method(spawn)但这可能会增加开销。更稳妥的方式是采用多线程threading或异步IOasyncio来处理并发尽管受限于Python的GIL但对于I/O密集型或混合型任务在结合了NumPy/Dlib的C扩展后通常也能获得不错的性能提升。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价