基于Google Vision QuickStart的目标检测器:按置信度过滤显示对象
自定义MLKit目标检测器:过滤低置信度对象不显示
需求
基于Google vision-quickstart示例修改目标检测器,实现置信度未达0.5的检测对象完全不显示(含边框、标签)。
原检测效果:
已做修改及当前问题
已修改ObjectGraphic.java移除低置信度标签文本:
// ObjectGraphic.java private static final float CONFIDENCE_THRESHOLD = 0.50f; ... for (Label label : object.getLabels()) { if (label.getConfidence() < CONFIDENCE_THRESHOLD) {continue;} canvas.drawText... }
但仅隐藏了标签文字,对象的边框和标签背景框仍会显示:
解决方案
方案1:添加前过滤(推荐,性能更优)
直接在ObjectDetectorProcessor.java的onSuccess方法中,先过滤掉无有效标签的检测对象,再添加到Overlay:
// 可复用ObjectGraphic中的阈值常量,或单独定义 private static final float CONFIDENCE_THRESHOLD = 0.50f; @Override protected void onSuccess( @NonNull List<DetectedObject> results, @NonNull GraphicOverlay graphicOverlay) { for (DetectedObject object : results) { // 检查当前对象是否存在符合置信度要求的标签 boolean hasValidLabel = false; for (Label label : object.getLabels()) { if (label.getConfidence() >= CONFIDENCE_THRESHOLD) { hasValidLabel = true; break; } } // 仅当存在有效标签时,才添加绘制图形 if (hasValidLabel) { graphicOverlay.add(new ObjectGraphic(graphicOverlay, object)); } } }
方案2:在绘制时跳过
修改ObjectGraphic.java的draw方法,若无有效标签则直接返回,不执行任何绘制逻辑:
@Override public void draw(Canvas canvas) { // 检查是否有符合置信度的标签 boolean hasValidLabel = false; for (Label label : object.getLabels()) { if (label.getConfidence() >= CONFIDENCE_THRESHOLD) { hasValidLabel = true; break; } } // 无有效标签则不绘制任何内容 if (!hasValidLabel) { return; } // 原有的绘制边框、标签文本代码... }
两种方案都能实现需求,方案1避免了创建不必要的ObjectGraphic实例,更推荐使用。
内容的提问来源于stack exchange,提问作者jw-smc
相关产品推荐
相关产品推荐

