运行时错误:无法打开 shape_predictor_68_face_landmark.dat(无法执行脚本主程序)

Posted

技术标签:

【中文标题】运行时错误:无法打开 shape_predictor_68_face_landmark.dat(无法执行脚本主程序)【英文标题】:Runtime Error: Unable to open shape_predictor_68_face_landmark.dat (Fail to execute script main) 【发布时间】:2021-01-06 22:36:43 【问题描述】:

我一直在尝试使用 pyinstaller 构建可执行文件。我已经测试了 main.py 文件,它运行良好,但是当我尝试在 exe 文件中时,它显示错误。 我还下载了这个 shape_predictor_68_face_landmark.dat 文件,并从这个链接https://github.com/ageitgey/face_recognition_models 保存在与我的 main.py 相同的文件夹中 我已经尝试过其他类似的堆栈问题的解决方案,但是,它们都不适合我

 Traceback (most recent call last):
   File "main.py", line 12, in <module>
   File "<frozen importlib._bootstrap>", line 983, in _find_and_load
   File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
   File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
   File "c:\users\leena\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 493, in exec_module
     exec(bytecode, module.__dict__)
   File "face_recognition\__init__.py", line 7, in <module>

   File "<frozen importlib._bootstrap>", line 983, in _find_and_load
   File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
   File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
   File "c:\users\leena\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 493, in exec_module
     exec(bytecode, module.__dict__)
   File "face_recognition\api.py", line 20, in <module>
 RuntimeError: Unable to open C:\Users\Leena\Desktop\hello world kivy\dist\main\face_recognition_models\models\shape_predictor_68_face_landmarks.dat
[1520] Failed to execute script main

我的 main.py 包含:

导入 cv2

导入人脸识别

将 numpy 导入为 np

这是我的 main.spec

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None
from kivy_deps import sdl2, glew, gstreamer
from kivymd import hooks_path as kivymd_hooks_path

a = Analysis(['main.py'],
             pathex=['C:\\Users\\Leena\\Desktop\\hello world kivy'],
             binaries=[],
             datas=[('C:\\Users\\Leena\\Desktop\\hello world kivy\\shape_predictor_68_face_landmarks.dat','.')],
             hiddenimports=[],
             hookspath=[kivymd_hooks_path],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='main',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
           *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins + gstreamer.dep_bins)],
               strip=False,
               upx=True,
               upx_exclude=[],
               name='main')

提前谢谢你

【问题讨论】:

【参考方案1】:

最近我遇到了一个非常相似的事情,我试图使用 pyinstaller 为面部识别项目构建一个可执行文件,但我遇到了几乎完全相同的错误。

花了几个小时试图修复错误后,我想出了一个解决方案。据我了解,库face_recognition(我相信您必须使用它)包含它自己的形状预测模型文件(包括您传递给data 参数的那个)。这些预测器模型文件存储在**/site-packages/face_recognition_models/models 中。现在,site-packages 目录可以在很多地方找到;您可能正在使用虚拟环境(例如,在 Linux 中),在这种情况下,site-packages 将存储在 .venv/libs/python*/site-packages 中,其中 .venv 是您正在使用的虚拟环境目录。简而言之,您必须找到当前 Python 正在使用的 site-packages 目录。

由于某种原因(可能是因为它们是二进制文件),在构建可执行文件时,上述形状预测器模型并未包含在 face_recognition 库中,face_recognition 需要它们才能正常运行,甚至如果您自己提供自己的形状预测模型。

通过将自己的形状预测器模型作为文件传递,以便将其添加到可执行文件中,您的工作进展顺利。这里的一个问题是您使用的是datas 参数,而shape_predictor_68_face_landmarks.dat 是一个二进制文件。为此,您可以将形状预测器模型作为参数传递,就像您这样做的方式一样,而是传递给 binaries 参数。完成此操作后,您需要执行以下操作。

可能有比我即将提供的更好的解决方法,但是一旦我意识到这一切,在&lt;script_name&gt;.spec 文件中,我将以下参数添加到binaries 参数:

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(['<script_name>.py'],
             pathex=['<path_to_script_dir>'],  # this should automatically be filled
             binaries=[('$PARENT_DIR/site-packages/face_recognition_models/models/*',
                        'face_recognition_models/models'),
                       ('<path_to_parentdir_your_shape>/shape_predictor_68_face_landmarks.dat',
                        '<path_to_parentdir_your_shape>')],
             datas=[...],
             ...

您在这里要做的是手动添加face_recognition 需要的那些在构建过程中不会自动添加的形状预测模型。 $PARENT_DIR/site-packages/ 将是当前正在使用的site-packages 目录的路径(这取决于您是否使用虚拟环境、您的操作系统等)。 path_to_parentdir_your_shape&gt; 基本上是您存储 shape_predictor_68_face_landmarks.dat 的目录的路径(看起来您的项目目录是您存储预测器文件的位置,因此您只需将这些值替换为上述 *.spec 文件示例) .

现在,您提供路径的方式取决于您使用的操作系统。我一直在使用Linux。在您的情况下,您必须执行我上面刚刚解释的操作,但要提供有效的 Windows 路径(使用反斜杠作为路径分隔符)。最后,在上述代码块的.../face_recognition_models/models/* 位中,这里的 * 或多或少表示“选择此目录中的所有内容”(在我们的示例中为models 目录)。它在 Windows 上可能无法正常工作,在这种情况下,您可以手动将多个元组传递给 binaries 参数,采用与上述类似的方式,每个元组都包含指向 models 目录中特定预测模型的路径, 直到你通过了所有的预测模型。

在此之后,您应该能够从*.spec 文件构建可执行文件,并且它应该在运行时不会给您带来任何错误。它应该可以按您的意愿工作。

【讨论】:

以上是关于运行时错误:无法打开 shape_predictor_68_face_landmark.dat(无法执行脚本主程序)的主要内容,如果未能解决你的问题,请参考以下文章

运行 php artisan serve 命令时,laravel 无法打开流致命错误

运行时错误:无法打开 shape_predictor_68_face_landmark.dat(无法执行脚本主程序)

运行时错误:无法打开 ./dlib_model/shape_predictor_68_face_landmarks.dat

尝试运行 Ubuntu 时出现 VirtualBox 错误“无法打开会话”[关闭]

运行 kivy 示例时无法打开共享对象文件

OpenCL 找到平台,但无法打开它们