调度器使用示例、OCR调用改进

This commit is contained in:
zhbaor 2024-11-03 15:32:35 +08:00
parent f19b7a4968
commit 1bcc311a93
15 changed files with 154 additions and 45 deletions

View file

@ -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()

View file

@ -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:

View file

@ -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)))

View file

@ -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("识别失败")

View file

@ -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

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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:

View file

@ -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()

View file

@ -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,

View file

@ -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

View file

@ -1,9 +1,7 @@
engine = None
from rapidocr_onnxruntime import RapidOCR
from mower.utils.log import logger
def initialize_ocr(score=0.3):
global engine
if not engine:
from rapidocr_onnxruntime import RapidOCR
engine = RapidOCR(text_score=score)
logger.info("加载OCR")
engine = RapidOCR(text_score=0.3)
logger.info("OCR加载完成")

View file

@ -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
View 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()