Обнаружение ограничивающей рамки отключено

#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. Спасибо, сэр!! По какой-то причине ваш пост вызвал у меня в голове одну мысль. Оказывается, вместо размеров камеры следует использовать размеры изображения.