From e3a296e68e7dd8bea79b3a574dc0a29d40454637 Mon Sep 17 00:00:00 2001 From: Refound-445 <2877834692@qq.com> Date: Fri, 17 Jan 2025 17:13:51 +0800 Subject: [PATCH] up --- i18n/README_en.md | 46 +++++++++---- .../README.md | 49 +++++++++----- .../nonebot_plugin_nailongremove/__init__.py | 2 +- .../nonebot_plugin_nailongremove/config.py | 5 +- .../nonebot_plugin_nailongremove/handler.py | 65 ++++++++++--------- .../model/hf_detection.py | 4 +- .../model/target_detection.py | 12 ++-- 7 files changed, 110 insertions(+), 73 deletions(-) diff --git a/i18n/README_en.md b/i18n/README_en.md index bb163bc..21ad432 100644 --- a/i18n/README_en.md +++ b/i18n/README_en.md @@ -219,11 +219,12 @@ Add the required configurations from the table below to the `.env` file in your | `NAILONG_USER_BLACKLIST` | No | `[]` | List of user IDs to be blacklisted. | | `NAILONG_PRIORITY` | No | `100` | Matcher priority. | | **Behavior Configuration** | | | | -| `NAILONG_RECALL` | No | `True` | Whether to recall the message. | -| `NAILONG_MUTE_SECONDS` | No | `0` | Time to mute, 0 means no mute (in seconds). | +| `NAILONG_RECALL` | No | `["nailong"]` | Whether to recall the message | +| `NAILONG_MUTE_SECONDS` | No | `{"nailong":0}` | Set the mute duration. If not set or the duration is 0, no mute will be applied.
Unit: seconds | | | `NAILONG_TIP` | No | `{"nailong": ["This group prohibits NaiLong images!"]}` | Message to send as a tip, using [Alconna message template](https://nonebot.dev/docs/best-practice/alconna/uniseg#%E4%BD%BF%E7%94%A8%E6%B6%88%E6%81%AF%E6%A8%A1%E6%9D%BF) with custom variables. | | `NAILONG_FAILED_TIP` | No | `{"nailong": ["{:Reply($message_id)} Oh no, please don't send NaiLong images! 🥺 👉👈"]}` | Message sent when recalling fails or when recalling is disabled. | | `NAILONG_CHECK_ALL_FRAMES` | No | `False` | Specifies whether to check all frames in the image when using model 1. Requires setting `NAILONG_CHECK_MODE` to 0. When enabled, the `$checked_result` variable in the message template will return a GIF if the original image is animated. | +| `NAILONG_CHECK_RATE` | No | `0.8` | When checking all frames of an image, the image will only be recalled or processed if a certain proportion of the frames meet the detection criteria. | | `NAILONG_CHECK_MODE` | No | `0` | Selects the detection method for GIF animations.
0. Check all frames
1. Check only the first frame
2. Random frame sampling | | **Similarity Detection Configuration** | | | | | `NAILONG_SIMILARITY_ON` | No | `False` | Specifies whether to enable similarity detection on local storage before processing images. | @@ -292,6 +293,14 @@ Welcome everyone to join the group for learning and exchange! ## 📝 Changelog +### 2.3.5 + +- The update adds a feature to select a mute tag, allowing users to choose whether to mute or recall the processing for + different types of images. +- A new configuration option, `NAILONG_CHECK_RATE`, has been added. When detecting all frames of an animated image, this + optional configuration allows success in judgment when the proportion of frames containing the "nailong" frame reaches + a certain threshold. + ### 2.3.4 - Added `model3` to `NAILONG_MODEL`, a model trained based on YOLOv11. It is recommended to set `{"nailong": 0.78}` in @@ -301,26 +310,38 @@ Welcome everyone to join the group for learning and exchange! ### 2.3.3 -- Optimized temporary processing solutions to reduce performance pressure and improve speed (the vector library faiss also supports GPU processing, but it is not recommended for non-professionals to use GPU due to the complex installation process). +- Optimized temporary processing solutions to reduce performance pressure and improve speed (the vector library faiss + also supports GPU processing, but it is not recommended for non-professionals to use GPU due to the complex + installation process). - Added `NAILONG_HF_TOKEN` to automatically upload errored images to the Hugging Face dataset. -- Changed the formats of the configuration items `NAILONG_TIP` and `NAILONG_FAILED_TIP`, allowing random response messages. When the corresponding value is an empty list `[]`, only the image will be checked (or the mute/revoke action will be performed) without returning a message. +- Changed the formats of the configuration items `NAILONG_TIP` and `NAILONG_FAILED_TIP`, allowing random response + messages. When the corresponding value is an empty list `[]`, only the image will be checked (or the mute/revoke + action will be performed) without returning a message. ### 2.3.2 - Updated the three frame processing modes for GIFs. You can choose through `NAILONG_CHECK_MODE`. -- Updated the temporary handling for errored images. By enabling `NAILONG_SIMILARITY_ON`, local storage similarity matching can be used. Additionally, by sending "This is [type]"+image through `SUPERUSERS`, errored images can be saved to local records. -- Added `model2` to `NAILONG_MODEL`, which is based on the YOLOv11-trained model. Currently, it only supports Nailong recognition. +- Updated the temporary handling for errored images. By enabling `NAILONG_SIMILARITY_ON`, local storage similarity + matching can be used. Additionally, by sending "This is [type]"+image through `SUPERUSERS`, errored images can be + saved to local records. +- Added `model2` to `NAILONG_MODEL`, which is based on the YOLOv11-trained model. Currently, it only supports Nailong + recognition. ### 2.3.1 -- Modified plugin dependencies to avoid some issues that affected the installation process. Please refer to the installation documentation for more details. - - Corresponding configuration changes: Removed the `NAILONG_ONNX_TRY_TO_USE_GPU` configuration item and added the `NAILONG_ONNX_PROVIDERS` configuration item. +- Modified plugin dependencies to avoid some issues that affected the installation process. Please refer to the + installation documentation for more details. + - Corresponding configuration changes: Removed the `NAILONG_ONNX_TRY_TO_USE_GPU` configuration item and added + the `NAILONG_ONNX_PROVIDERS` configuration item. ### 2.3.0 -- Added support for checking all frames in a GIF and re-encapsulating the results into a new GIF. This is disabled by default. The `$checked_image` variable has been deprecated, and a new `$checked_result` variable has been added. -- The input size for model 1 can now be automatically configured based on the model type, but if specified in the configuration, it will be used as the priority. -- Supported processing of images containing other tags. Some configuration items now allow custom values based on the tags. +- Added support for checking all frames in a GIF and re-encapsulating the results into a new GIF. This is disabled by + default. The `$checked_image` variable has been deprecated, and a new `$checked_result` variable has been added. +- The input size for model 1 can now be automatically configured based on the model type, but if specified in the + configuration, it will be used as the priority. +- Supported processing of images containing other tags. Some configuration items now allow custom values based on the + tags. - Added a user blacklist. - The default model has been changed to 1. @@ -333,7 +354,8 @@ Welcome everyone to join the group for learning and exchange! - Renamed the configuration item `NAILONG_YOLOX_SIZE` to `NAILONG_MODEL1_YOLOX_SIZE`. - Model 1 can now automatically get the latest version, and you can also choose the model type through configuration. - Model 1 can now control the confidence threshold for recognition via configuration. -- When loading the ONNX model, the system will attempt to use GPU by default. If it fails, a warning will be shown. If you don't want to see the warning, you can refer to the above to disable the corresponding configuration. +- When loading the ONNX model, the system will attempt to use GPU by default. If it fails, a warning will be shown. If + you don't want to see the warning, you can refer to the above to disable the corresponding configuration. ### 2.1.4 diff --git a/packages/nonebot-plugin-nailongremove-base/README.md b/packages/nonebot-plugin-nailongremove-base/README.md index 191b4fb..03ef952 100644 --- a/packages/nonebot-plugin-nailongremove-base/README.md +++ b/packages/nonebot-plugin-nailongremove-base/README.md @@ -69,7 +69,8 @@ NaiLongRemove 是一款由简单的 AI 模型建立的奶龙识别插件,可 ## 💿 安装 -**如果你从来没接触过 NoneBot,请查看 [这个文档](https://github.com/Refound-445/nonebot-plugin-nailongremove/blob/main/docs/tutorial.md)** +**如果你从来没接触过 +NoneBot,请查看 [这个文档](https://github.com/Refound-445/nonebot-plugin-nailongremove/blob/main/docs/tutorial.md)** 为避免依赖问题,我们把使用 GPU 推理的插件安装方式与普通安装分开了,供有需要的用户选择安装 @@ -207,11 +208,12 @@ pip install nonebot-plugin-nailongremove-base -U | `NAILONG_USER_BLACKLIST` | 否 | `[]` | 用户 ID 黑名单列表 | | `NAILONG_PRIORITY` | 否 | `100` | Matcher 优先级 | | **行为配置** | | | | -| `NAILONG_RECALL` | 否 | `True` | 是否撤回消息 | -| `NAILONG_MUTE_SECONDS` | 否 | `0` | 设置禁言时间,默认为 0 即不禁言
单位:秒 | +| `NAILONG_RECALL` | 否 | `["nailong"]` | 是否撤回消息 | +| `NAILONG_MUTE_SECONDS` | 否 | `{"nailong":0}` | 设置禁言时间,未被设置或者设置时间为0即不禁言
单位:秒 | | `NAILONG_TIP` | 否 | `{"nailong": ["本群禁止发奶龙!"]}` | 发送的提示,使用 [Alconna 的消息模板](https://nonebot.dev/docs/best-practice/alconna/uniseg#%E4%BD%BF%E7%94%A8%E6%B6%88%E6%81%AF%E6%A8%A1%E6%9D%BF),可用变量见下,可以根据标签自定义对应值,随机发送列表其中一条消息,
如遇其中没有的标签会回退到 `nailong`
如果对应值为空列表`[]`,则会检测而不会发送消息 | | `NAILONG_FAILED_TIP` | 否 | `{"nailong": ["{:Reply($message_id)}呜,不要发奶龙了嘛 🥺 👉👈"]}` | 撤回失败或禁用撤回时发送的提示,同上 | | `NAILONG_CHECK_ALL_FRAMES` | 否 | `False` | 使用模型 1 时是否检查图片中的所有帧,需要同时设置`NAILONG_CHECK_MODE`为0,启用该项后消息模板中的 `$checked_result` 变量当原图为动图时会变为动图 | +| `NAILONG_CHECK_RATE` | 否 | `0.8` | 检查图片中的所有帧时,当被检测到的图片满足一定比例时才会被撤回等处理 | | `NAILONG_CHECK_MODE` | 否 | `0` | 选择对GIF动图的检测方式
0.检测所有帧
1.只检测第一帧
2.随机抽帧检测 | | **相似度检测配置** | | | | | `NAILONG_SIMILARITY_ON` | 否 | `False` | 是否启用处理图片前对本地存储进行相似度检测 | @@ -235,20 +237,25 @@ pip install nonebot-plugin-nailongremove-base -U ### 可用模型 -- `0`:基于 Renet50 图像分类模型训练推理,感谢 [@spawner1145](https://github.com/spawner1145) 提供的模型,原链接:[spawner1145/NailongRecognize](https://github.com/spawner1145/NailongRecognize.git) -- `1`:基于 YOLOX 目标检测模型训练推理,感谢 [@NKXingXh](https://github.com/nkxingxh) 提供的模型,原链接:[nkxingxh/NailongDetection](https://github.com/nkxingxh/NailongDetection) -- `2`:基于 YOLOv11 目标检测模型训练推理,感谢 [@Hakureirm](https://github.com/Hakureirm) 提供的模型,原链接:[Hakureirm/NailongKiller](https://huggingface.co/Hakureirm/NailongKiller) -- `3`:基于 YOLOv11 目标检测模型训练推理,感谢 [@Threkork](https://github.com/Threkork) 提供的模型,原链接:[Threkork/kovi-plugin-check-alllong](https://github.com/Threkork/kovi-plugin-check-alllong),建议`NAILONG_MODEL1_SCORE`配置项中设置`{"nailong": 0.78}`,`NAILONG_MODEL1_YOLOX_SIZE`设置为`[640,640]` +- `0`:基于 Renet50 图像分类模型训练推理,感谢 [@spawner1145](https://github.com/spawner1145) + 提供的模型,原链接:[spawner1145/NailongRecognize](https://github.com/spawner1145/NailongRecognize.git) +- `1`:基于 YOLOX 目标检测模型训练推理,感谢 [@NKXingXh](https://github.com/nkxingxh) + 提供的模型,原链接:[nkxingxh/NailongDetection](https://github.com/nkxingxh/NailongDetection) +- `2`:基于 YOLOv11 目标检测模型训练推理,感谢 [@Hakureirm](https://github.com/Hakureirm) + 提供的模型,原链接:[Hakureirm/NailongKiller](https://huggingface.co/Hakureirm/NailongKiller) +- `3`:基于 YOLOv11 目标检测模型训练推理,感谢 [@Threkork](https://github.com/Threkork) + 提供的模型,原链接:[Threkork/kovi-plugin-check-alllong](https://github.com/Threkork/kovi-plugin-check-alllong) + ,建议`NAILONG_MODEL1_SCORE`配置项中设置`{"nailong": 0.78}`,`NAILONG_MODEL1_YOLOX_SIZE`设置为`[640,640]` ### 消息模板可用变量 -| 变量名 | 类型 | 说明 | -| ----------------- | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- | -| `$event` | [`Event`](https://nonebot.dev/docs/api/adapters/#Event) | 当前事件 | -| `$target` | [`Target`](https://nonebot.dev/docs/best-practice/alconna/uniseg#%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E5%AF%B9%E8%B1%A1) | 事件目标 | -| `$message_id` | `str` | 消息 ID | -| `$msg` | [`UniMessage`](https://nonebot.dev/docs/best-practice/alconna/uniseg#%E9%80%9A%E7%94%A8%E6%B6%88%E6%81%AF%E5%BA%8F%E5%88%97) | 当前消息 | -| `$ss` | [`Session`](https://github.com/RF-Tar-Railt/nonebot-plugin-uninfo?tab=readme-ov-file#session) | 当前会话 | +| 变量名 | 类型 | 说明 | +|-------------------|------------------------------------------------------------------------------------------------------------------------------|-----------------------------| +| `$event` | [`Event`](https://nonebot.dev/docs/api/adapters/#Event) | 当前事件 | +| `$target` | [`Target`](https://nonebot.dev/docs/best-practice/alconna/uniseg#%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E5%AF%B9%E8%B1%A1) | 事件目标 | +| `$message_id` | `str` | 消息 ID | +| `$msg` | [`UniMessage`](https://nonebot.dev/docs/best-practice/alconna/uniseg#%E9%80%9A%E7%94%A8%E6%B6%88%E6%81%AF%E5%BA%8F%E5%88%97) | 当前消息 | +| `$ss` | [`Session`](https://github.com/RF-Tar-Railt/nonebot-plugin-uninfo?tab=readme-ov-file#session) | 当前会话 | | `$checked_result` | [`Image`](https://nonebot.dev/docs/best-practice/alconna/uniseg#%E9%80%9A%E7%94%A8%E6%B6%88%E6%81%AF%E6%AE%B5) | 框选出对应目标后的图片,仅在模型配置为 `1` 时存在 | ## 🎉 使用 @@ -267,12 +274,17 @@ pip install nonebot-plugin-nailongremove-base -U ## 📝 更新日志 +### 2.3.5 + +- 更新可以增加禁言标签选择功能,分别对不同种类的图片选择是否禁言或者撤回处理 +- 增加配置项`NAILONG_CHECK_RATE`,检测动图的全部帧时,可选配置全部帧出现奶龙帧到某个比例时成功判定 + ### 2.3.4 -- `NAILONG_MODEL`加入model3,基于YOLOv11训练的模型,建议`NAILONG_MODEL1_SCORE`配置项中设置`{"nailong": 0.78}`,`NAILONG_MODEL1_YOLOX_SIZE`设置为`[640,640]` +- `NAILONG_MODEL`加入model3,基于YOLOv11训练的模型,建议`NAILONG_MODEL1_SCORE` + 配置项中设置`{"nailong": 0.78}`,`NAILONG_MODEL1_YOLOX_SIZE`设置为`[640,640]` - 更新配置项默认值`NAILONG_BYPASS_SUPERUSER`->`False`,`NAILONG_BYPASS_ADMIN`->`False` - ### 2.3.3 - 优化临时处理方案,减小性能压力同时提升速度(向量库faiss也支持GPU处理,但非专业人士不推荐使用GPU,因为这个安装过程比较复杂) @@ -282,13 +294,14 @@ pip install nonebot-plugin-nailongremove-base -U ### 2.3.2 - 更新对GIF动图的三种帧处理模式,通过`NAILONG_CHECK_MODE`自行选择 -- 更新对于报错图片临时处理方案,通过设置`NAILONG_SIMILARITY_ON`开启浏览本地存储相似度匹配,通过`SUPERUSERS`发送"这是[种类]"+图片,可将报错图片保存到本地记录 +- 更新对于报错图片临时处理方案,通过设置`NAILONG_SIMILARITY_ON`开启浏览本地存储相似度匹配,通过`SUPERUSERS`发送" + 这是[种类]"+图片,可将报错图片保存到本地记录 - `NAILONG_MODEL`加入model2,基于YOLOv11训练的模型,目前仅支持奶龙识别 ### 2.3.1 - 修改插件依赖以避免一些问题,影响了安装过程,请查看安装文档了解 - - 对应配置项修改:删除配置项 `NAILONG_ONNX_TRY_TO_USE_GPU`,添加配置项 `NAILONG_ONNX_PROVIDERS` + - 对应配置项修改:删除配置项 `NAILONG_ONNX_TRY_TO_USE_GPU`,添加配置项 `NAILONG_ONNX_PROVIDERS` ### 2.3.0 diff --git a/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/__init__.py b/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/__init__.py index 7916fc6..93a5426 100644 --- a/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/__init__.py +++ b/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/__init__.py @@ -9,7 +9,7 @@ from . import handler as handler from .config import Config -__version__ = "2.3.4" +__version__ = "2.3.5" __plugin_meta__ = PluginMetadata( name="自动撤回奶龙", description="一个基于图像分类模型的简单插件~", diff --git a/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/config.py b/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/config.py index 1147ced..02e2ac8 100644 --- a/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/config.py +++ b/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/config.py @@ -41,8 +41,8 @@ class Config(BaseModel): nailong_user_blacklist: List[str] = Field(default_factory=list) nailong_priority: int = 100 - nailong_recall: bool = True - nailong_mute_seconds: int = 0 + nailong_recall: List[str] = ["nailong"] + nailong_mute_seconds: Dict[str,int] = {"nailong":0} nailong_tip: Dict[str, List[str]] = { DEFAULT_LABEL: ["本群禁止发送奶龙!"], } @@ -50,6 +50,7 @@ class Config(BaseModel): DEFAULT_LABEL: ["{:Reply($message_id)}呜,不要发奶龙了嘛 🥺 👉👈"], } nailong_check_all_frames: bool = False + nailong_check_rate: float = 0.8 nailong_model_dir: Path = Field( default_factory=lambda: Path.cwd() / "data" / "nailongremove", diff --git a/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/handler.py b/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/handler.py index b48bbd5..d8eef46 100644 --- a/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/handler.py +++ b/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/handler.py @@ -23,7 +23,7 @@ def judge_list(lst: Iterable[T], val: T, blacklist: bool) -> bool: async def execute_functions_any_ok( - func: Iterable[Callable[[], Awaitable[Any]]], + func: Iterable[Callable[[], Awaitable[Any]]], ) -> bool: ok = False for f in func: @@ -38,36 +38,36 @@ async def execute_functions_any_ok( async def nailong_rule( - bot: BaseBot, - event: BaseEvent, - session: Uninfo, - ss_interface: QryItrface, - msg: UniMsg, + bot: BaseBot, + event: BaseEvent, + session: Uninfo, + ss_interface: QryItrface, + msg: UniMsg, ) -> bool: return ( # check if it's a group chat - bool(session.member) # this prop only exists in group chats - # user blacklist - and (session.user.id not in config.nailong_user_blacklist) - # scene blacklist or whitelist - and judge_list( - config.nailong_list_scenes, - session.scene_path, - config.nailong_blacklist, - ) - # bypass superuser - and ((not config.nailong_bypass_superuser) or (not await SUPERUSER(bot, event))) - # bypass group admin - and ( - (not config.nailong_bypass_admin) - or ((not session.member.role) or session.member.role.level <= 1) - ) - # msg has supported seg - and (any(True for x in msg if type(x) in source_extractors)) - # self is admin - and ( - (not config.nailong_need_admin) - or bool( + bool(session.member) # this prop only exists in group chats + # user blacklist + and (session.user.id not in config.nailong_user_blacklist) + # scene blacklist or whitelist + and judge_list( + config.nailong_list_scenes, + session.scene_path, + config.nailong_blacklist, + ) + # bypass superuser + and ((not config.nailong_bypass_superuser) or (not await SUPERUSER(bot, event))) + # bypass group admin + and ( + (not config.nailong_bypass_admin) + or ((not session.member.role) or session.member.role.level <= 1) + ) + # msg has supported seg + and (any(True for x in msg if type(x) in source_extractors)) + # self is admin + and ( + (not config.nailong_need_admin) + or bool( ( self_info := await ss_interface.get_member( session.scene.type, @@ -78,7 +78,7 @@ async def nailong_rule( and self_info.role and self_info.role.level > 1, ) - ) + ) ) @@ -124,10 +124,11 @@ async def handle_function(bot: BaseBot, ev: BaseEvent, msg: UniMsg, session: Uni continue functions: List[Callable[[], Awaitable[Any]]] = [] - if config.nailong_recall: + if check_res.label in config.nailong_recall: functions.append(lambda: recall(bot, ev)) - if config.nailong_mute_seconds > 0: - functions.append(lambda: mute(bot, ev, config.nailong_mute_seconds)) + if check_res.label in config.nailong_mute_seconds.keys() and config.nailong_mute_seconds[ + check_res.label] > 0: + functions.append(lambda: mute(bot, ev, config.nailong_mute_seconds[check_res.label])) punish_ok = functions and (await execute_functions_any_ok(functions)) template_dict = ( config.nailong_tip if punish_ok else config.nailong_failed_tip diff --git a/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/model/hf_detection.py b/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/model/hf_detection.py index 6501410..cba9fe1 100644 --- a/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/model/hf_detection.py +++ b/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/model/hf_detection.py @@ -185,7 +185,7 @@ async def check(source: FrameSource) -> CheckResult: for frame in tem_source ), ) - ok = any(r.ok for r in results) + ok = True if sum(1 for r in results if r.ok) / len(results) >= config.nailong_check_rate else False else: ok = False if not ok: @@ -193,7 +193,7 @@ async def check(source: FrameSource) -> CheckResult: results = await asyncio.gather( *(with_semaphore(sem)(check_single)(frame) for frame in source), ) - ok = any(r.ok for r in results) + ok = True if sum(1 for r in results if r.ok) / len(results) >= config.nailong_check_rate else False if ok: all_labels = {r.label for r in results if r.label} label = next( diff --git a/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/model/target_detection.py b/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/model/target_detection.py index ae4f92f..37d88d5 100644 --- a/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/model/target_detection.py +++ b/packages/nonebot-plugin-nailongremove-base/nonebot_plugin_nailongremove/model/target_detection.py @@ -83,8 +83,8 @@ def vis(self) -> np.ndarray: @run_sync def _check_single( - frame: np.ndarray, - is_gif: bool = False, + frame: np.ndarray, + is_gif: bool = False, ) -> CheckSingleResult[Optional[Detections]]: if is_gif: res = similarity_process(frame) @@ -127,8 +127,8 @@ def _check_single( async def check_single( - frame: np.ndarray, - is_gif: bool = False, + frame: np.ndarray, + is_gif: bool = False, ) -> CheckSingleResult[FrameInfo]: if is_gif: res = await _check_single(frame, True) @@ -158,7 +158,7 @@ async def check(source: FrameSource) -> CheckResult: for frame in tem_source ), ) - ok = any(r.ok for r in results) + ok = True if sum(1 for r in results if r.ok) / len(results) >= config.nailong_check_rate else False else: ok = False if not ok: @@ -166,7 +166,7 @@ async def check(source: FrameSource) -> CheckResult: results = await asyncio.gather( *(with_semaphore(sem)(check_single)(frame) for frame in source), ) - ok = any(r.ok for r in results) + ok = True if sum(1 for r in results if r.ok) / len(results) >= config.nailong_check_rate else False if ok: all_labels = {r.label for r in results if r.label} label = next(