Faster Rcnn 代码解读之 train_val.py

本文详细解读了Faster R-CNN在训练过程中的核心代码train_val.py,涵盖了目标检测模型的训练流程,包括数据预处理、网络架构、损失计算和反向传播等关键步骤。

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

# --------------------------------------------------------
# Tensorflow Faster R-CNN
# Licensed under The MIT License [see LICENSE for details]
# Written by Xinlei Chen and Zheqi He
# --------------------------------------------------------
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from model.config import cfg
import roi_data_layer.roidb as rdl_roidb
from roi_data_layer.layer import RoIDataLayer
from utils.timer import Timer

try:
    import cPickle as pickle
except ImportError:
    import pickle
import numpy as np
import os
import sys
import glob
import time

import tensorflow as tf
from tensorflow.python import pywrap_tensorflow


# Slover的封装类,包含和训练有关的属性和方法
class SolverWrapper(object):
    """
      A wrapper class for the training process
    """

    def __init__(self, sess, network, imdb, roidb, valroidb, output_dir, tbdir, pretrained_model=None):
        self.net = network  # network类的实例
        self.imdb = imdb  # imdb类的实例
        self.roidb = roidb  # roidb字典
        self.valroidb = valroidb  # 验证roidb字典
        self.output_dir = output_dir  # 模型保存路径
        self.tbdir = tbdir  # tensorboard保存路径
        # Simply put '_val' at the end to save the summaries from the validation set
        self.tbvaldir = tbdir + '_val'  # 验证过程的tensorboard保存路径
        if not os.path.exists(self.tbvaldir):
            os.makedirs(self.tbvaldir)
        self.pretrained_model = pretrained_model  # 预训练权重的路径

    # 保存快照,包括模型权重的ckpt文件和训练参数的pkl文件
    def snapshot(self, sess, iter):

        net = self.net

        if not os.path.exists(self.output_dir):
            os.makedirs(self.output_dir)

        # Store the model snapshot
        # 保存模型权重 例:shufflenetv2_faster_rcnn_iter_10000.cpkt等三个文件
        # SNAPSHOT_PREFIX在yml文件中配置 例:'shufflenetv2_faster_rcnn'
        filename = cfg.TRAIN.SNAPSHOT_PREFIX + '_iter_{:d}'.format(iter) + '.ckpt'
        filename = os.path.join(self.output_dir, filename)
        self.saver.save(sess, filename)
        print('Wrote snapshot to: {:s}'.format(filename))

        # Also store some meta information, random state, etc.
        # 保存随机数状态等训练过程参数
        nfilename = cfg.TRAIN.SNAPSHOT_PREFIX + '_iter_{:d}'.format(iter) + '.pkl'
        nfilename = os.path.join(self.output_dir, nfilename)
        # current state of numpy random
        # 保存随机数种子
        st0 = np.random.get_state()
        # current position in the database
        # 保存当前图片序号
        cur = self.data_layer._cur
        # current shuffled indexes of the database
        # 保存打乱后的图片序号列表
        perm = self.data_layer._perm
        # current position in the validation database
        # 验证过程,同上
        cur_val = self.data_layer_val._cur
        # current shuffled indexes of the validation database
        perm_val = self.data_layer_val._perm

        # Dump the meta info
        # 写入 例:shufflenetv2_faster_rcnn_iter_10000.pkl
        with open(nfilename, 'wb') as fid:
            pickle.dump(st0, fid, pickle.HIGHEST_PROTOCOL)
            pickle.dump(cur, fid, pickle.HIGHEST_PROTOCOL)
            pickle.dump(perm, fid, pickle.HIGHEST_PROTOCOL)
            pickle.dump(cur_val, fid, pickle.HIGHEST_PROTOCOL)
            pickle.dump(perm_val, fid, pickle.HIGHEST_PROTOCOL)
            pickle.dump(iter, fid, pickle.HIGHEST_PROTOCOL)

        return filename, nfilename

    # 载入快照
    def from_snapshot(self, sess, sfile, nfile):

        print('Restoring model snapshots from {:s}'.format(sfile))
        self.saver.restore(sess, sfile)
        print('Restored.')
        # Needs to restore the other hyper-parameters/states for training, (TODO xinlei) I have
        # tried my best to find the random states so that it can be recovered exactly
        # However the Tensorflow state
<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 # 确认CUDA与PyTorch版本匹配 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、付费专栏及课程。

余额充值