当前位置: 首页 > 知识库问答 >
问题:

为目标检测任务创建tf记录

史烈
2023-03-14

我正在使用tensorflow对象检测api为微调任务创建数据集。

我的目录结构是:

训练/

--imgs/

----img1。jpg

----img1。csv

其中,每幅图像一个csv是标签,x、y、w、h

我使用此脚本保存TFR记录:

    import tensorflow as tf
    from os import listdir
    import os
    from os.path import isfile, join
    import csv
    import json

    from object_detection.utils import dataset_util


    flags = tf.app.flags
    flags.DEFINE_string('output_path', '', 'Path to output TFRecord')
    FLAGS = flags.FLAGS

    LABEL_DICT = {}
    counter = 0

    def create_tf_example(example):
      # TODO(user): Populate the following variables from your example.
      height = 404 # Image height
      width = 720 # Image width
      filename = example['path'].encode('utf-8').strip() # Filename of the image. Empty if image is not from file

      with tf.gfile.GFile(example['path'], 'rb') as fid:
        encoded_image_data = fid.read()

      image_format = 'jpeg'.encode('utf-8').strip() # b'jpeg' or b'png'

      xmins = [] # List of normalized left x coordinates in bounding box (1 per box)
      xmaxs = [] # List of normalized right x coordinates in bounding box
                 # (1 per box)
      ymins = [] # List of normalized top y coordinates in bounding box (1 per box)
      ymaxs = [] # List of normalized bottom y coordinates in bounding box
                 # (1 per box)
      classes_text = [] # List of string class name of bounding box (1 per box)
      classes = [] # List of integer class id of bounding box (1 per box)

      for box in example['boxes']:
        #if box['occluded'] is False:
        #print("adding box")
        xmins.append(float(int(box['x']) / width))
        xmaxs.append(float(int(box['w']) + int(box['x']) / width))
        ymins.append(float(int(box['y']) / height))
        ymaxs.append(float(int(box['h']) + int(box['y']) / height))
        classes_text.append(box['label'].encode('utf-8'))
        classes.append(int(LABEL_DICT[box['label']]))


      tf_example = tf.train.Example(features=tf.train.Features(feature={
          'image/height': dataset_util.int64_feature(height),
          'image/width': dataset_util.int64_feature(width),
          'image/filename': dataset_util.bytes_feature(filename),
          'image/source_id': dataset_util.bytes_feature(filename),
          'image/encoded': dataset_util.bytes_feature(encoded_image_data),
          'image/format': dataset_util.bytes_feature(image_format),
          'image/object/bbox/xmin': dataset_util.float_list_feature(xmins),
          'image/object/bbox/xmax': dataset_util.float_list_feature(xmaxs),
          'image/object/bbox/ymin': dataset_util.float_list_feature(ymins),
          'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs),
          'image/object/class/text': dataset_util.bytes_list_feature(classes_text),
          'image/object/class/label': dataset_util.int64_list_feature(classes),
      }))

      return tf_example

    def ex_info(img_path, ann_path):
      boxes = []
      head = ['label','x','y','w','h']
      with open(ann_path, 'r') as csvfile:
        annreader = csv.DictReader(csvfile, fieldnames=head)
        for box in annreader:
          boxes.append(box)
          LABEL_DICT[box['label']] = LABEL_DICT.get(box['label'], len(LABEL_DICT) + 1)

      ex = {
        "path" : img_path,
        "boxes" : boxes
      }

      return ex

    def main(_):
      writer = tf.python_io.TFRecordWriter(FLAGS.output_path)

      # TODO(user): Write code to read in your dataset to examples variable
      dataset_dir = "train"
      ann_dir = join(dataset_dir, "ann")
      imgs_dir = join(dataset_dir, "imgs")
      labelDest = "tfTrain/data/labels_map.pbtxt"

      imgs = [join(imgs_dir, f) for f in listdir(imgs_dir) if isfile(join(imgs_dir, f))]
      anns = [join(ann_dir, os.path.basename(im).replace("jpg","csv")) for im in imgs]

      for img,ann in zip(imgs,anns):
        example = ex_info(img,ann)
        #tf_example = create_tf_example(example)
        #writer.write(tf_example.SerializeToString())


      with open(labelDest, 'w', encoding='utf-8') as outL:
        for name,key in LABEL_DICT.items():
          outL.write("item { \n  id: " + str(key) + "\n  name: '" + name + "'\n}\n")


      writer.close()


    if __name__ == '__main__':
      tf.app.run()

但是当我运行火车脚本时,我得到了这个错误

Pythontrain.py--logtostderr-train_dir=。/模型/训练-pipeline_config_path=faster_rcnn_resnet101_coco.config
警告:tensorflow:来自模型/研究/object_detection/trainer.py:257:create_global_step(来自tensorflow.contrib.framework.python.ops.variables)不建议使用在未来版本中删除。更新说明:请切换到tf.train.create_global_stepTraceback(最近一次调用最后一次):文件“模型/研究/object_detection/utils/label_map_util.py”,第135行,load_labelmaptext_format。合并(label_map_string,label_map)File"/home/user/anaconda3/envs/tf/lib/python3.6/site-包/谷歌/原型包/text_format.py",第525行,在合并descriptor_pool=descriptor_pool)File"/home/user/anaconda3/envs/tf/lib/python3.6/site-包/谷歌/原型包/text_format.py",行579,在MergeLines返回解析器中。MergeLines(行,消息)File"/home/user/anaconda3/envs/tf/lib/python3.6/site-包/谷歌/原型/text_format.py",第612行,在MergeLines自我。_ParseOrMerge(行,html" target="_blank">消息)文件"/home/user/anaconda3/envs/tf/lib/python3.6/site-包/google/原型/text_format.py",第627行,_ParseOrMerge。_MergeField(令牌,消息)File"/home/user/anaconda3/envs/tf/lib/python3.6/site-包/谷歌/原型包/text_format.py",第727行,在_MergeField合并(令牌,消息,字段)File"/home/user/anaconda3/envs/tf/lib/python3.6/site-包/谷歌/原型包/text_format.py》,第815行,_MergeMessageField自我。_MergeField(令牌,sub_message)File"/home/user/anaconda3/envs/tf/lib/python3.6/site-包/谷歌/原型/text_format.py",第695行,_MergeField(message_descriptor.full_name,名称)google.protobuf.text_format。消息类型"object_detection.protos.StringIntLabelMapItem"没有名为"s"的字段。

在处理上述异常时,发生了另一个异常:

    Traceback (most recent call last):
      File "train.py", line 184, in <module>
        tf.app.run()
      File "/home/user/anaconda3/envs/tf/lib/python3.6/site-packages/tensorflow/python/platform/app.py",

第126行,运行系统中。退出(主(argv))文件“train.py”,第180行,在train train配置中的主图形\u hook\u fn=图形\u rewriter\u fn)文件“models/research/object\u detection/trainer.py”,第264行。预回迁队列容量、数据扩充选项)文件“models/research/object\u detection/trainer.py”,第59行,在get\u next dataset\u builder中的创建队列张量dict=create\u张量dict\u fn()文件“train.py”,第121行。构建(配置)。get_next()文件“models/research/object_detection/builders/dataset_builder.py”,第155行,内置label_map_proto_File=label_map_proto_File)文件“models/research/object_detection/data_decoders/tf_example_decoder.py”,第245;行,在init use_display_name)文件“models/research/object_detection/util/label_-map_-util.py”第152行,在load_labelmap标签映射的第137行,获取标签映射=加载labelmap(标签映射路径)文件“models/research/object_detection/utils/label_map_util.py”中。ParseFromString(label\u map\u string)类型错误:需要类似字节的对象,而不是“str”

我不明白有什么问题。在电视唱片里?在labels.pbtxt?或配置文件中?

共有1个答案

乐正浩博
2023-03-14

好的,我刚刚解决了tensorflow的调试问题。最后,我的标签虽然是utf-8格式的,但由于一些奇怪的字符,比如

 类似资料:
  • 此任务用于创建目录。如果目录不存在,它会创建一个新目录。 如果目录已存在,则不会创建目录。 此任务使用以下属性。 1. Apache Ant Mkdir任务属性 属性 描述 必需 要创建的目录 是 2. Apache Ant Mkdir任务示例 参考以下示例代码: 上面的代码将在当前项目位置创建一个目录:yiibai-dir。 创建嵌套目录(子目录) 上面的代码将在yiibai-dir目录中创建一

  • !Python{SCRIPTS_PATH'/generate_tfrecord.py'}-x{IMAGE_PATH'/火车'}-l{ANNOTATION_PATH'/label_map.pbtxt'}-o{ANNOTATION_PATH'/train.record'} !python{SCRIPTS_PATH'/generate_tfrecord.py'}-x{IMAGE_PATH'/test'}

  • 我想在父build.gradle文件中创建一个任务,该任务按这个特定顺序从子项目调用任务。这是我在build.gradle文件中的任务定义,每个子项目的任务都已定义并开始工作。我可以从命令行调用每个单独的任务。我希望能够从命令行调用这个父任务,并且它按照定义的顺序执行所有子项目任务。 无法获取org.gradle.api.project类型的项目“:LoadRemote”的未知属性“Remote

  • 我有一个工作,需要一个HiveQL连接2个表(2.5TB,45GB),重新分区到100,然后做一些其他的转换。这是早些时候执行的罚款。 作业阶段:阶段0:配置单元表1扫描阶段1:配置单元表2扫描阶段2:连接的钨交换阶段3:修复的钨交换 今天这项工作陷入了第二阶段。在200个应该执行的任务中,没有一个任务已经开始,但是290个任务由于执行程序被抢占而失败。 在深入研究阶段时,它说“执行者没有报告度量

  • 我正在尝试使用以下命令评估我的模型: 我得到了这个错误 我得到了这个错误: Traceback(最近一次调用):文件"eval.py",第142行,在tf.app.run()文件"C:\用户\mosta\Anaconda3\envs\matt\lib\site-包\tensorflow_core\python\平台\app.py",第40行,在运行_run(main=Main, Argv=Argv

  • @subpage tutorial_py_face_detection_cn 人脸识别 使用 haar-cascades