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

run_recognition方法能不能返回命中图片名称 #496

Open
SCzfdf opened this issue Dec 24, 2024 · 29 comments
Open

run_recognition方法能不能返回命中图片名称 #496

SCzfdf opened this issue Dec 24, 2024 · 29 comments

Comments

@SCzfdf
Copy link

SCzfdf commented Dec 24, 2024

image
如上面图片, 每个骰子都可能出现在5*3的格子中
我试过识别整个放置区, 效果不太好.
现在是开15个线程识别对应格子, 里面又会识别蓝红2种骰子(2次run_recognition)通过得分确认骰子是红还是蓝,
而每次run_recognition会消耗大约1秒的时间, 完整识别红蓝骰子需要耗时2秒左右. 而且还会把其他骰子识别成我需要操作的红蓝骰子.
比如下面的就经常识别成蓝骰子
image
再开线程不开可行因为cpu已经到90多了, 而在现场内多执行run_recognition实时性又会大大降低

或者还有其他解决方案吗?

@SCzfdf
Copy link
Author

SCzfdf commented Dec 24, 2024

还有关于执行速度的, MaaDebugger执行pipeline的速度很明显比程序快, 是因为不是使用原生调用的原因吗? 换c或者java会快点吗?

@MistEO
Copy link
Member

MistEO commented Dec 25, 2024

log发一下,debug/maa.log

@SCzfdf
Copy link
Author

SCzfdf commented Dec 25, 2024

maa.log
recognition_single_blue_ston_{xx} 是识别pipeline
screenshot 是截图线程

log发一下,debug/maa.log

@MistEO
Copy link
Member

MistEO commented Dec 25, 2024

feature match是要慢一点的,而且图片还这么多。计算密集型,python 你开线程应该没什么用

如果这些图片大小不会变的话,可以用 template match

其实我更建议你直接训练一个 yolo 的模型然后用 nn detect

@MistEO
Copy link
Member

MistEO commented Dec 25, 2024

为啥你需要一个截图的线程,我没太看明白

CustomRecognition run 里本身就是带了一张图片的,argv.image,直接用这张图片来 run_recognition 就好了呀?

@MistEO
Copy link
Member

MistEO commented Dec 25, 2024

run_recognition 不返回命中的名称是设计如此,我们认为单个节点内所有图片等价,如果他们不等价,应该拆分成多个节点

@SCzfdf
Copy link
Author

SCzfdf commented Dec 26, 2024

feature match是要慢一点的,而且图片还这么多。计算密集型,python 你开线程应该没什么用

如果这些图片大小不会变的话,可以用 template match

其实我更建议你直接训练一个 yolo 的模型然后用 nn detect

图片大小倒是不会.变, 不过截图太多了一些图片大小不好控制(那个骰子是动画的并且有7个点数, 为了准确点我截了十多张图片...).

用template match会报一些图片太大,roi太小. 如果要使用template match只能扩大roi. 扩大的话就会识别到其他格子中....所以我就用了feature

@SCzfdf
Copy link
Author

SCzfdf commented Dec 26, 2024

为啥你需要一个截图的线程,我没太看明白

CustomRecognition run 里本身就是带了一张图片的,argv.image,直接用这张图片来 run_recognition 就好了呀?

因为我不是用的CustomRecognition, 我是这样调用的(我看示例项目里的阴阳师是这样调用的...)

img = context.tasker.controller.post_screencap().wait().get()
recognition_blue_result = context.run_recognition(self.recognition_blue_title,
                                                          screenshot,
                                                          self.recognition_blue)

因为每个格子(5*3)都需要识别对应格子是什么骰子, 为了节省点资源就共用一张图片

@MistEO
Copy link
Member

MistEO commented Dec 26, 2024

用template match会报一些图片太大,roi太小. 如果要使用template match只能扩大roi.

报错?不会的,说明你的图或者 json 写的有问题,发一下看看

@MistEO
Copy link
Member

MistEO commented Dec 26, 2024

为啥你需要一个截图的线程,我没太看明白
CustomRecognition run 里本身就是带了一张图片的,argv.image,直接用这张图片来 run_recognition 就好了呀?

因为我不是用的CustomRecognition, 我是这样调用的(我看示例项目里的阴阳师是这样调用的...)

img = context.tasker.controller.post_screencap().wait().get()
recognition_blue_result = context.run_recognition(self.recognition_blue_title,
                                                          screenshot,
                                                          self.recognition_blue)

因为每个格子(5*3)都需要识别对应格子是什么骰子, 为了节省点资源就共用一张图片

没用 CustomRecognition 吗那这个 context 哪来的?

@SCzfdf
Copy link
Author

SCzfdf commented Dec 26, 2024

用template match会报一些图片太大,roi太小. 如果要使用template match只能扩大roi.

报错?不会的,说明你的图或者 json 写的有问题,发一下看看

image 不知道为啥我的资源图片比实际的图片大点... 我是用ImageCropper截的

报的是

[2024-11-26 09:35:40.927][ERR][Px56043][Tx9852][TemplateMatcher.cpp][L60][TemplateMatcher::ResultsVec MaaNS::VisionNS::TemplateMatcher::template_match(const cv::Mat &) const] recognition_single_blue_ston_3 [uid_=300000018] templ size is too large [image=/Users/cgb/PycharmProjects/MaaRandomDicePy/assets/debug/dumps/2024.11.26-09.35.40.927-64f409a9-54f9-4953-9b47-944c793d5004.png] [templ=/Users/cgb/PycharmProjects/MaaRandomDicePy/assets/debug/dumps/2024.11.26-09.35.40.928-e28c2fc7-33d6-4990-afe8-b03244d5f7af.png] 

@SCzfdf
Copy link
Author

SCzfdf commented Dec 26, 2024

为啥你需要一个截图的线程,我没太看明白
CustomRecognition run 里本身就是带了一张图片的,argv.image,直接用这张图片来 run_recognition 就好了呀?

因为我不是用的CustomRecognition, 我是这样调用的(我看示例项目里的阴阳师是这样调用的...)

img = context.tasker.controller.post_screencap().wait().get()
recognition_blue_result = context.run_recognition(self.recognition_blue_title,
                                                          screenshot,
                                                          self.recognition_blue)

因为每个格子(5*3)都需要识别对应格子是什么骰子, 为了节省点资源就共用一张图片

没用 CustomRecognition 吗那这个 context 哪来的?

CustomAction的context...我看yys是这样用的. 不符合规范吗

@MistEO
Copy link
Member

MistEO commented Dec 26, 2024

用template match会报一些图片太大,roi太小. 如果要使用template match只能扩大roi.

报错?不会的,说明你的图或者 json 写的有问题,发一下看看

image 不知道为啥我的资源图片比实际的图片大点... 我是用ImageCropper截的
报的是

[2024-11-26 09:35:40.927][ERR][Px56043][Tx9852][TemplateMatcher.cpp][L60][TemplateMatcher::ResultsVec MaaNS::VisionNS::TemplateMatcher::template_match(const cv::Mat &) const] recognition_single_blue_ston_3 [uid_=300000018] templ size is too large [image=/Users/cgb/PycharmProjects/MaaRandomDicePy/assets/debug/dumps/2024.11.26-09.35.40.927-64f409a9-54f9-4953-9b47-944c793d5004.png] [templ=/Users/cgb/PycharmProjects/MaaRandomDicePy/assets/debug/dumps/2024.11.26-09.35.40.928-e28c2fc7-33d6-4990-afe8-b03244d5f7af.png] 

没看明白,100和120分别是哪个?log 也发一下

@MistEO
Copy link
Member

MistEO commented Dec 26, 2024

为啥你需要一个截图的线程,我没太看明白
CustomRecognition run 里本身就是带了一张图片的,argv.image,直接用这张图片来 run_recognition 就好了呀?

因为我不是用的CustomRecognition, 我是这样调用的(我看示例项目里的阴阳师是这样调用的...)

img = context.tasker.controller.post_screencap().wait().get()
recognition_blue_result = context.run_recognition(self.recognition_blue_title,
                                                          screenshot,
                                                          self.recognition_blue)

因为每个格子(5*3)都需要识别对应格子是什么骰子, 为了节省点资源就共用一张图片

没用 CustomRecognition 吗那这个 context 哪来的?

CustomAction的context...我看yys是这样用的. 不符合规范吗

不是太好,但也行

但是你说的截图线程是?

@MistEO
Copy link
Member

MistEO commented Dec 26, 2024

我们先理一下逻辑,这个画面期望是要怎么识别,然后需要怎么点击操作?具体说一下

@SCzfdf
Copy link
Author

SCzfdf commented Dec 26, 2024

用template match会报一些图片太大,roi太小. 如果要使用template match只能扩大roi.

报错?不会的,说明你的图或者 json 写的有问题,发一下看看

image 不知道为啥我的资源图片比实际的图片大点... 我是用ImageCropper截的
报的是

[2024-11-26 09:35:40.927][ERR][Px56043][Tx9852][TemplateMatcher.cpp][L60][TemplateMatcher::ResultsVec MaaNS::VisionNS::TemplateMatcher::template_match(const cv::Mat &) const] recognition_single_blue_ston_3 [uid_=300000018] templ size is too large [image=/Users/cgb/PycharmProjects/MaaRandomDicePy/assets/debug/dumps/2024.11.26-09.35.40.927-64f409a9-54f9-4953-9b47-944c793d5004.png] [templ=/Users/cgb/PycharmProjects/MaaRandomDicePy/assets/debug/dumps/2024.11.26-09.35.40.928-e28c2fc7-33d6-4990-afe8-b03244d5f7af.png] 

没看明白,100和120分别是哪个?log 也发一下

就这个图片. 120117是用ImageCropper截出来的, 100100是我定的roi
image

@MistEO
Copy link
Member

MistEO commented Dec 26, 2024

用template match会报一些图片太大,roi太小. 如果要使用template match只能扩大roi.

报错?不会的,说明你的图或者 json 写的有问题,发一下看看

image 不知道为啥我的资源图片比实际的图片大点... 我是用ImageCropper截的
报的是

[2024-11-26 09:35:40.927][ERR][Px56043][Tx9852][TemplateMatcher.cpp][L60][TemplateMatcher::ResultsVec MaaNS::VisionNS::TemplateMatcher::template_match(const cv::Mat &) const] recognition_single_blue_ston_3 [uid_=300000018] templ size is too large [image=/Users/cgb/PycharmProjects/MaaRandomDicePy/assets/debug/dumps/2024.11.26-09.35.40.927-64f409a9-54f9-4953-9b47-944c793d5004.png] [templ=/Users/cgb/PycharmProjects/MaaRandomDicePy/assets/debug/dumps/2024.11.26-09.35.40.928-e28c2fc7-33d6-4990-afe8-b03244d5f7af.png] 

没看明白,100和120分别是哪个?log 也发一下

就这个图片. 120_117是用ImageCropper截出来的, 100_100是我定的roi image

120*117,ImageCropper 你是怎么使用的,自己手动截了一张图,然后放进 src 文件夹?怎么截图的呢

@MistEO
Copy link
Member

MistEO commented Dec 26, 2024

@moomiji 我感觉这里文档还要改一下,确实没看见哪里说自己截图要手动 resize(

https://github.com/MaaXYZ/MaaFramework/tree/main/tools/ImageCropper

@SCzfdf
Copy link
Author

SCzfdf commented Dec 26, 2024

我们先理一下逻辑,这个画面期望是要怎么识别,然后需要怎么点击操作?具体说一下

用template match会报一些图片太大,roi太小. 如果要使用template match只能扩大roi.

报错?不会的,说明你的图或者 json 写的有问题,发一下看看

image 不知道为啥我的资源图片比实际的图片大点... 我是用ImageCropper截的
报的是

[2024-11-26 09:35:40.927][ERR][Px56043][Tx9852][TemplateMatcher.cpp][L60][TemplateMatcher::ResultsVec MaaNS::VisionNS::TemplateMatcher::template_match(const cv::Mat &) const] recognition_single_blue_ston_3 [uid_=300000018] templ size is too large [image=/Users/cgb/PycharmProjects/MaaRandomDicePy/assets/debug/dumps/2024.11.26-09.35.40.927-64f409a9-54f9-4953-9b47-944c793d5004.png] [templ=/Users/cgb/PycharmProjects/MaaRandomDicePy/assets/debug/dumps/2024.11.26-09.35.40.928-e28c2fc7-33d6-4990-afe8-b03244d5f7af.png] 

没看明白,100和120分别是哪个?log 也发一下

就这个图片. 120_117是用ImageCropper截出来的, 100_100是我定的roi image

120*117,ImageCropper 你是怎么使用的,自己手动截了一张图,然后放进 src 文件夹?

大部分是ImageCropper从运行时动态获取的, 小部分是从debug日志中拿的. 因为我不知道mumu的截图在哪所以只可能会有这2种图片

@MistEO
Copy link
Member

MistEO commented Dec 26, 2024

ImageCropper 你有改过它的什么参数吗?

@SCzfdf
Copy link
Author

SCzfdf commented Dec 26, 2024

这是核心需求

image

@SCzfdf
Copy link
Author

SCzfdf commented Dec 26, 2024

ImageCropper 你有改过它的什么参数吗?
大概知道问题了😭...
只改过一个参数, 由默认横屏改为竖屏. 然后竖屏的参数没有变(模拟器用的是1080*1920)

window_size = (720, 1280) # 竖屏
# window_size = (1280, 720)  # 横屏

@SCzfdf
Copy link
Author

SCzfdf commented Dec 26, 2024

为啥你需要一个截图的线程,我没太看明白
CustomRecognition run 里本身就是带了一张图片的,argv.image,直接用这张图片来 run_recognition 就好了呀?

因为我不是用的CustomRecognition, 我是这样调用的(我看示例项目里的阴阳师是这样调用的...)

img = context.tasker.controller.post_screencap().wait().get()
recognition_blue_result = context.run_recognition(self.recognition_blue_title,
                                                          screenshot,
                                                          self.recognition_blue)

因为每个格子(5*3)都需要识别对应格子是什么骰子, 为了节省点资源就共用一张图片

没用 CustomRecognition 吗那这个 context 哪来的?

CustomAction的context...我看yys是这样用的. 不符合规范吗

不是太好,但也行

但是你说的截图线程是?

截图线程是循环调用一个直接触发的pipeline,
pipeline

"screenshot": {
        "action": "Custom",
        "custom_action": "screenshot_action",
        "pre_delay": 0,
        "post_delay": 0
    }

custom_action

class ScreenshotAction(CustomAction):

    def run(self,
            context: Context,
            argv: CustomAction.RunArg) -> bool:
        """
        截图线程
        """
        img = context.tasker.controller.post_screencap().wait().get()
        logging.debug("ScreenshotAction post_screencap")
        # 存到全局变量里, 由其他线程直接识别
        RDContext.set_screenshot(img)

        return True

@SCzfdf
Copy link
Author

SCzfdf commented Dec 26, 2024

有时间我重新截一遍图片, 然后使用template match试试看识别时间会不会快点.
但是在另一个issue上提了 截图需要耗费400毫秒. 这是否正常, 感觉是比debug慢

这是我的项目代码, 上面一些描述可能表达不是很清楚如果有时间可以看看(入口是__main_v3__.py)

@MistEO
Copy link
Member

MistEO commented Dec 26, 2024

你把多线程的逻辑去掉就没这个问题了(

控制器一次只能进行一个操作,有一个执行队列,截图在等 swipe 这些操作执行完

@MistEO
Copy link
Member

MistEO commented Dec 26, 2024

不光 swipe 会阻塞截图,截图也同时会阻塞 swipe。

直接用最普通的方案就好了,一个 custom action 中,截图 -> 识别 -> 滑动操作

不过更优解是在 custom recognizer 中截图并识别,返回识别成功与否,custom action 中直接执行动作

@MistEO
Copy link
Member

MistEO commented Dec 26, 2024

这是核心需求

image

识别这里你也不用开线程,图像识别是计算密集型,python 的 GIL 开线程没有提升的(应该是吧,我也不是特别懂 python

假设 15 个格子每个都可能有 5 种情况,这里的比较优的方案可能是,对 15 个 ROI 每个分别跑 5 个 run_recognition TemplateMatch,每个里面都只有一张模板图片,然后你写点逻辑判断下命中的是哪个,比较朴实无华(

如果不是 5 种情况而是 50 种情况,可以考虑用 nn classify,可能会快一点

@SCzfdf
Copy link
Author

SCzfdf commented Dec 26, 2024

不光 swipe 会阻塞截图,截图也同时会阻塞 swipe。

直接用最普通的方案就好了,一个 custom action 中,截图 -> 识别 -> 滑动操作

不过更优解是在 custom recognizer 中截图并识别,返回识别成功与否,custom action 中直接执行动作

应该不是swipe和截图抢占, 我测试了单独开截图线程占用时间也是400毫秒左右. 不过截图问题不大, 后面我试试换java掉用会不会快点~
image

@SCzfdf
Copy link
Author

SCzfdf commented Dec 26, 2024

这是核心需求
image

识别这里你也不用开线程,图像识别是计算密集型,python 的 GIL 开线程没有提升的(应该是吧,我也不是特别懂 python

假设 15 个格子每个都可能有 5 种情况,这里的比较优的方案可能是,对 15 个 ROI 每个分别跑 5 个 run_recognition TemplateMatch,每个里面都只有一张模板图片,然后你写点逻辑判断下命中的是哪个,比较朴实无华(

如果不是 5 种情况而是 50 种情况,可以考虑用 nn classify,可能会快一点

后续换TemplateMatch试试, nn classify对我来说有点难= =没有人工智能和深度学习基础...

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

2 participants