目标检测——GDXray数据集转为YOLO格式

关于该数据集的介绍可以看我写的另一篇博客:链接

论文题目:《GDXray: The Database of X-ray Images for Nondestructive Testing》
论文链接:https://link.springer.com/article/10.1007/s10921-015-0315-7

Github链接  https://github.com/computervision-xray-testing/GDXray/blob/main/README.md

以GDXray的Baggages为例,其原数据集下载下来如下所示:

 

 其中每个文件夹里都有ground_truth.txt,即坐标框相关的信息,ground_truth.txt内容如下:

 知道了每个数字对应的含义,接下来的任务就简单了,因此只需要针对相同的ID创建同样的TXT的Label,并且对应图片的ID名即可,参考代码如下:
注:该代码仅是针对一组图片的,所有的图片都需转换的话再套一个循环即可!

import os


def map_number_to_filename(dir_name, number):
    """
    将数字映射为特定的文件名格式。

    参数:
    - number: 一个浮点数,表示映射的键。

    返回:
    - str: 按照给定格式映射后的文件名。
    """


    # 将浮点数转换为字符串,并去掉不必要的小数点和之后的所有0
    number_str = format(number, '.0f')
    
    # 将字符串格式化为至少4位的数字,不足部分前面补0
    number_str_padded = number_str.zfill(4)
    
    # 构造文件名
    img_name = f"{dir_name}_{number_str_padded}.png"
    label_name = f"{dir_name}_{number_str_padded}.txt"

    
    return label_name, img_name


import cv2

def get_image_dimensions(image_path, pos_list):
    """
    使用OpenCV获取指定图片文件的宽度和高度。
    
    参数:
    - image_path: 图片文件的路径。
    
    返回:
    - (width, height): 图片的宽度和高度的元组。
    """
    templist = []
    # 使用cv2.imread读取图片,0表示以原始格式读取
    image = cv2.imread(image_path, 0)
    
    # 检查图片是否正确读取
    if image is None:
        raise FileNotFoundError(f"The image at path {image_path} could not be found or is not a valid image file.")
    
    # 图片的尺寸可以通过image.shape属性获取,它返回一个三元组(height, width, channels)
    height, width = image.shape[:2]

    b_w = float(pos_list[1]) - float(pos_list[0])
    b_h = float(pos_list[3]) - float(pos_list[2])
    b_x = (float(pos_list[0]) + float(pos_list[1]))/2.0
    b_y = (float(pos_list[2]) + float(pos_list[3]))/2.0

    x = float(b_x)/width
    y = float(b_y)/height
    w = float(b_w)/width
    h = float(b_h)/height
    
    templist.append(x)
    templist.append(y)
    templist.append(w)
    templist.append(h)
    return templist


if __name__ == "__main__":
    dir_path = r"F:\BaiduNetdiskDownload\DataSet\GDXray\Baggages\Baggages\B0001"
    dir_basename = os.path.basename(dir_path)
    ground_truth_txt = os.path.join(dir_path,'ground_truth.txt')
    save_txt_dir = os.path.join(os.path.dirname(dir_path), f"YOLO_{dir_basename}")
    if not os.path.exists(save_txt_dir):
        os.makedirs(save_txt_dir)

    f = open(ground_truth_txt,'r',encoding='utf-8')
    contents = f.readlines()

    for content in contents:
        content = content.strip().split("   ")
        filename, img_name = map_number_to_filename(dir_name=dir_basename, number=float(content[0]))
        img_path = os.path.join(dir_path, img_name)
        yolo_pos_list = get_image_dimensions(img_path, pos_list=content[1:])

        save_filename = os.path.join(save_txt_dir,filename)
        f_s = open(save_filename,'a',encoding='utf-8')
        f_s.write("0 ")
        f_s.write(str(yolo_pos_list[0]))
        f_s.write(" ")
        f_s.write(str(yolo_pos_list[1]))
        f_s.write(" ")
        f_s.write(str(yolo_pos_list[2]))
        f_s.write(" ")
        f_s.write(str(yolo_pos_list[3]))
        

拿一组数据集来进行实验,B0001文件夹

运行代码得到: 

进行可视化验证,相关代码如下:链接

 

 

针对于它的类别暂时不知道写什么,但是框的位置没问题了,类别后期确定了根据做个映射就行,完美!!! 

<think>好的,我需要帮助用户寻找与YOLO相关的正方体数据集或训练数据。首先,我应该先理解用户的需求。用户提到“正方体”,也就是立方体,可能是指三维物体检测的数据集,特别是包含立方体的图像数据。YOLO通常用于目标检测,所以用户可能希望找到包含立方体标注的数据集来训练YOLO模型。 接下来,我需要回忆现有的公开数据集中是否有包含立方体的。常见的通用物体检测数据集如COCO、PASCAL VOC可能包含一些立方体形状的物体,比如盒子、箱子等,但可能标注为更通用的类别,如“box”或“package”,而不是明确的“正方体”。用户可能需要更专门的标注,比如形状属性。 然后,我想到工业检测或合成数据集可能更有可能包含正方体。例如,工业场景中的零件检测可能有规则的几何形状。合成数据集如利用3D渲染生成的图像,可以精确控制物体的形状、颜色等属性,适合特定需求。例如,用户提到的引用[3]中提到了语义分割的关键词,包括形状关键词如“方块”、“正方体”,这可能与用户的问题相关,但引用[3]中的数据集信息不明确,需要进一步确认。 用户还提到了UA-DETRAC数据集,但引用[2]中描述的是车辆检测,可能不包含正方体。不过,用户可能需要考虑其他类似的数据集。另外,引用[1]提到标签数据的重要性,强调必须使用带有正确标签的数据集,否则无法训练有效模型,这点需要提醒用户注意。 接下来,可能的解决方案包括:建议用户使用合成数据生成工具(如Blender合成数据生成)创建自定义的正方体数据集,或者寻找现有的工业/几何形状数据集。另外,建议用户检查通用数据集中是否有类似标注,或者通过迁移学习在现有模型基础上微调。 还需要考虑用户是否有特定的应用场景,比如工业检测、教育用途等,这可能会影响数据集的选择。例如,教育中的几何体识别可能需要简单的合成图像,而工业检测可能需要真实环境下的照片。 最后,需要确保回答结构清晰,分步骤建议,并引用相关的参考资料。同时,按照用户的要求,生成相关问题,帮助用户进一步探索。</think>根据您的需求,以下是关于YOLO正方体训练数据的解决方案和建议: ### 一、现有可用数据集分析 1. **通用物体检测数据集(含立方体类别)** - COCO数据集中的"bottle"、"box"类可能包含近似立方体形状物体,但需注意: $$ mAP = \frac{\sum_{c=1}^{C} AP_c}{C} $$ 需要人工筛选和补充标注,可通过[LabelImg](https://github.com/tzutalin/labelImg)工具添加"cube"标签[^1] 2. **工业检测专用数据集** - **GDXray工业零件数据集**包含规则几何体X光图像 - **T-LESS工业物体数据集**包含20类机械零件,其中包含多个立方体结构 3. **合成数据集解决方案** ```python # 使用Blender生成立方体合成数据示例 import bpy for i in range(1000): bpy.ops.mesh.primitive_cube_add(size=2, location=(0,0,0)) # 设置随机材质/光照/背景 # 输出带边界框标注的图片和YOLO格式标签 ``` ### 二、定制化解决方案 1. **数据采集建议参数** | 参数 | 推荐值 | 说明 | |---|---|---| | 分辨率 | ≥1920×1080 | 保证小目标识别 | | 角度覆盖 | 全周天球24方向 | 立体识别需求 | | 光照条件 | 3种以上光照环境 | 提升鲁棒性 | 2. **标注规范建议** - 增加形状属性标注(引用[3]语义分割规范) - 建议同时标注: $$ (x_{center}, y_{center}, width, height, \text{confidence}, \text{class}) $$ 其中class应包含cube及其变种(如破损立方体) ### 三、训练注意事项 1. **YOLO版本选择** - YOLOv8对小物体检测改进显著(较v5提升23% AP@0.5) - 修改anchors设置匹配立方体比例: ```yaml anchors: - [12,16, 19,36, 40,28] # P3/8 - [36,75, 76,55, 72,146] # P4/16 - [142,110, 192,243, 459,401] # P5/32 ``` 2. **数据增强策略** - 推荐使用Mosaic9增强: $$ \text{Image}_{aug} = \bigoplus_{i=1}^9 \text{Image}_i $$ - 添加OpenGL渲染扰动提升泛化性
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张飞飞飞飞飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值