问题:当我们标注完成新的类别后后直接删除classes.txt中不需要的类别之后再次打开labelimg会闪退,如何删除不需要的标签并且能够正确运行呢?(yolo格式)
原因:当我们打开labelimg进行标注的时候,自动生成的classes.txt文件会包含一些预设存在的类别,例如,刚安装时,生成的文件内容就是labelImg-master/data/predefined_classes.txt
文件 + 你所标注的标签,此时标注生成的txt文件每一行的第一个位置就是类别的序号,因为你删除了部分标签,导致重新打开labelimg的时候读取出错了故导致闪退。具体过程如下:
-
安装时自带的文件内容:
-
添加例如类别other后生成的classes.txt文件就为:
-
标注后生成的内容:
解决办法:可以看到此时的标注文件第一行的类别为15,因为我们标注时的classes.txt文件为十六个标签,而’other’标签的所在序列下标就是15,这就是报错内容所在。由此我们可以知道只需要在删除classess.txt中不需要的标签以外,再将所有txt文件的每一行表示标签的位置改成classes.txt序列的下表即可。例如我只需要other标签,那么我就将classes.txt中删除掉除other以外的标签,并且将所有生成的yolo格式的标注文件txt的每一行标签的位置改为0即可,故可以用以下的代码进行实现:
import osdef modify_labels(folder_path):# 获取labels文件夹中所有的txt文件txt_files = [file for file in os.listdir(folder_path) if file.endswith('.txt')]#逐个遍历for txt_file in txt_files:with open(os.path.join(folder_path, txt_file), 'r') as f:lines = f.readlines()# 将类别15替换为类别9new_lines = [modify_line(line) for line in lines]# 覆盖原来的txt文件内容with open(os.path.join(folder_path, txt_file), 'w') as f:f.writelines(new_lines)def modify_line(line):#只需要改变标签所在位置class_id, *values = line.split()if class_id == '15':class_id = '0'new_line = class_id + " " + " ".join(values) + "\n"return new_lineif __name__ == "__main__":label_file = "label_file"#写你存放label的位置modify_labels(label_file)
labelimg的下载与使用
可以直接到github上下载
- 下载完成后用编译软件(pycharm)打开其中的labelimg.py即可
注:若缺失库则需要在此环境下进行pip安装即可。 - 运行后的界面如下,选择好文件位置即可进行标注。
- 若要改变某一类别拉框的颜色,例如第一个类别,则到
labelImg-master/libs/utils.py
文件中的generate_color_by_text
函数中进行修改: