Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

recognition支持条件组合,例如同时满足ColorMatch和TemplateMatch才执行 #386

Closed
moulai opened this issue Oct 12, 2024 · 10 comments

Comments

@moulai
Copy link
Contributor

moulai commented Oct 12, 2024

需求:希望recognition能支持条件组合,例如同时满足ColorMatch和TemplateMatch才算识别到。

场景:TemplateMatch匹配时基本靠灰度匹配,不考虑颜色;而ColorMatch又只考虑颜色;OCR只考虑文字。有时需要同时满足才能正确匹配到想要的图片。希望能够支持条件的组合(AND)。

例子:

  • 希望匹配到的图片1:
    image

  • 不应该被匹配到的图片2(弹窗后加上灰色蒙版,TemplateMatch分数仍然达0.99以上,OCR仍能正常识别到文字):
    image

  • 尝试过仅使用ColorMatch方法,但某些情况会出错(如转场加载时会全白)。

  • 如果支持多条件组合,例如要求同时满足TemplateMatch+ColorMatch,或OCR+ColorMatch,或ColorMatch+ColorMatch,就能够正常匹配图片1而不匹配图片2。

虽然“串联任务”在一定程度上可以实现本需求(如Task1匹配TemplateMatch,next Task2匹配ColorMatch),但是这样依然进入了Task1的流程。例如,如果Task0的next为Task1,并且设置了interrupt列表,则interrupt列表就不会再被执行了(正常匹配到了Task1)。

@MistEO
Copy link
Member

MistEO commented Oct 12, 2024

这种的话,template match 的 next 是 color match 和 回滚上一个任务。就可以了吧

@moulai
Copy link
Contributor Author

moulai commented Oct 12, 2024

这种的话,template match 的 next 是 color match 和 回滚上一个任务。就可以了吧

您的意思是回滚回Task0是吗?但是这样的话,每一个这样的Task0都要写一个对应的Task1(否则无法正常回滚)

例如这样的一个任务:

"启动游戏": {
    "next": "确认当前在主界面",
    "interrupt": "关闭弹窗"
}

"不断返回主界面": {
    "next": "确认当前在主界面",
    "interrupt": "点击返回键"
}

"确认当前在主界面": {
    "recognition": ["TemplateMatch", "ColorMatch"], //假设这是个条件组
    ...
}

用回滚的话大概是写成:

"启动游戏": {
    "next": "确认当前在主界面-1-TemplateMatch",
    "interrupt": "关闭弹窗"
}

"确认当前在主界面-1-TemplateMatch": {
    "recognition": "TemplateMatch",
    ...
    "next": ["确认当前在主界面-ColorMatch", "启动游戏"]
}

"不断返回主界面": {
    "next": "确认当前在主界面-2-TemplateMatch",
    "interrupt": "点击返回键"
}

"确认当前在主界面-2-TemplateMatch": {
    "recognition": "TemplateMatch",
    ...
    "next": ["确认当前在主界面-ColorMatch", "不断返回主界面"]
}

"确认当前在主界面-ColorMatch": {
    "recognition": "ColorMatch",
    ...
}
  1. 每一个需要用到“确认当前在主界面”作为next的任务,都需要多写“中间任务”,有多少匹配条件需要同时满足就要多写多少个中间任务。并且假如想要修改这个“确认当前在主界面-TemplateMatch”的条件(比如改个roi)的话,需要检索所有的中间任务并修改。我感觉这样不是很优雅……
  2. 更重要的是,即使回滚到Task0,Task0的interrupt依然不会被执行,因为其next(TemplateMatch)是被满足的。例如,我们希望在”启动游戏“任务中关闭弹窗(在有弹窗条件下,TemplateMatch满足然而ColorMatch不满足),但是因为TemplateMatch满足,会直接进入TemplateMatch->ColorMatch->启动游戏(不执行interrupt)->TemplateMatch的死循环,因此这样回滚是有问题的。

不知道我有没有理解错您的意思,还是您觉得有更好的解决方式呢?

@dongwlin
Copy link
Member

custom recognition!

@moulai
Copy link
Contributor Author

moulai commented Oct 12, 2024

custom recognition!

custom recognition目前需要从python启动,打包也很麻烦,必须要pyinstaller,没法用MaaFramework自带的workflow了……可能要实现更复杂的功能确实需要custom recognition和custom action,整体上都往”高代码“靠一靠。但是条件组我感觉是个蛮常用的需求,要是能在低代码部分也实现就好了?

@MistEO
Copy link
Member

MistEO commented Oct 12, 2024

回滚确实有点麻烦,但是我感觉组合识别会更复杂,要考虑的细节问题比较多。

例如 画面中有三个同样的图标,旁边各有一行字,我想用 TemplateMatch + OCR

如果设定一个大的 ROI 分别跑两个算法,那假如 TemplateMatch 只识别到两个结果,OCR 识别到三个结果,怎么把它们一一对应起来?以谁的识别结果去执行 action?
如果是先 TemplateMatch 再 OCR,需要单独加个“第一个算法到第二个算法的 roi_offset”,那像 TemplateMatch 这种结果大小是固定的还好,但像 FeatureMatch,结果大小不固定,这个 roi_offset 几乎就不可用了,没有泛用性

我感觉识别的问题应该从识别的角度解决,但我现在确实没想到什么好方法,或许可以针对原始问题本身,TemplateMatch 对颜色不敏感,简单的给 TemplateMatch 加个颜色要求的字段

@moulai
Copy link
Contributor Author

moulai commented Oct 12, 2024

回滚确实有点麻烦,但是我感觉组合识别会更复杂,要考虑的细节问题比较多。

例如 画面中有三个同样的图标,旁边各有一行字,我想用 TemplateMatch + OCR

如果设定一个大的 ROI 分别跑两个算法,那假如 TemplateMatch 只识别到两个结果,OCR 识别到三个结果,怎么把它们一一对应起来?以谁的识别结果去执行 action? 如果是先 TemplateMatch 再 OCR,需要单独加个“第一个算法到第二个算法的 roi_offset”,那像 TemplateMatch 这种结果大小是固定的还好,但像 FeatureMatch,结果大小不固定,这个 roi_offset 几乎就不可用了,没有泛用性

我感觉识别的问题应该从识别的角度解决,但我现在确实没想到什么好方法,或许可以针对原始问题本身,TemplateMatch 对颜色不敏感,简单的给 TemplateMatch 加个颜色要求的字段

确实,组合条件需要考虑的细节比较多。您说的最后那个方案我觉得(对我的需求来说)是可行的,为TemplateMatch加颜色要求字段,仅在TemplateMatch到的结果上加一个颜色判断就可以,也能解决颜色不敏感的问题。

recognition: "TemplateMatch",
template_color: {method: 4, lower: [], upper: [], count: }, //默认为False?

类似这样?

@Windsland52
Copy link
Member

我的建议:
加入弹窗页面的判断(利用弹窗页面的特征),并放入interrupt,并处于匹配功能菜单任务之前

"当前任务": {
    "recognition": "xxx",
    "next": [
        "当前任务完成1",
        "当前任务完成2",
        "..."
    ],
    "interrupt": [
        "处于弹窗页面",
        "点击功能列表",
        "..."
    ]
}

"处于弹窗页面": {
    "recognition": "xxx",
    "action": "Click",
    "next": [
        "弹窗操作完毕,已返回点击功能列表的页面",
        "弹窗操作完毕2",
        "..."
    ],
    "interrupt": [
        "弹窗页面操作1",
        "弹窗界面关闭"
    ]
}

@Windsland52
Copy link
Member

关于返回主页面,我的处理是写一个通用的返回任务

"返回主界面": {
        "next": [
            "位于主界面1",
            "位于主界面2",
            "位于主界面3"
        ],
        "interrupt": [
            "关闭悬浮窗",
            "点击返回按钮",
            "加载中",
            "加载中1",
            "点击空白区域",
            "其他特殊退出"
        ]
    },

根据具体的任务,可在interface设置对应的override,调整顺序以便提高匹配概率

@moulai
Copy link
Contributor Author

moulai commented Oct 14, 2024

关于返回主页面,我的处理是写一个通用的返回任务

"返回主界面": {
        "next": [
            "位于主界面1",
            "位于主界面2",
            "位于主界面3"
        ],
        "interrupt": [
            "关闭悬浮窗",
            "点击返回按钮",
            "加载中",
            "加载中1",
            "点击空白区域",
            "其他特殊退出"
        ]
    },

根据具体的任务,可在interface设置对应的override,调整顺序以便提高匹配概率

您好,关于您提出的两种模式,我都在我的任务链里面尝试了,可能是因为我的任务链设计搞得比较复杂,还是会出现问题(并且需要增加很多中间任务的编写),总之非常感谢您的建议!

@moulai
Copy link
Contributor Author

moulai commented Oct 14, 2024

回滚确实有点麻烦,但是我感觉组合识别会更复杂,要考虑的细节问题比较多。

例如 画面中有三个同样的图标,旁边各有一行字,我想用 TemplateMatch + OCR

如果设定一个大的 ROI 分别跑两个算法,那假如 TemplateMatch 只识别到两个结果,OCR 识别到三个结果,怎么把它们一一对应起来?以谁的识别结果去执行 action? 如果是先 TemplateMatch 再 OCR,需要单独加个“第一个算法到第二个算法的 roi_offset”,那像 TemplateMatch 这种结果大小是固定的还好,但像 FeatureMatch,结果大小不固定,这个 roi_offset 几乎就不可用了,没有泛用性

我感觉识别的问题应该从识别的角度解决,但我现在确实没想到什么好方法,或许可以针对原始问题本身,TemplateMatch 对颜色不敏感,简单的给 TemplateMatch 加个颜色要求的字段

条件组合确实比较复杂,为TemplateMatch加颜色要求字段是目前比较好的方案。因此关闭本issue。

新的issue: #391

@moulai moulai closed this as completed Oct 14, 2024
@moulai moulai closed this as not planned Won't fix, can't repro, duplicate, stale Oct 14, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants