直接跳过看最后吧,之前是自己瞎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生效