【问题标题】:Is there any good way to rewrite the edgetpu old code by using pycoral api?有没有什么好的方法可以使用 pycoral api 重写 edgetpu 旧代码?
【发布时间】:2021-08-15 14:04:06
【问题描述】:

我是使用coral devboard mini的初学者。

我想开始一个智能喂鸟器项目。

https://coral.ai/projects/bird-feeder/

我一直在尝试通过引用来执行代码 我无法运行bird_classify.py。

错误如下 untimeError:内部:自定义操作处理程序中不支持的数据类型:0节点号 0 (edgetpu-custom-op) 准备失败。

最初,该项目中的示例似乎已被弃用,并且 edgetpu 需要旧的运行时版本 13,而不是当前的 14。 (tflite 是 2.5 ) 我已经直接下载了,重新安装进去

/usr/lib/python3/dist-packagesm

,但是我无法卸载新版本,无法匹配版本。 有没有更好的方法来做到这一点?

另外,我决定放弃运行与示例相同的环境,并使用 pycoralapi 来运行 如果有重写代码以使用 pycoral 的好方法,请告诉我。

谢谢

#!/usr/bin/python3

"""
Coral Smart Bird Feeder

Uses ClassificationEngine from the EdgeTPU API to analyze animals in
camera frames. Sounds a deterrent if a squirrel is detected.

Users define model, labels file, storage path, deterrent sound, and
optionally can set this to training mode for collecting images for a custom
model.

"""

import argparse
import time
import re
import imp
import logging
import gstreamer

import sys
sys.path.append('/usr/lib/python3/dist-packages/edgetpu')

from edgetpu.classification.engine import ClassificationEngine
from PIL import Image
from playsound import playsound

from pycoral.adapters import classify
from pycoral.adapters import common
from pycoral.utils.dataset import read_label_file
from pycoral.utils.edgetpu import make_interpreter

def save_data(image,results,path,ext='png'):
    """Saves camera frame and model inference results
    to user-defined storage directory."""
    tag = '%010d' % int(time.monotonic()*1000)
    name = '%s/img-%s.%s' %(path,tag,ext)
    image.save(name)
    print('Frame saved as: %s' %name)
    logging.info('Image: %s Results: %s', tag,results)

def load_labels(path):
    """Parses provided label file for use in model inference."""
    p = re.compile(r'\s*(\d+)(.+)')
    with open(path, 'r', encoding='utf-8') as f:
      lines = (p.match(line).groups() for line in f.readlines())
      return {int(num): text.strip() for num, text in lines}

def print_results(start_time, last_time, end_time, results):
    """Print results to terminal for debugging."""
    inference_rate = ((end_time - start_time) * 1000)
    fps = (1.0/(end_time - last_time))
    print('\nInference: %.2f ms, FPS: %.2f fps' % (inference_rate, fps))
    for label, score in results:
      print(' %s, score=%.2f' %(label, score))

def do_training(results,last_results,top_k):
    """Compares current model results to previous results and returns
    true if at least one label difference is detected. Used to collect
    images for training a custom model."""
    new_labels = [label[0] for label in results]
    old_labels = [label[0] for label in last_results]
    shared_labels  = set(new_labels).intersection(old_labels)
    if len(shared_labels) < top_k:
      print('Difference detected')
      return True

def user_selections():
    parser = argparse.ArgumentParser()
    parser.add_argument('--model', required=True,
                        help='.tflite model path')
    parser.add_argument('--labels', required=True,
                        help='label file path')
    parser.add_argument('--top_k', type=int, default=3,
                        help='number of classes with highest score to display')
    parser.add_argument('--threshold', type=float, default=0.1,
                        help='class score threshold')
    parser.add_argument('--storage', required=True,
                        help='File path to store images and results')
    parser.add_argument('--sound', required=True,
                        help='File path to deterrent sound')
    parser.add_argument('--print', default=False, required=False,
                        help='Print inference results to terminal')
    parser.add_argument('--training', default=False, required=False,
                        help='Training mode for image collection')
    args = parser.parse_args()
    return args


def main():
    """Creates camera pipeline, and pushes pipeline through ClassificationEngine
    model. Logs results to user-defined storage. Runs either in training mode to
    gather images for custom model creation or in deterrent mode that sounds an
    'alarm' if a defined label is detected."""
    args = user_selections()
    print("Loading %s with %s labels."%(args.model, args.labels))
    engine = ClassificationEngine(args.model)
    labels = load_labels(args.labels)
    storage_dir = args.storage

    #Initialize logging file
    logging.basicConfig(filename='%s/results.log'%storage_dir,
                        format='%(asctime)s-%(message)s',
                        level=logging.DEBUG)

    last_time = time.monotonic()
    last_results = [('label', 0)]
    def user_callback(image,svg_canvas):
        nonlocal last_time
        nonlocal last_results
        start_time = time.monotonic()
        results = engine.classify_with_image(image, threshold=args.threshold, top_k=args.top_k)
        end_time = time.monotonic()
        results = [(labels[i], score) for i, score in results]

        if args.print:
          print_results(start_time,last_time, end_time, results)

        if args.training:
          if do_training(results,last_results,args.top_k):
            save_data(image,results, storage_dir)
        else:
          #Custom model mode:
          #The labels can be modified to detect/deter user-selected items
          if results[0][0] !='background':
            save_data(image, storage_dir,results)
          if 'fox squirrel, eastern fox squirrel, Sciurus niger' in results:
            playsound(args.sound)
            logging.info('Deterrent sounded')

        last_results=results
        last_time = end_time
    result = gstreamer.run_pipeline(user_callback)

if __name__ == '__main__':
    main()
enter code here

【问题讨论】:

    标签: edge-detection tpu google-coral


    【解决方案1】:

    我建议您遵循可从珊瑚示例中获得的示例之一。有一个名为classify_image.py 的示例,它使用了我发现的edgetpu (tflite)。安装珊瑚示例后,您必须深入了解目录层次结构。所以,就我而言,从根目录是:/home/pi/ml-projects/coral/pycoral/tensorflow/examples/lite/examples。最后一个示例目录中有 17 个文件。我正在使用:numpy 1.19.3、pycoral 2.0.0、scipy 1.7.1、tensorflow 2.4.0、tflite-runtime 2.5.0.post1。我已经安装了以下 edgetpu-runtime:edgetpu_runtime_20201105.zip。

    【讨论】:

    猜你喜欢
    • 2021-11-29
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2016-11-16
    • 2023-02-14
    • 2023-01-20
    相关资源
    最近更新 更多