首页 | 资讯 | 财经 | 公益 | 彩店 | 奇闻 | 速递 | 前瞻 | 提点 | 网站相关 | 科技 | 热点 | 生活 |
labelimg总是崩溃的若干解决办法

发稿时间:2023-04-22 11:39:34 来源: 哔哩哔哩

一. 为什么labelimg总是在崩溃

Labelimg是一个用来对图片进行标注的工具,标注的过程是用鼠标进行的,涉及到程序图形界面的工作和文件的读写操作,这便是程序崩溃的两大来源。如果我们去看程序崩溃时的报错信息,那么我们可以总结出如下几条:

①  画线时的drawLine参数类型出错

②  使用txt文件进行标注时classes.txt的编码不能正常识别


(相关资料图)

③  TXT标注中分隔符的问题

二. 画线时参数类型的解决方法

画框框时,鼠标图标上下左右,有十字相随。十字的出现是伴随着鼠标图标的,所以要以鼠标图标位置为事件,触发绘图函数,并在鼠标图标离开后消除原有十字,形成新十字。

要画出十字,则需要确认十字的颜色。由于版本的兼容性问题,setPen函数有时无法正常使用。根据报错信息,定位到问题所在之地为canvas.py文件。找到paintEvent(self, event)函数,发现setPen函数在调用时的参数不能正常使用,为此,可以直接定其为常量。由于这个函数在此是确定画笔颜色的,为了简单,我们完全可以设置画笔颜色为纯粹的黑,那么那里就成了

当然,为了好看,也可以是别的颜色。

另外,颜色设置的后面是画十字的,前一行是在图像区域画竖线,后一行表示画横线。因为参数问题,电脑经常报错说传入的参数是float而非int,但是在电脑屏幕上显示图形,坐标往往是int的。开始画框时,欲显示十字,则报错如下:

对此,直接一个强制的数据类型转换,不管原来是什么东西,反正改成int就行了。

而且,前方显示框框的地方也是这样:

由此,画线的闪退问题解决。

有意思的是,后面还有一个很无聊的玩意,点了一个verify按钮,就是换了一个背景颜色,真不知道有什么用。

三.保存标签名称的TXT文件编码出错之解决方法

为了方便,很多时候标签的名称是中文的,这也就意味着UTF编码的更多的使用。经过几次试验,发现当标签的名称是中文时,文件classes.txt必须以UTF-8的编码来保存,但是,每次做完标注后,按下保存的按键,这个文件就变成了ANSI编码的。

由于程序一开始不认识中文,默认的是以纯英文的方式去读取文件的,所以标注工作一开始就会出问题。为此,我们需要让程序认识中文,也就是对classes.txt文件以UTF-8的形式读取。当程序一开始不认识中文时,我们根据其报错的信息找到文件yolo_io.py,锁定在某一部分的代码。

上面是报错信息,判定出错之地的文件路径在C:\Users\你的电脑用户名\AppData\Local\Programs\Python\Python310\Lib\site-packages\libs

这里是一个读取文件进行标注工作初始化的部分。可以看到,出错的read函数是不能识别汉字的,而这与文件打开的方法有关,在上面的open函数里,我们可以在最右边写上       ,encoding='utf-8'    表明这里用UTF-8编码打开文件,由此完成classes.txt的读取工作。

反之,在保存标注结果时,经过实验,发现中文的标签也容易出问题。根据报错信息我们可以找到对应的代码:

这里是负责保存文件的,将对象out_class_file的文件打开的方式中,加上同样的UTF-8编码的说明,告知机器用UTF-8编码保存文件,从而解决问题。同理,在yolo_io.py之结尾处,为了保险起见,也要如此。在函数parse_yolo_format(self)中同样是open方法,针对对象bnd_box_file修改。

三. 分隔符问题的解决方法

既然我们都是用UTF-8编码了,那么写文件的操作也是很有可能写入UTF-8的字符。TXT文件中每一行都有空格,写入时可能是中文的空格,也可能是英文的。查有关资料可以发现,中文和英文的空格居然不是同一个字符。

如果TXT文件内有中文空格,那么用labelimg打开试一试,必然报错。问题同样出在yolo_io.py上,看它的结尾处,是这样的:

看报错信息,在循环体的第一行上,里面有一个split函数,这是一个使用正则表达式进行匹配,匹配的内容是对每一行的遍历,匹配的选项是一个英文的空格。

如果发现中文空格而不是英文的,那么匹配失败,报错。反之,我们也不能保证所有的空格都是中文的空格,也很有可能报错,为此,可以进行错误检测。另外,如果在某些条件下人为修改TXT文件,很有可能会促使标注的数值之间多了空格。所以为了避免这种极端情况的报错,可以要求匹配多个空格,修改结果如下:

其中”\s”是用来匹配多个空格的。

标签:

责任编辑:mb01

网站首页 | 关于我们 | 免责声明 | 联系我们

生活晚报网版权所有

Copyright @ 1999-2017 www.news2.com.cn All Rights Reserved豫ICP备20022870号-23

联系邮箱:553 138 779@qq.com