树莓派4运行TensorFlow Lite目标检测,GPIO控制LED的分数逻辑问题
解决树莓派TFLite目标检测中基于置信度范围控制LED的问题
你的核心问题在于没有对置信度的范围做限定,同时当前的遍历逻辑存在缺陷——如果同一帧内检测到多个物体,后面的物体会覆盖前面的LED状态(比如先检测到符合条件的defective,LED点亮,随后检测到其他物体又会熄灭LED)。
以下是修改后的完整代码,整合了正确的置信度判断和逻辑优化:
import RPi.GPIO as GPIO # GPIO初始化 GPIO.setmode(GPIO.BOARD) LED_PIN = 11 # 替换为你实际使用的GPIO引脚 GPIO.setup(LED_PIN, GPIO.OUT) def turn_on_led(): GPIO.output(LED_PIN, GPIO.HIGH) def turn_off_led(): GPIO.output(LED_PIN, GPIO.LOW) # 定义目标检测的关键参数 TARGET_CLASS = 'defective' MIN_CONF_THRESHOLD = 0.95 # 对应95%置信度 MAX_CONF_THRESHOLD = 0.99 # 对应99%置信度 while True: # 保留原TFLite检测逻辑:获取当前帧的classes、scores、labels数组 # ...(比如读取摄像头帧、运行模型推理的代码) # 初始化LED状态:默认熄灭 need_turn_on = False for i in range(len(scores)): # 先过滤无效检测结果 if scores[i] > min_conf_threshold and scores[i] <= 1.0: object_name = labels[int(classes[i])] current_score = scores[i] # 判断是否为目标类别且置信度在指定范围内 if (object_name.lower() == TARGET_CLASS.lower() and MIN_CONF_THRESHOLD <= current_score <= MAX_CONF_THRESHOLD): need_turn_on = True # 找到符合条件的目标后可提前跳出循环,提升效率 break # 根据最终判断结果控制LED if need_turn_on: turn_on_led() else: turn_off_led() # 保留原代码的其他逻辑:绘制检测框、显示画面等 # ... # 程序退出时清理GPIO资源 GPIO.cleanup()
关键修改说明:
- 置信度范围限定:明确设置
0.95到0.99的分数区间,精准匹配需求中的95%-99%置信度要求 - 逻辑优化:
- 默认LED为熄灭状态,遍历检测结果时仅在找到符合条件的目标时标记点亮
- 遍历结束后统一控制LED,避免同一帧内多个检测结果互相覆盖LED状态
- 可维护性提升:用常量定义目标类别和置信度阈值,后续调整参数无需修改核心逻辑
内容的提问来源于stack exchange,提问作者Akash Patil
相关产品推荐
相关产品推荐

