前言:
Labelimg是一个图形图像注释工具。它是用Python编写的,并使用Qt作为其图形界面。注释以PASCAL VOC格式保存为XML文件,这是使用的ImageNet格式。此外,它还支持YOLO格式和 CreateML 格式。本文主要记录利用labelimg标注数据集时所遇到的问题
1、labelimg下载
way1:法1:从官网下载→下载地址:https://github.com/tzutalin/labelImg
way2:如果你和我一样懒就直接网盘下载吧(感谢提供资源的大佬!)
链接:百度网盘 请输入提取码
提取码:j666
注:下载完后记得解压。记得参看其解压后的文件夹内容是否存在嵌套,即labelimg文件夹中还有labelimg文件夹,如下图所示。如果是的话,把最底层的文件夹的内容复制到顶层文件文件,以免后面步骤出错。具体原因参考:安装labelImg时,执行pyrcc5 -o libs/resources.py resources.qrc 报错: File does not exist ‘resources.qrc‘
2、 labelimg的安装
Step1:WIN+R打开终端,依次输入以下指令:
d:
cd [自己的文件位置]
注:d:是自己labelimg所在盘,如在c盘,则输入:c:
Step2:安装 pyqt,本文安装的是pyqt5
conda install pyqt=5
安装完成就是下图这样:
注:(1)由于每个人的电脑配置不一样,安装结果也不一致。本文所参考的文献的 安装结果如下图所示:
(2)如出现:
'conda' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
解决步骤如下:
找到Anaconda安装路径和Scripts路径,两个都添加到添加环境变量:
我的电脑---右键属性---高级系统设置---环境变量---系统变量---Path---双击进入---新建---浏览---找到Anaconda和Scripts的路径添加,然后点击确定就好了。
Step3: 安装完成后,执行命令
pyrcc5 -o libs/resources.py resources.qrc
注: (1)若是出现File does not exist 'resources.qrc',说明在你没有看1、labelimg下载的注释
(2)这个命令没有返回结果。
Step4:打开labelimg
python labelImg.py
运行结果如下:
注:若打开时,出现该报错信息:ModuleNotFoundError: No module named 'lxml',其解决方案:依次输入一下命令:
pip install wheel
pip install lxml
如果在安装时,出现该报错信息: pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.则在每个命令后面添加: -i https://pypi.tuna.tsinghua.edu.cn/simple,其作用是切换镜像源,加速下载,今后遇到类似的情况,可以优先尝试该方法。
3、 labelImg 的使用
Step1:打开labelimg
win+r打开终端,进入到labelimg文件夹所在位置,输入python labelImg.py,即可打开labelimg。如图所示。
Step2:在yolov5目录下新建一个名为VOCData的文件夹
Step3:在VOCData的文件夹内建立Annotations和images文件夹
- Annotations:存放标注的标签文件
- images:存放需要打标签的图片文件
Step4:标注前的设置
(1)将要标注的图片放入images文件夹内,运行软件前可以更改下要标注的类别。
(2)在labelimg的data文件下找到predefined_classes.txt 这个txt文档,在里面输入自定义的类别名称,如下图所示:
Step5: 开始标注
标注前我们先认识一下功能键。如下图所示:
还有view的一些功能键,如下图所示:
常用快捷键如下:
A: 切换到上一张图片
D: 切换到下一张图片
W:调出标注十字架
del : 删除标注框框
Ctrl+u: 选择标注的图片文件夹
Ctrl+r: 选择标注好的label标签存在的文件夹
接下来打开图片,按住鼠标左键就可以标注了。
点击鼠标右键还可以移动选框位置和调整大小。
标签打完以后可以去Annotations 文件下看到标签文件已经保存在这个目录下。
报错信息:
标错1:
QMimeDatabase: Error loading internal MIME data
An error has been encountered at line 1 of <internal MIME data>: Premature end of document.:
Traceback (most recent call last):
File "D:\labelImg-master\labelImg.py", line 1359, in open_dir_dialog
self.import_dir_images(target_dir_path)
File "D:\labelImg-master\labelImg.py", line 1374, in import_dir_images
self.open_next_image()
File "D:\labelImg-master\labelImg.py", line 1429, in open_next_image
self.change_save_dir_dialog()
File "D:\labelImg-master\labelImg.py", line 1309, in change_save_dir_dialog
self.show_bounding_box_from_annotation_file(self.file_path)
File "D:\labelImg-master\labelImg.py", line 1198, in show_bounding_box_from_annotation_file
xml_path = os.path.splitext(file_path)[0] + XML_EXT
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<frozen ntpath>", line 258, in splitext
TypeError: expected str, bytes or os.PathLike object, not NoneType
解决方案:
self.show_bounding_box_from_annotation_file(str(self.file_path))
报错2:在标注时,labelimg可能会出现闪退,此时要在终端参看报错信息,并进行修复。本文在标注时就遇到如下错误:在使用labelimg的框选和label显示功能时,提示canvas.py或者shape.py中drawLine、drawRect、drawText不支持float类型作为参数。
E:\python_test\Visual_Test\labelImg>python labelImg.py
QMimeDatabase: Error loading internal MIME data
An error has been encountered at line 1 of <internal MIME data>: Premature end of document.:
Traceback (most recent call last):
File "E:\python_test\Visual_Test\labelImg\libs\canvas.py", line 530, in paintEvent
p.drawLine(self.prev_point.x(), 0, self.prev_point.x(), self.pixmap.height())
TypeError: arguments did not match any overloaded call:
drawLine(self, l: QLineF): argument 1 has unexpected type 'float'
drawLine(self, line: QLine): argument 1 has unexpected type 'float'
drawLine(self, x1: int, y1: int, x2: int, y2: int): argument 1 has unexpected type 'float'
drawLine(self, p1: QPoint, p2: QPoint): argument 1 has unexpected type 'float'
drawLine(self, p1: Union[QPointF, QPoint], p2: Union[QPointF, QPoint]): argument 1 has unexpected type 'float'
其本质原因是:在较新的PyQt版本中(如PyQt5),QPainter类中的相关draw方法不支持float数据作为参数传递。
解决方案:参考:【labelimg标注图片时float报错问题 完美解决方案】argument 1 has unexpected type ‘float‘