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('pheasant', 0.18, 0.3, 0.3, modelId: 1, modelName: '环颈雉鸡模型'), box('pheasant', 0.55, 0.31, 0.3, modelId: 2, modelName: '野兔模型'), ]; final merged = mergeAcrossModels(all, 0.45); expect(merged.length, 1); expect(merged.first.score, 0.55); expect(merged.first.modelName, '野兔模型'); }); test('不同类别重叠:去重取高分(实测多模型对同一目标检异类别)', () { final all = [ box('pheasant', 0.3, 0.5, 0.5, modelId: 1), box('hare', 0.7, 0.5, 0.5, modelId: 2), // 同位置但不同类别 ]; final merged = mergeAcrossModels(all, 0.45); expect(merged.length, 1); expect(merged.first.label, 'hare'); expect(merged.first.score, 0.7); }); test('不同类别不重叠:都保留', () { final all = [ box('pheasant', 0.3, 0.1, 0.1, modelId: 1), box('hare', 0.7, 0.8, 0.8, modelId: 2), // 远处互不重叠 ]; final merged = mergeAcrossModels(all, 0.45); expect(merged.length, 2); }); test('同模型内部与跨模型合并一致:远处不重叠保留', () { final all = [ box('pheasant', 0.2, 0.1, 0.1, modelId: 1, modelName: '环颈雉鸡模型'), box('pheasant', 0.3, 0.8, 0.8, modelId: 1, modelName: '环颈雉鸡模型'), ]; 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); }); }