mmdetection计算个数
时间: 2025-05-21 15:33:43 浏览: 29
### 如何使用 MMDetection 统计或计算检测目标的数量
在 MMDetection 中,可以通过自定义脚本或者修改现有代码实现统计检测框数量的功能。以下是具体方法:
#### 修改 `test` 函数中的逻辑
MMDetection 提供了一个用于模型推理的函数 `tools/test.py` 或者类似的测试工具。在这个过程中,可以捕获并处理每张图片上的预测结果。
通常情况下,模型返回的结果是一个列表,其中每个元素对应一张图像的检测结果。这些结果按照类别存储在一个二维数组中,形状为 `(N, 5)`,表示 N 个边界框及其置信度分数[^1]。
通过遍历该结构,可以轻松获取每张图的目标数量以及按类别的分布情况。以下是一个简单的 Python 实现示例:
```python
import mmcv
from mmdet.apis import init_detector, inference_detector
def count_detections(model, img_path):
result = inference_detector(model, img_path) # 获取单张图片的检测结果
total_count = 0
class_counts = {}
for i, bboxes in enumerate(result): # 遍历每一类的检测结果
count = len(bboxes)
if count > 0:
class_name = model.CLASSES[i]
class_counts[class_name] = count
total_count += count
return total_count, class_counts
# 初始化模型
config_file = 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'
checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'
model = init_detector(config_file, checkpoint_file)
img_path = 'demo/demo.jpg' # 输入图片路径
total, per_class = count_detections(model, img_path)
print(f"Total detections: {total}")
for cls, cnt in per_class.items():
print(f"{cls}: {cnt} objects")
```
上述代码展示了如何利用 `inference_detector` 对输入图片进行推断,并统计总的检测框数目和各类别下的对象数量。
#### 自定义绘图模块以显示计数信息
如果希望不仅统计还能够可视化输出,则可以在原生绘图基础上增加文字标注功能。例如,在绘制边框的同时打印当前帧内的物体总数或分类详情[^2]。
下面是一段可能需要调整的部分伪代码片段作为参考:
```python
def draw_and_count(img, results, score_thr=0.3):
from mmdet.visualization.image import imshow_det_bboxes
labels_to_names_seq = get_label_map() # 定义标签映射关系
counts_by_category = defaultdict(int)
filtered_boxes = []
valid_labels = []
for idx_cls, dets_per_cat in enumerate(results):
category_name = labels_to_names_seq[idx_cls]
keep_indices = np.where(dets_per_cat[:, -1] >= score_thr)[0].tolist()
num_valid = len(keep_indices)
if num_valid != 0:
counts_by_category[category_name] += num_valid
selected_boxes = dets_per_cat[keep_indices][:, :-1]
filtered_boxes.extend(selected_boxes.tolist())
valid_labels.extend([idx_cls]*num_valid)
summary_text = "\n".join([
f"{k}:{v}" for k,v in sorted(counts_by_category.items(), key=lambda item:item[1], reverse=True)])
annotated_img = imshow_det_bboxes(
img,
np.array(filtered_boxes),
np.array(valid_labels),
show=False,
font_size=16,
text_color='white',
bbox_color=(255, 102, 61))
cv2.putText(annotated_img,summary_text,(10,90),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=.7,color=[255,255,255])
return annotated_img
```
此部分实现了筛选高可信度的边界框并将它们叠加到原始图像之上,同时还附加了一条汇总字符串描述各个种类实例的存在状况。
#### 使用分析工具辅助理解性能指标
另外值得注意的是,除了直接操作 API 外部接口外,还可以借助内置的一些实用程序比如 `get_flops.py` 来评估资源消耗特性等等[^3]。不过这并不直接影响我们讨论的核心主题即“目标计数”。
---
阅读全文
相关推荐


















