代码之家  ›  专栏  ›  技术社区  ›  Ajinkya

以CSV格式存储Tensorflow对象检测API图像输出和方框

  •  5
  • Ajinkya  · 技术社区  · 8 年前

    我指的是谷歌的Tensor Flow对象检测API。我已经成功地对物体进行了训练和测试。我的问题是,在测试后,我得到了一个对象周围绘制的框的输出图像,如何获得这些框的csv坐标?测试代码可在上找到( https://github.com/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynb )

    如果我看到助手代码,它会将图像加载到numpy数组中:

    def load_image_into_numpy_array(image):
      (im_width, im_height) = image.size
      return np.array(image.getdata()).reshape(
          (im_height, im_width, 3)).astype(np.uint8)
    

    在检测过程中,它获取这个图像数组,并用如下绘制的方框输出

    with detection_graph.as_default():
      with tf.Session(graph=detection_graph) as sess:
        # Definite input and output Tensors for detection_graph
        image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
        # Each box represents a part of the image where a particular object was detected.
        detection_boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
        # Each score represent how level of confidence for each of the objects.
        # Score is shown on the result image, together with the class label.
        detection_scores = detection_graph.get_tensor_by_name('detection_scores:0')
        detection_classes = detection_graph.get_tensor_by_name('detection_classes:0')
        num_detections = detection_graph.get_tensor_by_name('num_detections:0')
        for image_path in TEST_IMAGE_PATHS:
          image = Image.open(image_path)
          # the array based representation of the image will be used later in order to prepare the
          # result image with boxes and labels on it.
          image_np = load_image_into_numpy_array(image)
          # Expand dimensions since the model expects images to have shape: [1, None, None, 3]
          image_np_expanded = np.expand_dims(image_np, axis=0)
          # Actual detection.
          (boxes, scores, classes, num) = sess.run(
              [detection_boxes, detection_scores, detection_classes, num_detections],
              feed_dict={image_tensor: image_np_expanded})
          # Visualization of the results of a detection.
          vis_util.visualize_boxes_and_labels_on_image_array(
              image_np,
              np.squeeze(boxes),
              np.squeeze(classes).astype(np.int32),
              np.squeeze(scores),
              category_index,
              use_normalized_coordinates=True,
              line_thickness=8)
          plt.figure(figsize=IMAGE_SIZE)
          plt.imshow(image_np)
    

    我想将这些绿色框的坐标存储在csv文件中。有什么方法可以做到这一点?

    1 回复  |  直到 8 年前
        1
  •  7
  •   ITiger KleinYuan    8 年前

    boxes 阵列( [ymin, xmin, ymax, xmax] )已规范化。因此,必须将它们与图像宽度/高度相乘,才能获得原始值。

    要实现这一点,可以执行以下操作:

    for box in np.squeeze(boxes):
        box[0] = box[0] * heigh
        box[1] = box[1] * width
        box[2] = box[2] * height
        box[3] = box[3] * width
    

    然后,您可以使用numpy将框保存到csv。savetxt()方法:

    import numpy as np
    np.savetxt('yourfile.csv', boxes, delimiter=',')
    

    编辑:

    正如评论中所指出的,上述方法给出了框坐标列表。这是因为boxes张量保持每个检测区域的坐标。假设您使用默认的置信度接受阈值0.5,我的一个快速修复方法如下:

      for i, box in enumerate(np.squeeze(boxes)):
          if(np.squeeze(scores)[i] > 0.5):
              print("ymin={}, xmin={}, ymax={}, xmax{}".format(box[0]*height,box[1]*width,box[2]*height,box[3]*width))
    

    这应该打印四个值,而不是四个框。每个值表示边界框的一个角。

    如果使用另一个置信度接受阈值,则必须调整该值。也许您可以解析此参数的模型配置。

    要将坐标存储为CSV,可以执行以下操作:

    new_boxes = []
    for i, box in enumerate(np.squeeze(boxes)):
        if(np.squeeze(scores)[i] > 0.5):
            new_boxes.append(box)
    np.savetxt('yourfile.csv', new_boxes, delimiter=',')