MaaFramework icon indicating copy to clipboard operation
MaaFramework copied to clipboard

pipeline override 导致丢失 custom_recognition_param 和 custom_action_param

Open Van493 opened this issue 9 months ago • 1 comments

@custom_registry.custom_recognition("overridelab202504main")
class OverrideLab202504Main(CustomRecognition):
    def analyze(self, context: Context, argv: CustomRecognition.AnalyzeArg) -> CustomRecognition.AnalyzeResult:
        new_context = context.clone()
        reco1 = context.run_recognition("OverrideLab202504Sub", argv.image)

        # override roi
        context.override_pipeline({"OverrideLab202504Sub": {"roi": [100, 100, 200, 300]}})
        reco2 = context.run_recognition("OverrideLab202504Sub", argv.image)
        
        # override custom param
        new_context.override_pipeline({"OverrideLab202504Sub": {"custom_recognition_param": {"value": "new value"}}})
        reco3 = new_context.run_recognition("OverrideLab202504Sub", argv.image)

        print(f"reco1 is {reco1.best_result.detail}")
        print(f"reco2 is {reco2.best_result.detail}")
        print(f"reco3 is {reco3.best_result.detail}")

        # action
        print("run action 1")
        context.run_action("OverrideLab202504Action")

        # override target
        context.override_pipeline({"OverrideLab202504Action": {"target": [100, 100, 200, 300]}})
        print("run action 2")
        context.run_action("OverrideLab202504Action")

        # override custom param
        print("run action 3")
        new_context.run_action("OverrideLab202504Action", pipeline_override={"OverrideLab202504Action": {"custom_action_param": {"value": "new value"}}})

        return CustomRecognition.AnalyzeResult(box=(0, 0, 100, 100), detail="Hello World!")
    
@custom_registry.custom_recognition("overridelab202504sub")
class OverrideLab202504Sub(CustomRecognition):
    def analyze(self, context: Context, argv: CustomRecognition.AnalyzeArg) -> CustomRecognition.AnalyzeResult:
        return CustomRecognition.AnalyzeResult(box=(0, 0, 100, 100), detail=f"roi is {argv.roi}. custom_recognition_param is {argv.custom_recognition_param}")
    
@custom_registry.custom_action("overridelab202504action")
class OverrideLab202504Action(CustomAction):
    def run(self, context: Context, argv: CustomAction.RunArg) -> CustomAction.RunResult:
        print(f"OverrideLab202504Action: box is {argv.box}. custom_action_param is {argv.custom_action_param}")
        return CustomAction.RunResult(True)
{
    "OverrideLab202504Main": {
        "recognition": "Custom",
        "custom_recognition": "overridelab202504main"
    },
    "OverrideLab202504Sub": {
        "recognition": "Custom",
        "custom_recognition": "overridelab202504sub",
        "custom_recognition_param": {
            "value": "default"
        },
        "roi": [
            10,
            20,
            30,
            40
        ]
    },
    "OverrideLab202504Action": {
        "action": "Custom",
        "custom_action": "overridelab202504action",
        "custom_action_param": {
            "value": "default"
        },
        "target": [
            30,
            40,
            50,
            60
        ]
    }
}

运行OverrideLab202504Main的结果为

reco1 is roi is Rect(x=10, y=20, w=30, h=40). custom_recognition_param is {"value":"default"}
reco2 is roi is Rect(x=100, y=100, w=200, h=300). custom_recognition_param is {}
reco3 is roi is Rect(x=10, y=20, w=30, h=40). custom_recognition_param is {"value":"new value"}
run action 1
OverrideLab202504Action: box is Rect(x=30, y=40, w=50, h=60). custom_action_param is {"value":"default"}
run action 2
OverrideLab202504Action: box is Rect(x=100, y=100, w=200, h=300). custom_action_param is {}
run action 3
OverrideLab202504Action: box is Rect(x=30, y=40, w=50, h=60). custom_action_param is {"value":"new value"}

reco2和action2的custom param在一次override其他字段后都变为{},期待的结果为{"value":"default"} 看起来override其他字段会导致丢失custom_recognition_param custom_action_param

Van493 avatar Apr 06 '25 10:04 Van493