Files
observer/flutter_app/test/model_merge_test.dart
T
2026-09-03 10:01:42 +08:00

67 lines
2.2 KiB
Dart

import 'package:observer/detection/detection_result.dart';
import 'package:observer/detection/detector_worker.dart';
import 'package:flutter_test/flutter_test.dart';
DetectionResult box(String label, double score, double x, double y,
{int modelId = -1, String modelName = ''}) =>
DetectionResult(
label: label,
score: score,
left: x,
top: y,
right: x + 0.1,
bottom: y + 0.1,
modelId: modelId,
modelName: modelName,
);
void main() {
test('不同模型同标签重复框:NMS 去重取高分', () {
// 两个模型都对同一目标检出同标签框(重复框需去重)
final all = [
box('target', 0.18, 0.3, 0.3, modelId: 1, modelName: '模型A'),
box('target', 0.55, 0.31, 0.3, modelId: 2, modelName: '模型B'),
];
final merged = mergeAcrossModels(all, 0.45);
expect(merged.length, 1);
expect(merged.first.score, 0.55);
expect(merged.first.modelName, '模型B');
});
test('不同类别重叠:去重取高分(实测多模型对同一目标检异类别)', () {
final all = [
box('target', 0.3, 0.5, 0.5, modelId: 1),
box('second', 0.7, 0.5, 0.5, modelId: 2), // 同位置但不同类别
];
final merged = mergeAcrossModels(all, 0.45);
expect(merged.length, 1);
expect(merged.first.label, 'second');
expect(merged.first.score, 0.7);
});
test('不同类别不重叠:都保留', () {
final all = [
box('target', 0.3, 0.1, 0.1, modelId: 1),
box('second', 0.7, 0.8, 0.8, modelId: 2), // 远处互不重叠
];
final merged = mergeAcrossModels(all, 0.45);
expect(merged.length, 2);
});
test('同模型内部与跨模型合并一致:远处不重叠保留', () {
final all = [
box('target', 0.2, 0.1, 0.1, modelId: 1, modelName: '模型A'),
box('target', 0.3, 0.8, 0.8, modelId: 1, modelName: '模型A'),
];
final merged = mergeAcrossModels(all, 0.45);
expect(merged.length, 2);
expect(merged.first.score, 0.3); // 按分排序
});
test('单条结果原样返回', () {
final single = [box('suspect', 0.11, 0.2, 0.2)];
final merged = mergeAcrossModels(single, 0.45);
expect(identical(merged, single), isTrue);
});
}