pyinstaller打包labelme.exe

直接跳过看最后吧,之前是自己瞎yy的,虽然能用,但有坑,最后仔细看了下github,其实很简单。

搞训练采集了一堆素材要扔给别人标注,为了避开安装python之类的环境,所以打算用pyinstaller打包一个labelme的应用程序直接打开用,本人小白第一次玩这个,只懂些简单的python,一步一个坑,在此记录。

一 LabelMe的安装

下载 anaconda 地址:https://www.anaconda.com/distribution/
安装就不截图了,就是点点点,装完打开
在这里插入图片描述
二 labelme安装
在anaconda prompt中输入,创建一个python2.7的环境

conda create -n labelme_py27 python=2.7

为啥用2.7,最早用的是3.6,结果是打包完的程序,在win10下可以运行,拿到win7下就出现api-ms-win-crt-runtime-|1-1-0.dll的问题,虽然也有解决办法,但我虚拟机里win7 64家庭版,装补丁失败,然后就懒得搞了
在这里插入图片描述
之后看到说是python3.5+都有这个问题,可以用3.4,然后玩3.4,在conda装labelme 的时候出现Microsoft Windows SDK7.1
在这里插入图片描述
继续懒得弄,然后试了试2.7,好了-。-

切到刚才安装的环境中

conda activate labelme_py27

安装pyqt

conda install pyqt

安装labelme

pip install labelme

运行labelme

labelme

打开大概就是这个样子
在这里插入图片描述

三 labelme源码

github地址:https://github.com/wkentaro/labelme

pycharm咋装咋破解就不写了,随便搜一个,挺多的

把文件导到pycharm里(我反正直接labelme-master整个扔进去,书读得少,就是莽),file->settings->project:labelme-master->projec interpreter->add
在这里插入图片描述conda environment-> existing environment里选择之前装的labelme_py27的环境
在这里插入图片描述等一会载入环境,然后找到labelme文件夹下的main.py文件,run,效果是和之前在conda里输入labelme是一样的

四 pyinstaller打包exe

继续在anaconda prompt下安装pywin32

pip install pywin32

安装dis3

pip install dis3

安装pyinstaller

pip install pyinstaller

打包exe
这里 -w 不弹出黑框,-i 选择图标,-F 打包一个单个文件

pyinstaller -w -i C:\labelme-master\labelme\icons\icon.ico -F C:\labelme-master\labelme\main.py

打包的结果是会在执行命令的文件夹下生成,build文件夹,dict文件夹和spec文件
dist目录:目录里面有可执行文件
build目录:生成exe的中间文件
spec文件:要转换文件的同一目录下,用于生成exe文件,可以修改来自定义生成exe的属性
(这三个不懂,抄别人的)

直接这个命令会报个错,提示C:\Users\builder\mc3\conda-bld\qt_1505945264697_h_env\Library\plugins(这个路径每个人不一样的,看他提示给的是啥)下面少东西,网上的说法是直接把dll弄过来,我最早是直接把conda环境下的Anaconda3\envs\labelme_py27\Library\plugins\PyQt5下面的dll复制进去了,也可以通过,但其实是有问题的。

我自己遇到的就是用labelme open的时候图像选择里面是没有jpg和jpeg,脑补了下把Anaconda3\envs\labelme_py27\Library\plugins下的imageformats文件夹复制到和exe同一个目录,其他格式确实是多了,但jpg和jpeg还是没有。

最后直接把整个Library给扔到它提示的C:\Users\builder\mc3\conda-bld\qt_1505945264697_h_env下面,打包,似乎错误和警告也没了,通过以后jpeg和jpg就有了,也不用把imageformats放过去了。

到这里其实打包的过程是结束了,但labelme源码还需要修改,主要是配置文件和exe中图标缺失的问题。
用刚才过程打包的exe打开会报错,但是因为我们加了-w选项,没弹出黑框,所以不知道报了啥,想看的话可以把-w去掉,然后在cmd里运行,大概错误就是说找不到default_config.yaml文件。

找了会源码,需要修改个地方,先别急着打包,还有个要改的地方。
在config下的__init__.py文件,config_file的那行,注释掉的是原本写的,对应修改在注释下面,不知道打包成exe他的路径是怎么样的,改成直接和exe同目录,然后把config下面的default_config.yaml拷贝到和exe同目录就可以了。

def get_default_config():
    #config_file = osp.join(here, 'default_config.yaml')
    config_file = 'default_config.yaml'
    with open(config_file) as f:
        config = yaml.safe_load(f)

    # save default config to ~/.labelmerc
    user_config_file = osp.join(osp.expanduser('~'), '.labelmerc')
    if not osp.exists(user_config_file):
        try:
            shutil.copy(config_file, user_config_file)
        except Exception:
            logger.warn('Failed to save config: {}'.format(user_config_file))

    return config

顺带把这里的 2,3后面的代码注释掉,这样就可以用default_config.yaml来配置exe程序了

def get_config(config_from_args=None, config_file=None):
    # Configuration load order:
    #
    #   1. default config (lowest priority)
    #   2. config file passed by command line argument or ~/.labelmerc
    #   3. command line argument (highest priority)

    # 1. default config
    config = get_default_config()

    # 2. config from yaml file
    #if config_file is not None and osp.exists(config_file):
    #    with open(config_file) as f:
    #        user_config = yaml.safe_load(f) or {}
    #    update_dict(config, user_config, validate_item=validate_config_item)

    # 3. command line argument
    #if config_from_args is not None:
    #    update_dict(config, config_from_args,
    #                validate_item=validate_config_item)

    return config

第二个修改的地方是读取icon文件,虽然这个影响不大,就是exe打开的labelme中按钮上是没有图标的,有点…丑
在utils下的qt.py中修改如下,同样注释是原来的,修改在下面,完成后把labelme下的icon文件夹整个复制到和exe同级目录。

def newIcon(icon):
    #icons_dir = osp.join(here, '../icons')
    icons_dir = 'icons'
    #return QtGui.QIcon(osp.join(':/', icons_dir, '%s.png' % icon))
    return QtGui.QIcon(osp.join(icons_dir, '%s.png' % icon))

最后,打包,跑,图标有了,jpg,jpeg也能选了,win7也能打开了。

五 总结
中间过程也不知道操作是否科学,是否有其他简单的方法,暂时目的达到了,就写个踩坑日记,也许是因为自己蠢,自己坑自己,随缘随缘。

参考资料
https://www.cnblogs.com/coodream2009/p/10183625.html 开源图像标注工具labelme的安装使用及汉化


正确的打包方法
今天因为要把工具给出去,之前的办法比较蠢,就重新看了下github,其实上面有些,这里就总结下坑。

直接从 https://github.com/wkentaro/labelme/releases 下载最近的release解压

# Setup conda
conda create --name labelme python=2.7
conda activate labelme

# Build the standalone executable
# 这里先进入到labelme的根目录
cd C:\labelme-3.16.2
# 需要手动安装下pyqt否则执行后面会报错
conda install pyqt
pip install .
pip install pyinstaller
pyinstaller labelme.spec

注意上面的环境,2.7!!!!
github里是3.6.0但是打包完以后打不开,需要拷贝env下的文件夹,issue里面有说用3.5.6,虽然可以直接打开,但扔到别人电脑上还是遇到我之前的问题,尔用2.7复制platforms文件夹就可以解决所有问题。

把C:\Users\wanghan.conda\envs\labelme\Library\plugins下的platforms文件夹整个复制到和labelme.exe同一个目录下,之后要移植,就这俩一起给就行了。

至于配置文件,在打包前直接修改labelme-3.16.2\labelme\config下的default_config.yaml这样打包完的exe默认就是修改的配置,如果还需临时修改,不打包,可以去C:\Users\你的用户名\下找到.labelmerc文件,进行临时配置修改,保存再打开exe生效

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值