ms-vite-plugin 1.4.10 → 1.4.11
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.
- package/docs/api/appleocr.md +78 -0
- package/docs/api/global.md +49 -0
- package/docs/api/node.md +3 -0
- package/docs/api/paddleocr.md +63 -11
- package/docs/api/yolo.md +58 -18
- package/docs/api/yolocls.md +272 -0
- package/docs/apicn/appleocr.md +78 -0
- package/docs/apicn/global.md +49 -0
- package/docs/apicn/node.md +6 -0
- package/docs/apicn/paddleocr.md +59 -7
- package/docs/apicn/yolo.md +50 -9
- package/docs/apicn/yolocls.md +272 -0
- package/docs/apipython/appleocr.md +75 -0
- package/docs/apipython/g.md +53 -0
- package/docs/apipython/node.md +4 -1
- package/docs/apipython/overview.md +1 -1
- package/docs/apipython/paddleocr.md +54 -4
- package/docs/apipython/yolo.md +37 -7
- package/docs/apipython/yolocls.md +269 -0
- package/docs/httpapi/api.md +284 -1
- package/package.json +1 -1
|
@@ -125,6 +125,31 @@ chinese_results = appleocr.recognize("screen", 0, 0, 1920, 1080, ["zh-Hans", "en
|
|
|
125
125
|
print(f"中英文识别结果: {chinese_results}")
|
|
126
126
|
```
|
|
127
127
|
|
|
128
|
+
#### `recognizeAbs` - 执行 OCR 识别,并将结果坐标映射为原图/全屏绝对坐标
|
|
129
|
+
|
|
130
|
+
参数与 `recognize` 相同。传入裁剪区域时,返回坐标可直接用于全屏点击。
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
def recognizeAbs(
|
|
134
|
+
input: str,
|
|
135
|
+
x: int = 0,
|
|
136
|
+
y: int = 0,
|
|
137
|
+
ex: int = 0,
|
|
138
|
+
ey: int = 0,
|
|
139
|
+
languages: Optional[List[str]] = None
|
|
140
|
+
) -> List[OCRResult]
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**示例:**
|
|
144
|
+
|
|
145
|
+
```python
|
|
146
|
+
from kuaijs import appleocr, action
|
|
147
|
+
|
|
148
|
+
abs_results = appleocr.recognizeAbs("screen", 100, 100, 500, 300)
|
|
149
|
+
if abs_results:
|
|
150
|
+
action.click(abs_results[0]["centerX"], abs_results[0]["centerY"])
|
|
151
|
+
```
|
|
152
|
+
|
|
128
153
|
### 数字识别
|
|
129
154
|
|
|
130
155
|
#### recognizeNumbers
|
|
@@ -174,6 +199,30 @@ for i, result in enumerate(number_results):
|
|
|
174
199
|
print(f"位置: ({result.centerX}, {result.centerY})")
|
|
175
200
|
```
|
|
176
201
|
|
|
202
|
+
#### `recognizeNumbersAbs` - 执行数字 OCR 识别,并将结果坐标映射为原图/全屏绝对坐标
|
|
203
|
+
|
|
204
|
+
参数与 `recognizeNumbers` 相同。传入裁剪区域时,返回坐标可直接用于全屏点击。
|
|
205
|
+
|
|
206
|
+
```python
|
|
207
|
+
def recognizeNumbersAbs(
|
|
208
|
+
input: str,
|
|
209
|
+
x: int = 0,
|
|
210
|
+
y: int = 0,
|
|
211
|
+
ex: int = 0,
|
|
212
|
+
ey: int = 0
|
|
213
|
+
) -> List[OCRResult]
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**示例:**
|
|
217
|
+
|
|
218
|
+
```python
|
|
219
|
+
from kuaijs import appleocr, action
|
|
220
|
+
|
|
221
|
+
abs_number_results = appleocr.recognizeNumbersAbs("screen", 100, 100, 500, 300)
|
|
222
|
+
if abs_number_results:
|
|
223
|
+
action.click(abs_number_results[0]["centerX"], abs_number_results[0]["centerY"])
|
|
224
|
+
```
|
|
225
|
+
|
|
177
226
|
### 文本查找
|
|
178
227
|
|
|
179
228
|
#### findText
|
|
@@ -224,3 +273,29 @@ for i, result in enumerate(text_results):
|
|
|
224
273
|
print(f"位置: ({result.x}, {result.y}) - ({result.ex}, {result.ey})")
|
|
225
274
|
print(f"中心点: ({result.centerX}, {result.centerY})")
|
|
226
275
|
```
|
|
276
|
+
|
|
277
|
+
#### `findTextAbs` - 查找目标文本,并将结果坐标映射为原图/全屏绝对坐标
|
|
278
|
+
|
|
279
|
+
参数与 `findText` 相同。传入裁剪区域时,返回坐标可直接用于全屏点击。
|
|
280
|
+
|
|
281
|
+
```python
|
|
282
|
+
def findTextAbs(
|
|
283
|
+
input: str,
|
|
284
|
+
texts: List[str],
|
|
285
|
+
x: int = 0,
|
|
286
|
+
y: int = 0,
|
|
287
|
+
ex: int = 0,
|
|
288
|
+
ey: int = 0,
|
|
289
|
+
languages: Optional[List[str]] = None
|
|
290
|
+
) -> List[OCRResult]
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**示例:**
|
|
294
|
+
|
|
295
|
+
```python
|
|
296
|
+
from kuaijs import appleocr, action
|
|
297
|
+
|
|
298
|
+
abs_hits = appleocr.findTextAbs("screen", ["确定"], 100, 100, 500, 400)
|
|
299
|
+
if abs_hits:
|
|
300
|
+
action.click(abs_hits[0]["centerX"], abs_hits[0]["centerY"])
|
|
301
|
+
```
|
package/docs/apipython/g.md
CHANGED
|
@@ -153,6 +153,59 @@ if g.getCpuAutoThrottle():
|
|
|
153
153
|
print("CPU 自动限流已开启")
|
|
154
154
|
```
|
|
155
155
|
|
|
156
|
+
#### `setCpuThrottleDelay` - 设置 CPU 限流延迟
|
|
157
|
+
|
|
158
|
+
设置 CPU 限流单次 sleep 延迟范围(毫秒)。默认 `min_ms=3`、`max_ms=30`。仅在 CPU 自动限流开启且触发限流时生效。
|
|
159
|
+
|
|
160
|
+
```python
|
|
161
|
+
def setCpuThrottleDelay(min_ms: int, max_ms: int) -> dict
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**参数:**
|
|
165
|
+
|
|
166
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
167
|
+
| --------- | ----- | -------- | ------ | ---------------------------------- |
|
|
168
|
+
| `min_ms` | `int` | 是 | - | 最低延迟(毫秒) |
|
|
169
|
+
| `max_ms` | `int` | 是 | - | 最高延迟(毫秒);小于 min_ms 时自动对齐 |
|
|
170
|
+
|
|
171
|
+
**返回值:**
|
|
172
|
+
|
|
173
|
+
| 类型 | 描述 |
|
|
174
|
+
| ------ | ------------------ |
|
|
175
|
+
| `dict` | `{"minMs": int, "maxMs": int}`,实际生效的延迟范围 |
|
|
176
|
+
|
|
177
|
+
**示例:**
|
|
178
|
+
|
|
179
|
+
```python
|
|
180
|
+
from kuaijs import g
|
|
181
|
+
|
|
182
|
+
delay = g.setCpuThrottleDelay(3, 30)
|
|
183
|
+
print(f"CPU 限流延迟: {delay['minMs']}~{delay['maxMs']}ms")
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
#### `getCpuThrottleDelay` - 获取 CPU 限流延迟
|
|
187
|
+
|
|
188
|
+
获取 CPU 限流延迟范围(毫秒)。
|
|
189
|
+
|
|
190
|
+
```python
|
|
191
|
+
def getCpuThrottleDelay() -> dict
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**返回值:**
|
|
195
|
+
|
|
196
|
+
| 类型 | 描述 |
|
|
197
|
+
| ------ | ------------------ |
|
|
198
|
+
| `dict` | `{"minMs": int, "maxMs": int}`,当前最低与最高延迟 |
|
|
199
|
+
|
|
200
|
+
**示例:**
|
|
201
|
+
|
|
202
|
+
```python
|
|
203
|
+
from kuaijs import g
|
|
204
|
+
|
|
205
|
+
delay = g.getCpuThrottleDelay()
|
|
206
|
+
print(f"CPU 限流延迟: {delay['minMs']}~{delay['maxMs']}ms")
|
|
207
|
+
```
|
|
208
|
+
|
|
156
209
|
#### `restartScript` - 重启脚本
|
|
157
210
|
|
|
158
211
|
```python
|
package/docs/apipython/node.md
CHANGED
|
@@ -46,6 +46,7 @@ class NodeInfo:
|
|
|
46
46
|
|
|
47
47
|
class NodeSelectorOptions(TypedDict, total=False):
|
|
48
48
|
maxDepth: int # 最大层级深度,默认 50
|
|
49
|
+
mode: int # 抓取模式:模式 1、模式 2,默认模式 1
|
|
49
50
|
```
|
|
50
51
|
|
|
51
52
|
## 节点选择器 (NodeSelector)
|
|
@@ -67,6 +68,7 @@ def createNodeSelector(params: Optional[NodeSelectorOptions] = None) -> NodeSele
|
|
|
67
68
|
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
68
69
|
| ---------- | ---- | -------- | ------ | --------------------- |
|
|
69
70
|
| `maxDepth` | int | 否 | 50 | 最大层级深度,默认 50 |
|
|
71
|
+
| `mode` | int | 否 | 1 | 抓取模式。模式 1、模式 2,默认模式 1 |
|
|
70
72
|
|
|
71
73
|
**返回值:** `NodeSelector`
|
|
72
74
|
|
|
@@ -77,7 +79,8 @@ from kuaijs import node
|
|
|
77
79
|
|
|
78
80
|
# 创建选择器
|
|
79
81
|
selector = node.createNodeSelector({
|
|
80
|
-
"maxDepth": 20 # 最大20层深度
|
|
82
|
+
"maxDepth": 20, # 最大20层深度
|
|
83
|
+
"mode": 1 # 默认模式 1
|
|
81
84
|
})
|
|
82
85
|
```
|
|
83
86
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
- 导入方式:
|
|
6
6
|
|
|
7
7
|
```python
|
|
8
|
-
from kuaijs import action, hid, image, appleocr, paddleocr, yolo, system, device, file, mysql, netcard, ime, media, hotupdate, tomatoocr, tts, ui, utils, node, pip, logger
|
|
8
|
+
from kuaijs import action, hid, image, appleocr, paddleocr, yolo, yolocls, system, device, file, mysql, netcard, ime, media, hotupdate, tomatoocr, tts, ui, utils, node, pip, logger
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
## 下载资源
|
|
@@ -43,7 +43,7 @@ class OCRResult(TypedDict):
|
|
|
43
43
|
初始化 PP-OCRv5 模型,这是使用 OCR 功能的前提。
|
|
44
44
|
|
|
45
45
|
```python
|
|
46
|
-
def loadV5(maxSideLen: int = 640) -> bool
|
|
46
|
+
def loadV5(maxSideLen: int = 640, useGpu: bool = False) -> bool
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
**参数:**
|
|
@@ -51,12 +51,15 @@ def loadV5(maxSideLen: int = 640) -> bool
|
|
|
51
51
|
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
52
52
|
| ------------ | ---- | -------- | ------ | -------------------------------- |
|
|
53
53
|
| `maxSideLen` | int | 否 | 640 | 输入图像的最大边长,默认值为 640 |
|
|
54
|
+
| `useGpu` | bool | 否 | False | 是否启用 GPU 加速 |
|
|
54
55
|
|
|
55
56
|
**返回值:**
|
|
56
57
|
|
|
57
|
-
| 类型 | 描述
|
|
58
|
-
| ------ |
|
|
59
|
-
| `bool` |
|
|
58
|
+
| 类型 | 描述 |
|
|
59
|
+
| ------ | --------------------------------------------------- |
|
|
60
|
+
| `bool` | 加载成功或模型已加载返回 `True`,否则返回 `False` |
|
|
61
|
+
|
|
62
|
+
重复调用 `loadV5` 时,如果模型已经加载,会直接返回 `True`,不会重新加载或应用新的参数。需要更换加载参数时,先调用 `free()` 释放模型。
|
|
60
63
|
|
|
61
64
|
**示例:**
|
|
62
65
|
|
|
@@ -134,6 +137,29 @@ else:
|
|
|
134
137
|
print(f"网络图片识别结果数量: {len(url_results)}")
|
|
135
138
|
```
|
|
136
139
|
|
|
140
|
+
#### `recognizeAbs` - 执行 OCR 识别,并将结果坐标映射为原图/全屏绝对坐标
|
|
141
|
+
|
|
142
|
+
参数与 `recognize` 相同。传入裁剪区域时,返回坐标可直接用于全屏点击。
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
def recognizeAbs(
|
|
146
|
+
input: str,
|
|
147
|
+
x: int = 0,
|
|
148
|
+
y: int = 0,
|
|
149
|
+
ex: int = 0,
|
|
150
|
+
ey: int = 0,
|
|
151
|
+
confidenceThreshold: float = 0.6
|
|
152
|
+
) -> List[OCRResult]
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**示例:**
|
|
156
|
+
|
|
157
|
+
```python
|
|
158
|
+
abs_results = paddleocr.recognizeAbs("screen", 100, 100, 500, 300)
|
|
159
|
+
if abs_results:
|
|
160
|
+
print(f"绝对坐标中心点: ({abs_results[0].centerX}, {abs_results[0].centerY})")
|
|
161
|
+
```
|
|
162
|
+
|
|
137
163
|
#### `findText` - 在识别结果中查找目标文本并返回对应子串坐标
|
|
138
164
|
|
|
139
165
|
在 OCR 识别结果中查找指定文本,返回匹配文本的坐标和置信度等信息。
|
|
@@ -190,6 +216,30 @@ else:
|
|
|
190
216
|
print(f"区域命中数量: {len(region_hits)}")
|
|
191
217
|
```
|
|
192
218
|
|
|
219
|
+
#### `findTextAbs` - 查找目标文本,并将结果坐标映射为原图/全屏绝对坐标
|
|
220
|
+
|
|
221
|
+
参数与 `findText` 相同。传入裁剪区域时,返回坐标可直接用于全屏点击。
|
|
222
|
+
|
|
223
|
+
```python
|
|
224
|
+
def findTextAbs(
|
|
225
|
+
input: str,
|
|
226
|
+
targetTexts: List[str],
|
|
227
|
+
x: int = 0,
|
|
228
|
+
y: int = 0,
|
|
229
|
+
ex: int = 0,
|
|
230
|
+
ey: int = 0,
|
|
231
|
+
confidenceThreshold: float = 0.6
|
|
232
|
+
) -> List[OCRResult]
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**示例:**
|
|
236
|
+
|
|
237
|
+
```python
|
|
238
|
+
abs_hits = paddleocr.findTextAbs("screen", ["确定"], 100, 100, 500, 400, 0.6)
|
|
239
|
+
if abs_hits:
|
|
240
|
+
print(f"绝对坐标中心点: ({abs_hits[0].centerX}, {abs_hits[0].centerY})")
|
|
241
|
+
```
|
|
242
|
+
|
|
193
243
|
### 资源管理
|
|
194
244
|
|
|
195
245
|
#### `free` - 释放 OCR 模型占用的内存资源
|
package/docs/apipython/yolo.md
CHANGED
|
@@ -65,7 +65,7 @@ class YoloResult(TypedDict):
|
|
|
65
65
|
加载模型是使用目标检测功能的前提。
|
|
66
66
|
|
|
67
67
|
```python
|
|
68
|
-
def load(paramPath: str, binPath: str, nc: int, version: int = 11) -> Optional[str]
|
|
68
|
+
def load(paramPath: str, binPath: str, nc: int = 0, version: int = 11, useGpu: bool = False) -> Optional[str]
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
**参数:**
|
|
@@ -74,8 +74,9 @@ def load(paramPath: str, binPath: str, nc: int, version: int = 11) -> Optional[s
|
|
|
74
74
|
| ----------- | ---- | -------- | ------ | ------------------------------------------- |
|
|
75
75
|
| `paramPath` | str | 是 | - | NCNN 模型的 param 文件绝对路径 |
|
|
76
76
|
| `binPath` | str | 是 | - | NCNN 模型的 bin 文件绝对路径 |
|
|
77
|
-
| `nc` | int |
|
|
77
|
+
| `nc` | int | 否 | 0 | 模型的标签数量;传 `0` 或省略时根据模型输出自动推断,显式传入但不匹配时检测返回空列表 |
|
|
78
78
|
| `version` | int | 否 | 11 | YOLO 模型版本号(仅支持 8/11/26) |
|
|
79
|
+
| `useGpu` | bool | 否 | False | 是否启用 GPU 加速 |
|
|
79
80
|
|
|
80
81
|
**返回值:**
|
|
81
82
|
|
|
@@ -92,8 +93,9 @@ from kuaijs import yolo
|
|
|
92
93
|
model_id = yolo.load(
|
|
93
94
|
"yolov8n_ncnn_model/model.ncnn.param",
|
|
94
95
|
"yolov8n_ncnn_model/model.ncnn.bin",
|
|
95
|
-
|
|
96
|
+
0,
|
|
96
97
|
8,
|
|
98
|
+
False,
|
|
97
99
|
)
|
|
98
100
|
```
|
|
99
101
|
|
|
@@ -102,7 +104,7 @@ model_id = yolo.load(
|
|
|
102
104
|
加载模型是使用目标检测功能的前提。
|
|
103
105
|
|
|
104
106
|
```python
|
|
105
|
-
def loadV11(paramPath: str, binPath: str, nc: int) -> Optional[str]
|
|
107
|
+
def loadV11(paramPath: str, binPath: str, nc: int = 0, useGpu: bool = False) -> Optional[str]
|
|
106
108
|
```
|
|
107
109
|
|
|
108
110
|
**参数:**
|
|
@@ -111,7 +113,8 @@ def loadV11(paramPath: str, binPath: str, nc: int) -> Optional[str]
|
|
|
111
113
|
| ----------- | ---- | -------- | ------ | ------------------------------------------- |
|
|
112
114
|
| `paramPath` | str | 是 | - | NCNN 模型的 param 文件绝对路径 |
|
|
113
115
|
| `binPath` | str | 是 | - | NCNN 模型的 bin 文件绝对路径 |
|
|
114
|
-
| `nc` | int |
|
|
116
|
+
| `nc` | int | 否 | 0 | 模型的标签数量;传 `0` 或省略时根据模型输出自动推断,显式传入但不匹配时检测返回空列表 |
|
|
117
|
+
| `useGpu` | bool | 否 | False | 是否启用 GPU 加速 |
|
|
115
118
|
|
|
116
119
|
**返回值:**
|
|
117
120
|
|
|
@@ -129,7 +132,8 @@ from kuaijs import yolo
|
|
|
129
132
|
model_id = yolo.loadV11(
|
|
130
133
|
"yolo11n_ncnn_model/model.ncnn.param",
|
|
131
134
|
"yolo11n_ncnn_model/model.ncnn.bin",
|
|
132
|
-
|
|
135
|
+
0, # 自动根据模型输出推断类别数量
|
|
136
|
+
False,
|
|
133
137
|
)
|
|
134
138
|
|
|
135
139
|
if model_id:
|
|
@@ -176,7 +180,7 @@ def detect(
|
|
|
176
180
|
from kuaijs import yolo
|
|
177
181
|
|
|
178
182
|
# 首先加载模型
|
|
179
|
-
mid = yolo.loadV11("yolo11n_ncnn_model/model.ncnn.param", "yolo11n_ncnn_model/model.ncnn.bin",
|
|
183
|
+
mid = yolo.loadV11("yolo11n_ncnn_model/model.ncnn.param", "yolo11n_ncnn_model/model.ncnn.bin", 0)
|
|
180
184
|
|
|
181
185
|
if not mid:
|
|
182
186
|
print("模型加载失败")
|
|
@@ -227,6 +231,32 @@ else:
|
|
|
227
231
|
print(f"网络图片检测结果: {len(url_results)} 个物体")
|
|
228
232
|
```
|
|
229
233
|
|
|
234
|
+
#### detectAbs - 对指定区域执行目标检测,并将结果坐标映射为原图/全屏绝对坐标
|
|
235
|
+
|
|
236
|
+
```python
|
|
237
|
+
def detectAbs(
|
|
238
|
+
modelId: str,
|
|
239
|
+
img: str,
|
|
240
|
+
x: int = 0,
|
|
241
|
+
y: int = 0,
|
|
242
|
+
ex: int = 0,
|
|
243
|
+
ey: int = 0,
|
|
244
|
+
targetSize: int = 640,
|
|
245
|
+
threshold: float = 0.4,
|
|
246
|
+
nmsThreshold: float = 0.5
|
|
247
|
+
) -> List[YoloResult]
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**示例:**
|
|
251
|
+
|
|
252
|
+
```python
|
|
253
|
+
from kuaijs import yolo, action
|
|
254
|
+
|
|
255
|
+
abs_results = yolo.detectAbs(mid, "screen", 100, 100, 500, 400, 640, 0.4, 0.5)
|
|
256
|
+
if abs_results:
|
|
257
|
+
action.click(abs_results[0]["centerX"], abs_results[0]["centerY"])
|
|
258
|
+
```
|
|
259
|
+
|
|
230
260
|
### 资源管理
|
|
231
261
|
|
|
232
262
|
#### free - 释放指定模型
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# YOLO 图像分类模块 (yolocls)
|
|
2
|
+
|
|
3
|
+
YOLO 图像分类模块基于 YOLOv8-cls / YOLO11-cls / YOLO26-cls 分类模型和 NCNN 框架,提供整图分类、区域分类和模型资源管理能力。
|
|
4
|
+
|
|
5
|
+
## 功能概览
|
|
6
|
+
|
|
7
|
+
- **模型管理**: 加载和释放 YOLOv8-cls / YOLO11-cls / YOLO26-cls NCNN 模型
|
|
8
|
+
- **图像分类**: 对屏幕截图、图片文件、HTTP 图片或图片 ID 执行整图分类
|
|
9
|
+
- **区域分类**: 先裁剪指定区域,再对裁剪结果执行分类
|
|
10
|
+
- **结果处理**: 返回 Ultralytics `Probs` 风格的完整概率、top1、top5 和对应置信度
|
|
11
|
+
- **资源控制**: 支持释放单个模型或释放全部已加载模型
|
|
12
|
+
|
|
13
|
+
## 适用场景
|
|
14
|
+
|
|
15
|
+
- 判断当前屏幕或图片属于哪个业务类别
|
|
16
|
+
- 对截图中的固定区域进行状态识别
|
|
17
|
+
- 对自定义 YOLO-cls 模型导出的 NCNN 模型执行端侧推理
|
|
18
|
+
|
|
19
|
+
## 数据结构
|
|
20
|
+
|
|
21
|
+
### YoloClsProbs
|
|
22
|
+
|
|
23
|
+
YOLO 分类概率结果字典,字段命名与 Ultralytics `Probs` 保持一致。
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
from typing import List, Optional, TypedDict
|
|
27
|
+
|
|
28
|
+
class YoloClsProbs(TypedDict):
|
|
29
|
+
data: List[float] # 所有类别概率,下标即类别 ID
|
|
30
|
+
top1: Optional[int] # 概率最高的类别 ID
|
|
31
|
+
top5: List[int] # 概率最高的 5 个类别 ID
|
|
32
|
+
top1conf: Optional[float] # top1 对应的概率
|
|
33
|
+
top5conf: List[float] # top5 对应的概率
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**字段说明:**
|
|
37
|
+
|
|
38
|
+
| 字段名 | 类型 | 描述 |
|
|
39
|
+
| ---------- | --------------------- | ---------------------------------------------------------- |
|
|
40
|
+
| `data` | `List[float]` | 所有类别概率数组,下标即类别 ID |
|
|
41
|
+
| `top1` | `Optional[int]` | 概率最高的类别 ID;分类失败时为 `None` |
|
|
42
|
+
| `top5` | `List[int]` | 概率最高的 5 个类别 ID,按概率从高到低排序 |
|
|
43
|
+
| `top1conf` | `Optional[float]` | `top1` 对应的概率;分类失败时为 `None` |
|
|
44
|
+
| `top5conf` | `List[float]` | `top5` 对应的概率,顺序与 `top5` 一致 |
|
|
45
|
+
|
|
46
|
+
**结果说明:**
|
|
47
|
+
|
|
48
|
+
- `top1` 等于 `top5[0]`,`top1conf` 等于 `data[top1]`。
|
|
49
|
+
- 当模型类别数少于 5 时,`top5` 和 `top5conf` 的长度会小于 5。
|
|
50
|
+
- 分类失败时返回空结果:`data`、`top5`、`top5conf` 为空列表,`top1` 和 `top1conf` 为 `None`。
|
|
51
|
+
|
|
52
|
+
## API 参考
|
|
53
|
+
|
|
54
|
+
### 模型管理
|
|
55
|
+
|
|
56
|
+
#### load - 加载 YOLO 分类模型(支持 YOLOv8-cls / YOLO11-cls / YOLO26-cls)
|
|
57
|
+
|
|
58
|
+
加载模型是使用图像分类能力的前提。支持 Ultralytics 官方 YOLOv8-cls、YOLO11-cls、YOLO26-cls 导出的 NCNN 分类模型,常见模型名使用 `-cls` 后缀,例如 `yolov8n-cls`、`yolo11n-cls`、`yolo26n-cls`。
|
|
59
|
+
|
|
60
|
+
```python
|
|
61
|
+
def load(
|
|
62
|
+
paramPath: str,
|
|
63
|
+
binPath: str,
|
|
64
|
+
nc: int = 0,
|
|
65
|
+
useGpu: bool = False
|
|
66
|
+
) -> Optional[str]
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**参数:**
|
|
70
|
+
|
|
71
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
72
|
+
| ----------- | ---- | -------- | ------ | ----------------------------------------- |
|
|
73
|
+
| `paramPath` | str | 是 | - | NCNN 模型的 param 文件路径 |
|
|
74
|
+
| `binPath` | str | 是 | - | NCNN 模型的 bin 文件路径 |
|
|
75
|
+
| `nc` | int | 否 | 0 | 模型类别数量;传 `0` 或省略时按模型输出自动推断,显式传入但不匹配时分类返回空结果 |
|
|
76
|
+
| `useGpu` | bool | 否 | False | 是否使用 GPU 推理 |
|
|
77
|
+
|
|
78
|
+
**返回值:**
|
|
79
|
+
|
|
80
|
+
| 类型 | 描述 |
|
|
81
|
+
| ------------- | ------------------------------------ |
|
|
82
|
+
| `str \| None` | 加载成功返回模型 ID,失败返回 `None` |
|
|
83
|
+
|
|
84
|
+
**示例:**
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
from kuaijs import yolocls
|
|
88
|
+
|
|
89
|
+
# 模型文件通常放在 res 目录
|
|
90
|
+
model_id = yolocls.load(
|
|
91
|
+
"yolo11n_cls_ncnn_model/model.ncnn.param",
|
|
92
|
+
"yolo11n_cls_ncnn_model/model.ncnn.bin",
|
|
93
|
+
1000, # ImageNet 分类模型通常为 1000 类
|
|
94
|
+
False,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
if model_id:
|
|
98
|
+
print(f"YOLO 分类模型加载成功,ID: {model_id}")
|
|
99
|
+
else:
|
|
100
|
+
print("YOLO 分类模型加载失败,请检查模型文件路径和格式")
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 图像分类
|
|
104
|
+
|
|
105
|
+
#### classify - 对输入图像执行分类
|
|
106
|
+
|
|
107
|
+
对整张输入图像执行分类,返回完整概率数组和 top1/top5 结果。
|
|
108
|
+
|
|
109
|
+
```python
|
|
110
|
+
def classify(
|
|
111
|
+
modelId: str,
|
|
112
|
+
img: str,
|
|
113
|
+
targetSize: int = 224
|
|
114
|
+
) -> YoloClsProbs
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**参数:**
|
|
118
|
+
|
|
119
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
120
|
+
| ------------ | ---- | -------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
|
|
121
|
+
| `modelId` | str | 是 | - | 模型 ID(通过 `load` 获取) |
|
|
122
|
+
| `img` | str | 是 | - | 图像输入源:<br>- `"screen"` - 使用当前屏幕截图<br>- `str` - 图片文件路径或 HTTP 图片地址<br>- `imageId` - 图片 ID(通过 image 模块获取) |
|
|
123
|
+
| `targetSize` | int | 否 | 224 | 分类输入大小,应与模型训练或导出时的输入尺寸一致 |
|
|
124
|
+
|
|
125
|
+
**返回值:**
|
|
126
|
+
|
|
127
|
+
| 类型 | 描述 |
|
|
128
|
+
| -------------- | --------------------------------------------------- |
|
|
129
|
+
| `YoloClsProbs` | Ultralytics `Probs` 风格分类结果,包含 top1/top5 等 |
|
|
130
|
+
|
|
131
|
+
**示例:**
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
from kuaijs import yolocls
|
|
135
|
+
|
|
136
|
+
model_id = yolocls.load(
|
|
137
|
+
"yolo11n_cls_ncnn_model/model.ncnn.param",
|
|
138
|
+
"yolo11n_cls_ncnn_model/model.ncnn.bin",
|
|
139
|
+
1000,
|
|
140
|
+
False,
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
if not model_id:
|
|
144
|
+
print("模型加载失败")
|
|
145
|
+
else:
|
|
146
|
+
probs = yolocls.classify(
|
|
147
|
+
model_id,
|
|
148
|
+
"screen", # 使用当前屏幕
|
|
149
|
+
224 # 分类模型常用输入尺寸
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
if probs["top1"] is not None:
|
|
153
|
+
print(f"top1 类别ID: {probs['top1']}")
|
|
154
|
+
print(f"top1 置信度: {round(probs['top1conf'] * 100, 2)}%")
|
|
155
|
+
else:
|
|
156
|
+
print("分类失败或无有效结果")
|
|
157
|
+
|
|
158
|
+
for i, class_id in enumerate(probs["top5"]):
|
|
159
|
+
conf = probs["top5conf"][i]
|
|
160
|
+
print(f"top{i + 1}: 类别ID={class_id}, 置信度={round(conf, 4)}")
|
|
161
|
+
|
|
162
|
+
# 如需读取某个类别的原始概率,可直接访问 data[class_id]
|
|
163
|
+
class_id = 0
|
|
164
|
+
if len(probs["data"]) > class_id:
|
|
165
|
+
print(f"类别 {class_id} 概率: {round(probs['data'][class_id], 4)}")
|
|
166
|
+
|
|
167
|
+
yolocls.free(model_id)
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
#### classifyRegion - 对指定区域执行分类
|
|
171
|
+
|
|
172
|
+
先从输入图像中裁剪指定区域,再对裁剪结果执行分类。适合只关心屏幕某个固定区域状态的场景。
|
|
173
|
+
|
|
174
|
+
```python
|
|
175
|
+
def classifyRegion(
|
|
176
|
+
modelId: str,
|
|
177
|
+
img: str,
|
|
178
|
+
x: int = 0,
|
|
179
|
+
y: int = 0,
|
|
180
|
+
ex: int = 0,
|
|
181
|
+
ey: int = 0,
|
|
182
|
+
targetSize: int = 224
|
|
183
|
+
) -> YoloClsProbs
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**参数:**
|
|
187
|
+
|
|
188
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
189
|
+
| ------------ | ---- | -------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
|
|
190
|
+
| `modelId` | str | 是 | - | 模型 ID(通过 `load` 获取) |
|
|
191
|
+
| `img` | str | 是 | - | 图像输入源:<br>- `"screen"` - 使用当前屏幕截图<br>- `str` - 图片文件路径或 HTTP 图片地址<br>- `imageId` - 图片 ID(通过 image 模块获取) |
|
|
192
|
+
| `x` | int | 否 | 0 | 裁剪区域左上角 x 坐标 |
|
|
193
|
+
| `y` | int | 否 | 0 | 裁剪区域左上角 y 坐标 |
|
|
194
|
+
| `ex` | int | 否 | 0 | 裁剪区域右下角 x 坐标 |
|
|
195
|
+
| `ey` | int | 否 | 0 | 裁剪区域右下角 y 坐标 |
|
|
196
|
+
| `targetSize` | int | 否 | 224 | 分类输入大小,应与模型训练或导出时的输入尺寸一致 |
|
|
197
|
+
|
|
198
|
+
**返回值:**
|
|
199
|
+
|
|
200
|
+
| 类型 | 描述 |
|
|
201
|
+
| -------------- | --------------------------------------------------- |
|
|
202
|
+
| `YoloClsProbs` | Ultralytics `Probs` 风格分类结果,包含 top1/top5 等 |
|
|
203
|
+
|
|
204
|
+
**示例:**
|
|
205
|
+
|
|
206
|
+
```python
|
|
207
|
+
region_probs = yolocls.classifyRegion(
|
|
208
|
+
model_id,
|
|
209
|
+
"screen",
|
|
210
|
+
100,
|
|
211
|
+
100,
|
|
212
|
+
500,
|
|
213
|
+
400,
|
|
214
|
+
224,
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
if region_probs["top1"] is not None:
|
|
218
|
+
print(
|
|
219
|
+
f"区域分类 top1={region_probs['top1']}, "
|
|
220
|
+
f"置信度={round(region_probs['top1conf'], 4)}"
|
|
221
|
+
)
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### 资源管理
|
|
225
|
+
|
|
226
|
+
#### free - 释放指定模型
|
|
227
|
+
|
|
228
|
+
释放指定分类模型占用的资源。
|
|
229
|
+
|
|
230
|
+
```python
|
|
231
|
+
def free(modelId: str) -> None
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**参数:**
|
|
235
|
+
|
|
236
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
237
|
+
| --------- | ---- | -------- | ------ | --------------- |
|
|
238
|
+
| `modelId` | str | 是 | - | 要释放的模型 ID |
|
|
239
|
+
|
|
240
|
+
**示例:**
|
|
241
|
+
|
|
242
|
+
```python
|
|
243
|
+
if model_id:
|
|
244
|
+
yolocls.free(model_id)
|
|
245
|
+
print(f"YOLO 分类模型 {model_id} 资源已释放")
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
#### freeAll - 释放所有模型
|
|
249
|
+
|
|
250
|
+
释放所有已加载的 YOLO 分类模型资源。
|
|
251
|
+
|
|
252
|
+
```python
|
|
253
|
+
def freeAll() -> None
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**示例:**
|
|
257
|
+
|
|
258
|
+
```python
|
|
259
|
+
yolocls.freeAll()
|
|
260
|
+
print("所有 YOLO 分类模型资源已释放")
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## 使用注意事项
|
|
264
|
+
|
|
265
|
+
- `targetSize` 默认值为 224,常见 YOLO-cls 模型使用该尺寸;自定义模型请填写训练或导出时使用的输入尺寸。
|
|
266
|
+
- `nc` 传 `0` 或省略时会根据模型输出自动推断类别数量;显式传入但和模型输出不匹配时返回空结果。
|
|
267
|
+
- `classifyRegion` 中 `x/y/ex/ey` 全部为 `0` 时表示不裁剪,直接对整张图分类。
|
|
268
|
+
- 裁剪区域必须位于图像范围内,并且 `ex > x`、`ey > y`。
|
|
269
|
+
- 分类结果中的类别 ID 需要结合训练时的类别列表解释;本模块只返回类别 ID 和概率。
|