如何将 Tensorflow 输出边界框调整为原始图像
How to Resize the Tensorflow Output Bounding Box to Original Image
所以,我正在研究一个我已经成功训练的模型,它是一个 .tflite
模型并使用 Tensorflow Lite。我正在使用 Python 3 作为我与 tensorflow 的接口,我无法从返回的图像中添加边界框。
我的问题是:
如何将 Tensorflow 输出边界框调整为原始图像
我能够获得 512x512
输入文件的输出,但我无法继续获得原始文件的输出,如果我是正确的话。如何继续调整模型输出的大小,以便继续从原始图像中裁剪该部分,然后保存它。
代码
import tensorflow as tf
import numpy as np
import cv2
import pathlib
import os
from silence_tensorflow import silence_tensorflow
from PIL import Image
silence_tensorflow()
interpreter = tf.lite.Interpreter(model_path="model.tflite")
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
#print(input_details)
#print(output_details)
interpreter.allocate_tensors()
def draw_rect(image, box):
h, w, c = image.shape
y_min = int(max(1, (box[0] * h)))
x_min = int(max(1, (box[1] * w)))
y_max = int(min(h, (box[2] * h)))
x_max = int(min(w, (box[3] * w)))
# draw a rectangle on the image
cv2.rectangle(image, (x_min, y_min), (x_max, y_max), (13, 13, 13), 2)
for file in pathlib.Path('./').iterdir():
if file.suffix != '.jpeg' and file.suffix != '.png':
continue
img = cv2.imread(r"{}".format(file.resolve()))
print(f'[Converting] {file.resolve()}')
new_img = cv2.resize(img, (512, 512))
interpreter.set_tensor(input_details[0]['index'], [new_img])
interpreter.invoke()
rects = interpreter.get_tensor(
output_details[0]['index'])
scores = interpreter.get_tensor(
output_details[2]['index'])
for index, score in enumerate(scores[0]):
if index == 0:
print('[Quantity]')
print(index,score)
if index == 1:
print('[Barcode]')
print(index,score)
if score > 0.2:
draw_rect(new_img,rects[0][index])
print(rects[0][index])
cv2.imshow("image", new_img)
cv2.waitKey(0)
解决方案
此问题最简单的解决方案是继续查找缩小图像的 h, w, c
与原始图像的 h, w, c
进行比较的因数。
可以使用下面的一段代码来理解。
h, w, c = image.shape # old image 512x512
h1, w1, c1 = image2.shape # new image resize
h = (h1/h) * h
w = (w1/w) * w
c = (c1/c) * c
新形成的h, w, c
值属于图像2或原始图像。
绘制矩形
为了继续绘制矩形,我们将继续使用以下方法解决此问题,以便继续并使其可行。
def draw_rect(image,image2, box):
h, w, c = image.shape # old image 512x512
h1, w1, c1 = image2.shape # new image resize
h = (h1/h) * h
w = (w1/w) * w
c = (c1/c) * c
y_min = int(max(1, (box[0] * h)))
x_min = int(max(1, (box[1] * w)))
y_max = int(min(h, (box[2] * h)))
x_max = int(min(w, (box[3] * w)))
# draw a rectangle on the image
cv2.rectangle(image2, (x_min, y_min), (x_max, y_max), (13, 13, 13), 2)
所以,我正在研究一个我已经成功训练的模型,它是一个 .tflite
模型并使用 Tensorflow Lite。我正在使用 Python 3 作为我与 tensorflow 的接口,我无法从返回的图像中添加边界框。
我的问题是:
如何将 Tensorflow 输出边界框调整为原始图像
我能够获得 512x512
输入文件的输出,但我无法继续获得原始文件的输出,如果我是正确的话。如何继续调整模型输出的大小,以便继续从原始图像中裁剪该部分,然后保存它。
代码
import tensorflow as tf
import numpy as np
import cv2
import pathlib
import os
from silence_tensorflow import silence_tensorflow
from PIL import Image
silence_tensorflow()
interpreter = tf.lite.Interpreter(model_path="model.tflite")
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
#print(input_details)
#print(output_details)
interpreter.allocate_tensors()
def draw_rect(image, box):
h, w, c = image.shape
y_min = int(max(1, (box[0] * h)))
x_min = int(max(1, (box[1] * w)))
y_max = int(min(h, (box[2] * h)))
x_max = int(min(w, (box[3] * w)))
# draw a rectangle on the image
cv2.rectangle(image, (x_min, y_min), (x_max, y_max), (13, 13, 13), 2)
for file in pathlib.Path('./').iterdir():
if file.suffix != '.jpeg' and file.suffix != '.png':
continue
img = cv2.imread(r"{}".format(file.resolve()))
print(f'[Converting] {file.resolve()}')
new_img = cv2.resize(img, (512, 512))
interpreter.set_tensor(input_details[0]['index'], [new_img])
interpreter.invoke()
rects = interpreter.get_tensor(
output_details[0]['index'])
scores = interpreter.get_tensor(
output_details[2]['index'])
for index, score in enumerate(scores[0]):
if index == 0:
print('[Quantity]')
print(index,score)
if index == 1:
print('[Barcode]')
print(index,score)
if score > 0.2:
draw_rect(new_img,rects[0][index])
print(rects[0][index])
cv2.imshow("image", new_img)
cv2.waitKey(0)
解决方案
此问题最简单的解决方案是继续查找缩小图像的 h, w, c
与原始图像的 h, w, c
进行比较的因数。
可以使用下面的一段代码来理解。
h, w, c = image.shape # old image 512x512
h1, w1, c1 = image2.shape # new image resize
h = (h1/h) * h
w = (w1/w) * w
c = (c1/c) * c
新形成的h, w, c
值属于图像2或原始图像。
绘制矩形
为了继续绘制矩形,我们将继续使用以下方法解决此问题,以便继续并使其可行。
def draw_rect(image,image2, box):
h, w, c = image.shape # old image 512x512
h1, w1, c1 = image2.shape # new image resize
h = (h1/h) * h
w = (w1/w) * w
c = (c1/c) * c
y_min = int(max(1, (box[0] * h)))
x_min = int(max(1, (box[1] * w)))
y_max = int(min(h, (box[2] * h)))
x_max = int(min(w, (box[3] * w)))
# draw a rectangle on the image
cv2.rectangle(image2, (x_min, y_min), (x_max, y_max), (13, 13, 13), 2)