YOLOv5--利用labelimg标注数据集

前言:

        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‘

参考文献:

YOLOv5入门实践(2)——手把手教你利用labelimg标注数据集

### 如何使用 LabelImg 进行 YOLOv8 数据集标注 LabelImg 是一款广泛使用的图像标注工具,支持多种格式导出标注文件。对于 YOLOv8 的数据集准备,可以通过以下方法完成标注工作。 #### 安装 LabelImg 工具 首先需要安装 LabelImg 工具。推荐通过 `pip` 或者源码编译的方式进行安装。以下是 pip 安装命令: ```bash pip install labelimg ``` 如果希望通过 Anaconda 环境管理依赖项,则可以按照以下方式进行安装: ```bash conda install pyqt=5 conda install -c anaconda lxml pip install labelimg ``` 启动工具时运行以下命令即可打开图形界面: ```bash labelimg ``` --- #### 使用 LabelImg 创建标注 1. **加载图片** 打开 LabelImg 后,点击左上角菜单栏中的 “Open Dir”,选择包含待标注图片的目录;再点击 “Change Save Dir” 设置保存标注文件的位置[^2]。 2. **设置标签列表** 在顶部菜单中找到并点击 “Pref”(Preferences),弹出配置窗口后勾选 “Create PASCAL VOC .xml”。接着切换到 “Labels” 部分,手动输入目标类别的名称,或者导入预先写好的 `.names` 文件作为标签集合[^3]。 3. **绘制边界框** 对每一张图片逐一操作:先用鼠标拖拽画矩形区域覆盖感兴趣的目标对象,随后从下拉菜单里挑选对应的类别名赋予该 bounding box。完成后按快捷键 Ctrl+S 存储当前进度至本地磁盘为 XML 格式的描述文档。 4. **转换成 YOLO 格式** 默认情况下,LabelImg 输出的是 Pascal VOC 格式的 xml 文件。为了适配 YOLOv8 输入需求,需借助额外脚本来实现批量转化任务。下面给出一段 Python 脚本用于自动化此过程: ```python import os from xml.etree import ElementTree as ET def convert(size, box): dw = 1./size[0] dh = 1./size[1] x = (box[0] + box[1])/2.0 y = (box[2] + box[3])/2.0 w = abs(box[1] - box[0]) h = abs(box[3] - box[2]) x = round(x*dw, 6) w = round(w*dw, 6) y = round(y*dh, 6) h = round(h*dh, 6) return (x,y,w,h) def main(): classes = ["your_class_name"] # 替换为你自己的分类名字 for file in os.listdir("./Annotations"): if not file.endswith(".xml"): continue tree = ET.parse(f"./Annotations/{file}") root = tree.getroot() size = root.find('size') width = int(size.find('width').text) height = int(size.find('height').text) filename = f"{os.path.splitext(file)[0]}.txt" with open(os.path.join("labels", filename), 'w') as out_file: for obj in root.iter('object'): cls = obj.find('name').text if cls not in classes: continue bndbox = obj.find('bndbox') bbox = ( float(bndbox.find('xmin').text), float(bndbox.find('xmax').text), float(bndbox.find('ymin').text), float(bndbox.find('ymax').text)) bb = convert((width,height),bbox) class_id = classes.index(cls) out_str = f"{class_id} {bb[0]} {bb[1]} {bb[2]} {bb[3]}" out_file.write(out_str+'\n') if __name__ == "__main__": main() ``` 上述代码会读取所有的 XML 文件并将它们转化为 YOLO 文本格式存储于指定路径下的 labels 文件夹之中。 --- #### 注意事项 - 如果仅有一个类别,可以在偏好设置中启用默认标签选项来减少重复劳动量。 - 记得调整上面提到的 `classes` 列表以匹配实际项目里的物体种类定义情况。 - 当前示例假设所有原始标注位于 Annotations 目录而最终结果应放置在 labels 下面,请依据个人环境做相应修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值