如何在OpenCV DNN中禁用COCO部分类别检测并启用其余类别
解决OpenCV DNN中SSD-MobileNet仅保留特定COCO类别的问题
别去删模型节点!SSD-MobileNet的预训练模型结构是固定的,随便删节点会直接破坏推理的张量传递逻辑,程序崩溃是必然的。正确的做法是在推理完成后过滤检测结果,只保留你需要的类别,完全不用动模型本身。
具体操作步骤:
- 先确定你要保留的COCO类别对应的ID(COCO共80类,比如人是ID 0,汽车是ID 2,摩托车是ID 3,具体可查COCO类别对照表)。
- 在代码处理检测结果的环节,加个过滤判断,跳过不在允许列表里的类别。
举个代码修改的例子,对应原仓库里的检测结果遍历部分:
# 先定义你要保留的类别ID集合 allowed_class_ids = {0, 2, 3, 5} # 替换成你需要的类别ID for i in range(detections.shape[2]): confidence = detections[0, 0, i, 2] if confidence > conf_threshold: class_id = int(detections[0, 0, i, 1]) # 过滤掉不允许的类别 if class_id not in allowed_class_ids: continue # 下面的绘制检测框、显示类别名称等逻辑正常执行 class_name = classes[class_id] # ... 原代码里的绘制逻辑
如果你觉得推理后过滤还不够,想减少模型计算量,那得重新训练只包含目标类别的SSD-MobileNet模型,但这需要准备数据集、训练环境,成本比过滤高很多,一般场景下用推理后过滤就足够了。
内容的提问来源于stack exchange,提问作者Osama Gaweesh
相关产品推荐
相关产品推荐

