faster_rcnn锚框生成与原理

锚框的生成是RPN区域建议网络必要的组成部分,文章引自

RPN(区域生成网络)-CSDN博客 

通过一个3*3的卷积核对输入特征进行卷积,不改变输入特征的长宽,只改变通道数,卷积操作之后,输出的每一个特征点都会映射k个锚框

 这个k是怎么来的呢,每个像素点对应原图的一个框,这个框需要进行预测,他应该长什么样子,所以设定k个框来对应这个锚点,并通过分类来判断这个框是前景还是背景,然后通过回归对锚框进行优化。用代码来实现一下,代码摘自faster Rcnn

导入numpy

import numpy as np

这里会有一个base_size,原始大小,生成base_anchor

定义生成框(总的),这段代码首先利用base_size生成base_anchor,是一个[0,0,15,15],之后生成一个以基础框长宽比生成的锚框,之后通过结合以尺度生成的锚框来得出最终的锚框

def generate_anchors(base_size=16, ratios=[0.5, 1, 2], scales=2**np.arange(3,6)):
    base_anchor = np.array([1, 1, base_size, base_size]) - 1
    ratio_anchors = _ratio_enum(base_anchor, ratios)
    # 下面是用来生成一组锚点,这是将锚框长宽比与尺度结合起来
    anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)
                         for i in range(ratio_anchors.shape[0])])

    return anchors

定义长宽比锚框

def _ratio_enum(anchor, ratios):

    w, h, x_ctr, y_ctr = _whctrs(anchor)
    # 原始锚框的面积
    size = w * h
    # 计算指定比例的面积,有三个[0.5,1,2]
    size_ratios = size / ratios
    # round是四舍五入到指定的位数,开根号相当于长×宽开根号得出宽
    ws = np.round(np.sqrt(size_ratios))
    # 宽乘以长宽比
    hs = np.round(ws * ratios)
    # 生成锚点坐标,锚框坐标,左上角和右下角,生成一个[左上x1,左上y1,右下x1右下y1],[左上x2,左上y2,右下x2,右下y2]
    # [左上x3,左上y3,右下x3,右下y3],[左上x4,左上y4,右下x4,右下y4],这是一个尺度的
    anchors = _mkanchors(ws, hs, x_ctr, y_ctr)
    return anchors

定义获取中心点坐标

def _whctrs(anchor):
    """
    return width, height, x_center, y_center for an anchor(window)
    w:长度减去对应的x坐标,再加1
    h:宽度减去对应的y坐标,再加1
    x_ctr:将锚点的起始坐标加上宽度的一半减去0.5就是下面的额公式
    """
    w = anchor[2] - anchor[0] + 1
    h = anchor[3] - anchor[1] + 1
    x_ctr = anchor[0] + 0.5 * (w - 1)
    y_ctr = anchor[1] + 0.5 * (h - 1)
    return w, h, x_ctr, y_ctr

定义生成单个锚框

def _mkanchors(ws, hs, x_ctr, y_ctr):
    ws = ws[:, np.newaxis]
    # 转换为二维数组,或列向量,是一列的向量
    hs = hs[:, np.newaxis]
    # hstack用于水平堆叠数组,锚点四个坐标,左上角x,y坐标,右下角x,y坐标
    anchors = np.hstack((x_ctr - 0.5 * (ws - 1),
                         y_ctr - 0.5 * (hs - 1),
                         x_ctr + 0.5 * (ws - 1),
                         y_ctr + 0.5 * (hs - 1)))
    return anchors

定义尺度生成的锚框

def _scale_enum(anchor, scales):
    """
    尺度就是面积
    根据给定的锚点和尺度,为每个尺度生成一组新的锚点(锚框)
    """
    w, h, x_ctr, y_ctr = _whctrs(anchor)
    # scales = [scale1,scale2,scale3]
    #宽的尺度大小,[w*scale1,h*scale1],[w*scale2,h*scale2],[w*scale3,h*scale3]
    ws = w * scales
    # 高的尺度大小
    hs = h * scales
    # 得出三个尺度大小的锚框坐标,上面得出三个长宽比大小的锚框,最后这两个结合在一起
    anchors = _mkanchors(ws, hs, x_ctr, y_ctr)
    return anchors

主函数

if __name__ == '__main__':
    import time
    # 获取当前时间
    t = time.time()
    a = generate_anchors()
    # 打印生成的时间
    print(time.time() - t)
    print(a)

打印

<think>好的,我现在需要帮助用户解决运行Faster R-CNN训练脚本时遇到的问题。用户提到了错误或者对用法不太清楚,所以我要详细分析可能的情况。 首先,用户提供的命令是python tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_didi.py,这可能涉及到配置文件的路径是否正确。我需要检查用户是否在正确的项目目录下运行命令,比如MMDetection架通常需要从根目录执行。如果用户在其他目录下运行,可能会找不到配置文件或依赖文件。 然后,配置文件faster_rcnn_r50_fpn_1x_didi.py是否存在?用户可能没有正确设置配置文件,或者文件路径有误。比如,如果用户的项目结构中没有configs目录,或者该目录下没有相应的配置文件,就会出错。需要建议用户确认文件路径,并检查_base_中的引用是否正确,比如是否有../_base_/models/faster_rcnn_r50_fpn.py这样的引用,这些基础文件是否存在。 接下来,用户可能缺少依赖库。MMDetection需要PyTorch、CUDA等环境。如果用户没有正确安装这些依赖,或者版本不匹配,会导致运行错误。建议用户检查requirements.txt,确保所有依赖已安装,并确认CUDA版本PyTorch兼容。 数据集的配置也是常见的问题。用户提到的didi_detection.py可能是指自定义的数据集,需要检查数据集路径是否正确,标注文件是否存在,数据格式是否符合要求。例如,COCO格式的数据集需要特定的目录结构和json文件。 GPU资源问题也可能导致错误。如果用户没有可用的GPU,或者显存不足,训练脚本可能会崩溃。建议用户使用--gpu-id参数指定GPU,或者调整batch size以减少显存占用。 日志和错误信息是关键。用户需要查看终端输出的错误信息,或者日志文件,比如work_dirs中的日志,来定位具体问题。常见的错误包括导入错误、文件未找到、CUDA内存不足等。 另外,用户可能需要了解如何继续训练、多GPU训练或者指定工作目录。比如,使用--resume-from参数继续训练,或者--work-dir指定输出目录。多GPU训练可以通过工具如分布式训练脚本启动。 最后,建议用户参考提供的引用中的示例命令,比如引用[1]和引用[2],里面提到了类似的训练命令,可能帮助用户正确执行。同时,可以提示用户进行FPS测试,如引用[3]中的方法,来验证模型性能。 总结可能的问题点:路径错误、依赖缺失、数据集配置、GPU问题、参数使用。需要逐步引导用户检查这些方面,并提供相应的解决方法和示例命令。</think>根据引用[1][2]提供的训练命令及配置信息,运行Faster R-CNN训练脚本的正确步骤如下: ### 一、基础执行命令 ```bash # 单GPU训练 python tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_didi.py --work-dir work_dirs/faster_rcnn # 多GPU训练(例如8卡) bash tools/dist_train.sh configs/faster_rcnn/faster_rcnn_r50_fpn_1x_didi.py 8 --work-dir work_dirs/faster_rcnn ``` 参数说明: - `--work-dir`指定模型和日志保存路径[^2] - 配置文件`faster_rcnn_r50_fpn_1x_didi.py`需包含正确的_base_配置链[^2] ### 二、常见问题排查 1. **路径错误** - 确认在项目根目录执行命令 - 检查配置文件中的`_base_`路径是否正确: ```python # faster_rcnn_r50_fpn_1x_didi.py _base_ = [ '../_base_/models/faster_rcnn_r50_fpn.py', # 模型结构 '../_base_/datasets/didi_detection.py', # 数据集配置 '../_base_/schedules/schedule_1x.py', # 训练策略 '../_base_/default_runtime.py' # 运行时配置 ] ``` 2. **依赖缺失** ```bash # 安装必要依赖 pip install -r requirements.txt # 确认CUDAPyTorch版本匹配 nvidia-smi # 查看CUDA版本 ``` 3. **数据集配置** - 检查`didi_detection.py`中的路径: ```python data = dict( train=dict( img_prefix='data/didi/train/', ann_file='data/didi/annotations/train.json'), val=dict( img_prefix='data/didi/val/', ann_file='data/didi/annotations/val.json')) ``` 4. **GPU资源问题** ```bash # 指定单卡训练 python tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_didi.py --gpu-id 0 # 减少batch_size防止OOM sed -i 's/samples_per_gpu=2/samples_per_gpu=1/g' configs/faster_rcnn/faster_rcnn_r50_fpn_1x_didi.py ``` ### 三、进阶用法 1. **恢复训练** ```bash python tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_didi.py \ --resume-from work_dirs/faster_rcnn/latest.pth ``` 2. **性能验证** ```bash # 训练完成后测试FPS(需修改路径) python tools/analysis_tools/benchmark.py \ configs/faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py \ work_dirs/faster_rcnn/epoch_12.pth \ --fuse-conv-bn ``` 引用[3]展示了基准测试的标准方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值