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
相关产品推荐
相关产品推荐

