关于labelimg使用的坑

本文讲述了如何解决LabelImg中的闪退问题,标签顺序调整,以及XML与TXT格式之间的转换,重点在于Yolo模式下的操作和VOC模式训练的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.闪退问题

进入虚拟环境再打开labelimg即可

2.标签乱序

yolo模式的情况

1.进入labelimg文件夹

 

2.将该文件修改为你所需的标签(记住此处顺序!三者从上至下分别为0 1 2)

 3.打开labelimg后,选择图片文件夹,及保存文件夹,选择yolo模式,打开自动保存

图片文件夹和保存文件夹,分别命名为images,labels

 

 4.打开labels文件夹,新建一classes.txt文件,填写标签信息,如之前顺序一样

(从上至下分别为0 1 2)

 5.开始标注,w标注,标注完第一张后,检查labels文件夹内对应文件

这里开头的0 1 2即代表标签信息,后面为标签框坐标

若要修改标签,在txt文件内修改!不要在labelimg内修改,很容易出错

6.在yolo训练时,yaml文件内标签名也要与上述两个标签名顺序一致,否则训练结果会混乱 

7.最后还是建议使用voc模式训练

 3.xml与txt互转

xml转txt

记得修改类别及路径,路径使用绝对路径

参考链接:python批量实现labelImg标注的 xml格式数据转换成 txt格式保存_labelimg保存txt_深度学习菜鸟的博客-CSDN博客

# -*- coding: utf-8 -*-
import os
import xml.etree.ElementTree as ET

dirpath = 'raw_data/xml_raw'  # 原来存放xml文件的目录
newdir = 'raw_data/txt'                # 修改label后形成的txt目录

if not os.path.exists(newdir):
    os.makedirs(newdir)

dict_info = {'1': 0, '2': 1, '0': 2}              # 有几个 属性 填写几个label names

for fp in os.listdir(dirpath):
    if fp.endswith('.xml'):
        root = ET.parse(os.path.join(dirpath, fp)).getroot()

        xmin, ymin, xmax, ymax = 0, 0, 0, 0
        sz = root.find('size')
        width = float(sz[0].text)
        height = float(sz[1].text)
        filename = root.find('filename').text
        for child in root.findall('object'):  # 找到图片中的所有框

            sub = child.find('bndbox')  # 找到框的标注值并进行读取
            label = child.find('name').text
            label_ = dict_info.get(label)
            if label_:
                label_ = label_
            else:
                label_ = 0
            xmin = float(sub[0].text)
            ymin = float(sub[1].text)
            xmax = float(sub[2].text)
            ymax = float(sub[3].text)
            try:  # 转换成yolov3的标签格式,需要归一化到(0-1)的范围内
                x_center = (xmin + xmax) / (2 * width)
                x_center = '%.6f' % x_center
                y_center = (ymin + ymax) / (2 * height)
                y_center = '%.6f' % y_center
                w = (xmax - xmin) / width
                w = '%.6f' % w
                h = (ymax - ymin) / height
                h = '%.6f' % h
            except ZeroDivisionError:
                print(filename, '的 width有问题')
            with open(os.path.join(newdir, fp.split('.xml')[0] + '.txt'), 'a+') as f:
                f.write(' '.join([str(label_), str(x_center), str(y_center), str(w), str(h) + '\n']))
print('ok')

 txt转xml

记得修改类别

from xml.dom.minidom import Document
import os
import cv2


def makexml(txtPath, xmlPath, picPath):  # txt所在文件夹路径,xml文件保存路径,图片所在文件夹路径
    """此函数用于将yolo格式txt标注文件转换为voc格式xml标注文件

    在自己的标注图片文件夹下建三个子文件夹,分别命名为picture、txt、xml
    """
    dic = {'0': "C_1",  # 创建字典用来对类型进行转换
           '1': "B_5",  # 此处的字典要与自己的classes.txt文件中的类对应,且顺序要一致
           '2': "A_10",
           }
    files = os.listdir(txtPath)
    for i, name in enumerate(files):
        xmlBuilder = Document()
        annotation = xmlBuilder.createElement("annotation")  # 创建annotation标签
        xmlBuilder.appendChild(annotation)
        txtFile = open(txtPath + name)
        txtList = txtFile.readlines()
        img = cv2.imread(picPath + name[0:-4] + ".jpg")
        Pheight, Pwidth, Pdepth = img.shape

        folder = xmlBuilder.createElement("folder")  # folder标签
        foldercontent = xmlBuilder.createTextNode("driving_annotation_dataset")
        folder.appendChild(foldercontent)
        annotation.appendChild(folder)  # folder标签结束

        filename = xmlBuilder.createElement("filename")  # filename标签
        filenamecontent = xmlBuilder.createTextNode(name[0:-4] + ".jpg")
        filename.appendChild(filenamecontent)
        annotation.appendChild(filename)  # filename标签结束

        size = xmlBuilder.createElement("size")  # size标签
        width = xmlBuilder.createElement("width")  # size子标签width
        widthcontent = xmlBuilder.createTextNode(str(Pwidth))
        width.appendChild(widthcontent)
        size.appendChild(width)  # size子标签width结束

        height = xmlBuilder.createElement("height")  # size子标签height
        heightcontent = xmlBuilder.createTextNode(str(Pheight))
        height.appendChild(heightcontent)
        size.appendChild(height)  # size子标签height结束

        depth = xmlBuilder.createElement("depth")  # size子标签depth
        depthcontent = xmlBuilder.createTextNode(str(Pdepth))
        depth.appendChild(depthcontent)
        size.appendChild(depth)  # size子标签depth结束

        annotation.appendChild(size)  # size标签结束

        for j in txtList:
            oneline = j.strip().split(" ")
            object = xmlBuilder.createElement("object")  # object 标签
            picname = xmlBuilder.createElement("name")  # name标签
            namecontent = xmlBuilder.createTextNode(dic[oneline[0]])
            picname.appendChild(namecontent)
            object.appendChild(picname)  # name标签结束

            pose = xmlBuilder.createElement("pose")  # pose标签
            posecontent = xmlBuilder.createTextNode("Unspecified")
            pose.appendChild(posecontent)
            object.appendChild(pose)  # pose标签结束

            truncated = xmlBuilder.createElement("truncated")  # truncated标签
            truncatedContent = xmlBuilder.createTextNode("0")
            truncated.appendChild(truncatedContent)
            object.appendChild(truncated)  # truncated标签结束

            difficult = xmlBuilder.createElement("difficult")  # difficult标签
            difficultcontent = xmlBuilder.createTextNode("0")
            difficult.appendChild(difficultcontent)
            object.appendChild(difficult)  # difficult标签结束

            bndbox = xmlBuilder.createElement("bndbox")  # bndbox标签
            xmin = xmlBuilder.createElement("xmin")  # xmin标签
            mathData = int(((float(oneline[1])) * Pwidth + 1) - (float(oneline[3])) * 0.5 * Pwidth)
            xminContent = xmlBuilder.createTextNode(str(mathData))
            xmin.appendChild(xminContent)
            bndbox.appendChild(xmin)  # xmin标签结束

            ymin = xmlBuilder.createElement("ymin")  # ymin标签
            mathData = int(((float(oneline[2])) * Pheight + 1) - (float(oneline[4])) * 0.5 * Pheight)
            yminContent = xmlBuilder.createTextNode(str(mathData))
            ymin.appendChild(yminContent)
            bndbox.appendChild(ymin)  # ymin标签结束

            xmax = xmlBuilder.createElement("xmax")  # xmax标签
            mathData = int(((float(oneline[1])) * Pwidth + 1) + (float(oneline[3])) * 0.5 * Pwidth)
            xmaxContent = xmlBuilder.createTextNode(str(mathData))
            xmax.appendChild(xmaxContent)
            bndbox.appendChild(xmax)  # xmax标签结束

            ymax = xmlBuilder.createElement("ymax")  # ymax标签
            mathData = int(((float(oneline[2])) * Pheight + 1) + (float(oneline[4])) * 0.5 * Pheight)
            ymaxContent = xmlBuilder.createTextNode(str(mathData))
            ymax.appendChild(ymaxContent)
            bndbox.appendChild(ymax)  # ymax标签结束

            object.appendChild(bndbox)  # bndbox标签结束

            annotation.appendChild(object)  # object标签结束

        f = open(xmlPath + name[0:-4] + ".xml", 'w')
        xmlBuilder.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')
        f.close()


makexml("D:/A_coin/yolov5-master/CoinData/labels/", "D:/A_coin/yolov5-master/CoinData/xml/",
        "D:/A_coin/yolov5-master/CoinData/Images/")  # txt所在文件夹路径,xml文件保存路径,图片所在文件夹路径


# if __name__ == "__main__":
#     picPath = "D:/A_coin/yolov5-master/CoinData/Images/"  # 图片所在文件夹路径,后面的\\一定要带上
#     txtPath = "D:/A_coin/yolov5-master/CoinData/labels/"  # txt所在文件夹路径,后面的\\一定要带上
#     xmlPath = "D:/A_coin/yolov5-master/CoinData/xml/"  # xml文件保存路径,后面的\\一定要带上
#     makexml(picPath, txtPath, xmlPath)

### 使用YOLOv8实现道路洞检测 #### 数据准备 为了训练YOLOv8模型用于道路洞检测,首先需要收集并标注相关数据集。通常情况下,可以使用工具如LabelImg或Roboflow来创建带有边界框的标注文件。这些标注文件应遵循COCO或VOC格式,并存储为`.json`或`.txt`文件[^2]。 #### 环境配置 安装必要的依赖库以支持YOLOv8的运行。可以通过以下命令安装 Ultralytics 库,这是官方维护的 YOLOv8 的 Python 软件包: ```bash pip install ultralytics ``` 此软件包包含了训练、验证和推理所需的全部功能模块[^1]。 #### 训练过程 假设已准备好数据集并将路径设置好,下面是如何启动训练的过程。通过定义一个 YAML 文件指定数据结构和类别信息,例如 `dataset.yaml`: ```yaml train: ./data/train/images/ val: ./data/valid/images/ nc: 1 names: ['pothole'] ``` 接着,在终端执行如下命令开始训练自定义模型: ```bash yolo train model=yolov8n.pt data=dataset.yaml epochs=100 imgsz=640 ``` 这里选用的是预训练权重 `yolov8n.pt`(小型版本)。根据具体需求可以选择其他变体如 `yolov8s`, `yolov8m` 或者加载之前提到的个人训练完成后的 `.pt` 权重文件。 #### 测试与评估 当训练完成后,利用测试集评估模型性能。同样借助 Ultralytics 提供的功能来进行预测操作: ```python from ultralytics import YOLO model = YOLO('./runs/train/exp_1000/weights/best.pt') results = model('./test/image.jpg') for result in results: boxes = result.boxes.xyxy.cpu().numpy() # 获取边界框坐标 ``` 上述脚本展示了如何载入最佳模型并对单张图片实施推断,提取出所有检测到的目标位置。 #### 部署应用 最后一步就是把经过良好调参后的模型集成至实际应用场景当中去。考虑到 YOLOv8 对硬件资源的有效管理特性,无论是嵌入式装置还是云端服务器都能顺利承载该解决方案。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值