在Tensorflow对象检测API中将图像裁剪到边界框

bq3bfh9z  于 2022-11-25  发布在  其他
关注(0)|答案(2)|浏览(188)

如何在Tensorflow中将图像裁剪到边界框?我使用的是Python API。
从文档中,

tf.image.crop_to_bounding_box(image, offset_height, offset_width, target_height, target_width)

将图像裁剪到指定的边界框。
此操作从图像中剪切出一个矩形部分。返回图像的左上角位于图像中的offset_height,offset_width处,其右下角位于offset_height + target_height,offset_width + target_width处。
我可以得到一个边界框在标准化坐标中的坐标,

ymin = boxes[0,i,0]
    xmin = boxes[0,i,1]
    ymax = boxes[0,i,2]
    xmax = boxes[0,i,3]

并将其转换为绝对坐标,

(xminn, xmaxx, yminn, ymaxx) = (xmin * im_width, xmax * im_width, ymin * im_height, ymax * im_height)

然而,我不知道如何在crop_to_bounding_box函数中使用这些坐标。

iyfamqjs

iyfamqjs1#

由于我们将x视为水平方向,将y视为垂直方向,因此下面将使用指定框裁剪图像。

cropped_image = tf.image.crop_to_bounding_box(image, yminn, xminn, 
                                       ymaxx - yminn, xmaxx - xminn)
kgsdhlau

kgsdhlau2#

下面是在tensorflow中裁剪和保存边界框的工作代码

for idx in range(len(bboxes)):
    if bscores[idx] >= Threshold:
      #Region of Interest
      y_min = int(bboxes[idx][0] * im_height)
      x_min = int(bboxes[idx][1] * im_width)
      y_max = int(bboxes[idx][2] * im_height)
      x_max = int(bboxes[idx][3] * im_width)

      class_label = category_index[int(bclasses[idx])]['name']
      class_labels.append(class_label)
      bbox.append([x_min, y_min, x_max, y_max, class_label, float(bscores[idx])])

      #Crop Image - Working Code
      cropped_image = tf.image.crop_to_bounding_box(image, y_min, x_min, y_max - y_min, x_max - x_min).numpy().astype(np.int32)

      # encode_jpeg encodes a tensor of type uint8 to string
      output_image = tf.image.encode_jpeg(cropped_image)
      # decode_jpeg decodes the string tensor to a tensor of type uint8
      #output_image = tf.image.decode_jpeg(output_image)

      score = bscores[idx] * 100

      file_name = tf.constant(OUTPUT_PATH+image_name[:-4]+'_'+str(idx)+'_'+class_label+'_'+str(round(score))+'%'+'_'+os.path.splitext(image_name)[1])

      writefile = tf.io.write_file(file_name, output_image)

相关问题