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

问题描述 投票:0回答:2

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

 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

这是我的主要规格

# -*- 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')

提前谢谢您

python opencv pyinstaller face-recognition dlib
2个回答
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
文件构建可执行文件,并且在运行时不会出现错误。它应该按您的预期工作。


0
投票

只需在 .spec 文件中手动添加它们,例如:

    datas=[
    ('myenv\\Lib\\site-packages\\face_recognition_models\\models\\dlib_face_recognition_resnet_model_v1.dat', 'face_recognition_models/models'),
    ('myenv\\Lib\\site-packages\\face_recognition_models\\models\\mmod_human_face_detector.dat', 'face_recognition_models/models'),
    ('myenv\\Lib\\site-packages\\face_recognition_models\\models\\shape_predictor_5_face_landmarks.dat', 'face_recognition_models/models'),
    ('myenv\\Lib\\site-packages\\face_recognition_models\\models\\shape_predictor_68_face_landmarks.dat', 'face_recognition_models/models')
],
© www.soinside.com 2019 - 2024. All rights reserved.