labelImg无法保存classes文件的解决方法(IndexError: list index out of range)

作者 : admin 本文共1596个字,预计阅读时间需要4分钟 发布时间: 2024-06-10 共2人阅读

憨憨程序员,其实是有做读取旧classes保存到新classes功能的,但是看完代码发现就启动程序初始化的时候调用了一次,change save dir的时候根本没有调用。

我实力有限,只能靠比较愚蠢的方法解决了。

首先找到我们安装labelImg的地址,比如我就是放到conda环境里面,所以在这个目录下。不同安装会有不同目录所以只能做参考。

labelImg无法保存classes文件的解决方法(IndexError: list index out of range)插图如上图,进入环境envs文件夹后,选择你安装labelImg的环境,进入Lib/site-packages/labelImg文件夹。

labelImg无法保存classes文件的解决方法(IndexError: list index out of range)插图(1)

用IDE啥的,打开labelImg.py

翻到1230行(版本1.8.5),

def change_save_dir_dialog(self, _value=False):

这个函数里面,改成这个样子:

def change_save_dir_dialog(self, _value=False):
    if self.default_save_dir is not None:
        path = ustr(self.default_save_dir)
    else:
        path = '.'

    dir_path = ustr(QFileDialog.getExistingDirectory(self,
                                                     '%s - Save annotations to the directory' % __appname__, path,  QFileDialog.ShowDirsOnly
                                                     | QFileDialog.DontResolveSymlinks))

    if dir_path is not None and len(dir_path) > 1:
        self.default_save_dir = dir_path
        temp0=(self.default_save_dir+"/_classes.txt")
        with open(self.default_save_dir+"/classes.txt","r",encoding='mbcs') as tempfile0:
            allinclasses=tempfile0.readlines()
        with open(temp0,"w",encoding="utf-8")as _tempfile0:
            for line in allinclasses:
                _tempfile0.write(line)
        # print(temp0,type(temp0))
        self.load_predefined_classes(temp0)# outway!!


    self.statusBar().showMessage('%s . Annotation will be saved to %s' %
                                 ('Change saved folder', self.default_save_dir))
    self.statusBar().show()

具体实现方式就是,把打开文件调用的那个函数拿过来,然后在改变输出文件夹的时候再调用一遍。

为什么会这么复杂呢?原因就是很多人可能会出现:

UnicodeDecodeError: ‘gbk’ codec can’t decode byte xxxxx………………

这种情况。因为默认classes的编码格式是ANSI,但是正常写txt文件用的是utf-8。所以classes文件必须是ansi才行。

但是啊但是,这个憨憨函数调用,要求输入的是utf-8的txt文件。于是我直接就创建一个_classes文件,用utf-8的格式,然后再把classes里面的东西全部搬进来,很原始的方法,但是很有效。

需要注意的是,我的水平有限,它的鲁棒性并没有那么高,所以,只有在点击change_save_dir按钮以后,它才会识别classes文件。如果是直接点open dir自动的标签,还是会出错的。

因此,强烈建议复制一个classes.txt作为备份,原因是windows创建ansi格式的txt文件并不怎么方便,自己创建的classes.txt是默认utf-8的。

本站无任何商业行为
个人在线分享 » labelImg无法保存classes文件的解决方法(IndexError: list index out of range)
E-->