在没有 Google Coral USB 的情况下使用 tensorflow lite 进行图像分类

问题描述

我正在尝试使用 Google Goral Edge TPU USB 设备评估 RaspBerry Pi 的性能,但不使用它对视频文件进行图像分类任务。我已经设法使用 Edge TPU USB 设备评估了性能。但是,当我尝试运行 tensorflow lite 代码来运行推理时,它会收到一个错误,告诉我需要插入设备:

ValueError: Failed to load delegate from libedgetpu.so.1

我具体做的是使用珊瑚设备对视频进行推理,并保存视频中的每一帧以对硬件进行基准测试。

import argparse
import time
import cv2
import numpy as np
from pycoral.adapters import classify,common
from pycoral.utils.dataset import read_label_file
from pycoral.utils.edgetpu import make_interpreter
from utils import visualization as visual

WINDOW_NAME = "Edge TPU Image classification"


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)
    parser.add_argument("--top_k",help="keep top k candidates.",default=2,type=int)
    parser.add_argument("--threshold",help="score threshold.",default=0.0,type=float)
    parser.add_argument("--width",help="Resolution width.",default=640,type=int)
    parser.add_argument("--height",help="Resolution height.",default=480,type=int)
    parser.add_argument("--videopath",help="File path of Videofile.",default="")
    args = parser.parse_args()

    # Initialize window.
    cv2.namedWindow(WINDOW_NAME)
    cv2.moveWindow(WINDOW_NAME,100,200)

    # Initialize engine and load labels.
    count = 0
    interpreter = make_interpreter(args.model)
    interpreter.allocate_tensors()
    labels = read_label_file(args.label) if args.label else None
    elapsed_list = []
    cap = cv2.VideoCapture('/home/pi/coral-usb/pycoral/test_data/video.mkv)
    while cap.isOpened():
        _,frame = cap.read()
        im = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
        cv2.imwrite("/home/pi/Desktop/frames/frame_%d.jpeg" % count,frame)
        print('gravou o frame_%d'% count,frame)      
        cv2.imshow('Frame',frame)
        cap_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
        cap_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
        # Run inference.
        start = time.perf_counter()

        _,scale = common.set_resized_input(
            interpreter,(cap_width,cap_height),lambda size: cv2.resize(im,size)
        )
        interpreter.invoke()

        # Check result.
        results = classify.get_classes(interpreter,args.top_k,args.threshold)
        elapsed_ms = (time.perf_counter() - start) * 1000
        if results:
            for i in range(len(results)):
                label = "{0} ({1:.2f})".format(labels[results[i][0]],results[i][1])
                pos = 60 + (i * 30)
                visual.draw_caption(frame,(10,pos),label)


        # display
        cv2.imshow(WINDOW_NAME,frame)
        if cv2.waitKey(10) & 0xFF == ord("q"):
            break

代码用于使用珊瑚设备运行推理。我想知道如何在没有珊瑚的情况下做同样的事情?我想测试一下使用我的模型在有和没有边缘 tpu USB 设备的情况下的区别。

最后,我尝试使用 tensorflow lite 从这个 link 进行图像分类。但是,我收到以下错误

运行时错误:遇到未解析的自定义操作:edgetpu-custom-op.Node 编号 0 (edgetpu-custom-op) 未能准备。

解决方法

我最近进入这个领域是为了指导论文。我们在带有 Coral USB 的树莓派 4 中测试了人脸检测,而没有(在 rpi CPU 上的推断)。您是否为两者使用相同的模型文件?如果是这种情况,那么这就是问题所在。 您需要使用裸 tflite 模型进行 CPU 推理,使用 TPU 编译模型进行 TPU 推理。 您可以查看此 repo,您可以在其中找到我之前提到的代码(它没有很好的文档记录,但可以正常工作,请查看推理 CPU 和推理 CORAL 文件)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...