一、 Pytorch 项目打包后找不到源码问题描述及解决方案
现有一个主要由 Pytorch、Opencv3 与 Flask 库构建的多目标跟踪项目,项目地址
https://github.com/Zhongdao/Towards-Realtime-MOT
主要系统环境和库版本如下:
Windows 10 1909 专业教育版
Pytorch = 1.3.0
Torchvision=0.4.1
Opencv3 = 3.3.0
Pyinstaller=4.0
Flask = 1.1.2
pyinstaller 打包命令如下:
pyinstaller -D app.py
因为是 web 应用,使用-D 参数打包成文件夹形式,而非用-F 打包成一个 exe 文件,
打包完成后没有报错:
在打包好的文件夹脱离 python 环境用 cmd 独立运行程序报错找不到 pytorch 中的源码,部分
典型错误代码如下:
Traceback (most recent call last):
File "torch\_utils_internal.py", line 46, in get_source_lines_and_file
sourcelines, file_lineno = inspect.getsourcelines(obj)
File "inspect.py", line 955, in getsourcelines
File "inspect.py", line 786, in findsource
OSError: could not get source code
…
OSError: Can't get source for torchvision\ops\misc.py. TorchScript requires source access in order
to carry out compilation. Make sure original .py files are available. Original error: could not get
source code
[32] Failed to execute script app
解决方案参考 pyinstaller git 上的相关 issues:
https://github.com/pyinstaller/pyinstaller/issues/4740
与 https://github.com/pytorch/vision/issues/1899
在本 Flask 项目的主文件 app.py 之前加入如下代码可以解决找不到 pytorch 源文件的问题:
def script_method(fn, _rcb=None):
return fn
def script(obj, optimize=True, _frames_up=0, _rcb=None):
return obj
import torch.jit
torch.jit.script_method = script_method
torch.jit.script = script
如下图:
再利用 pyinstaller -D app.py 进行打包,打包出来的 app.exe 运行时就不存在找不到 pytorch 源
码的错误了。 双击 app.exe 后运行 web 应用,没有报错,如下图:
至此关于 pytorch 打包的问题已经解决。真正部署时在 web 项目的 dist\app\文件夹中就是用
pyinstaller 打包的项目文件,但是如果不编辑 app.spec 文件加入额外的文件夹,Flask 项目中
的 template 等网页文件夹不会被自动打包,会在访问 web 应用时因找不到网页报错,如下图:
因此需要将 web 项目开发目录下的文件夹拷到 dist\app\下:
文件夹核对部署完毕后再运行 app.exe,访问 127.0.0.1:5000/MOT 就不报错了,运行效果如
图:
二、 关于运行后 Opencv 读不进视频文件及跟踪完毕不能输出视频
的问题
在确保和 pytorch 和 Flask 库相关工作成功部署后,最后还可能出现 Opencv 不能读写视
频问题(具体表现为项目中的视频文件为空,分辨率是 0*0)。而在开发环境下确可以正常
用 CvCapture 读入视频文件,在部署后就不可以。其中主要问题主要是关于 ffmpeg 的 dll 没
有拷贝,而要在部署环境中安装 ffmpeg 编解码包。
解决方案是将 ffmpeg 的 dll 包拷贝到与 app.exe 相同的目录下:
同时安装 ffmpeg 环境,参考:
https://blog.csdn.net/caicai1171523597/article/details/92994162?utm_medium=distribute.pc_releva
nt_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-
utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-
1.nonecase
才能在代码中直接用 ffmpeg 命令写视频。安装好 ffmpeg 后可以 ffmpeg -version 验证安装版
本,如下图:
最终基于 Flask + Pytorch + Opencv 的多目标跟踪项目运行如下图:
控制台处理信息:
跟踪结果: