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

Python Edge Impulse如何实现指定分类标签的阈值触发逻辑

问题根因

你的代码逻辑错误来自两个核心问题:

  • 阈值判断代码写在了for label in labels标签遍历循环的外部,循环执行完成后,label和score两个变量只会保留最后一个遍历到的标签(也就是你运行日志里排在最后的Unknown标签)的数值,根本获取不到"Hey Bmo"标签的实际置信度。
  • 你写的标签匹配逻辑没有和阈值判断绑定,只要循环遍历到"Hey Bmo"标签,不管得分多少都会触发my_function,完全没有做0.6的阈值校验。

另外你的代码还有两个基础语法/逻辑bug:

  • Python是缩进敏感语言,你定义的signal_handler、help、my_function函数内部的代码没有做正确缩进,运行时会直接报语法错误。
  • 代码末尾重复写了两次main(sys.argv[1:])调用,会导致程序启动后重复执行两遍主逻辑。
修复方法

把针对特定标签的阈值判断移到标签遍历循环内部,仅当标签匹配为"Hey Bmo"时才做置信度校验,其余标签直接跳过阈值判断即可。
修复后的完整可运行代码如下:

import os
import sys, getopt
import signal
import time
from edge_impulse_linux.audio import AudioImpulseRunner
DEFAULT_THRESHOLD = 0.60

my_threshold = DEFAULT_THRESHOLD
runner = None

def signal_handler(sig, frame):
    print('Interrupted')
    if (runner):
        runner.stop()
    sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)

def help():
    print('python classify.py <path_to_model.eim> <audio_device_ID, optional>' )

def my_function(label, score):
    # 在这里编写你需要触发的自定义业务逻辑
    print(f"检测到目标关键词,标签:{label},置信度:{score:.2f}")

def main(argv):
    try:
        opts, args = getopt.getopt(argv, "h", ["--help"])
    except getopt.GetoptError:
        help()
        sys.exit(2)

    for opt, arg in opts:
        if opt in ('-h', '--help'):
            help()
            sys.exit()

    if len(args) == 0:
        help()
        sys.exit(2)

    model = args[0]
    dir_path = os.path.dirname(os.path.realpath(__file__))
    modelfile = os.path.join(dir_path, model)

    with AudioImpulseRunner(modelfile) as runner:
        try:
            model_info = runner.init()
            labels = model_info['model_parameters']['labels']
            print('Loaded runner for "' + model_info['project']['owner'] + ' / ' + model_info['project']['name'] + '"')

            selected_device_id = None
            if len(args) >= 2:
                selected_device_id=int(args[1])
                print("Device ID "+ str(selected_device_id) + " has been provided as an argument.")

            for res, audio in runner.classifier(device_id=selected_device_id):
                print('Result (%d ms.) ' % (res['timing']['dsp'] + res['timing']['classification']), end='')
                for label in labels:
                    score = res['result']['classification'][label]
                    print('%s: %.2f\t' % (label, score), end='')
                    # 仅对目标标签做阈值校验,其余标签直接跳过
                    if label == "Hey Bmo" and score >= my_threshold:
                        my_function(label, score)
                        print('Yes', flush=True)
                print('', flush=True)

        finally:
            if (runner):
                runner.stop()

if __name__ == '__main__':
    main(sys.argv[1:])
验证说明

修复后运行程序,只有当分类结果中"Hey Bmo"的置信度大于等于0.6时才会触发你的自定义函数,不会再出现Unknown标签得分达标误触发、或者"Hey Bmo"得分达标不触发的问题,和你给出的终端输出示例完全匹配:当输出Hey Bmo: 0.90时会正常触发逻辑,其余得分低于0.6的场景不会触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:39:35