ms-vite-plugin 1.4.17 → 1.4.18

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.
@@ -5,6 +5,8 @@ PaddleOCR 模块基于百度飞桨 PaddleOCR 技术,提供强大的光学字
5
5
  ## 功能概览
6
6
 
7
7
  - **自动加载**: 识别和查找方法会自动加载所需模型,无需先手动加载
8
+ - **模型选择**: 同一时间只保留一个 active 模型,默认 `ppocr-v6-tiny`,可通过模型 ID 手动加载 `ppocr-v6-small` 或 `ppocr-v5`
9
+ - **长边设置**: 可单独调整检测阶段最大边长,不需要重新加载已加载模型
8
10
  - **多源识别**: 支持屏幕截图、图片文件、URL 等多种输入源
9
11
  - **区域识别**: 支持指定区域的精确文字识别
10
12
  - **结构化结果**: 提供详细的文本位置、置信度和方向信息
@@ -61,98 +63,77 @@ interface OCRResult {
61
63
 
62
64
  ### 模型管理
63
65
 
64
- #### loadV5 - 可选预加载 PP-OCRv5 模型。
66
+ #### loadModel - 按模型 ID 手动加载内置 PaddleOCR 模型。
65
67
 
66
- 识别和查找方法会自动加载所需模型,通常不需要先调用 `loadV5`。只有需要提前加载或指定模型参数时才调用。
68
+ 识别和查找方法默认自动加载 `ppocr-v6-tiny`。只有需要切换模型或指定 GPU 参数时才调用 `loadModel`。PaddleOCR 同一时间只保留一个 active 模型,`loadModel` 加载成功后会替换已加载模型;检测长边请使用 `setMaxSideLen` 单独设置。
67
69
 
68
70
  ```typescript
69
- function loadV5(maxSideLen?: number, useGpu?: boolean): boolean;
71
+ function loadModel(modelId: "ppocr-v6-tiny" | "ppocr-v6-small" | "ppocr-v5", useGpu?: boolean): boolean;
70
72
  ```
71
73
 
72
74
  **参数:**
73
75
 
74
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
75
- | ------------ | ------- | -------- | ------ | -------------------------------- |
76
- | `maxSideLen` | number | | 640 | 输入图像的最大边长,默认值为 640 |
77
- | `useGpu` | boolean | 否 | false | 是否启用 GPU 加速 |
76
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
77
+ | --------- | ------------------------------------------------ | -------- | ------ | ------------- |
78
+ | `modelId` | `"ppocr-v6-tiny" \| "ppocr-v6-small" \| "ppocr-v5"` | | | 内置模型 ID |
79
+ | `useGpu` | boolean | 否 | false | 是否启用 GPU 加速 |
78
80
 
79
81
  **返回值:**
80
82
 
81
- | 类型 | 描述 |
82
- | ------- | --------------------------------------------------- |
83
- | boolean | 加载成功或模型已加载返回 `true`,否则返回 `false` |
83
+ | 类型 | 描述 |
84
+ | ------- | ----------------------------------------------------------- |
85
+ | boolean | 加载成功或目标模型已加载返回 `true`,模型 ID 不支持或加载失败返回 `false` |
84
86
 
85
- ### 文字识别
87
+ **示例:**
88
+
89
+ ```javascript
90
+ // 手动加载 PP-OCRv6 tiny 模型
91
+ paddleOcr.loadModel("ppocr-v6-tiny", false);
92
+
93
+ // 手动加载 PP-OCRv6 small 模型
94
+ const loaded = paddleOcr.loadModel("ppocr-v6-small", false);
95
+ logi(`PP-OCRv6 small 加载结果: ${loaded}`);
96
+
97
+ // 手动切换到 PP-OCRv5 模型
98
+ paddleOcr.loadModel("ppocr-v5", false);
99
+ ```
86
100
 
87
- #### recognize - 执行 OCR 文字识别,支持多种输入源和指定识别区域。
101
+ #### setMaxSideLen - 单独设置检测阶段输入最大边长。
102
+
103
+ 该方法只调整后续检测输入缩放,不会重新加载已加载的 PP-OCRv5/v6 模型。如果当前尚未加载模型,后续识别或查找触发默认 PP-OCRv6 tiny 自动加载时会沿用该设置。
88
104
 
89
105
  ```typescript
90
- function recognize(
91
- input: string,
92
- x?: number,
93
- y?: number,
94
- ex?: number,
95
- ey?: number,
96
- confidenceThreshold?: number,
97
- ): OCRResult[];
106
+ function setMaxSideLen(maxSideLen?: number): boolean;
98
107
  ```
99
108
 
100
109
  **参数:**
101
110
 
102
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
103
- | --------------------- | ------ | -------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
104
- | `input` | string | | | 输入源,支持以下类型:<br>- `"screen"` - 当前屏幕截图<br>- `string` - 图片文件路径或 URL<br>- `imageId` - 图片 ID(通过 image 模块获取) |
105
- | `x` | number | 否 | 0 | 识别区域左上角 x 坐标 |
106
- | `y` | number | 否 | 0 | 识别区域左上角 y 坐标 |
107
- | `ex` | number | 否 | 0 | 识别区域右下角 x 坐标 |
108
- | `ey` | number | 否 | 0 | 识别区域右下角 y 坐标 |
109
- | `confidenceThreshold` | number | 否 | 0.6 | 置信度阈值,默认值为 0.6 |
111
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
112
+ | ------------ | ------ | -------- | ------ | ----------------------------------------- |
113
+ | `maxSideLen` | number | | 640 | 输入图像的最大边长;传 0 或负数时使用 640 |
110
114
 
111
115
  **返回值:**
112
116
 
113
- | 类型 | 描述 |
114
- | ------------- | --------------------------------------------------------------------------------- |
115
- | `OCRResult[]` | 识别结果数组,坐标相对于裁剪区域 |
117
+ | 类型 | 描述 |
118
+ | ------- | -------------------- |
119
+ | boolean | 设置成功返回 `true` |
116
120
 
117
121
  **示例:**
118
122
 
119
123
  ```javascript
120
- // 识别整个屏幕
121
- const fullScreenResults = paddleOcr.recognize("screen", 0, 0, 0, 0);
122
- logi(`识别到 ${fullScreenResults.length} 个文本区域`);
123
- fullScreenResults.forEach((result, index) => {
124
- logi(`文本 ${index + 1}: ${JSON.stringify(result)}`);
125
- });
126
-
127
- // 识别屏幕指定区域(返回相对裁剪区域的坐标)
128
- const regionResults = paddleOcr.recognize("screen", 100, 100, 500, 300);
129
- logi(`指定区域识别结果: ${JSON.stringify(regionResults)}`);
130
-
131
- // 识别图片文件
132
- const imageResults = paddleOcr.recognize("/path/to/image.png", 0, 0, 800, 600);
133
- if (imageResults.length > 0) {
134
- logi("图片文字识别成功");
135
- imageResults.forEach((result) => {
136
- logi(`识别文字: ${JSON.stringify(result)}`);
137
- });
138
- } else {
139
- logi("图片中未识别到文字");
140
- }
124
+ // 只更新检测长边,不重新加载模型
125
+ paddleOcr.setMaxSideLen(960);
141
126
 
142
- // 识别网络图片
143
- const urlResults = paddleOcr.recognize(
144
- "https://example.com/image.jpg",
145
- 0,
146
- 0,
147
- 1000,
148
- 800,
149
- );
150
- logi(`网络图片识别结果: ${JSON.stringify(urlResults)}`);
127
+ // 后续识别会使用新的检测长边
128
+ const results = paddleOcr.recognizeAbs("screen", 0, 0, 0, 0);
129
+ logi(`识别数量: ${results.length}`);
151
130
  ```
152
131
 
132
+ ### 文字识别
133
+
153
134
  #### recognizeAbs - 执行 OCR 识别,并将结果坐标映射为原图/全屏绝对坐标。
154
135
 
155
- 参数与 `recognize` 相同。传入裁剪区域时,返回坐标可直接用于全屏点击。
136
+ 传入裁剪区域时,返回坐标会映射回原图或全屏坐标,可直接用于点击。
156
137
 
157
138
  ```typescript
158
139
  function recognizeAbs(
@@ -165,81 +146,35 @@ function recognizeAbs(
165
146
  ): OCRResult[];
166
147
  ```
167
148
 
168
- **示例:**
169
-
170
- ```javascript
171
- const absResults = paddleOcr.recognizeAbs("screen", 100, 100, 500, 300);
172
- if (absResults.length > 0) {
173
- action.click(absResults[0].centerX, absResults[0].centerY);
174
- }
175
- ```
176
-
177
- #### findText - 在识别结果中查找目标文本并返回对应子串坐标。
178
-
179
- ```typescript
180
- function findText(
181
- input: string,
182
- targetTexts: string[],
183
- x?: number,
184
- y?: number,
185
- ex?: number,
186
- ey?: number,
187
- confidenceThreshold?: number,
188
- exactMatch?: boolean,
189
- ): OCRResult[];
190
- ```
191
-
192
149
  **参数:**
193
150
 
194
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
195
- | --------------------- | -------- | -------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
196
- | `input` | string | 是 | | 输入源,支持以下类型:<br>- `"screen"` - 当前屏幕截图<br>- `string` - 图片文件路径或 URL<br>- `imageId` - 图片 ID(通过 image 模块获取) |
197
- | `targetTexts` | string[] | | | 目标文本数组,例如 `["你好", "确定"]` |
198
- | `x` | number | 否 | 0 | 查找区域左上角 x 坐标 |
199
- | `y` | number | 否 | 0 | 查找区域左上角 y 坐标 |
200
- | `ex` | number | 否 | 0 | 查找区域右下角 x 坐标 |
201
- | `ey` | number | 否 | 0 | 查找区域右下角 y 坐标 |
202
- | `confidenceThreshold` | number | 否 | 0.6 | 置信度阈值,默认值为 0.6 |
203
- | `exactMatch` | boolean | 否 | false | 是否完整匹配;`false` 表示包含匹配,`true` 表示整条 OCR 识别结果文本必须等于目标文本 |
151
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
152
+ | --------------------- | ------ | -------- | ------ | ----------------------------------------------------------- |
153
+ | `input` | string | 是 | | 输入源,支持 imageId、URL 字符串、文件路径或 `"screen"` |
154
+ | `x` | number | | 0 | 裁剪区域左上角 x 坐标;全屏识别传 0 |
155
+ | `y` | number | 否 | 0 | 裁剪区域左上角 y 坐标;全屏识别传 0 |
156
+ | `ex` | number | 否 | 0 | 裁剪区域右下角 x 坐标;全屏识别传 0 |
157
+ | `ey` | number | 否 | 0 | 裁剪区域右下角 y 坐标;全屏识别传 0 |
158
+ | `confidenceThreshold` | number | 否 | 0.6 | 置信度阈值,低于该值的识别结果会被过滤 |
204
159
 
205
160
  **返回值:**
206
161
 
207
- | 类型 | 描述 |
208
- | ------------- | ----------------------------------------------------------------------------------------------------------- |
209
- | `OCRResult[]` | 匹配结果数组,坐标相对于裁剪区域 |
162
+ | 类型 | 描述 |
163
+ | ------------- | ------------------------------------------------ |
164
+ | OCRResult[] | 识别结果数组,坐标为原图或全屏绝对坐标 |
210
165
 
211
166
  **示例:**
212
167
 
213
168
  ```javascript
214
- // 在整个屏幕中查找目标文本
215
- const hitResults = paddleOcr.findText(
216
- "screen",
217
- ["登录", "确定"],
218
- 0,
219
- 0,
220
- 0,
221
- 0,
222
- 0.6,
223
- false,
224
- );
225
- if (hitResults.length > 0) {
226
- hitResults.forEach((item, index) => {
227
- logi(
228
- `命中 ${index + 1}: ${item.text}, 中心点: (${item.centerX}, ${item.centerY})`,
229
- );
230
- });
231
- } else {
232
- logi("未命中目标文本");
169
+ const absResults = paddleOcr.recognizeAbs("screen", 100, 100, 500, 300);
170
+ if (absResults.length > 0) {
171
+ action.click(absResults[0].centerX, absResults[0].centerY);
233
172
  }
234
-
235
- // 在指定区域查找目标文本(返回相对裁剪区域的坐标)
236
- const regionHits = paddleOcr.findText("screen", ["下一步"], 100, 100, 500, 400);
237
- logi(`区域命中数量: ${regionHits.length}`);
238
173
  ```
239
174
 
240
175
  #### findTextAbs - 查找目标文本,并将结果坐标映射为原图/全屏绝对坐标。
241
176
 
242
- 参数与 `findText` 相同。传入裁剪区域时,返回坐标可直接用于全屏点击。
177
+ 传入裁剪区域时,返回坐标会映射回原图或全屏坐标,可直接用于点击。
243
178
 
244
179
  ```typescript
245
180
  function findTextAbs(
@@ -254,6 +189,25 @@ function findTextAbs(
254
189
  ): OCRResult[];
255
190
  ```
256
191
 
192
+ **参数:**
193
+
194
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
195
+ | --------------------- | -------- | -------- | ------ | ------------------------------------------------------------------------ |
196
+ | `input` | string | 是 | | 输入源,支持 imageId、URL 字符串、文件路径或 `"screen"` |
197
+ | `targetTexts` | string[] | 是 | | 目标文本数组,例如 `["你好", "确定"]` |
198
+ | `x` | number | 否 | 0 | 裁剪区域左上角 x 坐标;全屏识别传 0 |
199
+ | `y` | number | 否 | 0 | 裁剪区域左上角 y 坐标;全屏识别传 0 |
200
+ | `ex` | number | 否 | 0 | 裁剪区域右下角 x 坐标;全屏识别传 0 |
201
+ | `ey` | number | 否 | 0 | 裁剪区域右下角 y 坐标;全屏识别传 0 |
202
+ | `confidenceThreshold` | number | 否 | 0.6 | 置信度阈值,低于该值的识别结果会被过滤 |
203
+ | `exactMatch` | boolean | 否 | false | 是否完整匹配;`false` 表示包含匹配,`true` 要求整条 OCR 文本等于目标文本 |
204
+
205
+ **返回值:**
206
+
207
+ | 类型 | 描述 |
208
+ | ------------- | ---------------------------------------------------------- |
209
+ | OCRResult[] | 匹配到的子串结果数组,坐标为原图或全屏绝对坐标 |
210
+
257
211
  **示例:**
258
212
 
259
213
  ```javascript
package/docs/api/yolo.md CHANGED
@@ -102,54 +102,20 @@ const modelId = yolo.load(
102
102
  );
103
103
  ```
104
104
 
105
- #### loadV11 - 加载 YOLOv11 模型(兼容 yolov8 模型),这是使用目标检测功能的前提。
106
-
107
- ```typescript
108
- function loadV11(paramPath: string, binPath: string, nc?: number, useGpu?: boolean): string | null;
109
- ```
110
-
111
- **参数:**
112
-
113
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
114
- | ----------- | ------- | -------- | ------ | ------------------------------------------- |
115
- | `paramPath` | string | 是 | | NCNN 模型的 param 文件绝对路径 |
116
- | `binPath` | string | 是 | | NCNN 模型的 bin 文件绝对路径 |
117
- | `nc` | number | 否 | 0 | 模型的标签数量;传 `0` 或省略时根据模型输出自动推断,显式传入但不匹配时检测返回空数组 |
118
- | `useGpu` | boolean | 否 | false | 是否启用 GPU 加速 |
119
-
120
- **返回值:**
121
-
122
- | 类型 | 描述 |
123
- | ---------------- | ----------------------------------------- |
124
- | `string \| null` | 加载成功返回模型 ID 字符串,失败返回 null |
125
-
126
- **示例:**
127
-
128
- ```javascript
129
- // 加载 YOLOv11 模型
130
- // 模型放在res目录
131
- const modelId = yolo.loadV11(
132
- "yolo11n_ncnn_model/model.ncnn.param",
133
- "yolo11n_ncnn_model/model.ncnn.bin",
134
- 0, // 自动根据模型输出推断类别数量
135
- false
136
- );
137
-
138
- if (modelId) {
139
- logi(`模型加载成功,ID: ${modelId}`);
140
- } else {
141
- logi("模型加载失败,请检查文件路径和格式");
142
- }
143
- ```
144
-
145
105
  ### 目标检测
146
106
 
147
- #### detect - 执行目标检测,识别图像中的物体并返回检测结果。
107
+ #### detectAbs - 对指定区域执行目标检测,并将结果坐标映射为原图/全屏绝对坐标。
108
+
109
+ 执行目标检测,识别图像中的物体并返回检测结果。传入裁剪区域时,结果坐标会映射回原图或全屏坐标,可直接用于点击;全屏检测时 `x/y/ex/ey` 传 `0`。
148
110
 
149
111
  ```typescript
150
- function detect(
112
+ function detectAbs(
151
113
  modelId: string,
152
114
  img: string,
115
+ x?: number,
116
+ y?: number,
117
+ ex?: number,
118
+ ey?: number,
153
119
  targetSize?: number,
154
120
  threshold?: number,
155
121
  nmsThreshold?: number
@@ -158,29 +124,34 @@ function detect(
158
124
 
159
125
  **参数:**
160
126
 
161
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
162
- | ------------ | ------ | -------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
163
- | `modelId` | string | 是 | | 模型 ID(通过 loadV11 获取) |
164
- | `img` | string | 是 | | 图像输入源:<br>- `"screen"` - 使用当前屏幕截图<br>- `string` - 图片文件路径或 HTTP 图片地址<br>- `imageId` - 图片 ID(通过 image 模块获取) |
165
- | `targetSize` | number | 否 | 640 | 图像缩放的检测大小,通常为 640(与模型训练时一致) |
166
- | `threshold` | number | 否 | 0.4 | 置信度阈值,默认 0.4,低于此值的检测结果会被过滤 |
167
-
168
- - `nmsThreshold` - 非极大值抑制阈值,默认 0.5,用于去除重叠检测框
127
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
128
+ | -------------- | ------ | -------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
129
+ | `modelId` | string | 是 | | 模型 ID,通过 `load` 获取 |
130
+ | `img` | string | 是 | | 图像输入源,支持 `"screen"`、图片文件路径、HTTP 图片地址或 imageId |
131
+ | `x` | number | 否 | 0 | 裁剪区域左上角 x 坐标;全屏检测传 0 |
132
+ | `y` | number | 否 | 0 | 裁剪区域左上角 y 坐标;全屏检测传 0 |
133
+ | `ex` | number | 否 | 0 | 裁剪区域右下角 x 坐标;全屏检测传 0 |
134
+ | `ey` | number | 否 | 0 | 裁剪区域右下角 y 坐标;全屏检测传 0 |
135
+ | `targetSize` | number | 否 | 640 | 模型推理输入边长,通常为 640(与模型训练时一致) |
136
+ | `threshold` | number | 否 | 0.4 | 置信度阈值,低于此值的检测结果会被过滤 |
137
+ | `nmsThreshold` | number | 否 | 0.5 | 非极大值抑制阈值,用于去除重叠检测框 |
169
138
 
170
139
  **返回值:**
171
140
 
172
141
  | 类型 | 描述 |
173
142
  | -------------- | ---------------------------------------------- |
174
- | `YoloResult[]` | 检测结果数组,每个元素包含一个检测到的物体信息 |
143
+ | `YoloResult[]` | 检测结果数组,坐标为原图或全屏绝对坐标 |
175
144
 
176
145
  **示例:**
177
146
 
178
147
  ```javascript
179
148
  // 首先加载模型
180
- const modelId = yolo.loadV11(
149
+ const modelId = yolo.load(
181
150
  "/yolo11n_ncnn_model/model.ncnn.param",
182
151
  "/yolo11n_ncnn_model/model.ncnn.bin",
183
- 0
152
+ 0,
153
+ 11,
154
+ false
184
155
  );
185
156
 
186
157
  if (!modelId) {
@@ -189,9 +160,13 @@ if (!modelId) {
189
160
  }
190
161
 
191
162
  // 检测当前屏幕
192
- const screenResults = yolo.detect(
163
+ const screenResults = yolo.detectAbs(
193
164
  modelId,
194
165
  "screen", // 使用当前屏幕
166
+ 0,
167
+ 0,
168
+ 0,
169
+ 0,
195
170
  640, // 标准检测尺寸
196
171
  0.4, // 置信度阈值
197
172
  0.5 // NMS 阈值
@@ -212,10 +187,14 @@ screenResults.forEach((result, index) => {
212
187
  logi(` 尺寸: ${result.width} x ${result.height}`);
213
188
  });
214
189
 
215
- // 检测图片文件
216
- const imageResults = yolo.detect(
190
+ // 检测图片文件的指定区域
191
+ const imageResults = yolo.detectAbs(
217
192
  modelId,
218
193
  "/path/to/test_image.jpg",
194
+ 100,
195
+ 100,
196
+ 500,
197
+ 400,
219
198
  640,
220
199
  0.3, // 降低置信度阈值以检测更多物体
221
200
  0.5
@@ -233,9 +212,13 @@ if (imageResults.length > 0) {
233
212
  }
234
213
 
235
214
  // 检测网络图片
236
- const urlResults = yolo.detect(
215
+ const urlResults = yolo.detectAbs(
237
216
  modelId,
238
217
  "https://example.com/test_image.jpg",
218
+ 0,
219
+ 0,
220
+ 0,
221
+ 0,
239
222
  640,
240
223
  0.5, // 提高置信度阈值以获得更可靠的结果
241
224
  0.4
@@ -244,9 +227,13 @@ const urlResults = yolo.detect(
244
227
  logi(`网络图片检测结果: ${urlResults.length} 个物体`);
245
228
 
246
229
  // 高精度检测(降低阈值)
247
- const highPrecisionResults = yolo.detect(
230
+ const highPrecisionResults = yolo.detectAbs(
248
231
  modelId,
249
- null,
232
+ "screen",
233
+ 0,
234
+ 0,
235
+ 0,
236
+ 0,
250
237
  640,
251
238
  0.2, // 更低的置信度阈值
252
239
  0.3 // 更低的 NMS 阈值
@@ -255,9 +242,13 @@ const highPrecisionResults = yolo.detect(
255
242
  logi(`高精度检测结果: ${highPrecisionResults.length} 个物体`);
256
243
 
257
244
  // 快速检测(提高阈值)
258
- const fastResults = yolo.detect(
245
+ const fastResults = yolo.detectAbs(
259
246
  modelId,
260
- null,
247
+ "screen",
248
+ 0,
249
+ 0,
250
+ 0,
251
+ 0,
261
252
  416, // 更小的检测尺寸以提高速度
262
253
  0.6, // 更高的置信度阈值
263
254
  0.6 // 更高的 NMS 阈值
@@ -266,41 +257,6 @@ const fastResults = yolo.detect(
266
257
  logi(`快速检测结果: ${fastResults.length} 个物体`);
267
258
  ```
268
259
 
269
- #### detectAbs - 对指定区域执行目标检测,并将结果坐标映射为原图/全屏绝对坐标。
270
-
271
- ```typescript
272
- function detectAbs(
273
- modelId: string,
274
- img: string,
275
- x?: number,
276
- y?: number,
277
- ex?: number,
278
- ey?: number,
279
- targetSize?: number,
280
- threshold?: number,
281
- nmsThreshold?: number
282
- ): YoloResult[];
283
- ```
284
-
285
- **示例:**
286
-
287
- ```javascript
288
- const absResults = yolo.detectAbs(
289
- modelId,
290
- "screen",
291
- 100,
292
- 100,
293
- 500,
294
- 400,
295
- 640,
296
- 0.4,
297
- 0.5
298
- );
299
- if (absResults.length > 0) {
300
- action.click(absResults[0].centerX, absResults[0].centerY);
301
- }
302
- ```
303
-
304
260
  ### 资源管理
305
261
 
306
262
  #### free - 释放指定模型的资源。