获取FasterRcnn训练集VOC2007的宽高宽高比等信息

本文分享了在使用Fasterrcnn进行自定义数据集训练时遇到的问题及解决方案,详细记录了调整图片尺寸比例以避免训练错误的过程,为面临类似挑战的研究者提供宝贵经验。

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

背景:
用Faster rcnn 在进行自己做数据集训练的时候,很坎坷,十分受挫,碰到问题之后在github上找答案,也有碰到相同问题的人,他们说改了某个或某些参数或者几行代码后,就好了,我也照着改可能开始训练,但是训练几百次以后还会报错或进入pdb,主要有两个问题

  1. bg_inds.size和fg_inds.size都是零,导致代码进入了断点
  2. 发起异常ValueError: attempt to get argmax of an empty sequence
    后来,我看见有人说,图片不能太宽,不能太高,宽高比要在一定范围内,不能太大也不能太小,但是没有给出具体范围,所以我写了一个脚本来获取这些信息:读取文件夹“\data\VOCDevkit2007\VOC2007\Annotations”下面的xml文件,获取各种信息的最大值和最小值。得到的结果如下
    | 图片最大宽度 | 500 |
    | 图片最大高度 | 500 |
    | 图片最大宽高比 | 3.29 |
    | 图片包含的最大标记数 | 41 |
    | 图片包含的标记的最大类别数 | 6 |
    | 图片最小宽度 | 148|
    | 图片最小高度 | 139 |
    | 图片最小宽高比 | 0.34 |
    | 图片包含的最小标记数 | 1 |
    | 图片包含的标记的最小类别数 | 1 |
    | 标记最大宽度 | 500 |
    | 标记最大高度 | 500 |
    | 标记最大宽高比 | 12.77 |
    | 图片宽度和标记宽度的最大比值 | 100 |
    | 图片高度和标记高度的最大比值 | 62.5 |
    | 标记最小宽度 | 5|
    | 标记最小高度 | 6|
    | 标记最小宽高比 | 0.06 |
    | 图片宽度和标记宽度的最小比值 | 1.0|
    | 图片高度和标记高度的最小比值 | 1.0 |

源代码如下

import xmltodict,json,os

#根据文件夹目录,把xml文件标记信息的一些最大最小值输出
#输出结果是一个列表,列表有四个元素,每个元素又是一个列表
#第一个列表包含 图片的最大宽度,图片的最大高度,图片的最大宽高比,图片包含的最大标记数,图片包含的标记的最大类别数
#第二个列表包含 图片的最小宽度,图片的最小高度,图片的最小宽高比,图片包含的最小标记数,图片包含的标记的最小类别数
#第三个列表包含 标记的最大宽度,标记的最大高度,标记的最大宽高比,图片宽度和标记宽度的最大比值,图片高度和标记高度的最大比值
#第四个列表包含 标记的最小宽度,标记的最小高度,标记的最小宽高比,图片宽度和标记宽度的最小比值,图片高度和标记高度的最小比值
def get_folder_info(folder_path):
    files = os.listdir(folder_path)
    for fname in files:
        file_path = os.path.join(folder_path,fname)
        if fname == files[0]:
            res = get_info_from_xml(file_path)
            result = [res[:5],res[:5],res[5],res[6]]
            # print(result)
        else:
            res = get_info_from_xml(file_path)
            result1 = [res[:5],res[:5],res[5],res[6]]
            # print(result1)
            for i in range(len(result)):
                if i == 0 or i == 2:
                    for j in range(len(result[i])):
                        if result[i][j] < result1[i][j]:
                            result[i][j] = result1[i][j]
                if i == 1 or i == 3:
                    for j in range(len(result[i])):
                        if result[i][j] > result1[i][j]:
                            result[i][j] = result1[i][j]
    print(result)

#根据xml文件的路径,获取以下信息
#图片的宽度,图片的高度,图片的宽高比,图片包含的标记数,图片包含的标记的类别数
#标记的最大宽度,标记的最大高度,标记的最大宽高比,图片宽度和标记宽度的最大比值,图片高度和标记高度的最大比值
#标记的最小宽度,标记的最小高度,标记的最小宽高比,图片宽度和标记宽度的最小比值,图片高度和标记高度的最小比值
def get_info_from_xml(file_path):
    d = trans_xml_to_dict(file_path)
    info = get_pic_info_from_dict(d)
    return info

#把XML文件转换成字典
def trans_xml_to_dict(file_path):
    with open(file_path,'r') as f:
        xml_str = f.read()
    d = xmltodict.parse(xml_str)
    j = json.dumps(d)
    r = json.loads(j)
    return r

#从字典里把文件信息提取
#图片的宽度,图片的高度,图片的宽高比,图片包含的标记数,图片包含的标记的类别数
#标记的最大宽度,标记的最大高度,标记的最大宽高比,图片宽度和标记宽度的最大比值,图片高度和标记高度的最大比值
#标记的最小宽度,标记的最小高度,标记的最小宽高比,图片宽度和标记宽度的最小比值,图片高度和标记高度的最小比值
def get_pic_info_from_dict(d):
    a = d['annotation']
    pic_size = a['size']
    objects = a['object']

    w = int(pic_size['width'])
    h = int(pic_size['height'])
    wtoh = round(w/h,2)

    if type(objects) is list:
        lable_class_set = set()
        label_number = len(objects)
        max_list = get_obj_info(objects[0],w,h)[1:]
        min_list = get_obj_info(objects[0],w,h)[1:]
        for obj in objects:
            res_list = get_obj_info(obj,w,h)
            lable_class_set.add(res_list[0])
            res_list = res_list[1:]
            for i in range(len(max_list)):
                if max_list[i]<res_list[i]:
                    max_list[i] = res_list[i]
                if min_list[i]>res_list[i]:
                    min_list[i] = res_list[i]
        lable_class_number = len(lable_class_set)
    else:
        label_number = 1
        lable_class_number = 1
        max_list = get_obj_info(objects,w,h)[1:]
        min_list = get_obj_info(objects,w,h)[1:]
    return [w,h,wtoh,label_number,lable_class_number,max_list,min_list]

#获取每个标记的信息
#标记的名字,标记的宽度,标记的高度,标记的宽高比,图片宽度和标记宽度的比值,图片高度和标记高度的比值
def get_obj_info(obj,pic_w,pic_h):
    name = obj['name']
    pts = obj['bndbox']
    w = int(pts['xmax']) - int(pts['xmin']) +1
    h = int(pts['ymax']) - int(pts['ymin']) +1 
    wtoh = round(w / h,2)
    wtow = round(pic_w/w,2)
    htoh = round(pic_h/h,2)
    return [name,w,h,wtoh,wtow,htoh]

if __name__=='__main__':
    # i = get_info_from_xml(r'D:\FasterRcnn\FasterRcnn\Faster-RCNN-TensorFlow-Python3.5-master\data\VOCDevkit2007\VOC2007\Annotations\004953.xml')
    # print(i)

    get_folder_info(r'D:\FasterRcnn\FasterRcnn\Faster-RCNN-TensorFlow-Python3.5-master\data\VOCdevkit\VOC2007\Annotations')

运行之后得到结果

C:\ProgramData\Anaconda3\python.exe D:/code/logo/pic_infos/get_voc_info.py
[[500, 500, 3.29, 41, 6], [148, 139, 0.34, 1, 1], [500, 500, 12.77, 100.0, 62.5], [5, 6, 0.06, 1.0, 1.0]]

Process finished with exit code 0

后续会把自己的数据集按照这些边界值进行调整,然后再试着训练

### 计算与可视化街道比的方法 在 ArcGIS 中计算和可视化街道的比涉及多个步骤,主要包括获取必要的输入数据、处理这些数据以及最终实现可视化的操作。以下是具体方法: #### 1. 输入数据准备 要计算街道的比,需要以下两类主要数据: - **街道几何数据**:表示街道中心线或边界的数据集,通常可以从 OpenStreetMap 或其他地理信息系统中获得。 - **建筑物度数据**:可以通过 LiDAR 数据或其他遥感技术提取建筑物的信息。 将这两类数据加载到 ArcGIS 中,并确保它们具有相同的坐标系以便后续分析[^1]。 #### 2. 街道计算 对于街道度的计算,可以采用如下方式之一: - 如果有详细的街道边界数据,则可以直接测量两侧边界的距离作为街道度。 - 若仅有街道中心线数据,可利用缓冲区工具创建一定范围的街道区域来近似估计其度。例如,在 `Analysis Tools` 下选择 `Buffer` 功能,设置合理的缓冲半径并将其乘以二得到总度[^2]。 ```python import arcpy # 设置工作空间 arcpy.env.workspace = r"C:\path\to\your\data.gdb" # 创建缓冲区 input_roads = "roads" output_buffer = "buffered_roads" distance = "5 Meters" # 假设此值为单侧缓冲距离 arcpy.Buffer_analysis(input_roads, output_buffer, distance) ``` #### 3. 获取建筑物平均度 针对每一段街道上的所有相邻建筑物,求取它们的平均度作为该路段对应部分的建筑度代表值。这一步骤可通过空间联接完成——即将建筑物图层与街道图层关联起来,再运用字段计算器得出所需指标[^1]。 ```sql -- SQL 查询示例 (假设已建立关系表 buildings_around_streets) SELECT street_id, AVG(building_height) AS avg_building_height FROM buildings_around_streets GROUP BY street_id; ``` #### 4. 计算 一旦获得了各条道路上对应的平均建筑度及估算出来的街道度之后,就可以轻松地通过简单的除法运算得出各自的比率了。可以在属性表格里新增一列专门存储这个数值结果。 ```vbnet ' 使用Field Calculator表达式 Dim height As Double = [AVG_Building_Height] Dim width As Double = [Calculated_Width] [Height_to_Width_Ratio] = height / width ``` #### 5. 可视化展示 最后一步就是把刚才所得到的结果呈现出来供人们直观理解。可以选择不同的颜色渐变方案或者分类分级办法来区分不同等级别的比情况;也可以制作三维模型更生动形象地表现出实际效果。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值