动态编辑 Tensorflow 对象检测的管道配置

2024-01-13

我正在使用tensorflow对象检测API,并且我希望能够在python中动态编辑配置文件,如下所示。我想过在 python 中使用协议缓冲区库,但我不知道如何去做。

model {
ssd {
num_classes: 1
image_resizer {
  fixed_shape_resizer {
    height: 300
    width: 300
  }
}
feature_extractor {
  type: "ssd_inception_v2"
  depth_multiplier: 1.0
  min_depth: 16
  conv_hyperparams {
    regularizer {
      l2_regularizer {
        weight: 3.99999989895e-05
      }
    }
    initializer {
      truncated_normal_initializer {
        mean: 0.0
        stddev: 0.0299999993294
      }
    }
    activation: RELU_6
    batch_norm {
      decay: 0.999700009823
      center: true
      scale: true
      epsilon: 0.0010000000475
      train: true
    }
  }
 ...
 ...

}

有没有一种简单/简单的方法可以将 image_resizer ->fixed_shape_resizer 中的高度等字段的特定值从 300 更改为 500?并用修改后的值写回文件而不更改其他任何内容?

编辑: 虽然 @DmytroPrylipko 提供的答案适用于配置中的大多数参数,但我面临着“复合字段”的一些问题。

也就是说,如果我们有如下配置:

train_input_reader: {
  label_map_path: "/tensorflow/data/label_map.pbtxt"
  tf_record_input_reader {
    input_path: "/tensorflow/models/data/train.record"
  }
}

我添加这一行来编辑 input_path:

 pipeline_config.train_input_reader.tf_record_input_reader.input_path = "/tensorflow/models/data/train100.record"

它抛出错误:

TypeError: Can't set composite field

是的,使用 Protobuf Python API 非常简单:

编辑管道.py:

import argparse

import tensorflow as tf
from google.protobuf import text_format
from object_detection.protos import pipeline_pb2


def parse_arguments():                                                                                                                                                                                                                                                
    parser = argparse.ArgumentParser(description='')                                                                                                                                                                                                                  
    parser.add_argument('pipeline')                                                                                                                                                                                                                                   
    parser.add_argument('output')                                                                                                                                                                                                                                     
    return parser.parse_args()                                                                                                                                                                                                                                        


def main():                                                                                                                                                                                                                                                           
    args = parse_arguments()                                                                                                                                                                                                                                          
    pipeline_config = pipeline_pb2.TrainEvalPipelineConfig()                                                                                                                                                                                                          

    with tf.gfile.GFile(args.pipeline, "r") as f:                                                                                                                                                                                                                     
        proto_str = f.read()                                                                                                                                                                                                                                          
        text_format.Merge(proto_str, pipeline_config)                                                                                                                                                                                                                 

    pipeline_config.model.ssd.image_resizer.fixed_shape_resizer.height = 300                                                                                                                                                                                          
    pipeline_config.model.ssd.image_resizer.fixed_shape_resizer.width = 300                                                                                                                                                                                           

    config_text = text_format.MessageToString(pipeline_config)                                                                                                                                                                                                        
    with tf.gfile.Open(args.output, "wb") as f:                                                                                                                                                                                                                       
        f.write(config_text)                                                                                                                                                                                                                                          


if __name__ == '__main__':                                                                                                                                                                                                                                            
    main() 

我调用脚本的方式:

TOOL_DIR=tool/tf-models/research

(
   cd $TOOL_DIR
   protoc object_detection/protos/*.proto --python_out=.
)

export PYTHONPATH=$PYTHONPATH:$TOOL_DIR:$TOOL_DIR/slim

python3 edit_pipeline.py pipeline.config pipeline_new.config

复合字段

如果存在重复字段,则必须将它们视为数组(例如使用extend(), append()方法):

pipeline_config.train_input_reader.tf_record_input_reader.input_path[0] = '/tensorflow/models/data/train100.record'

Eval 输入读取器错误

这是尝试编辑复合字段时的常见错误。 (如果是 eval_input_reader,则“未找到属性 tf_record_input_reader” )

下面@latida 的回答中提到了这一点。 通过将其设置为数组字段来解决此问题。

pipeline_config.eval_input_reader[0].label_map_path  = label_map_full_path
pipeline_config.eval_input_reader[0].tf_record_input_reader.input_path[0] = val_record_path
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态编辑 Tensorflow 对象检测的管道配置 的相关文章

随机推荐

  • C# 中 XML 映射到没有属性的对象

    是否有 C 库允许将 C 对象映射到没有属性的 XML 我有几个数据源 它们都包含具有相同逻辑结构但不同架构的 XML 数据 例如 在一个 XML 中可能有一个名为 邮政编码 的字段 在另一个 XML 中 此数据将位于名为 邮政编码 的属性
  • org.hibernate.HibernateException:如果没有活动事务,get 无效

    我是休眠新手 自动创建 hibernate cfg xml Netbeans 向导 自动创建HibernateUtil java 自动创建带有注释的 POJO 类 尝试从数据库获取对象但出现错误 Exception in thread po
  • 使用 Paramiko 从 SSH 跳转主机加载密钥

    我使用中间主机 2 从主机 1 连接到主机 3 主机1 gt 主机2 gt 主机3 这是我的代码 运行良好 SSH to host2 ssh paramiko SSHClient ssh load system host keys ssh
  • grunt 服务:并发:服务器由于警告而中止

    突然我的项目不再与 grunt 一起工作 不幸的是 我有一段时间没有将更改提交到 git 中 所以我无法说出有什么不同 当我跑步时grunt server verbose 我得到以下输出 上面的所有内容 通过与OK Running wire
  • JPasswordField 返回一些转换为字符串类型的哈希码

    我的程序在初始化程序之前需要用户的用户名和密码验证 所以我创建了一个按钮登录 并将其与 ActionListener 关联 如下所示 login addActionListener new ActionListener public voi
  • 暂停 Nivo 滑块

    我想在 Nivo 滑块运行之前暂停 5 秒钟 但显示第一张图像 所以我需要在属性中添加一些代码afterLoad我相信 我试过了setTimout在运行滑块代码之前 它不会给出我想要的结果 这是我当前的代码 window load func
  • 是否有像 C++ STL 的“transform”这样的 Objective-C 算法?

    我的目标是拥有一个包含特定扩展名的所有文件名但不包含扩展名的数组 有一个获取特定扩展名的所有文件名的优雅解决方案 https stackoverflow com questions 499673 getting a list of file
  • 当用户未经身份验证时,如何防止 Laravel 设置会话 cookie?

    默认情况下 Laravel 在每个请求上都会设置一个名为 APP NAME session 的 Cookie 它用于以下功能redirect gt back 这个 cookie 会阻止我的缓存机制正常工作 FastCGI Varnish 凡
  • Django REST Framework - 嵌套序列化器的查询限制?

    我遇到一种情况 一个表通过外键与另一个表相关 如下所示 模型 py class Container models Model size models CharField max length 20 shape models CharFiel
  • 更改 WinForm 按钮文本颜色?

    我想知道是否可以更改 WinForm 按钮文本的颜色 我正在查看字体属性 找不到任何东西 但我觉得像这样简单且 在我看来 实用的东西应该是可能的 你需要ForeColor按钮的属性 继承自Control See 这个链接 http msdn
  • 使用谷歌表格 API

    我希望能够从 Android 应用程序编辑 Google 电子表格 我读到我需要执行 OAuth 2 0 只有之后我才能访问 API 在 android 网站的 Google 授权 REST API 中 它说 Note An OAuth 2
  • Android ViewPager2 不动态包裹不同大小片段的高度

    我有一个 ViewPager2 它具有不同高度的片段作为子项 子项的高度在数据加载后会发生变化
  • Jackson真的无法将json反序列化为泛型类型吗?

    这是一个重复的问题 因为以下问题要么很混乱 要么根本没有答案 使用 Jackson 反序列化通用类型 https stackoverflow com questions 13118798 deserializing a generic ty
  • 通过 Play 中的“activator run”运行时获取要编译的资源

    我使用 Sass 作为 CSS 预处理器 并尝试让它通过资产管道运行 我尝试将此 sassTask 实现为源文件任务和 Web 资产任务 但两种方式都遇到了问题 如果我将 Sass 作为源任务运行 见下文 它会在activator run当
  • Rails 选择助手 - 默认选择值,如何?

    这是我现在使用的一段代码 如何修改它使其默认值等于params pid 页面何时加载 这应该可以做到
  • TFS:查询包含特定变更集的构建

    我有许多基于 TFS 中的单个分支 例如 Main 执行的构建定义 我想 以某种方式 查询 TFS 以查找包含我提供的特定变更集编号的所有构建 并返回 TFS 包含的构建名称的字符串列表 任何类型的应用程序 VS 扩展 CLI 应用程序 w
  • 在Python中组合多个for循环

    比方说 我们有一个名为 articles 的变量中的对象列表 每个对象都有一个成员 tags 这是一个简单的列表 预期输出 所有文章中的所有标签 加入到一个列表中 在多行中 解决方案是 arr for article in articles
  • PHP 中的递归生成器

    介绍 自 PHP 5 5 版本以来 出现了以下很棒的功能发电机 http php net manual en language generators overview php 我不会重复官方手册页 但它们对于迭代器的简短定义来说是很棒的事情
  • Facebook 链接将在应用程序而不是浏览器中打开[重复]

    这个问题在这里已经有答案了 可能的重复 从其他应用程序启动 Facebook 应用程序 https stackoverflow com questions 4191492 launch facebook app from other app
  • 动态编辑 Tensorflow 对象检测的管道配置

    我正在使用tensorflow对象检测API 并且我希望能够在python中动态编辑配置文件 如下所示 我想过在 python 中使用协议缓冲区库 但我不知道如何去做 model ssd num classes 1 image resize