Tensorflow 对象检测 API - 中途添加更多训练数据,可以吗?
Tensorflow Object Detection API - Adding more training data half way, is it ok?
目前我的训练数据集总共有300张图片,目前保存的检查点是8054个。训练了10个小时,准确率在50%左右。该模型只需要检测一个对象。
我想提高准确性。所以,我只是想知道,如果我想添加更多训练图像怎么办?我将需要创建新的 xml 文件、csv 文件,当然还有新的 TF 记录。我需要重新开始训练吗?或者只是,添加图像,新 xml,新 csv,然后新 TF 记录,然后在检查点 8054 继续训练?
我正在使用 SSD mobilenet COCO 模型,批量大小为 5。除了仅仅增加训练数据集的数量之外,为了提高准确性,我需要更改/改进哪些参数/因素?
要回答您的第一个问题,是的,您可以向对象检测添加更多数据(例如作为单独的 tfrecord 文件)API。只需为您的模型编辑 pipeline.config 文件。您实际上可以将整个 .record 文件列表添加到 input_path 参数。
大致如下所示:
train_input_reader: {
tf_record_input_reader {
input_path: ["path/to/first.record", "path/to/second.record"]
}
label_map_path: "..."
}
如果您不更改任何其他参数,训练应该简单地从检查点继续,它将加载新数据。
回答第二个问题,对于SSD,一个简单的事情就是看学习率,它可能太高了,损失可能会跳很多。不过,您必须自己使用 tensorboard 分析损失。至于其他超参数,我还没有取得太大的成功,所以我希望其他人可以参与其中。
如果我错了请纠正我,但我不认为接受的答案是完全准确的。每次你调用 train.py
时,你的框预测器和全局步骤都会从随机权重和零初始化,就好像你是 almost 从头开始训练,即你只设法检索您的特征提取器。如果您不关心 global_step,您可以使用以下简单而肮脏的 hack 来恢复您的边界框权重:
在文件 meta_architectures/ssd_meta_arch.py
中,将行 #694 从
更改为
if variable.op.name.startswith(self._extract_features_scope):
对此:
if variable.op.name.startswith(self._extract_features_scope) or (from_detection_checkpoint and variable.op.name.startswith("BoxPredictor_")):
目前我的训练数据集总共有300张图片,目前保存的检查点是8054个。训练了10个小时,准确率在50%左右。该模型只需要检测一个对象。
我想提高准确性。所以,我只是想知道,如果我想添加更多训练图像怎么办?我将需要创建新的 xml 文件、csv 文件,当然还有新的 TF 记录。我需要重新开始训练吗?或者只是,添加图像,新 xml,新 csv,然后新 TF 记录,然后在检查点 8054 继续训练?
我正在使用 SSD mobilenet COCO 模型,批量大小为 5。除了仅仅增加训练数据集的数量之外,为了提高准确性,我需要更改/改进哪些参数/因素?
要回答您的第一个问题,是的,您可以向对象检测添加更多数据(例如作为单独的 tfrecord 文件)API。只需为您的模型编辑 pipeline.config 文件。您实际上可以将整个 .record 文件列表添加到 input_path 参数。
大致如下所示:
train_input_reader: {
tf_record_input_reader {
input_path: ["path/to/first.record", "path/to/second.record"]
}
label_map_path: "..."
}
如果您不更改任何其他参数,训练应该简单地从检查点继续,它将加载新数据。
回答第二个问题,对于SSD,一个简单的事情就是看学习率,它可能太高了,损失可能会跳很多。不过,您必须自己使用 tensorboard 分析损失。至于其他超参数,我还没有取得太大的成功,所以我希望其他人可以参与其中。
如果我错了请纠正我,但我不认为接受的答案是完全准确的。每次你调用 train.py
时,你的框预测器和全局步骤都会从随机权重和零初始化,就好像你是 almost 从头开始训练,即你只设法检索您的特征提取器。如果您不关心 global_step,您可以使用以下简单而肮脏的 hack 来恢复您的边界框权重:
在文件 meta_architectures/ssd_meta_arch.py
中,将行 #694 从
if variable.op.name.startswith(self._extract_features_scope):
对此:
if variable.op.name.startswith(self._extract_features_scope) or (from_detection_checkpoint and variable.op.name.startswith("BoxPredictor_")):