25、从零开始训练 Faster R - CNN 全流程指南

从零开始训练 Faster R - CNN 全流程指南

1. 数据准备与验证

1.1 记录文件创建

在完成相关操作后,查看 lisa/records 目录,你会看到训练和测试文件:

$ ls lisa/records/
classes.pbtxt
testing.record
training.record

这表明我们已成功创建了 TensorFlow 格式的记录文件和关联的类标签文件。

1.2 预训练关键步骤

在开始训练 Faster R - CNN 之前,务必注意:很多深度学习开发者、学生和研究人员常犯的错误是在构建数据集时急于求成,不仔细检查工作。在目标检测中,我们处理的不仅是输入图像和类标签,还有边界框坐标。不能因为代码执行完成且无错误,就认为一切正常。

在训练网络之前,要仔细检查代码。特别是在为给定图像构建边界框和类标签时,可按以下步骤进行可视化验证:
1. 通过 OpenCV 从磁盘加载图像。
2. 将 xMin xMax yMin yMax 缩放回标准整数坐标,然后在图像上绘制边界框。
3. 同时在图像上绘制类标签。

以下是实现此过程的代码段:

# loop over the bounding boxes + labels associated with
# the image
for (label, (startX, startY, endX, endY)) in D[k]:
    # TensorFlow assumes all bounding boxes are in the
    # range [0, 1] so we need to scale them
    xMin = startX / w
    xMax = endX / w
    yMin = startY / h
    yMax = endY / h

    # load the input image from disk and denormalize the
    # bounding box coordinates
    image = cv2.imread(k)
    startX = int(xMin * w)
    startY = int(yMin * h)
    endX = int(xMax * w)
    endY = int(yMax * h)

    # draw the bounding box on the image
    cv2.rectangle(image, (startX, startY), (endX, endY),
                  (0, 255, 0), 2)

    # show the output image
    cv2.imshow("Image", image)
    cv2.waitKey(0)

虽然不需要检查数据集中的每一张图像,但每个类别抽取几百张,花 10 - 20 分钟查看是否有错误,这种可视化验证至关重要,绝不能跳过。

如果你想使用自定义数据集并构建关联的记录文件,可将此脚本作为起点,修改类标签/边界框解析部分,尽量不要修改 TFAnnotation 对象的实际构造,以减少引入错误的可能性。

2. 配置 Faster R - CNN

2.1 训练步骤概述

在 LISA 数据集上训练 Faster R - CNN 分为四个步骤:
1. 下载预训练的 Faster R - CNN 以进行网络微调。
2. 下载样本 TFOD API 配置文件,并修改其指向我们的记录文件。
3. 启动训练过程并进行监控。
4. 训练完成后导出冻结的模型图。

2.2 下载预训练模型

首先,前往 TensorFlow 对象检测模型库: http://pyimg.co/1z34r ,找到在 COCO 数据集上训练的 Faster R - CNN + ResNet - 101 模型链接并下载。截至撰写本文时,文件名是 faster_rcnn_resnet101_coco_2018_01_28.tar.gz

下载完成后,将模型移动到 experiments/training 子目录并解压:

$ cd lisa/experiments/training
$ mv ~/Downloads/faster_rcnn_resnet101_coco_2018_01_28.tar.gz ./
$ tar -zxvf faster_rcnn_resnet101_coco_2018_01_28.tar.gz
$ ls -l faster_rcnn_resnet101_coco_2018_01_28
checkpoint
frozen_inference_graph.pb
model.ckpt.data-00000-of-00001
model.ckpt.index
model.ckpt.meta
pipeline.config
saved_model

这些文件构成了在 COCO 数据集上预训练的 TensorFlow Faster R - CNN。

2.3 下载并修改配置文件

http://pyimg.co/r2xql 下载 Faster R - CNN + ResNet - 101 架构的样本配置文件 faster_rcnn_resnet101_pets.config ,并保存到 experiments/training 目录,可将其重命名为 faster_rcnn_lisa.config

打开 faster_rcnn_lisa.config 文件,需要更新以下七个配置:
1. num_classes :将其从 37 改为 3,因为 LISA 数据集样本中有 3 个类别(行人过街、前方信号和停车标志)。

faster_rcnn {
    num_classes: 3
    image_resizer {
        keep_aspect_ratio_resizer {
            min_dimension: 600
            max_dimension: 1024
        }
    }
}
  1. num_steps :训练时执行的批处理步数,默认值为 200,000,建议在这个特定数据集上使用 50,000。大多数数据集至少训练 20,000 步。
train_config: {
    batch_size: 1
    ...
    num_steps: 50000
    data_augmentation_options {
        random_horizontal_flip {
        }
    }
}
  1. fine_tune_checkpoint :指向下载的 Faster R - CNN + ResNet 101 模型的 model.ckpt 基础文件路径,要提供完整路径。
gradient_clipping_by_norm: 10.0
fine_tune_checkpoint: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/lisa/experiments/training/faster_rcnn_resnet101_coco_2018_01_28/model.ckpt"
from_detection_checkpoint: true
  1. train_input_reader 中的 input_path label_map_path :分别指向 training.record 文件和 classes.pbtxt 文件。
train_input_reader: {
    tf_record_input_reader {
        input_path: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/lisa/records/training.record"
    }
    label_map_path: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/lisa/records/classes.pbtxt"
}
  1. eval_input_reader 中的 input_path label_map_path input_path 指向 testing.record 文件, label_map_path 指向 classes.pbtxt 文件。
eval_input_reader: {
    tf_record_input_reader {
        input_path: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/lisa/records/testing.record"
    }
    label_map_path: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/lisa/records/classes.pbtxt"
    shuffle: false
    num_readers: 1
}
  1. eval_config 中的 num_examples :设置为测试集中边界框的总数。可注释掉 max_evals 以确保评估脚本无限期运行。
eval_config: {
    num_examples: 955
    # Note: The below line limits the evaluation process to 10 evaluations.
    # Remove the below line to evaluate indefinitely.
    #max_evals: 10
}

3. 训练 Faster R - CNN

3.1 启动训练

使用以下命令启动训练(确保在运行此命令前执行 setup.sh 脚本导出 PYTHONPATH ):

$ python object_detection/train.py --logtostderr \
--pipeline ssds_and_rcnn/lisa/experiments/training/faster_rcnn_lisa.config \
--train_dir ssds_and_rcnn/lisa/experiments/training

3.2 启动评估

打开另一个终端,执行以下命令启动评估:

$ python object_detection/eval.py --logtostderr \
--pipeline_config_path ssds_and_rcnn/lisa/experiments/training/faster_rcnn_lisa.config \
--checkpoint_dir ssds_and_rcnn/lisa/experiments/training \
--eval_dir ssds_and_rcnn/lisa/experiments/evaluation

3.3 可视化训练过程

在系统的任何位置执行以下命令,可在浏览器中可视化训练过程:

$ cd ~/pyimagesearch/dlbook/ssds_and_rcnn/
$ tensorboard --logdir lisa/experiments

4. 使用 TFOD API 的建议

4.1 接受学习曲线

使用 TFOD API 存在学习曲线,初次使用时,不要期望所有脚本都能直接运行。建议预留一到两天时间来熟悉该 API。遇到错误时,要冷静诊断,很多错误可能是由于 Python 路径或文件路径设置不当导致的,一定要仔细检查文件路径。

4.2 先复现已知结果

建议先在 LISA 交通标志数据集上训练第一个 Faster R - CNN,至少训练 2,500 步,以验证训练和评估流程是否正常。不要急于替换示例数据集,应先熟悉 TFOD API 工具,再使用自己的数据集进行训练。

4.3 导出 PYTHONPATH

如果在执行 TFOD API 脚本或导入文件时遇到 ImportError ,可能是 PYTHONPATH 未正确设置。可使用 setup.sh 脚本或手动导出:

$ source setup.sh
$ python build_lisa_records.py

4.4 清理 “training” 目录

如果发现网络训练速度变慢或结果异常,可清理 training 目录,删除除 faster_rcnn_resnet101_coco_2018_01_28.tar.gz faster_rcnn_lisa.config 之外的所有文件,然后重新解压模型并重启训练。

$ cd lisa/experiments/training/
$ rm checkpoint graph.pbtxt pipeline.config
$ rm events.* model.*
$ rm -rf faster_rcnn_resnet101_coco_2018_01_28
$ tar -zxvf faster_rcnn_resnet101_coco_2018_01_28.tar.gz
$ ls -l
faster_rcnn_lisa.config
faster_rcnn_resnet101_coco_2018_01_28
faster_rcnn_resnet101_coco_2018_01_28.tar.gz

4.5 监控损失和 mAP

训练目标检测器时,要监控损失和平均精度均值(mAP)。mAP 应在开始时较低,在训练的前 10,000 - 50,000 步内快速上升,然后趋于平稳,同时损失应逐渐降低。理想情况下,损失应低于 1.5,低于 1 更佳。

4.6 GPU 和 CPU 训练与评估

在熟悉 TFOD API 工具之前,建议使用单个 GPU 进行训练和评估。如果只有一个 GPU,不要在同一个 GPU 上同时进行训练和评估,可在 GPU 上启动训练,在 CPU 上进行评估。评估时,将 eval_config 中的 num_examples 设置为较小的数字(如 5 - 10),以减少评估时间。

4.7 设置 CUDA 可见设备

可通过设置 CUDA_VISIBLE_DEVICES 环境变量来指定 TensorFlow 使用的 GPU。例如:

# 只使用 GPU 0 进行训练
$ export CUDA_VISIBLE_DEVICES="0"
$ python object_detection/train.py --logtostderr \
--pipeline ssds_and_rcnn/lisa/experiments/training/faster_rcnn_lisa.config \
--train_dir ssds_and_rcnn/lisa/experiments/training

# 只使用 GPU 1 进行评估
$ export CUDA_VISIBLE_DEVICES="1"
$ python object_detection/eval.py --logtostderr \
--pipeline_config_path ssds_and_rcnn/lisa/experiments/training/faster_rcnn_lisa.config \
--checkpoint_dir ssds_and_rcnn/lisa/experiments/training \
--eval_dir ssds_and_rcnn/lisa/experiments/evaluation

# 使用 CPU 进行评估
$ export CUDA_VISIBLE_DEVICES=""
$ python object_detection/eval.py --logtostderr \
--pipeline_config_path ssds_and_rcnn/lisa/experiments/training/faster_rcnn_lisa.config \
--checkpoint_dir ssds_and_rcnn/lisa/experiments/training \
--eval_dir ssds_and_rcnn/lisa/experiments/evaluation

4.8 优化器参数

在 Faster R - CNN + ResNet - 101 中,默认配置文件使用 SGD + Nesterov 动量优化器,学习率为 0.0003。在熟悉工具包并多次复现结果之前,建议保持这些优化器参数不变。同时,要参考 TensorFlow 社区在管道配置中的注释,获取参数建议。

4.9 尊重工具包

TFOD API 是一个强大的工具,但使用它有学习曲线,需要耐心和时间。遇到错误时,要仔细阅读错误信息,参考 TensorFlow 文档,不要期望快速解决问题。大多数情况下,错误可能是由于文件路径设置不当、Python 路径未更新等原因导致的。

5. 训练流程总结与注意事项

5.1 训练流程总结

为了更清晰地展示整个 Faster R - CNN 的训练流程,我们可以用一个流程图来概括:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A(数据准备):::process --> B(创建记录文件):::process
    B --> C(可视化验证数据):::process
    C --> D(下载预训练模型):::process
    D --> E(下载并修改配置文件):::process
    E --> F(启动训练):::process
    F --> G(启动评估):::process
    F & G --> H(可视化训练过程):::process

整个流程主要包括以下几个关键步骤:
1. 数据准备 :创建 TensorFlow 格式的记录文件和关联的类标签文件,并进行可视化验证,确保数据的准确性。
2. 模型和配置准备 :下载预训练的 Faster R - CNN 模型,下载并修改样本配置文件,使其指向我们的记录文件和模型文件。
3. 训练和评估 :使用修改后的配置文件启动训练和评估过程,并通过 TensorBoard 可视化训练过程。

5.2 注意事项

在整个训练过程中,有一些重要的注意事项需要我们牢记:
|注意事项|详情|
| ---- | ---- |
|数据验证|可视化验证数据至关重要,不能因为代码执行无错误就认为数据没问题。每个类别抽取几百张图像,花 10 - 20 分钟查看是否有错误。|
|文件路径|在修改配置文件时,要确保提供完整的文件路径,避免使用控制台快捷方式。同时,要仔细检查 Python 路径和文件路径,很多错误可能是由于路径设置不当导致的。|
|训练步数|大多数数据集至少训练 20,000 步,在这个特定的 LISA 数据集上,建议训练 50,000 步。不要过早停止训练,通常在 20,000 步之后再考虑是否停止。|
|GPU 和 CPU 使用|在熟悉 TFOD API 工具之前,建议使用单个 GPU 进行训练和评估。如果只有一个 GPU,不要在同一个 GPU 上同时进行训练和评估,可在 GPU 上启动训练,在 CPU 上进行评估,并将 eval_config 中的 num_examples 设置为较小的数字。|
|优化器参数|在熟悉工具包并多次复现结果之前,建议保持默认的优化器参数不变。同时,要参考 TensorFlow 社区在管道配置中的注释,获取参数建议。|

6. 常见错误及解决方法

6.1 ImportError

当执行 TFOD API 脚本或导入文件时,可能会遇到 ImportError ,这通常是由于 PYTHONPATH 未正确设置导致的。解决方法是使用 setup.sh 脚本或手动导出 PYTHONPATH

$ source setup.sh
$ python build_lisa_records.py

6.2 训练速度变慢或结果异常

如果发现网络训练速度变慢或结果异常,可能是 training 目录中的文件过多导致的。解决方法是清理 training 目录,删除除 faster_rcnn_resnet101_coco_2018_01_28.tar.gz faster_rcnn_lisa.config 之外的所有文件,然后重新解压模型并重启训练:

$ cd lisa/experiments/training/
$ rm checkpoint graph.pbtxt pipeline.config
$ rm events.* model.*
$ rm -rf faster_rcnn_resnet101_coco_2018_01_28
$ tar -zxvf faster_rcnn_resnet101_coco_2018_01_28.tar.gz
$ ls -l
faster_rcnn_lisa.config
faster_rcnn_resnet101_coco_2018_01_28
faster_rcnn_resnet101_coco_2018_01_28.tar.gz

6.3 GPU 内存耗尽错误

如果在同一个 GPU 上同时进行训练和评估,可能会遇到 GPU 内存耗尽错误。解决方法是在 GPU 上启动训练,在 CPU 上进行评估,并将 eval_config 中的 num_examples 设置为较小的数字(如 5 - 10)。

6.4 其他错误

遇到其他错误时,要仔细阅读 TensorFlow 输出的错误信息,通常错误信息会提示问题所在。可以通过 Google 搜索错误信息,参考 TensorFlow 文档或相关论坛来解决问题。同时,要接受使用 TFOD API 存在学习曲线,不要期望快速解决问题,要有耐心和毅力。

7. 总结

通过以上的步骤和建议,我们可以从零开始训练一个 Faster R - CNN 模型。整个过程虽然涉及多个步骤和配置,但只要我们按照流程进行,仔细检查每一个环节,就能够顺利完成训练。

在训练过程中,要特别注意数据的准确性、文件路径的设置、训练步数的选择、GPU 和 CPU 的使用以及优化器参数的调整。同时,要接受使用 TFOD API 存在学习曲线,遇到错误时要冷静分析,参考相关文档和论坛来解决问题。

希望这篇指南能够帮助你成功训练出一个高性能的 Faster R - CNN 模型,在目标检测领域取得更好的成果。如果你在训练过程中遇到任何问题,欢迎在评论区留言,我们一起探讨解决。

内容概要:本文介绍了一个基于Matlab的综合能源系统优化调度仿真资源,重点实现了含光热电站、有机朗肯循环(ORC)和电含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)转气(P2G)技术的冷、热、电多能互补系统的优化调度模型。该模型充分考虑多种能源形式的协同转换与利用,通过Matlab代码构建系统架构、设定约束条件并求解优化目标,旨在提升综合能源系统的运行效率与经济性,同时兼顾灵活性供需不确定性下的储能优化配置问题。文中还提到了相关仿真技术支持,如YALMIP工具包的应用,适用于复杂能源系统的建模与求解。; 适合人群:具备一定Matlab编程基础和能源系统背景知识的科研人员、研究生及工程技术人员,尤其适合从事综合能源系统、可再生能源利用、电力系统优化等方向的研究者。; 使用场景及目标:①研究含光热、ORC和P2G的多能系统协调调度机制;②开展考虑不确定性的储能优化配置与经济调度仿真;③学习Matlab在能源系统优化中的建模与求解方法,复现高水平论文(如EI期刊)中的算法案例。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码和案例文件,按照目录顺序逐步学习,重点关注模型构建逻辑、约束设置与求解器调用方式,并通过修改参数进行仿真实验,加深对综合能源系统优化调度的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值