在ubuntu系统上用pyinstaller打包yolov5项目代码

news2024/9/29 21:26:38

目录

        • 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中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node.JS(4)--模块、exports和module

文章目录模块核心模块文件模块基本数据类型引用数据类型exports和module.exports的关系模块 分为两大类 核心模块 由node引擎提供的模块 核心模块的标识就是模块的名字 var fsrequire("fs");文件模块 由用户自己创建的模块文件模块的标识就是文件的路径&#x…

一个专注推荐.Net开源项目的榜单

大家好,我是编程乐趣,从7月份开始推荐开源项目,已经推荐了接近100个开源项目了,其中绝大部分是有关.Net的开源项目,也受到大家非常多人的喜欢。 由于公众号不方便查询,很多人又想了解更多的开源项目&#…

C++【多线程】

文章目录一、什么是线程二、创建线程一、什么是线程 线程在进程内部执行,是OS调度的基本单位。 在堆区上存在下面一种数据结构 struct vm_area_struct{ //用来记录这块空间的起始和终止。unsigned long vm_start;unsigned long vm_end;//其实这是一个双向链表中的结…

判断环形链表是否有环??返回环形链表的入口点!!

上次笔者写了一篇大概有7个题的链表相关的题目解析,感觉还不错,感兴趣的各位老铁,可以点一下链接进行欣赏:做几个与链表相关的题吧!https://blog.csdn.net/weixin_64308540/article/details/128550685?spm1001.2014.3…

CPT205-Computer Graphics(2)

文章目录7. Hierarchical Modelling7.1 Local and world co-ordinate frames of reference7.1.1 Relative motion7.2 Linear modelling7.3 Hierarchical modelling7.3.1 Hierarchical transformations8. Lighting and Materials8.1 Lighting sources8.1.1 Point light8.1.2 Dir…

如何将revit的内建模型导出使用?项目族管理功能介绍

Revit中内建模型建模是我们常用的功能,每次建模完成后都可以在另一个项目中使用,但是前提是需要导出后再载入才能在另一个项目中使用。今天就教教大家如何将Revit的内建模型单独导出,方便大家下次使用在其它项目。 如何将revit的内建模型单独…

计算机组成原理_总线的性能指标

计算机组成原理总目录总线的性能指标 一、总线周期和时钟周期 总线周期 总线周期通常指的是CPU完成一次访问内存或I/O端口操作所需要的时间 其中包括申请阶段、寻址阶段、传输阶段和结束阶段时钟周期 时钟周期是处理操作最基本的单位,在一个时钟周期内,…

【历史上的今天】1 月 9 日:iPhone 问世;iTunes 发布;激光打印机的发明者出生

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 1 月 9 日,在 1978 年的这段时间,我国恢复了研究生制度,这一年,共录取了 10500 多名研究生。研究生教育的中断和…

哈希的应用 —— 布隆过滤器

目录 一、布隆过滤器的提出 二、布隆过滤器的介绍 1. 基本概念 2. 布隆过滤器的特点 3. 哈希函数和布隆过滤器的长度对误判的影响 三、布隆过滤器的实现 1. 布隆过滤器的插入 (Set接口) 2. 布隆过滤器的查找(Test接口) …

javascript原型之保姆级讲解

目录前言一,面向对象编程1.1 面向过程与面向对象1.2 JS创建类和对象1.3 类的继承1.4 Super关键词1.5 几个注意点二,构造函数原型2.1 创建对象的三种方法2.2 静态成员和实例成员2.3 构造函数的弊端2.4 函数的共享-原型prototype2.5 对象原型___proto__2.6…

用Python制作你的专属音乐播放器(此刻浪漫只属于你哦*´▽`*)

文章目录前言一、项目介绍二、环境配置三、代码实战前言 昨天是博主的一位朋友生日,除了送上大大的红包,知道他喜欢听音乐,特意用代码给他写了一个 专属音乐播放器,今天把这个代码也开源送给所有粉丝哦。 一、项目介绍 我们常用…

Vue--》实现动画与过渡效果

目录 动画效果 过渡效果 第三方动画库 Vue封装的过渡与动画作用是在插入、更新或移除DOM元素时,在合适的时候给元素添加类名。 动画效果 操作css的trasition或animation,vue会给目标元素添加/移除特定的class,过渡的相关类名是&#xff1…

Spring项目中用了这种解耦模式,经理对我刮目相看

前言 不知道大家在项目中有没有遇到过这样的场景,根据传入的类型,调用接口不同的实现类或者说服务,比如根据文件的类型使用 CSV解析器或者JSON解析器,在调用的客户端一般都是用if else去做判断,比如类型等于JSON&…

【Spring6源码・IOC】Bean的实例化

上一节我们讲到《【Spring6源码・IOC】BeanDefinition的加载》,这一节我们来讲解一下Bean的实例化。 根据xml或注解加载完Bean的信息后,最终会通过反射来创建bean的对象。 invokeBeanFactoryPostProcessors()主要是加载BeanDefinition。 finishBeanFa…

MAC(m1)-VMWare Fusion安装CentOS7.9(续)

下载了CentOS8,优先安装CentOS8 默认的配置有点小, 可以根据自己需求进行自定义设置: 点击存储,会出现: 咱们是中国人,优先选择中文: 点击网络和主机名,配置网络: 打开网卡开关&…

找出给定数组中和是给定目标整数的两个整数,输出找到的两个整数下标

找出给定数组中和是给定目标整数的两个整数,输出找到的两个整数下标。 (本文获得CSDN质量评分【x】)【学习的细节是欢悦的历程】Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅…

Android---简易Snackbar

目录 Snackbar 简介 Snackbar 特性 完整Demo Snackbar 简介 Snackbar 是 Android5.0 新特性---Material Design 中的一个控件,用来代替 Toast。Snackbar 就是一个类似 Toast 的快速弹出消息提示的控件,手机上显示在底部,大屏幕设备显示在左…

Golang实现分布式锁

1. go实现分布式锁 通过 golang 实现一个简单的分布式锁,包括锁续约、重试机制、singleflght机制的使用 1.1 redis_lock.go package redis_lockimport ("context"_ "embed""errors""github.com/go-redis/redis/v9""…

Java Netty框架自建DNS代理服务器教程

前言 DNS协议作为着互联网客户端-服务器通信模式得第一关,在当下每天都有成千上亿上网记录产生得当今社会,其重要性自然不可言喻。在国内比较有名得DNS服务器有电信得114.114.114.114、阿里云得223.5.5.5,DNSPod得119.29.29.29,配…

【矩阵论】8. 常用矩阵总结——镜面阵,正定阵

8.4 镜面阵 法向量确定一个镜面 8.4.1 镜面阵的作用 对法向量 Aα−αA\alpha-\alphaAα−αA(Aα)A2ααA(A\alpha)A^2\alpha\alphaA(Aα)A2αα 对镜面上向量 AYYAYYAYY 8.4.2 镜面阵表示 AIn−2ααH∣α∣2,其中α(x1x2⋮xn)∈Cn,且α≠0AI_n-\frac{2\alpha\alpha^H}{\…