裁剪 Select 仅从 Python 中的图像中检测到的区域
Crop and Select Only the Detected Region from an Image in Python
我使用 Tensorflow 对象检测 API 从图像中检测手。通过使用提供的示例代码 (object_detection_tutorial.ipynb),我已经能够在图像上绘制边界框。有什么方法可以 select 仅检测到的区域(在边界框内)并将其作为图像获取?
例如,
示例输入图像
Tensorflow 输出
我想要的
对象检测API示例代码可以在这里找到。 https://github.com/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynb
非常感谢任何帮助!
是的,在教程中可以使用变量 output_dict
来实现这一点。注意传递给函数 vis_util.visualize_boxes_and_labels_on_image_array
的所有变量,它们包含框、分数等
首先你需要得到图像的形状,因为框坐标是规范化的形式。
img_height, img_width, img_channel = image_np.shape
然后将所有的框坐标转换为绝对格式
absolute_coord = []
THRESHOLD = 0.7 # adjust your threshold here
N = len(output_dict['detection_boxes'])
for i in range(N):
if output_dict['score'][i] < THRESHOLD:
continue
box = output_dict['detection_boxes']
ymin, xmin, ymax, xmax = box
x_up = int(xmin*img_width)
y_up = int(ymin*img_height)
x_down = int(xmax*img_width)
y_down = int(ymax*img_height)
absolute_coord.append((x_up,y_up,x_down,y_down))
然后你可以使用numpy slices 来获取边界框内的图像区域
bounding_box_img = []
for c in absolute_coord:
bounding_box_img.append(image_np[c[1]:c[3], c[0]:c[2],:])
然后将bounding_box_img
中的所有numpy数组保存为图像。保存时您可能需要更改形状,因为 img 的形状为 [img_height、img_width、img_channel]。如果您使用分数数组,您甚至可以过滤掉所有具有低置信度分数的检测。
PS:我可能搞砸了 img_height
和 img_width
但这些应该给你一个起点。
我使用 Tensorflow 对象检测 API 从图像中检测手。通过使用提供的示例代码 (object_detection_tutorial.ipynb),我已经能够在图像上绘制边界框。有什么方法可以 select 仅检测到的区域(在边界框内)并将其作为图像获取?
例如,
示例输入图像
Tensorflow 输出
我想要的
对象检测API示例代码可以在这里找到。 https://github.com/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynb
非常感谢任何帮助!
是的,在教程中可以使用变量 output_dict
来实现这一点。注意传递给函数 vis_util.visualize_boxes_and_labels_on_image_array
的所有变量,它们包含框、分数等
首先你需要得到图像的形状,因为框坐标是规范化的形式。
img_height, img_width, img_channel = image_np.shape
然后将所有的框坐标转换为绝对格式
absolute_coord = []
THRESHOLD = 0.7 # adjust your threshold here
N = len(output_dict['detection_boxes'])
for i in range(N):
if output_dict['score'][i] < THRESHOLD:
continue
box = output_dict['detection_boxes']
ymin, xmin, ymax, xmax = box
x_up = int(xmin*img_width)
y_up = int(ymin*img_height)
x_down = int(xmax*img_width)
y_down = int(ymax*img_height)
absolute_coord.append((x_up,y_up,x_down,y_down))
然后你可以使用numpy slices 来获取边界框内的图像区域
bounding_box_img = []
for c in absolute_coord:
bounding_box_img.append(image_np[c[1]:c[3], c[0]:c[2],:])
然后将bounding_box_img
中的所有numpy数组保存为图像。保存时您可能需要更改形状,因为 img 的形状为 [img_height、img_width、img_channel]。如果您使用分数数组,您甚至可以过滤掉所有具有低置信度分数的检测。
PS:我可能搞砸了 img_height
和 img_width
但这些应该给你一个起点。