Как добавить быстрый текст в речь в скрипт обнаружения объектов TensorFlow Lite на Raspberry Pi без снижения FPS?

#python #tensorflow #raspberry-pi #text-to-speech #tensorflow-lite

#python #tensorflow #raspberry-pi #преобразование текста в речь #tensorflow-lite

Вопрос:

Я новичок на этом форуме и знаю только базовое кодирование, так что заранее извините, если мне что-то непонятно. Я пытаюсь запустить распознавание объектов в потоке видео в реальном времени с picamera, который подключен к Raspberry Pi 4, на котором работает Buster. Я использую модель обнаружения объектов Tensorflow Lite, потому что она имеет более высокую частоту кадров. Я следовал руководству EdjeElectronics по GitHub здесь и успешно запустил TFLite_detection_webcam.py скрипт без проблем. Мне удалось получить частоту кадров в секунду от 4,6 до 4,8, чем я действительно доволен. Однако я хотел добавить речевой вывод в модель, чтобы Pi сообщал мне, какой объект распознается. Для этого я использовал espeak в качестве моего механизма преобразования текста в речь в модели. Мне удалось перевести текст в речь в рабочее состояние, но это приводит к резкому падению частоты кадров примерно до 0,2 кадров в секунду. Очевидно, я хотел бы, чтобы скорость была не менее 4 кадров в секунду по сравнению с предыдущей версией, однако я не знаю, как изменить код. Блок кода находится здесь, ниже (код от EdjeElectronics), а код преобразования текста в речь находится в последних нескольких строках. Я добавил строку: call(["espeak", object_name]) #object_name is the name of the object being recognized and changes when a new object is recognized . Если у кого-нибудь есть какие-либо советы, которые помогут мне добавить текст в речь в скрипт без снижения скорости обнаружения / кадров в секунду, я был бы очень признателен. Или, если у вас есть какие-либо полезные предложения, например, использовать более быстрые и облегченные механизмы преобразования текста в речь, такие как Festival, или какие-либо идеи о том, как изменить код, это было бы здорово. Заранее спасибо.

  # Loop over all detections and draw detection box if confidence is above minimum threshold
for i in range(len(scores)):
    if ((scores[i] > min_conf_threshold) and (scores[i] <= 1.0)):

        # Get bounding box coordinates and draw box
        # Interpreter can return coordinates that are outside of image dimensions, need to force them to be within image using max() and min()
        ymin = int(max(1,(boxes[i][0] * imH)))
        xmin = int(max(1,(boxes[i][1] * imW)))
        ymax = int(min(imH,(boxes[i][2] * imH)))
        xmax = int(min(imW,(boxes[i][3] * imW)))
        
        cv2.rectangle(frame, (xmin,ymin), (xmax,ymax), (10, 255, 0), 2)

        # Draw label
        object_name = labels[int(classes[i])] # Look up object name from "labels" array using class index
        label = '%s: %d%%' % (object_name, int(scores[i]*100)) # Example: 'person: 72%'
        labelSize, baseLine = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.7, 2) # Get font size
        label_ymin = max(ymin, labelSize[1]   10) # Make sure not to draw label too close to top of window
        cv2.rectangle(frame, (xmin, label_ymin-labelSize[1]-10), (xmin labelSize[0], label_ymin baseLine-10), (255, 255, 255), cv2.FILLED) # Draw white box to put label text in
        cv2.putText(frame, label, (xmin, label_ymin-7), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 0), 2) # Draw label text
        call(["espeak", object_name])
  

Комментарии:

1. Просто комментарий, потому что я не пишу Python каждый день. Я думаю, вы хотите Popen вместо call , потому что call будет ждать завершения работы исполняемого файла espeak, тогда как Popen следует просто вызвать внешнюю программу как новый процесс и забыть об этом (возможно, нет потокобезопасности). Также рассмотрите возможность вызова espeak только на каждой X итерации, т.Е. if (i % 10 == 0): call(["espeak", object_name).