调度器使用示例、OCR调用改进
This commit is contained in:
parent
f19b7a4968
commit
1bcc311a93
15 changed files with 154 additions and 45 deletions
|
@ -7,7 +7,7 @@ from mower.solvers.base_schedule import BaseSchedulerSolver
|
|||
from mower.solvers.depot_reader import DepotManager
|
||||
from mower.solvers.reclamation_algorithm import ReclamationAlgorithm
|
||||
from mower.solvers.secret_front import SecretFront
|
||||
from mower.utils import config, path, rapidocr
|
||||
from mower.utils import config, path
|
||||
from mower.utils.csleep import MowerExit
|
||||
from mower.utils.datetime import format_time
|
||||
from mower.utils.device.adb_client.session import Session
|
||||
|
@ -26,7 +26,6 @@ operators = config.operators
|
|||
# 执行自动排班
|
||||
def main():
|
||||
logger.info("开始运行Mower")
|
||||
rapidocr.initialize_ocr()
|
||||
simulate()
|
||||
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ from mower.solvers.depotREC import depotREC as DepotSolver
|
|||
from mower.solvers.fight.credit_fight import CreditFight
|
||||
from mower.solvers.infra.base_choose import RIIC_ChooseSolver
|
||||
from mower.solvers.infra.base_mixin import BaseMixin
|
||||
from mower.solvers.infra.clue import ClueSolver
|
||||
from mower.solvers.infra.clue import ClueManager
|
||||
from mower.solvers.infra.drone import DroneSolver
|
||||
from mower.solvers.infra.enter_room import EnterRoomSolver
|
||||
from mower.solvers.infra.get_agent_from_room import GetAgentFromRoomSolver
|
||||
|
@ -1691,7 +1691,9 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
|
|||
self.todo_task = True
|
||||
|
||||
def clue_new(self):
|
||||
self.party_time = ClueSolver().run()
|
||||
clue_solver = ClueManager()
|
||||
clue_solver.run()
|
||||
self.party_time = clue_solver.party_time
|
||||
if self.party_time:
|
||||
if not find_next_task(
|
||||
self.tasks,
|
||||
|
@ -2679,7 +2681,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
|
|||
|
||||
def skland_plan_solover(self):
|
||||
try:
|
||||
return SKLand().start()
|
||||
return SKLand().run()
|
||||
except MowerExit:
|
||||
raise
|
||||
except Exception as e:
|
||||
|
|
|
@ -36,7 +36,7 @@ class CreditFight(SceneGraphSolver):
|
|||
{"type": "SkillDaemon"},
|
||||
]
|
||||
self.auto_choose = auto_choose
|
||||
super().run()
|
||||
return super().run()
|
||||
|
||||
def choose_support(self):
|
||||
img = cropimg(config.recog.gray, ((0, 908), (1839, 983)))
|
||||
|
|
|
@ -7,11 +7,12 @@ import numpy as np
|
|||
|
||||
from mower import __rootdir__
|
||||
from mower.solvers.infra.filter import RIIC_Filter
|
||||
from mower.utils import config, rapidocr
|
||||
from mower.utils import config
|
||||
from mower.utils.character_recognize import operator_room_select
|
||||
from mower.utils.csleep import MowerExit
|
||||
from mower.utils.image import cropimg, loadres, thres2
|
||||
from mower.utils.log import logger
|
||||
from mower.utils.rapidocr import engine
|
||||
|
||||
with lzma.open(f"{__rootdir__}/models/operator_room.model", "rb") as f:
|
||||
OP_ROOM = pickle.loads(f.read())
|
||||
|
@ -145,7 +146,7 @@ class BaseMixin:
|
|||
img = cropimg(img, ((169, 22), (513, 80)))
|
||||
return self.read_operator_in_room(img)
|
||||
try:
|
||||
ret = rapidocr.engine(img, use_det=False, use_cls=False, use_rec=True)[0]
|
||||
ret = engine(img, use_det=False, use_cls=False, use_rec=True)[0]
|
||||
logger.debug(ret)
|
||||
if not ret or not ret[0][0]:
|
||||
raise Exception("识别失败")
|
||||
|
|
|
@ -9,7 +9,9 @@ from .place import PlaceSolver
|
|||
from .receive import ReceiveSolver
|
||||
|
||||
|
||||
class ClueSolver:
|
||||
class ClueManager:
|
||||
solver_name = "线索交流"
|
||||
|
||||
def run(self):
|
||||
logger.info("基建:线索")
|
||||
DailySolver().run()
|
||||
|
@ -17,6 +19,6 @@ class ClueSolver:
|
|||
PlaceSolver().run()
|
||||
clue_count = GetClueCountSolver().run()
|
||||
GiveAwaySolver().run(clue_count)
|
||||
party_time = PartyTimeSolver().run()
|
||||
self.party_time = PartyTimeSolver().run()
|
||||
CreditShop().run()
|
||||
return party_time
|
||||
return True
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
from mower.solvers.infra.enter_room import EnterRoomSolver
|
||||
from mower.utils import config, rapidocr
|
||||
from mower.utils import config
|
||||
from mower.utils.graph import SceneGraphSolver
|
||||
from mower.utils.image import cropimg
|
||||
from mower.utils.log import logger
|
||||
from mower.utils.rapidocr import engine
|
||||
from mower.utils.recognize import Scene
|
||||
from mower.utils.vector import va
|
||||
|
||||
|
@ -40,7 +41,7 @@ class GiveAwaySolver(SceneGraphSolver):
|
|||
break
|
||||
name_top_left = (870, 127 + 222 * i)
|
||||
name_scope = (name_top_left, va(name_top_left, (383, 62)))
|
||||
name = rapidocr.engine(
|
||||
name = engine(
|
||||
cropimg(config.recog.gray, name_scope),
|
||||
use_det=True,
|
||||
use_cls=False,
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
import cv2
|
||||
|
||||
from mower.solvers.infra.enter_room import EnterRoomSolver
|
||||
from mower.utils import config, rapidocr
|
||||
from mower.utils import config
|
||||
from mower.utils.graph import SceneGraphSolver
|
||||
from mower.utils.image import cropimg, loadres, thres2
|
||||
from mower.utils.log import logger
|
||||
from mower.utils.rapidocr import engine
|
||||
from mower.utils.recognize import Scene
|
||||
from mower.utils.vector import va
|
||||
|
||||
|
@ -102,7 +103,7 @@ class PlaceSolver(SceneGraphSolver):
|
|||
name_img = cv2.copyMakeBorder(
|
||||
name_img, 48, 48, 48, 48, cv2.BORDER_REPLICATE
|
||||
)
|
||||
name = rapidocr.engine(
|
||||
name = engine(
|
||||
name_img,
|
||||
use_det=True,
|
||||
use_cls=False,
|
||||
|
@ -117,7 +118,7 @@ class PlaceSolver(SceneGraphSolver):
|
|||
time_img = cv2.copyMakeBorder(
|
||||
time_img, 48, 48, 48, 48, cv2.BORDER_REPLICATE
|
||||
)
|
||||
time = rapidocr.engine(
|
||||
time = engine(
|
||||
time_img,
|
||||
use_det=True,
|
||||
use_cls=False,
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
import cv2
|
||||
|
||||
from mower.solvers.infra.enter_room import EnterRoomSolver
|
||||
from mower.utils import config, rapidocr
|
||||
from mower.utils import config
|
||||
from mower.utils.graph import SceneGraphSolver
|
||||
from mower.utils.image import cropimg
|
||||
from mower.utils.log import logger
|
||||
from mower.utils.rapidocr import engine
|
||||
from mower.utils.recognize import Scene
|
||||
|
||||
from .utils import clue_cls, exit_pos
|
||||
|
@ -32,7 +33,7 @@ class ReceiveSolver(SceneGraphSolver):
|
|||
name_img = cv2.copyMakeBorder(
|
||||
name_img, 48, 48, 48, 48, cv2.BORDER_REPLICATE
|
||||
)
|
||||
name = rapidocr.engine(
|
||||
name = engine(
|
||||
name_img,
|
||||
use_det=True,
|
||||
use_cls=False,
|
||||
|
|
|
@ -62,12 +62,7 @@ class ReportSolver(SceneGraphSolver):
|
|||
logger.info("今天的基报看过了")
|
||||
return True
|
||||
logger.info("康康大基报捏~")
|
||||
try:
|
||||
super().run()
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.exception(e)
|
||||
return False
|
||||
return super().run()
|
||||
|
||||
def transition(self) -> bool:
|
||||
if self.scene() == Scene.RIIC_REPORT:
|
||||
|
|
|
@ -7,15 +7,14 @@ import numpy as np
|
|||
from mower.data import agent_list
|
||||
from mower.models import Digtal
|
||||
from mower.solvers.navigation.utils import generate_name
|
||||
from mower.utils import config, rapidocr
|
||||
from mower.utils import config
|
||||
from mower.utils.graph import SceneGraphSolver
|
||||
from mower.utils.image import cropimg, loadres, thres2
|
||||
from mower.utils.log import logger
|
||||
from mower.utils.rapidocr import engine
|
||||
from mower.utils.recognize import Scene
|
||||
from mower.utils.vector import va
|
||||
|
||||
rapidocr.initialize_ocr()
|
||||
|
||||
profession_list = [
|
||||
"PIONEER",
|
||||
"WARRIOR",
|
||||
|
@ -65,7 +64,7 @@ class OperatorSolver(SceneGraphSolver):
|
|||
img = thres2(config.recog.gray, 200)
|
||||
img = cropimg(img, ((20, 680), (630, 740)))
|
||||
profession = self.profession()
|
||||
ocr_result = rapidocr.engine(img, use_det=False, use_cls=False)[0][0][0]
|
||||
ocr_result = engine(img, use_det=False, use_cls=False)[0][0][0]
|
||||
logger.debug(f"{profession=} {ocr_result=}")
|
||||
|
||||
ocr_result = ocr_result.replace(".", "").strip()
|
||||
|
|
|
@ -6,13 +6,14 @@ from typing import Optional
|
|||
import cv2
|
||||
import numpy as np
|
||||
|
||||
from mower.utils import config, rapidocr
|
||||
from mower.utils import config
|
||||
from mower.utils import typealias as tp
|
||||
from mower.utils.csleep import MowerExit
|
||||
from mower.utils.graph import SceneGraphSolver
|
||||
from mower.utils.image import cropimg, loadres, thres2
|
||||
from mower.utils.log import logger
|
||||
from mower.utils.matcher import Matcher
|
||||
from mower.utils.rapidocr import engine
|
||||
from mower.utils.scene import Scene
|
||||
|
||||
src_pts = np.float32([[0, 97], [1920, 97], [-400, 1080], [2320, 1080]])
|
||||
|
@ -294,7 +295,7 @@ class ReclamationAlgorithm(SceneGraphSolver):
|
|||
def detect_score(self, scope=None, find_max=True):
|
||||
if find_max and self.find("ra/max", scope=scope, score=0.7):
|
||||
return "已达上限"
|
||||
score = rapidocr.engine(
|
||||
score = engine(
|
||||
thres2(cropimg(config.recog.gray, scope), 127),
|
||||
use_det=False,
|
||||
use_cls=False,
|
||||
|
|
|
@ -20,6 +20,8 @@ from mower.utils.skland import (
|
|||
|
||||
|
||||
class SKLand:
|
||||
solver_name = "森空岛签到"
|
||||
|
||||
def __init__(self):
|
||||
self.record_path = get_path("@app/tmp/skland.csv")
|
||||
|
||||
|
@ -28,7 +30,7 @@ class SKLand:
|
|||
self.sign_token = ""
|
||||
self.all_recorded = True
|
||||
|
||||
def start(self):
|
||||
def run(self):
|
||||
for item in config.conf.skland_info:
|
||||
if self.has_record(item.account):
|
||||
continue
|
||||
|
@ -62,7 +64,7 @@ class SKLand:
|
|||
f'{i.get("nickName")}获得了{res["name"]}×{j.get("count") or 1}'
|
||||
)
|
||||
if len(self.reward) > 0:
|
||||
return self.record_log()
|
||||
return True
|
||||
if self.all_recorded:
|
||||
return True
|
||||
return False
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
engine = None
|
||||
|
||||
|
||||
def initialize_ocr(score=0.3):
|
||||
global engine
|
||||
if not engine:
|
||||
from rapidocr_onnxruntime import RapidOCR
|
||||
|
||||
engine = RapidOCR(text_score=score)
|
||||
from mower.utils.log import logger
|
||||
|
||||
logger.info("加载OCR")
|
||||
engine = RapidOCR(text_score=0.3)
|
||||
logger.info("OCR加载完成")
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
from datetime import datetime, time, timedelta
|
||||
from typing import Any
|
||||
from importlib import import_module
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
@ -9,10 +9,18 @@ from mower.utils.log import logger
|
|||
from mower.utils.simulator import restart_simulator
|
||||
|
||||
|
||||
def import_solver(full_name: str):
|
||||
index = full_name.rfind(".")
|
||||
module_name = full_name[:index]
|
||||
class_name = full_name[index + 1 :]
|
||||
module = import_module(module_name)
|
||||
return getattr(module, class_name)
|
||||
|
||||
|
||||
class BasicTask(BaseModel):
|
||||
"内部使用"
|
||||
|
||||
solver: Any
|
||||
solver: str
|
||||
"调用solver().run()"
|
||||
|
||||
priority: int = 10
|
||||
|
@ -23,9 +31,10 @@ class BasicTask(BaseModel):
|
|||
|
||||
@property
|
||||
def _solver_name(self):
|
||||
if self.solver.solver_name is None:
|
||||
return self.solver.__qualname__
|
||||
return self.solver.solver_name
|
||||
solver_class = import_solver(self.solver)
|
||||
if solver_class.solver_name is None:
|
||||
return solver_class.__qualname__
|
||||
return solver_class.solver_name
|
||||
|
||||
def _get_next_execution(self, now: datetime):
|
||||
return now
|
||||
|
@ -109,6 +118,18 @@ class Scheduler:
|
|||
logger.info(f"注册任务:{task}")
|
||||
self.task_list.append(task)
|
||||
|
||||
def register_one_time(self, solver: str, time: datetime, priority: int = 10):
|
||||
self.register(OneTimeTask(solver=solver, time=time, priority=priority))
|
||||
|
||||
def register_periodic(self, solver: str, interval: timedelta, priority: int = 20):
|
||||
self.register(PeriodicTask(solver=solver, interval=interval, priority=priority))
|
||||
|
||||
def register_daily(self, solver: str, offset: timedelta, priority: int = 30):
|
||||
self.register(DailyTask(solver=solver, time_offset=offset, priority=priority))
|
||||
|
||||
def register_long(self, solver: str, priority: int = 40):
|
||||
self.register(LongTask(solver=solver, priority=priority))
|
||||
|
||||
def list_tasks(self):
|
||||
for i, task in enumerate(self.task_list):
|
||||
logger.info(f"({i + 1}/{len(self.task_list)}) {task}")
|
||||
|
@ -135,7 +156,7 @@ class Scheduler:
|
|||
[task for _time, task in execution_list if _time <= now],
|
||||
key=lambda task: task.priority,
|
||||
)
|
||||
solver = next_task.solver()
|
||||
solver = import_solver(next_task.solver)()
|
||||
try:
|
||||
stop_time = min(
|
||||
[
|
||||
|
|
86
scheduler.py
Executable file
86
scheduler.py
Executable file
|
@ -0,0 +1,86 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from mower.utils import path
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) == 2:
|
||||
path.global_space = sys.argv[1]
|
||||
|
||||
from mower.utils import config
|
||||
from mower.utils.scheduler import scheduler
|
||||
|
||||
conf = config.conf
|
||||
now = datetime.now()
|
||||
|
||||
# scheduler.register(
|
||||
# OneTimeTask(
|
||||
# solver=MiniBase,
|
||||
# time=now,
|
||||
# )
|
||||
# )
|
||||
|
||||
if conf.sign_in.enable:
|
||||
scheduler.register_daily(
|
||||
solver="mower.solvers.sign_in.SignInManager",
|
||||
offset=timedelta(hours=4),
|
||||
priority=15,
|
||||
)
|
||||
if conf.visit_friend:
|
||||
scheduler.register_daily(
|
||||
solver="mower.solvers.credit.CreditSolver",
|
||||
offset=timedelta(hours=4),
|
||||
priority=16,
|
||||
)
|
||||
if conf.report_enable:
|
||||
scheduler.register_daily(
|
||||
solver="mower.solvers.infra.report.ReportSolver",
|
||||
offset=timedelta(hours=4),
|
||||
priority=17,
|
||||
)
|
||||
if conf.switch_assistants:
|
||||
scheduler.register_daily(
|
||||
solver="mower.solvers.infra.switch_assistants.SwitchAssistantsSolver",
|
||||
offset=timedelta(hours=4),
|
||||
priority=18,
|
||||
)
|
||||
if conf.skland_enable:
|
||||
scheduler.register_daily(
|
||||
solver="mower.solvers.skland.SKLand",
|
||||
offset=timedelta(hours=3),
|
||||
priority=19,
|
||||
)
|
||||
if conf.check_mail_enable:
|
||||
scheduler.register_daily(
|
||||
solver="mower.solvers.mail.MailSolver",
|
||||
offset=timedelta(hours=4),
|
||||
priority=20,
|
||||
)
|
||||
if conf.maa_credit_fight:
|
||||
scheduler.register_daily(
|
||||
solver="mower.solvers.fight.credit_fight.CreditFight",
|
||||
offset=timedelta(hours=4),
|
||||
priority=21,
|
||||
)
|
||||
if conf.enable_party:
|
||||
scheduler.register_periodic(
|
||||
solver="mower.solvers.infra.clue.ClueManager",
|
||||
interval=timedelta(hours=1),
|
||||
priority=25,
|
||||
)
|
||||
if conf.maa_enable:
|
||||
scheduler.register_periodic(
|
||||
solver="mower.solvers.operation.OperationManager",
|
||||
interval=timedelta(hours=config.conf.maa_gap),
|
||||
priority=26,
|
||||
)
|
||||
if conf.maa_depot_enable:
|
||||
scheduler.register_periodic(
|
||||
solver="mower.solvers.depotREC.depotREC",
|
||||
interval=timedelta(hours=config.conf.maa_gap),
|
||||
priority=27,
|
||||
)
|
||||
|
||||
scheduler.schedule()
|
Loading…
Add table
Add a link
Reference in a new issue