You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pycoral API重写edgetpu旧版智能喂鸟器项目代码

基于PyCoral API的智能喂鸟器代码迁移方案

前置操作

  • 先删除你之前手动拷贝到/usr/lib/python3/dist-packages的旧版edgetpu目录,避免多版本库路径冲突
  • 确保系统安装了官方最新的libedgetpu14和pycoral包,直接通过apt安装即可,无需手动处理版本
  • 将原项目使用的tflite模型用最新版edgetpu_compiler重新编译,适配v14运行时,原模型训练逻辑不需要修改

迁移后完整代码

#!/usr/bin/python3
"""
Coral智能喂鸟器
使用PyCoral API调用EdgeTPU分析摄像头画面中的物体,检测到松鼠时播放驱离音效
支持自定义模型、标签文件、存储路径、驱离音效,可切换训练模式收集自定义模型训练用图片
"""
import argparse
import time
import logging
import gstreamer
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'):
    """保存摄像头帧和模型推理结果到指定目录"""
    tag = '%010d' % int(time.monotonic()*1000)
    name = '%s/img-%s.%s' %(path, tag, ext)
    image.save(name)
    print('帧已保存为: %s' % name)
    logging.info('图片: %s 结果: %s', tag, results)

def print_results(start_time, last_time, end_time, results):
    """打印推理结果到终端用于调试"""
    inference_rate = ((end_time - start_time) * 1000)
    fps = (1.0/(end_time - last_time))
    print('\n推理耗时: %.2f ms, 帧率: %.2f fps' % (inference_rate, fps))
    for label, score in results:
        print(' %s, 置信度=%.2f' %(label, score))

def do_training(results, last_results, top_k):
    """对比当前和上一帧的推理结果,检测到标签变化时返回True,用于收集训练图片"""
    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('检测到内容变化')
        return True
    return False

def user_selections():
    parser = argparse.ArgumentParser()
    parser.add_argument('--model', required=True,
                        help='.tflite模型路径')
    parser.add_argument('--labels', required=True,
                        help='标签文件路径')
    parser.add_argument('--top_k', type=int, default=3,
                        help='显示置信度最高的N个类别')
    parser.add_argument('--threshold', type=float, default=0.1,
                        help='类别置信度阈值')
    parser.add_argument('--storage', required=True,
                        help='图片和结果存储路径')
    parser.add_argument('--sound', required=True,
                        help='驱离音效文件路径')
    parser.add_argument('--print', default=False, required=False,
                        help='是否打印推理结果到终端')
    parser.add_argument('--training', default=False, required=False,
                        help='是否开启训练模式(收集图片)')
    args = parser.parse_args()
    return args

def main():
    args = user_selections()
    print("加载模型 %s,标签文件 %s" % (args.model, args.labels))
    # 替换旧版ClassificationEngine为PyCoral推理器
    interpreter = make_interpreter(args.model)
    interpreter.allocate_tensors()
    # 直接使用PyCoral内置的标签读取工具
    labels = read_label_file(args.labels)
    storage_dir = args.storage

    # 初始化日志文件
    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()
        # PyCoral推理流程
        size = common.input_size(interpreter)
        resized_image = image.convert('RGB').resize(size, Image.Resampling.LANCZOS)
        common.set_input(interpreter, resized_image)
        interpreter.invoke()
        results = classify.get_classes(interpreter, top_k=args.top_k, score_threshold=args.threshold)
        end_time = time.monotonic()
        results = [(labels.get(i.id, f'类别_{i.id}'), i.score) for i 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:
            # 自定义模型模式:可以修改下面的标签判断逻辑检测/驱离指定物体
            if results and results[0][0] != 'background':
                save_data(image, results, storage_dir)
            label_list = [item[0] for item in results]
            if 'fox squirrel, eastern fox squirrel, Sciurus niger' in label_list:
                playsound(args.sound)
                logging.info('已触发驱离音效')

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

if __name__ == '__main__':
    main()

核心修改说明

  • 完全移除了旧版edgetpu库的导入和路径追加逻辑,所有推理功能基于官方PyCoral API实现,适配v14运行时
  • 替换废弃的ClassificationEngine为PyCoral的Interpreter推理流程,兼容最新版EdgeTPU运行时
  • 复用PyCoral内置的read_label_file读取标签,避免自定义解析逻辑出错
  • 修复了原代码非训练模式下save_data函数参数顺序错误的问题
  • 增加了标签不存在时的兜底处理,避免标签缺失导致程序崩溃
  • 新增推理前的图片尺寸适配和格式转换,兼容不同输入尺寸的模型

内容的提问来源于stack exchange,提问作者taboopython

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 23:06:01