目录
- 0. 背景
- 1. 创建虚拟环境
- 2. pyinstaller打包
- 2.1. 生成并修改spec文件
- 2.2. 重新生成二进制文件
- 3. 测试
0. 背景
最近需要在ubuntu 18.04上将自己写的一些基于yolov5的项目代码打包成二进制文件,方便部署的同时也尽量减少暴露源码。
参考网上的很多教程,绝大多数是在win上做的,好像没有在ubuntu 18.04上的详细打包步骤。
1. 创建虚拟环境
这里选用anaconda创建一个干净的Python环境,我这里的python版本为3.8,其他python版本影响应该不大。后面用pyinstaller打包的就是这个环境里面的依赖。
后面的操作会用到一些库,如果执行命令时报错,就自己装库。
首先,下载yolov5-v4.0,这里选择v4.0没有特殊意思,仅仅是我自己用的就是v4.0,其他版本应该也行
git clone https://gitee.com/monkeycc/yolov5.git -b v4.0
其次,创建虚拟环境,这里,需要确认下你的显卡型号、cuda版本是否和pytorch版本适配(可以去Pytorch官网查看)
,如果不适配后面可能会报错。我这里cuda版本是11.1,我这里选择pytorch 1.10.0
。
千万不要直接pip install -r requirements.txt
,会损坏你其他虚拟环境的torch!
conda create -n pyinstaller python=3.8
conda activate pyinstaller
pip install torch==1.10.0+cu111 torchvision==0.11.0+cu111 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html
pip install pyyaml numpy opencv-python matplotlib scipy tqdm pandas seaborn -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
cd yolov5
最后,下载weights(链接:https://pan.baidu.com/s/1uVa5eylGETYN0tUB2adjcQ
提取码:ruwf),这里我将yolov5s.pt下载到./yolov5/weights。自己将一张图片test.png放到项目地址./yolov5中,然后执行以下命令测试下,一般是没问题的
python detect.py --source test.png --weights weights/yolov5s.pt
2. pyinstaller打包
pyinstaller命令需要在目标python代码detect.py
所在目录./yolov5
中执行。这里,我们分为两步,第一步为生成spec文件,第二步为修改spec文件参数,重新生成二进制文件。
2.1. 生成并修改spec文件
执行如下命令
cd yolov5
pyinstaller -D detect.py
生成的spec文件detect.spec
位于目录yolov5
中,下一步对detect.spec
进行修改,主要是指定外部库、指定外部资源。
这里spec文件参数含义可以参考博客《【python第三方库】pyinstaller使用教程及spec资源文件介绍》以及博客《pyinstaller spec文件详解》,这里我对我们需要修改的参数进行介绍。
-
Analysis里面的
scripts
参数,如下图
这里的scripts参数为.py文件列表,默认是目标python代码detect.py
,不需要写多个python代码。 -
Analysis里面的
pathex
参数,如下图
这里的pathex参数为文件夹列表,当空的时候,默认为目标python代码detect.py
所在的目录./yolov5
的绝对地址;这里通常添加自定义库所在目录地址。因为yolov5项目所需要的自定义库utils
位于./yolov5
中,所以这里pathex
参数默认即可。 -
Analysis里面的
datas
参数,如下图
这里的datas参数为资源目录/资源的列表,当有非python代码之外的其他资源时,如图片/图片目录、数据库/数据库目录、配置/配置目录、权重文件/权重文件目录等,需要在这里写明。比如权重文件yolov5s.pt
,存放于./yolov5/weights
目录下,这里的根目录为./yolov5
;实际二进制文件运行的根目录为./yolov5/dist/detect
,因此需要在该根目录下复制weights
。 -
Analysis里面的
hiddenimports
参数,如下图
这里的hiddenimports参数为第三方库名称列表。当报错ModuleNotFoundError: No module named 'xxx'
,即第三方库无法import
时,将module名增加到列表中。
最后完整的detect.spec
文件如下,
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['detect.py'],
pathex=[],
binaries=[],
datas=[('models','./models'), ('weights', './weights'), ('data', './data')],
hiddenimports=['utils', 'utils.autoanchor'],
hookspath=[],
hooksconfig={},
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='detect',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='detect',
)
2.2. 重新生成二进制文件
修改好detect.spec
后,重新生成二进制文件,如下
pyinstaller detect.spec
生成过程中会提示是和删除原有./yolov5/dist/detect
目录下的所有文件,直接输入y
即可,如下图
如无意外,很快可以看到成功完成。
生成的二进制文件所在目录为yolov5/dist/detect
。
3. 测试
这里,退出python环境,然后执行二进制文件,如下
conda deactivate pyinstaller
cd dist/detect
./detect --source ../../test.png --weights weights/yolov5s.pt
这里,测试结果位于yolov5/dist/detect/runs
中。