#python-3.x #tensorflow #opencv
#python-3.x #тензорный поток #opencv
Вопрос:
Привет — я играю с обнаружением объектов тензорных потоков для Raspberry pi. https://github.com/tensorflow/examples/blob/master/lite/examples/object_detection/raspberry_pi/README.md
Моя проблема в том, что Tensorflow правильно обнаруживает объект. Однако неверно выдает координаты обнаруженного объекта. Это сводит меня с ума. Я не могу понять это.
PFB:
def main():
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument(
'--model', help='File path of .tflite file.', required=True)
parser.add_argument(
'--labels', help='File path of labels file.', required=True)
parser.add_argument(
'--threshold',
help='Score threshold for detected objects.',
required=False,
type=float,
default=0.4)
args = parser.parse_args()
np.set_printoptions(threshold=sys.maxsize)
labels = load_labels(args.labels)
interpreter = Interpreter(args.model)
interpreter.allocate_tensors()
_, input_height, input_width, _ = interpreter.get_input_details()[0]['shape']
with picamera.PiCamera(
resolution=(CAMERA_WIDTH, CAMERA_HEIGHT), framerate=30) as camera:
camera.rotation = 180
camera.start_preview()
try:
print("works!!!")
stream = io.BytesIO()
annotator = Annotator(camera)
count = 0
for _ in camera.capture_continuous(
stream, format='jpeg', use_video_port=True):
stream.seek(0)
image = Image.open(stream).convert('RGB').resize(
(input_width, input_height), Image.ANTIALIAS)
#image = image.rotate(180, PIL.Image.NEAREST, expand = 1)
start_time = time.monotonic()
results = detect_objects(interpreter, image, args.threshold)
elapsed_ms = (time.monotonic() - start_time) * 1000
open_cv_image = np.array(image)
distance = us.get_distance()
print(distance)
print("*********************NUM PY DATA **********************")
print(results)
#print(type(image))
filename = "geeks"
filename = str(count)
filename = ".png"
annotator.clear()
print("Annotating!!")
print(annotator)
annotate_objects(annotator,results,labels,open_cv_image, count)
annotator.text([5, 0], '%.1fms' % (elapsed_ms))
annotator.update()
print(annotator)
count = 1
stream.seek(0)
stream.truncate()
finally:
camera.stop_preview()
if __name__ == '__main__':
main()
def annotate_objects(annotator, results, labels, npcv, count):
"""Draws the bounding box and label for each object in the results."""
window_name = 'Image'
image = npcv
filename="image"
filename =str(count)
filename =".jpg"
for obj in results:
# Convert the bounding box figures from relative coordinates
# to absolute coordinates based on the original resolution
ymin, xmin, ymax, xmax = obj['bounding_box']
xmin = int(xmin * CAMERA_WIDTH)
xmax = int(xmax * CAMERA_WIDTH)
ymin = int(ymin * CAMERA_HEIGHT)
ymax = int(ymax * CAMERA_HEIGHT)
if obj['score'] >= 0.60:
start_point = (xmin,ymin)
end_point = (xmax,ymax)
color = (255, 0, 0)
thickness = 20
image = cv2.rectangle(image, start_point, end_point, color, thickness)
font = cv2.FONT_HERSHEY_SIMPLEX
org = (xmin, ymin)
fontScale = 0.5
color = (255, 0, 0)
text = labels[obj['class_id']]
thickness = 2
image = cv2.putText(image, text , org, font,
fontScale, color, thickness, cv2.LINE_AA)
annotator.bounding_box([xmin, ymin, xmax, ymax])
annotator.text([xmin, ymin],
'%sn%.2f' % (labels[obj['class_id']], obj['score']))
print(labels[obj['class_id']], obj['score'])
print(xmin, ymin, xmax, ymax)
cv2.imwrite(filename, image)
Ответ №1:
Я не вижу, что не так, но, похоже, что-то с системами координат, поскольку нижний правый угол окна находится вне кадра или, возможно, из-за изменения размера. Я бы начал с просмотра этих значений — можете ли вы их распечатать:
CAMERA_WIDTH
,CAMERA_HEIGHT
input_height
,input_width
ymin
,xmin
,ymax
,xmax
start_point
#(xmin, ymin)end_point
#(xmax, ymax)
А затем отобразите входное изображение модели:
image
= Image.open(stream).convert(‘RGB’).resize( (input_width, input_height), Изображение.СГЛАЖИВАНИЕ)
А затем отобразите изображение, которое вы используете для рисования ограничивающей рамки:
open_cv_image
Комментарии:
1. Спасибо, сэр!! По какой-то причине ваш пост вызвал у меня в голове одну мысль. Оказывается, вместо размеров камеры следует использовать размеры изображения.