调度器使用示例、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.depot_reader import DepotManager
from mower.solvers.reclamation_algorithm import ReclamationAlgorithm from mower.solvers.reclamation_algorithm import ReclamationAlgorithm
from mower.solvers.secret_front import SecretFront 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.csleep import MowerExit
from mower.utils.datetime import format_time from mower.utils.datetime import format_time
from mower.utils.device.adb_client.session import Session from mower.utils.device.adb_client.session import Session
@ -26,7 +26,6 @@ operators = config.operators
# 执行自动排班 # 执行自动排班
def main(): def main():
logger.info("开始运行Mower") logger.info("开始运行Mower")
rapidocr.initialize_ocr()
simulate() 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.fight.credit_fight import CreditFight
from mower.solvers.infra.base_choose import RIIC_ChooseSolver from mower.solvers.infra.base_choose import RIIC_ChooseSolver
from mower.solvers.infra.base_mixin import BaseMixin 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.drone import DroneSolver
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.solvers.infra.get_agent_from_room import GetAgentFromRoomSolver from mower.solvers.infra.get_agent_from_room import GetAgentFromRoomSolver
@ -1691,7 +1691,9 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
self.todo_task = True self.todo_task = True
def clue_new(self): 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 self.party_time:
if not find_next_task( if not find_next_task(
self.tasks, self.tasks,
@ -2679,7 +2681,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
def skland_plan_solover(self): def skland_plan_solover(self):
try: try:
return SKLand().start() return SKLand().run()
except MowerExit: except MowerExit:
raise raise
except Exception as e: except Exception as e:

View file

@ -36,7 +36,7 @@ class CreditFight(SceneGraphSolver):
{"type": "SkillDaemon"}, {"type": "SkillDaemon"},
] ]
self.auto_choose = auto_choose self.auto_choose = auto_choose
super().run() return super().run()
def choose_support(self): def choose_support(self):
img = cropimg(config.recog.gray, ((0, 908), (1839, 983))) 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 import __rootdir__
from mower.solvers.infra.filter import RIIC_Filter 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.character_recognize import operator_room_select
from mower.utils.csleep import MowerExit from mower.utils.csleep import MowerExit
from mower.utils.image import cropimg, loadres, thres2 from mower.utils.image import cropimg, loadres, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.rapidocr import engine
with lzma.open(f"{__rootdir__}/models/operator_room.model", "rb") as f: with lzma.open(f"{__rootdir__}/models/operator_room.model", "rb") as f:
OP_ROOM = pickle.loads(f.read()) OP_ROOM = pickle.loads(f.read())
@ -145,7 +146,7 @@ class BaseMixin:
img = cropimg(img, ((169, 22), (513, 80))) img = cropimg(img, ((169, 22), (513, 80)))
return self.read_operator_in_room(img) return self.read_operator_in_room(img)
try: 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) logger.debug(ret)
if not ret or not ret[0][0]: if not ret or not ret[0][0]:
raise Exception("识别失败") raise Exception("识别失败")

View file

@ -9,7 +9,9 @@ from .place import PlaceSolver
from .receive import ReceiveSolver from .receive import ReceiveSolver
class ClueSolver: class ClueManager:
solver_name = "线索交流"
def run(self): def run(self):
logger.info("基建:线索") logger.info("基建:线索")
DailySolver().run() DailySolver().run()
@ -17,6 +19,6 @@ class ClueSolver:
PlaceSolver().run() PlaceSolver().run()
clue_count = GetClueCountSolver().run() clue_count = GetClueCountSolver().run()
GiveAwaySolver().run(clue_count) GiveAwaySolver().run(clue_count)
party_time = PartyTimeSolver().run() self.party_time = PartyTimeSolver().run()
CreditShop().run() CreditShop().run()
return party_time return True

View file

@ -1,8 +1,9 @@
from mower.solvers.infra.enter_room import EnterRoomSolver 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.graph import SceneGraphSolver
from mower.utils.image import cropimg from mower.utils.image import cropimg
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.rapidocr import engine
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.vector import va from mower.utils.vector import va
@ -40,7 +41,7 @@ class GiveAwaySolver(SceneGraphSolver):
break break
name_top_left = (870, 127 + 222 * i) name_top_left = (870, 127 + 222 * i)
name_scope = (name_top_left, va(name_top_left, (383, 62))) name_scope = (name_top_left, va(name_top_left, (383, 62)))
name = rapidocr.engine( name = engine(
cropimg(config.recog.gray, name_scope), cropimg(config.recog.gray, name_scope),
use_det=True, use_det=True,
use_cls=False, use_cls=False,

View file

@ -1,10 +1,11 @@
import cv2 import cv2
from mower.solvers.infra.enter_room import EnterRoomSolver 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.graph import SceneGraphSolver
from mower.utils.image import cropimg, loadres, thres2 from mower.utils.image import cropimg, loadres, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.rapidocr import engine
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.vector import va from mower.utils.vector import va
@ -102,7 +103,7 @@ class PlaceSolver(SceneGraphSolver):
name_img = cv2.copyMakeBorder( name_img = cv2.copyMakeBorder(
name_img, 48, 48, 48, 48, cv2.BORDER_REPLICATE name_img, 48, 48, 48, 48, cv2.BORDER_REPLICATE
) )
name = rapidocr.engine( name = engine(
name_img, name_img,
use_det=True, use_det=True,
use_cls=False, use_cls=False,
@ -117,7 +118,7 @@ class PlaceSolver(SceneGraphSolver):
time_img = cv2.copyMakeBorder( time_img = cv2.copyMakeBorder(
time_img, 48, 48, 48, 48, cv2.BORDER_REPLICATE time_img, 48, 48, 48, 48, cv2.BORDER_REPLICATE
) )
time = rapidocr.engine( time = engine(
time_img, time_img,
use_det=True, use_det=True,
use_cls=False, use_cls=False,

View file

@ -1,10 +1,11 @@
import cv2 import cv2
from mower.solvers.infra.enter_room import EnterRoomSolver 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.graph import SceneGraphSolver
from mower.utils.image import cropimg from mower.utils.image import cropimg
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.rapidocr import engine
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from .utils import clue_cls, exit_pos from .utils import clue_cls, exit_pos
@ -32,7 +33,7 @@ class ReceiveSolver(SceneGraphSolver):
name_img = cv2.copyMakeBorder( name_img = cv2.copyMakeBorder(
name_img, 48, 48, 48, 48, cv2.BORDER_REPLICATE name_img, 48, 48, 48, 48, cv2.BORDER_REPLICATE
) )
name = rapidocr.engine( name = engine(
name_img, name_img,
use_det=True, use_det=True,
use_cls=False, use_cls=False,

View file

@ -62,12 +62,7 @@ class ReportSolver(SceneGraphSolver):
logger.info("今天的基报看过了") logger.info("今天的基报看过了")
return True return True
logger.info("康康大基报捏~") logger.info("康康大基报捏~")
try: return super().run()
super().run()
return True
except Exception as e:
logger.exception(e)
return False
def transition(self) -> bool: def transition(self) -> bool:
if self.scene() == Scene.RIIC_REPORT: if self.scene() == Scene.RIIC_REPORT:

View file

@ -7,15 +7,14 @@ import numpy as np
from mower.data import agent_list from mower.data import agent_list
from mower.models import Digtal from mower.models import Digtal
from mower.solvers.navigation.utils import generate_name 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.graph import SceneGraphSolver
from mower.utils.image import cropimg, loadres, thres2 from mower.utils.image import cropimg, loadres, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.rapidocr import engine
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.vector import va from mower.utils.vector import va
rapidocr.initialize_ocr()
profession_list = [ profession_list = [
"PIONEER", "PIONEER",
"WARRIOR", "WARRIOR",
@ -65,7 +64,7 @@ class OperatorSolver(SceneGraphSolver):
img = thres2(config.recog.gray, 200) img = thres2(config.recog.gray, 200)
img = cropimg(img, ((20, 680), (630, 740))) img = cropimg(img, ((20, 680), (630, 740)))
profession = self.profession() 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=}") logger.debug(f"{profession=} {ocr_result=}")
ocr_result = ocr_result.replace(".", "").strip() ocr_result = ocr_result.replace(".", "").strip()

View file

@ -6,13 +6,14 @@ from typing import Optional
import cv2 import cv2
import numpy as np 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 import typealias as tp
from mower.utils.csleep import MowerExit from mower.utils.csleep import MowerExit
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg, loadres, thres2 from mower.utils.image import cropimg, loadres, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.matcher import Matcher from mower.utils.matcher import Matcher
from mower.utils.rapidocr import engine
from mower.utils.scene import Scene from mower.utils.scene import Scene
src_pts = np.float32([[0, 97], [1920, 97], [-400, 1080], [2320, 1080]]) 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): def detect_score(self, scope=None, find_max=True):
if find_max and self.find("ra/max", scope=scope, score=0.7): if find_max and self.find("ra/max", scope=scope, score=0.7):
return "已达上限" return "已达上限"
score = rapidocr.engine( score = engine(
thres2(cropimg(config.recog.gray, scope), 127), thres2(cropimg(config.recog.gray, scope), 127),
use_det=False, use_det=False,
use_cls=False, use_cls=False,

View file

@ -20,6 +20,8 @@ from mower.utils.skland import (
class SKLand: class SKLand:
solver_name = "森空岛签到"
def __init__(self): def __init__(self):
self.record_path = get_path("@app/tmp/skland.csv") self.record_path = get_path("@app/tmp/skland.csv")
@ -28,7 +30,7 @@ class SKLand:
self.sign_token = "" self.sign_token = ""
self.all_recorded = True self.all_recorded = True
def start(self): def run(self):
for item in config.conf.skland_info: for item in config.conf.skland_info:
if self.has_record(item.account): if self.has_record(item.account):
continue continue
@ -62,7 +64,7 @@ class SKLand:
f'{i.get("nickName")}获得了{res["name"]}×{j.get("count") or 1}' f'{i.get("nickName")}获得了{res["name"]}×{j.get("count") or 1}'
) )
if len(self.reward) > 0: if len(self.reward) > 0:
return self.record_log() return True
if self.all_recorded: if self.all_recorded:
return True return True
return False 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): logger.info("加载OCR")
global engine engine = RapidOCR(text_score=0.3)
if not engine: logger.info("OCR加载完成")
from rapidocr_onnxruntime import RapidOCR
engine = RapidOCR(text_score=score)

View file

@ -1,5 +1,5 @@
from datetime import datetime, time, timedelta from datetime import datetime, time, timedelta
from typing import Any from importlib import import_module
from pydantic import BaseModel from pydantic import BaseModel
@ -9,10 +9,18 @@ from mower.utils.log import logger
from mower.utils.simulator import restart_simulator 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): class BasicTask(BaseModel):
"内部使用" "内部使用"
solver: Any solver: str
"调用solver().run()" "调用solver().run()"
priority: int = 10 priority: int = 10
@ -23,9 +31,10 @@ class BasicTask(BaseModel):
@property @property
def _solver_name(self): def _solver_name(self):
if self.solver.solver_name is None: solver_class = import_solver(self.solver)
return self.solver.__qualname__ if solver_class.solver_name is None:
return self.solver.solver_name return solver_class.__qualname__
return solver_class.solver_name
def _get_next_execution(self, now: datetime): def _get_next_execution(self, now: datetime):
return now return now
@ -109,6 +118,18 @@ class Scheduler:
logger.info(f"注册任务:{task}") logger.info(f"注册任务:{task}")
self.task_list.append(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): def list_tasks(self):
for i, task in enumerate(self.task_list): for i, task in enumerate(self.task_list):
logger.info(f"({i + 1}/{len(self.task_list)}) {task}") 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], [task for _time, task in execution_list if _time <= now],
key=lambda task: task.priority, key=lambda task: task.priority,
) )
solver = next_task.solver() solver = import_solver(next_task.solver)()
try: try:
stop_time = min( 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()