憨憨程序员,其实是有做读取旧classes保存到新classes功能的,但是看完代码发现就启动程序初始化的时候调用了一次,change save dir的时候根本没有调用。
我实力有限,只能靠比较愚蠢的方法解决了。
首先找到我们安装labelImg的地址,比如我就是放到conda环境里面,所以在这个目录下。不同安装会有不同目录所以只能做参考。
如上图,进入环境envs文件夹后,选择你安装labelImg的环境,进入Lib/site-packages/labelImg文件夹。
用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自动的标签,还是会出错的。文章来源:https://www.toymoban.com/news/detail-856840.html
因此,强烈建议复制一个classes.txt作为备份,原因是windows创建ansi格式的txt文件并不怎么方便,自己创建的classes.txt是默认utf-8的。文章来源地址https://www.toymoban.com/news/detail-856840.html
到了这里,关于labelImg无法保存classes文件的解决方法(IndexError: list index out of range)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!