非保姆级教程,打包之前没想到自己能成功,,,,,
yolov5, deepsort, pytorch(torch,torchvision),多进程,TCP/IP通信,传输视频流
conda create -n pack python=3.8 **(建议3.7以上**)
activate pack
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt (自己需要的包)
pip3 install torchvision==0.10.0+cu102 -f https://download.pytorch.org/whl/cu102/torch_stable.html
注:
pytorch版本不要太高,否则可能报错,我安装的是torchvision 0.10.0+cu102,有个小技巧是,如果需要安装torchvision,就不要先装torch,否则,装完torch以后,你可能找不到torchvision对应的版本,但是你先装torchvision,他会自己安装对应的torch版本,我这里安装的是:
torch 1.9.0+cu102,torchvision 0.10.0+cu102
cuda的版本也不需要太高,10.2就不错
直接pip 安装后,用pyinstaller 打包会到报找不到一些库的问题,我去github上找了一圈以后,发现外网的解决方法是,下载维护的新版pyinstaller
pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip
如果下载报错,可以先浏览器下载压缩包,然后解压,anaconda prompt命令行cd 到解压安装包的setup.py路径下,使用命令:
python setup.py install 直接安装,这样安装的pyinstalle,打包抓取报的错误少一些,亲测很有效,大部分的文件都能抓取到
首先确保项目在新建的虚拟环境下能够直接运行,项目封装好(写成类,做好API接口),做一个main.py函数作为入口函数
使用了多进程的项目,一定要在main.py 的if name == ‘main’:下面加上
multiprocessing.freeze_support()
否则打包好以后,直接运行,会在后台运行30+main.exe, cup拉满,本人深受其害,电脑直接黑屏,,,,
直接打包:
pyinstaller main.py
会生成build和dist两个文件夹,main.exe在dist下
选择用 “命令提示符" 运行,开始-Windows系统-命令提示符,右键管理员运行(一定)
然后使用 cd 命令切换到 main.exe文件目录下,直接输入 main.exe。
对于yolo 一般需要导入.pt 和.yaml 文件,路径是根据打包前代码里的相对路径,因此需要在main.exe同级文件夹下,创建一个相同文件目录的文件夹,并将需要的文件放入,deepsor需要的文件同理, 不要使用绝对路径
一般是因为直接将包含yolo模块的文件直接嵌入项目,然后内部的models文件夹和utils文件夹里的from,import 报错
解决方法:从main.py一级文件夹开始写from ,而不要从含yolo模块的文件开始写,从顶层到.py的位置,这样就能找到文件了。
这个一般是因为tensorflow版本的问题,我换成torch 1.9.0+cu102,torchvision 0.10.0+cu102以后就没有问题了
更换pyinstaller,不要直接pip install pyinstaller 的而是pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip 或者set up的方法(上面),这样很多找不到包的错误都会减少不少。
也可以看看网上适当添加 –hidden-import
因为有些是应用需要的包,但是没有被打包进来,这里的错误是最多的,因为一般是第三方包隐式调用其他包,然后打包出来的程序显示Fate Error不能运行
说是没有找到models 模型,方法:
改写函数:
(1)yolo模块的detect.py
*载入设备:
源码:
device = select_device(self.device)
改成:
cuda = torch.cuda.is_available()
device = torch.device('cuda:0' if cuda else 'cpu')
这样就去掉了select_device函数的使用
(2)yolo模块的detect.py
*载入模型:
源码:
model = attempt_load(self.yolo_weights, map_location=device) # load FP32 model
改成:
model = torch.load('yolov5_deepsort_master/yolov5/best.pt', map_location=device)["model"].float().eval() # load FP32 model
这样就绕过了attempt_load函数,好处是直接给出模型相对位置,而不是用attempt_load函数找,pytorch torch.load ModuleNotFoundError No module named ‘models‘的错误就能解决,记得编译完以后,在dist文件夹下新建一个’yolov5_deepsort_master/yolov5/best.pt’的文件夹
由于包含torch依赖文件,因此我的这个项目的dist大约在3.44G,是正常的,如果不包含torch的项目,那就小的多