EasyMetrics 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- easymetrics-0.1.0/EasyMetrics.egg-info/PKG-INFO +136 -0
- easymetrics-0.1.0/EasyMetrics.egg-info/SOURCES.txt +22 -0
- easymetrics-0.1.0/EasyMetrics.egg-info/dependency_links.txt +1 -0
- easymetrics-0.1.0/EasyMetrics.egg-info/requires.txt +4 -0
- easymetrics-0.1.0/EasyMetrics.egg-info/top_level.txt +1 -0
- easymetrics-0.1.0/LICENSE +21 -0
- easymetrics-0.1.0/MANIFEST.in +4 -0
- easymetrics-0.1.0/PKG-INFO +136 -0
- easymetrics-0.1.0/README.md +90 -0
- easymetrics-0.1.0/docs//344/275/277/347/224/250/346/214/207/345/215/227.md +253 -0
- easymetrics-0.1.0/docs//346/214/207/346/240/207/350/257/246/350/247/243.md +71 -0
- easymetrics-0.1.0/easyMetrics/__init__.py +4 -0
- easymetrics-0.1.0/easyMetrics/core/__init__.py +1 -0
- easymetrics-0.1.0/easyMetrics/core/base.py +37 -0
- easymetrics-0.1.0/easyMetrics/tasks/__init__.py +1 -0
- easymetrics-0.1.0/easyMetrics/tasks/detection/__init__.py +2 -0
- easymetrics-0.1.0/easyMetrics/tasks/detection/format_converter.py +277 -0
- easymetrics-0.1.0/easyMetrics/tasks/detection/interface.py +67 -0
- easymetrics-0.1.0/easyMetrics/tasks/detection/map.py +413 -0
- easymetrics-0.1.0/easyMetrics/tasks/detection/matcher.py +73 -0
- easymetrics-0.1.0/easyMetrics/tasks/detection/utils.py +77 -0
- easymetrics-0.1.0/pyproject.toml +35 -0
- easymetrics-0.1.0/setup.cfg +4 -0
- easymetrics-0.1.0/test/test_package.py +34 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: EasyMetrics
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: 轻量级、零依赖的机器学习指标评估平台
|
|
5
|
+
Author-email: EasyMetrics Team <team@easymetrics.example>
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 EasyMetrics Team
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
28
|
+
Project-URL: homepage, https://github.com/easymetrics/easymetrics
|
|
29
|
+
Project-URL: documentation, https://easymetrics.readthedocs.io
|
|
30
|
+
Project-URL: repository, https://github.com/easymetrics/easymetrics
|
|
31
|
+
Project-URL: issues, https://github.com/easymetrics/easymetrics/issues
|
|
32
|
+
Classifier: Programming Language :: Python :: 3
|
|
33
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
34
|
+
Classifier: Operating System :: OS Independent
|
|
35
|
+
Classifier: Intended Audience :: Developers
|
|
36
|
+
Classifier: Intended Audience :: Science/Research
|
|
37
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
38
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
39
|
+
Requires-Python: >=3.7
|
|
40
|
+
Description-Content-Type: text/markdown
|
|
41
|
+
License-File: LICENSE
|
|
42
|
+
Requires-Dist: numpy
|
|
43
|
+
Provides-Extra: progress
|
|
44
|
+
Requires-Dist: tqdm; extra == "progress"
|
|
45
|
+
Dynamic: license-file
|
|
46
|
+
|
|
47
|
+
# EasyMetrics
|
|
48
|
+
|
|
49
|
+
一个轻量级、零依赖的机器学习指标评估平台,基于 `numpy` 从零构建,专注于提供简单易用且准确的模型评估工具。
|
|
50
|
+
|
|
51
|
+
## ✨ 核心特性
|
|
52
|
+
- **零依赖**: 仅需 Python 和 Numpy,无需安装大型深度学习框架
|
|
53
|
+
- **易于扩展**: 模块化设计,通过继承 `Metric` 基类即可添加新任务
|
|
54
|
+
- **功能强大**: 完美支持目标检测任务的全方位评估
|
|
55
|
+
- 标准 COCO 指标: mAP、mAP_50、mAP_75、mAP_s/m/l
|
|
56
|
+
- 平均召回率 (AR) 指标
|
|
57
|
+
- 每类别独立评估
|
|
58
|
+
- **独家功能**: 自动计算满足特定精度要求的最佳置信度阈值
|
|
59
|
+
|
|
60
|
+
## � 目录结构
|
|
61
|
+
```
|
|
62
|
+
easyMetrics/
|
|
63
|
+
├── easyMetrics/ # 核心代码
|
|
64
|
+
│ ├── core/ # 抽象基类
|
|
65
|
+
│ │ └── base.py
|
|
66
|
+
│ └── tasks/ # 任务实现
|
|
67
|
+
│ └── detection/ # 目标检测
|
|
68
|
+
│ ├── interface.py # 对外接口
|
|
69
|
+
│ ├── map.py # mAP 核心逻辑
|
|
70
|
+
│ ├── matcher.py # 匹配策略
|
|
71
|
+
│ ├── utils.py # 辅助函数
|
|
72
|
+
│ └── format_converter.py # 格式转换器
|
|
73
|
+
├── docs/ # 文档
|
|
74
|
+
│ ├── 使用指南.md
|
|
75
|
+
│ └── 指标详解.md
|
|
76
|
+
├── demo.py # 使用示例
|
|
77
|
+
└── README.md
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 🚀 快速上手
|
|
81
|
+
|
|
82
|
+
### 目标检测评估
|
|
83
|
+
|
|
84
|
+
使用 `evaluate_detection` 函数,一行代码完成评估:
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
import numpy as np
|
|
88
|
+
from easyMetrics.tasks.detection import evaluate_detection
|
|
89
|
+
|
|
90
|
+
# 准备数据 - 每张图片一个字典
|
|
91
|
+
preds = [{
|
|
92
|
+
'boxes': np.array([[10, 10, 50, 50]]), # [x1, y1, x2, y2] 格式
|
|
93
|
+
'scores': np.array([0.9]), # 置信度分数
|
|
94
|
+
'labels': np.array([0]) # 类别索引
|
|
95
|
+
}]
|
|
96
|
+
targets = [{
|
|
97
|
+
'boxes': np.array([[10, 10, 50, 50]]), # 真实边界框
|
|
98
|
+
'labels': np.array([0]) # 真实类别
|
|
99
|
+
}]
|
|
100
|
+
|
|
101
|
+
# 1. 计算标准 COCO 指标
|
|
102
|
+
results = evaluate_detection(preds, targets)
|
|
103
|
+
print(f"mAP: {results['mAP']:.4f}")
|
|
104
|
+
print(f"mAP_50: {results['mAP_50']:.4f}")
|
|
105
|
+
|
|
106
|
+
# 2. 寻找最佳置信度阈值
|
|
107
|
+
# 场景: IoU=0.5 时精度至少达到 90%
|
|
108
|
+
results = evaluate_detection(
|
|
109
|
+
preds, targets,
|
|
110
|
+
score_criteria=[(0.5, 0.9)]
|
|
111
|
+
)
|
|
112
|
+
print(f"推荐阈值: {results.get('BestScore_IoU0.50_P0.90_0')}")
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 并行加速
|
|
116
|
+
|
|
117
|
+
对于大规模数据集,启用多核并行计算:
|
|
118
|
+
|
|
119
|
+
```python
|
|
120
|
+
# 使用 4 个核心
|
|
121
|
+
results = evaluate_detection(preds, targets, n_jobs=4)
|
|
122
|
+
|
|
123
|
+
# 使用所有可用核心
|
|
124
|
+
results = evaluate_detection(preds, targets, n_jobs=-1)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## 🔧 扩展新任务
|
|
128
|
+
|
|
129
|
+
添加新指标(例如分类任务的准确率):
|
|
130
|
+
|
|
131
|
+
1. 在 `easyMetrics/tasks/` 下创建新目录(如 `classification`)
|
|
132
|
+
2. 继承 `easyMetrics.core.Metric` 基类
|
|
133
|
+
3. 实现 `reset()`, `update()` 和 `compute()` 方法
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
*Created with ❤️ by EasyMetrics Team*
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
MANIFEST.in
|
|
3
|
+
README.md
|
|
4
|
+
pyproject.toml
|
|
5
|
+
EasyMetrics.egg-info/PKG-INFO
|
|
6
|
+
EasyMetrics.egg-info/SOURCES.txt
|
|
7
|
+
EasyMetrics.egg-info/dependency_links.txt
|
|
8
|
+
EasyMetrics.egg-info/requires.txt
|
|
9
|
+
EasyMetrics.egg-info/top_level.txt
|
|
10
|
+
docs/使用指南.md
|
|
11
|
+
docs/指标详解.md
|
|
12
|
+
easyMetrics/__init__.py
|
|
13
|
+
easyMetrics/core/__init__.py
|
|
14
|
+
easyMetrics/core/base.py
|
|
15
|
+
easyMetrics/tasks/__init__.py
|
|
16
|
+
easyMetrics/tasks/detection/__init__.py
|
|
17
|
+
easyMetrics/tasks/detection/format_converter.py
|
|
18
|
+
easyMetrics/tasks/detection/interface.py
|
|
19
|
+
easyMetrics/tasks/detection/map.py
|
|
20
|
+
easyMetrics/tasks/detection/matcher.py
|
|
21
|
+
easyMetrics/tasks/detection/utils.py
|
|
22
|
+
test/test_package.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
easyMetrics
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 EasyMetrics Team
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: EasyMetrics
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: 轻量级、零依赖的机器学习指标评估平台
|
|
5
|
+
Author-email: EasyMetrics Team <team@easymetrics.example>
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 EasyMetrics Team
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
28
|
+
Project-URL: homepage, https://github.com/easymetrics/easymetrics
|
|
29
|
+
Project-URL: documentation, https://easymetrics.readthedocs.io
|
|
30
|
+
Project-URL: repository, https://github.com/easymetrics/easymetrics
|
|
31
|
+
Project-URL: issues, https://github.com/easymetrics/easymetrics/issues
|
|
32
|
+
Classifier: Programming Language :: Python :: 3
|
|
33
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
34
|
+
Classifier: Operating System :: OS Independent
|
|
35
|
+
Classifier: Intended Audience :: Developers
|
|
36
|
+
Classifier: Intended Audience :: Science/Research
|
|
37
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
38
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
39
|
+
Requires-Python: >=3.7
|
|
40
|
+
Description-Content-Type: text/markdown
|
|
41
|
+
License-File: LICENSE
|
|
42
|
+
Requires-Dist: numpy
|
|
43
|
+
Provides-Extra: progress
|
|
44
|
+
Requires-Dist: tqdm; extra == "progress"
|
|
45
|
+
Dynamic: license-file
|
|
46
|
+
|
|
47
|
+
# EasyMetrics
|
|
48
|
+
|
|
49
|
+
一个轻量级、零依赖的机器学习指标评估平台,基于 `numpy` 从零构建,专注于提供简单易用且准确的模型评估工具。
|
|
50
|
+
|
|
51
|
+
## ✨ 核心特性
|
|
52
|
+
- **零依赖**: 仅需 Python 和 Numpy,无需安装大型深度学习框架
|
|
53
|
+
- **易于扩展**: 模块化设计,通过继承 `Metric` 基类即可添加新任务
|
|
54
|
+
- **功能强大**: 完美支持目标检测任务的全方位评估
|
|
55
|
+
- 标准 COCO 指标: mAP、mAP_50、mAP_75、mAP_s/m/l
|
|
56
|
+
- 平均召回率 (AR) 指标
|
|
57
|
+
- 每类别独立评估
|
|
58
|
+
- **独家功能**: 自动计算满足特定精度要求的最佳置信度阈值
|
|
59
|
+
|
|
60
|
+
## � 目录结构
|
|
61
|
+
```
|
|
62
|
+
easyMetrics/
|
|
63
|
+
├── easyMetrics/ # 核心代码
|
|
64
|
+
│ ├── core/ # 抽象基类
|
|
65
|
+
│ │ └── base.py
|
|
66
|
+
│ └── tasks/ # 任务实现
|
|
67
|
+
│ └── detection/ # 目标检测
|
|
68
|
+
│ ├── interface.py # 对外接口
|
|
69
|
+
│ ├── map.py # mAP 核心逻辑
|
|
70
|
+
│ ├── matcher.py # 匹配策略
|
|
71
|
+
│ ├── utils.py # 辅助函数
|
|
72
|
+
│ └── format_converter.py # 格式转换器
|
|
73
|
+
├── docs/ # 文档
|
|
74
|
+
│ ├── 使用指南.md
|
|
75
|
+
│ └── 指标详解.md
|
|
76
|
+
├── demo.py # 使用示例
|
|
77
|
+
└── README.md
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 🚀 快速上手
|
|
81
|
+
|
|
82
|
+
### 目标检测评估
|
|
83
|
+
|
|
84
|
+
使用 `evaluate_detection` 函数,一行代码完成评估:
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
import numpy as np
|
|
88
|
+
from easyMetrics.tasks.detection import evaluate_detection
|
|
89
|
+
|
|
90
|
+
# 准备数据 - 每张图片一个字典
|
|
91
|
+
preds = [{
|
|
92
|
+
'boxes': np.array([[10, 10, 50, 50]]), # [x1, y1, x2, y2] 格式
|
|
93
|
+
'scores': np.array([0.9]), # 置信度分数
|
|
94
|
+
'labels': np.array([0]) # 类别索引
|
|
95
|
+
}]
|
|
96
|
+
targets = [{
|
|
97
|
+
'boxes': np.array([[10, 10, 50, 50]]), # 真实边界框
|
|
98
|
+
'labels': np.array([0]) # 真实类别
|
|
99
|
+
}]
|
|
100
|
+
|
|
101
|
+
# 1. 计算标准 COCO 指标
|
|
102
|
+
results = evaluate_detection(preds, targets)
|
|
103
|
+
print(f"mAP: {results['mAP']:.4f}")
|
|
104
|
+
print(f"mAP_50: {results['mAP_50']:.4f}")
|
|
105
|
+
|
|
106
|
+
# 2. 寻找最佳置信度阈值
|
|
107
|
+
# 场景: IoU=0.5 时精度至少达到 90%
|
|
108
|
+
results = evaluate_detection(
|
|
109
|
+
preds, targets,
|
|
110
|
+
score_criteria=[(0.5, 0.9)]
|
|
111
|
+
)
|
|
112
|
+
print(f"推荐阈值: {results.get('BestScore_IoU0.50_P0.90_0')}")
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 并行加速
|
|
116
|
+
|
|
117
|
+
对于大规模数据集,启用多核并行计算:
|
|
118
|
+
|
|
119
|
+
```python
|
|
120
|
+
# 使用 4 个核心
|
|
121
|
+
results = evaluate_detection(preds, targets, n_jobs=4)
|
|
122
|
+
|
|
123
|
+
# 使用所有可用核心
|
|
124
|
+
results = evaluate_detection(preds, targets, n_jobs=-1)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## 🔧 扩展新任务
|
|
128
|
+
|
|
129
|
+
添加新指标(例如分类任务的准确率):
|
|
130
|
+
|
|
131
|
+
1. 在 `easyMetrics/tasks/` 下创建新目录(如 `classification`)
|
|
132
|
+
2. 继承 `easyMetrics.core.Metric` 基类
|
|
133
|
+
3. 实现 `reset()`, `update()` 和 `compute()` 方法
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
*Created with ❤️ by EasyMetrics Team*
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# EasyMetrics
|
|
2
|
+
|
|
3
|
+
一个轻量级、零依赖的机器学习指标评估平台,基于 `numpy` 从零构建,专注于提供简单易用且准确的模型评估工具。
|
|
4
|
+
|
|
5
|
+
## ✨ 核心特性
|
|
6
|
+
- **零依赖**: 仅需 Python 和 Numpy,无需安装大型深度学习框架
|
|
7
|
+
- **易于扩展**: 模块化设计,通过继承 `Metric` 基类即可添加新任务
|
|
8
|
+
- **功能强大**: 完美支持目标检测任务的全方位评估
|
|
9
|
+
- 标准 COCO 指标: mAP、mAP_50、mAP_75、mAP_s/m/l
|
|
10
|
+
- 平均召回率 (AR) 指标
|
|
11
|
+
- 每类别独立评估
|
|
12
|
+
- **独家功能**: 自动计算满足特定精度要求的最佳置信度阈值
|
|
13
|
+
|
|
14
|
+
## � 目录结构
|
|
15
|
+
```
|
|
16
|
+
easyMetrics/
|
|
17
|
+
├── easyMetrics/ # 核心代码
|
|
18
|
+
│ ├── core/ # 抽象基类
|
|
19
|
+
│ │ └── base.py
|
|
20
|
+
│ └── tasks/ # 任务实现
|
|
21
|
+
│ └── detection/ # 目标检测
|
|
22
|
+
│ ├── interface.py # 对外接口
|
|
23
|
+
│ ├── map.py # mAP 核心逻辑
|
|
24
|
+
│ ├── matcher.py # 匹配策略
|
|
25
|
+
│ ├── utils.py # 辅助函数
|
|
26
|
+
│ └── format_converter.py # 格式转换器
|
|
27
|
+
├── docs/ # 文档
|
|
28
|
+
│ ├── 使用指南.md
|
|
29
|
+
│ └── 指标详解.md
|
|
30
|
+
├── demo.py # 使用示例
|
|
31
|
+
└── README.md
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 🚀 快速上手
|
|
35
|
+
|
|
36
|
+
### 目标检测评估
|
|
37
|
+
|
|
38
|
+
使用 `evaluate_detection` 函数,一行代码完成评估:
|
|
39
|
+
|
|
40
|
+
```python
|
|
41
|
+
import numpy as np
|
|
42
|
+
from easyMetrics.tasks.detection import evaluate_detection
|
|
43
|
+
|
|
44
|
+
# 准备数据 - 每张图片一个字典
|
|
45
|
+
preds = [{
|
|
46
|
+
'boxes': np.array([[10, 10, 50, 50]]), # [x1, y1, x2, y2] 格式
|
|
47
|
+
'scores': np.array([0.9]), # 置信度分数
|
|
48
|
+
'labels': np.array([0]) # 类别索引
|
|
49
|
+
}]
|
|
50
|
+
targets = [{
|
|
51
|
+
'boxes': np.array([[10, 10, 50, 50]]), # 真实边界框
|
|
52
|
+
'labels': np.array([0]) # 真实类别
|
|
53
|
+
}]
|
|
54
|
+
|
|
55
|
+
# 1. 计算标准 COCO 指标
|
|
56
|
+
results = evaluate_detection(preds, targets)
|
|
57
|
+
print(f"mAP: {results['mAP']:.4f}")
|
|
58
|
+
print(f"mAP_50: {results['mAP_50']:.4f}")
|
|
59
|
+
|
|
60
|
+
# 2. 寻找最佳置信度阈值
|
|
61
|
+
# 场景: IoU=0.5 时精度至少达到 90%
|
|
62
|
+
results = evaluate_detection(
|
|
63
|
+
preds, targets,
|
|
64
|
+
score_criteria=[(0.5, 0.9)]
|
|
65
|
+
)
|
|
66
|
+
print(f"推荐阈值: {results.get('BestScore_IoU0.50_P0.90_0')}")
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 并行加速
|
|
70
|
+
|
|
71
|
+
对于大规模数据集,启用多核并行计算:
|
|
72
|
+
|
|
73
|
+
```python
|
|
74
|
+
# 使用 4 个核心
|
|
75
|
+
results = evaluate_detection(preds, targets, n_jobs=4)
|
|
76
|
+
|
|
77
|
+
# 使用所有可用核心
|
|
78
|
+
results = evaluate_detection(preds, targets, n_jobs=-1)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## 🔧 扩展新任务
|
|
82
|
+
|
|
83
|
+
添加新指标(例如分类任务的准确率):
|
|
84
|
+
|
|
85
|
+
1. 在 `easyMetrics/tasks/` 下创建新目录(如 `classification`)
|
|
86
|
+
2. 继承 `easyMetrics.core.Metric` 基类
|
|
87
|
+
3. 实现 `reset()`, `update()` 和 `compute()` 方法
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
*Created with ❤️ by EasyMetrics Team*
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# EasyMetrics 使用指南
|
|
2
|
+
|
|
3
|
+
EasyMetrics 是一个轻量级、零依赖的机器学习指标评估平台,专注于提供简单易用且准确的模型评估工具。
|
|
4
|
+
|
|
5
|
+
## 📦 安装与配置
|
|
6
|
+
|
|
7
|
+
### 快速安装
|
|
8
|
+
只需将 `easy_metrics` 文件夹复制到你的项目中,并确保安装了 `numpy`:
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
pip install numpy
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## 🚀 核心功能使用
|
|
15
|
+
|
|
16
|
+
### 1. 目标检测评估
|
|
17
|
+
|
|
18
|
+
#### 基本用法
|
|
19
|
+
|
|
20
|
+
```python
|
|
21
|
+
import numpy as np
|
|
22
|
+
from easyMetrics.tasks.detection import evaluate_detection
|
|
23
|
+
|
|
24
|
+
# 准备数据 - 每张图片一个字典
|
|
25
|
+
preds = [{
|
|
26
|
+
'boxes': np.array([[100, 100, 200, 200]]), # [x1, y1, x2, y2] 格式
|
|
27
|
+
'scores': np.array([0.9]), # 置信度分数
|
|
28
|
+
'labels': np.array([0]) # 类别索引
|
|
29
|
+
}]
|
|
30
|
+
targets = [{
|
|
31
|
+
'boxes': np.array([[100, 100, 200, 200]]), # 真实边界框
|
|
32
|
+
'labels': np.array([0]) # 真实类别
|
|
33
|
+
}]
|
|
34
|
+
|
|
35
|
+
# 评估并获取结果
|
|
36
|
+
results = evaluate_detection(preds, targets)
|
|
37
|
+
|
|
38
|
+
# 打印关键指标
|
|
39
|
+
print(f"mAP: {results['mAP']:.4f}")
|
|
40
|
+
print(f"mAP_50: {results['mAP_50']:.4f}")
|
|
41
|
+
print(f"mAP_75: {results['mAP_75']:.4f}")
|
|
42
|
+
print(f"AR_100: {results['AR_100']:.4f}")
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
#### 高级功能
|
|
46
|
+
|
|
47
|
+
##### 1.1 寻找最佳置信度阈值
|
|
48
|
+
|
|
49
|
+
**功能说明**:自动计算满足特定精度要求的最佳置信度阈值,帮助你确定模型上线时的阈值设置。
|
|
50
|
+
|
|
51
|
+
**使用场景**:
|
|
52
|
+
- 要求模型在 IoU=0.5 时精度至少达到 90%
|
|
53
|
+
- 需要为不同类别设置不同的阈值
|
|
54
|
+
|
|
55
|
+
**示例代码**:
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
# 场景 1: IoU=0.5 时精度至少达到 90%
|
|
59
|
+
results = evaluate_detection(
|
|
60
|
+
preds, targets,
|
|
61
|
+
score_criteria=[(0.5, 0.9)] # 格式: [(iou阈值, 最低精度要求)]
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
# 获取类别 0 的最佳阈值
|
|
65
|
+
best_thresh = results.get('BestScore_IoU0.50_P0.90_0')
|
|
66
|
+
print(f"类别 0 的推荐阈值: {best_thresh}")
|
|
67
|
+
|
|
68
|
+
# 场景 2: 多个精度要求
|
|
69
|
+
results = evaluate_detection(
|
|
70
|
+
preds, targets,
|
|
71
|
+
score_criteria=[(0.5, 0.9), (0.75, 0.8)]
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# 获取不同要求下的阈值
|
|
75
|
+
best_thresh_50 = results.get('BestScore_IoU0.50_P0.90_0')
|
|
76
|
+
best_thresh_75 = results.get('BestScore_IoU0.75_P0.80_0')
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
##### 1.2 并行加速计算
|
|
80
|
+
|
|
81
|
+
**功能说明**:对于大规模数据集,启用多核并行计算以提高评估速度。
|
|
82
|
+
|
|
83
|
+
**使用方法**:
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
# 使用 4 个核心进行评估
|
|
87
|
+
results = evaluate_detection(preds, targets, n_jobs=4)
|
|
88
|
+
|
|
89
|
+
# 使用所有可用核心
|
|
90
|
+
results = evaluate_detection(preds, targets, n_jobs=-1)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
##### 1.3 自定义指标筛选
|
|
94
|
+
|
|
95
|
+
**功能说明**:只计算你关心的指标,减少输出干扰,提高计算效率。
|
|
96
|
+
|
|
97
|
+
**使用示例**:
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
# 只计算 mAP 和 mAP_50
|
|
101
|
+
results = evaluate_detection(preds, targets, metrics=['mAP', 'mAP_50'])
|
|
102
|
+
print(results)
|
|
103
|
+
|
|
104
|
+
# 只计算召回率相关指标
|
|
105
|
+
results = evaluate_detection(preds, targets, metrics=['AR_100', 'AR_1000'])
|
|
106
|
+
print(results)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 📊 数据格式详解
|
|
110
|
+
|
|
111
|
+
### 预测结果 (preds)
|
|
112
|
+
|
|
113
|
+
`preds` 是一个列表,每个元素对应一张图片的预测结果,格式为字典:
|
|
114
|
+
|
|
115
|
+
| 键名 | 类型 | 形状 | 说明 |
|
|
116
|
+
|------|------|------|------|
|
|
117
|
+
| `boxes` | numpy.ndarray | (N, 4) | 预测的边界框,格式为 `[x1, y1, x2, y2]` |
|
|
118
|
+
| `scores` | numpy.ndarray | (N,) | 每个预测框的置信度分数 |
|
|
119
|
+
| `labels` | numpy.ndarray | (N,) | 每个预测框的类别索引 (整数) |
|
|
120
|
+
|
|
121
|
+
### 真实标签 (targets)
|
|
122
|
+
|
|
123
|
+
`targets` 是一个列表,每个元素对应一张图片的真实标签,格式为字典:
|
|
124
|
+
|
|
125
|
+
| 键名 | 类型 | 形状 | 说明 |
|
|
126
|
+
|------|------|------|------|
|
|
127
|
+
| `boxes` | numpy.ndarray | (M, 4) | 真实的边界框,格式为 `[x1, y1, x2, y2]` |
|
|
128
|
+
| `labels` | numpy.ndarray | (M,) | 真实的类别索引 (整数) |
|
|
129
|
+
|
|
130
|
+
### 数据格式示例
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
# 两张图片的示例数据
|
|
134
|
+
preds = [
|
|
135
|
+
# 图片 1 的预测
|
|
136
|
+
{
|
|
137
|
+
'boxes': np.array([[10, 10, 50, 50], [100, 100, 150, 150]]),
|
|
138
|
+
'scores': np.array([0.95, 0.8]),
|
|
139
|
+
'labels': np.array([0, 1])
|
|
140
|
+
},
|
|
141
|
+
# 图片 2 的预测
|
|
142
|
+
{
|
|
143
|
+
'boxes': np.array([[200, 200, 250, 250]]),
|
|
144
|
+
'scores': np.array([0.9]),
|
|
145
|
+
'labels': np.array([0])
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
|
|
149
|
+
targets = [
|
|
150
|
+
# 图片 1 的真实标签
|
|
151
|
+
{
|
|
152
|
+
'boxes': np.array([[10, 10, 50, 50], [100, 100, 150, 150]]),
|
|
153
|
+
'labels': np.array([0, 1])
|
|
154
|
+
},
|
|
155
|
+
# 图片 2 的真实标签
|
|
156
|
+
{
|
|
157
|
+
'boxes': np.array([[200, 200, 250, 250], [300, 300, 350, 350]]),
|
|
158
|
+
'labels': np.array([0, 1])
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## 🔧 扩展与定制
|
|
164
|
+
|
|
165
|
+
### 添加新任务
|
|
166
|
+
|
|
167
|
+
要添加新的评估任务(如分类、分割等):
|
|
168
|
+
|
|
169
|
+
1. 在 `easyMetrics/tasks/` 下创建新目录(例如 `classification`)
|
|
170
|
+
2. 创建评估接口文件(例如 `interface.py`)
|
|
171
|
+
3. 继承 `easyMetrics.core.Metric` 基类
|
|
172
|
+
4. 实现 `reset()`, `update()` 和 `compute()` 方法
|
|
173
|
+
|
|
174
|
+
### 自定义匹配策略
|
|
175
|
+
|
|
176
|
+
EasyMetrics 支持自定义匹配策略,详情请参考源码中的 `matcher.py` 文件。
|
|
177
|
+
|
|
178
|
+
## 📋 参数详解
|
|
179
|
+
|
|
180
|
+
### evaluate_detection 函数参数说明
|
|
181
|
+
|
|
182
|
+
#### 核心参数
|
|
183
|
+
|
|
184
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
185
|
+
| :--- | :--- | :--- | :--- |
|
|
186
|
+
| **preds** | List[Any] | 必填 | 每张图片的预测结果列表。支持多种格式,具体取决于 `format` 或 `pred_format` 参数。 |
|
|
187
|
+
| **targets** | List[Any] | 必填 | 每张图片的真实标签列表。支持多种格式,具体取决于 `format` 或 `target_format` 参数。 |
|
|
188
|
+
| **metrics** | Optional[List[str]] | None | 需要返回的特定指标列表。如果为 None,则返回所有计算的指标。 |
|
|
189
|
+
| **n_jobs** | int | 1 | 并行计算线程数。1 表示串行计算,-1 表示使用所有可用 CPU 核心。 |
|
|
190
|
+
| **score_criteria** | Optional[List[Tuple[float, float]]] | None | 计算指定 IoU 和精度下的最佳置信度阈值。格式为 `[(iou_thresh, min_precision), ...]`,例如 `[(0.5, 0.9)]` 表示寻找 IoU=0.5 时精度至少为 0.9 的最低置信度。 |
|
|
191
|
+
| **progress** | bool | True | 是否显示进度条。默认为 True,在计算过程中显示评估进度。 |
|
|
192
|
+
|
|
193
|
+
#### 格式参数
|
|
194
|
+
|
|
195
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
196
|
+
| :--- | :--- | :--- | :--- |
|
|
197
|
+
| **format** | str | "coco" | 输入数据的默认格式,当 `pred_format` 和 `target_format` 未指定时使用。支持 "coco", "voc", "yolo", "custom"。 |
|
|
198
|
+
| **pred_format** | Optional[str] | None | 预测结果的格式,优先级高于 `format`。 |
|
|
199
|
+
| **target_format** | Optional[str] | None | 真实标签的格式,优先级高于 `format`。 |
|
|
200
|
+
|
|
201
|
+
#### 额外参数(**kwargs)
|
|
202
|
+
|
|
203
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
204
|
+
| :--- | :--- | :--- | :--- |
|
|
205
|
+
| **image_size** | Tuple[int, int] | (640, 640) | YOLO 格式需要的图像尺寸 (width, height),用于将归一化坐标转换为绝对坐标。 |
|
|
206
|
+
| **custom_converter** | Callable | None | 自定义格式的转换函数,当 `format` 为 "custom" 时使用。 |
|
|
207
|
+
|
|
208
|
+
#### 示例用法
|
|
209
|
+
|
|
210
|
+
```python
|
|
211
|
+
# 基本用法
|
|
212
|
+
evaluate_detection(preds, targets)
|
|
213
|
+
|
|
214
|
+
# 指定并行计算线程数
|
|
215
|
+
evaluate_detection(preds, targets, n_jobs=4)
|
|
216
|
+
|
|
217
|
+
# 只计算特定指标
|
|
218
|
+
evaluate_detection(preds, targets, metrics=['mAP', 'mAP_50'])
|
|
219
|
+
|
|
220
|
+
# 计算最佳置信度阈值
|
|
221
|
+
evaluate_detection(preds, targets, score_criteria=[(0.5, 0.9)])
|
|
222
|
+
|
|
223
|
+
# 使用不同格式的输入
|
|
224
|
+
evaluate_detection(
|
|
225
|
+
preds, targets,
|
|
226
|
+
pred_format="yolo", # 预测值使用 YOLO 格式
|
|
227
|
+
target_format="voc", # 真值使用 VOC 格式
|
|
228
|
+
image_size=(640, 480) # YOLO 格式需要的图像尺寸
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
# 禁用进度条
|
|
232
|
+
evaluate_detection(preds, targets, progress=False)
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## 💡 实用技巧
|
|
236
|
+
|
|
237
|
+
1. **数据预处理**:确保输入的边界框坐标格式正确(`[x1, y1, x2, y2]`),且为浮点数类型。
|
|
238
|
+
|
|
239
|
+
2. **类别索引**:确保预测结果和真实标签使用相同的类别索引体系。
|
|
240
|
+
|
|
241
|
+
3. **性能优化**:
|
|
242
|
+
- 对于大规模数据集,使用 `n_jobs=-1` 启用并行计算
|
|
243
|
+
- 使用 `metrics` 参数只计算需要的指标
|
|
244
|
+
|
|
245
|
+
4. **结果分析**:
|
|
246
|
+
- 关注 `mAP_50` 指标评估模型在宽松条件下的性能
|
|
247
|
+
- 关注 `mAP_75` 指标评估模型在严格条件下的性能
|
|
248
|
+
- 使用 `AR_100` 评估模型的召回能力
|
|
249
|
+
|
|
250
|
+
## 📚 相关文档
|
|
251
|
+
|
|
252
|
+
- **指标详解.md**:详细介绍各种评估指标的计算原理
|
|
253
|
+
- **README.md**:项目概述和快速开始指南
|