Как использовать кастомную модель TF.lite с 2 классами на Rasperry Pi с Coral?

Два дня назад я создал пользовательскую модель в Tflite из набора данных изображения. Точность 97,4% и всего 2 класса (человек, цветок).

Я преобразовал модель, чтобы использовать ее в моем Rasberry Pi с TPU Google Coral.

На данный момент у меня возникли некоторые проблемы. Документация Google Coral не для меня.

Язык: Python3

Библиотеки

  • Керас
  • Tensorflow
  • Подушка
  • Picamera
  • Numpy
  • EdgeTPU-Engine

Дерево проекта:

--------> модель (подпапка)

-----------> модель.tflite

-----------> labels.txt

--------> video_detection.py

Это код Python: (на самом деле код взят из документации)

import argparse
import io
import time
import numpy as np
import picamera
import edgetpu.classification.engine
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
      '--model', help='File path of Tflite model.', required=True)
    parser.add_argument(
      '--label', help='File path of label file.', required=True)
    args = parser.parse_args()
    with open(args.label, 'r', encoding="utf-8") as f:
        pairs = (l.strip().split(maxsplit=2) for l in f.readlines())
        labels = dict((int(k), v) for k, v in pairs)
    engine = edgetpu.classification.engine.ClassificationEngine(args.model)
    with picamera.PiCamera() as camera:
        camera.resolution = (640, 480)
        camera.framerate = 30
        _, width, height, channels = engine.get_input_tensor_shape()
        camera.start_preview()
        try:
            stream = io.BytesIO()
            for foo in camera.capture_continuous(stream,
                                                 format='rgb',
                                                 use_video_port=True,
                                                 resize=(width, height)):
                stream.truncate()
                stream.seek(0)
                input = np.frombuffer(stream.getvalue(), dtype=np.uint8)
                start_ms = time.time()
                results = engine.ClassifyWithInputTensor(input, top_k=1)
                elapsed_ms = time.time() - start_ms
                if results:
                    camera.annotate_text = "%s %.2f\n%.2fms" % (
                        labels[results[0][0]], results[0][1], elapsed_ms*1000.0)
        finally:
            camera.stop_preview()
if __name__ == '__main__':
    main()

Как запустить скрипт

python3 video_detection.py --model model/model.tflite --label model/labels.txt

Ошибка

`Traceback (most recent call last):
  File "video_detection.py", line 41, in <module>
    main()
  File "video_detection.py", line 16, in main
    labels = dict((int(k), v) for k, v in pairs)
  File "video_detection.py", line 16, in <genexpr>
    labels = dict((int(k), v) for k, v in pairs)
ValueError: not enough values to unpack (expected 2, got 1)`

Для меня сейчас очень сложно интегрировать нестандартную модель и использовать ее с кораллами.

Документация:

Спасибо за чтение, с наилучшими пожеланиями

E.


person sgsg    schedule 15.10.2019    source источник


Ответы (1)


Ошибка находится в файле labels.txt:

labels = dict((int(k), v) for k, v in pairs)
ValueError: not enough values to unpack (expected 2, got 1)`

Похоже, у вас есть строки, которые имеют только одно значение вместо двух

person olegr    schedule 15.10.2019
comment
Спасибо, мужик, проблема была в txt. Ярлыки должны быть: 0 человек 1 цветок и НЕ человек цветок. - person sgsg; 15.10.2019