运行时错误:无法打开 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
参数。完成此操作后,您需要执行以下操作。
可能有比我即将提供的更好的解决方法,但是一旦我意识到这一切,在<script_name>.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>
基本上是您存储 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