AzurLaneAutoScript
AzurLaneAutoScript copied to clipboard
多Alas实例共享同一OCR服务时,字符白名单可能冲突
在提问之前...
- [X] 我已经搜索了现有的 issues
- [X] 我在提问题之前至少花费了 5 分钟来思考和准备
- [X] 我已经阅读了 Wiki 中的 常见问题(FAQ)
- [X] 我正在使用最新版的 Alas
描述你的问题
食物ocr有设置字符白名单,但是没有生效
@cached_property
def _dorm_food_ocr(self):
grids = self._dorm_food.crop((65, 66, 128, 91), name='FOOD_AMOUNT')
return Digit(grids.buttons, letter=(255, 255, 255), threshold=128, name='OCR_DORM_FOOD')
我猜测:OCR 调用的 set_cand_alphabet 和 ocr_for_single_lines 是两个方法,并行的时候可能会乱序 https://github.com/LmeSzinc/AzurLaneAutoScript/blob/9f2defedfb82ad6b300f1d6f3edf1f17f830e965/module/ocr/ocr.py#L74-L103
如何复现
- 在 config/deploy.yaml 中打开 UseOcrServer 和 StartOcrServer,重启alas
- 像往常一样使用alas
- 在另外一处打开 UseOcrServer,调用alas代码执行繁重的ocr任务
- 等待问题出现
预期行为
No response
相关 Logs
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
DORM
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
2022-08-18 08:42:20.457 | INFO | <<< UI ENSURE >>>
2022-08-18 08:42:20.459 | INFO | UI get current page
2022-08-18 08:42:20.479 | INFO | [UI] page_os
2022-08-18 08:42:20.480 | INFO | Goto page_dormmenu
2022-08-18 08:42:20.482 | INFO | <<< UI GOTO PAGE_DORMMENU >>>
2022-08-18 08:42:20.492 | INFO | Page switch: page_os -> page_main
2022-08-18 08:42:20.494 | INFO | Click (1248, 37) @ GOTO_MAIN
2022-08-18 08:42:21.083 | INFO | Page switch: page_main -> page_dormmenu
2022-08-18 08:42:21.085 | INFO | Click ( 527, 689) @ MAIN_GOTO_DORMMENU
2022-08-18 08:42:21.380 | INFO | Page arrive: page_dormmenu
2022-08-18 08:42:21.390 | INFO | <<< UI GOTO PAGE_DORM >>>
2022-08-18 08:42:21.396 | INFO | Page switch: page_dormmenu -> page_dorm
2022-08-18 08:42:21.399 | INFO | Click ( 587, 332) @ DORMMENU_GOTO_DORM
2022-08-18 08:42:21.680 | INFO | Page arrive: page_dorm
2022-08-18 08:42:21.682 | INFO | <<< DORM COLLECT >>>
2022-08-18 08:42:23.367 | INFO | Dorm loves: 2, Dorm coins: 1
2022-08-18 08:42:23.370 | INFO | Click ( 738, 202) @ DORM_LOVE
2022-08-18 08:42:24.018 | INFO | Click ( 785, 329) @ DORM_LOVE
2022-08-18 08:42:24.811 | INFO | Click ( 765, 363) @ DORM_COIN
2022-08-18 08:42:29.820 | INFO | Dorm loves: 0, Dorm coins: 0
2022-08-18 08:42:29.823 | INFO | <<< UI CLICK >>>
2022-08-18 08:42:29.841 | INFO | Click ( 101, 631) @ DORM_FEED_ENTER
2022-08-18 08:42:31.231 | INFO | <<< DORM FEED >>>
2022-08-18 08:42:31.558 | INFO | [OCR_DORM_FOOD 0.013s] [4854, 133, 11, 0, 2, 0]
2022-08-18 08:42:31.583 | INFO | [OCR_DORM_FILL 0.023s] 69646/90000
2022-08-18 08:42:31.585 | INFO | Dorm food: [4854, 133, 11, 0, 2, 0], to fill: 20354
2022-08-18 08:42:31.587 | INFO | Dorm feed FOOD_4_0 x 2
2022-08-18 08:42:31.589 | INFO | Click ( 973, 439) @ FOOD_4_0
2022-08-18 08:42:32.306 | INFO | Click ( 980, 406) @ FOOD_4_0
2022-08-18 08:42:33.460 | ERROR | ValueError: invalid literal for int() with base 10: '---133'
┌───────────────────────────────────────── Traceback (most recent call last) ─────────────────────────────────────────┐
│ │
│ E:\ProgramData\Pycharm\AzurLaneAutoScript\alas.py:62 in run │
│ │
│ 59 │ def run(self, command): │
│ 60 │ │ try: │
│ 61 │ │ │ self.device.screenshot() │
│ > 62 │ │ │ self.__getattribute__(command)() │
│ 63 │ │ │ return True │
│ 64 │ │ except TaskEnd: │
│ 65 │ │ │ return True │
│ │
│ ┌───────────────────────────────── locals ─────────────────────────────────┐ │
│ │ command = 'dorm' │ │
│ │ e = ValueError("invalid literal for int() with base 10: '---133'") │ │
│ │ self = <alas.AzurLaneAutoScript object at 0x000002C3A31BF348> │ │
│ └──────────────────────────────────────────────────────────────────────────┘ │
│ E:\ProgramData\Pycharm\AzurLaneAutoScript\alas.py:171 in dorm │
│ │
│ 168 │ │
│ 169 │ def dorm(self): │
│ 170 │ │ from module.dorm.dorm import RewardDorm │
│ > 171 │ │ RewardDorm(config=self.config, device=self.device).run() │
│ 172 │ │
│ 173 │ def meowfficer(self): │
│ 174 │ │ from module.meowfficer.meowfficer import RewardMeowfficer │
│ │
│ ┌────────────────────────────── locals ───────────────────────────────┐ │
│ │ RewardDorm = <class 'module.dorm.dorm.RewardDorm'> │ │
│ │ self = <alas.AzurLaneAutoScript object at 0x000002C3A31BF348> │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ E:\ProgramData\Pycharm\AzurLaneAutoScript\module\dorm\dorm.py:317 in run │
│ │
│ 314 │ │ │ self.config.Scheduler_Enable = False │
│ 315 │ │ │ self.config.task_stop() │
│ 316 │ │ │
│ > 317 │ │ self.dorm_run(feed=self.config.Dorm_Feed, collect=self.config.Dorm_Collect) │
│ 318 │ │ self.config.task_delay(success=True) │
│ 319 │
│ │
│ ┌───────────────────────────── locals ──────────────────────────────┐ │
│ │ self = <module.dorm.dorm.RewardDorm object at 0x000002C3D61DDB48> │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ E:\ProgramData\Pycharm\AzurLaneAutoScript\module\dorm\dorm.py:303 in dorm_run │
│ │
│ 300 │ │ if feed: │
│ 301 │ │ │ self.ui_click(click_button=DORM_FEED_ENTER, appear_button=DORM_CHECK, │
│ check_button=DORM_FEED_CHECK, │
│ 302 │ │ │ │ │ │ additional=self.ui_additional, retry_wait=3, │
│ skip_first_screenshot=True) │
│ > 303 │ │ │ self.dorm_feed() │
│ 304 │ │ │ self.ui_click(click_button=DORM_FEED_ENTER, appear_button=DORM_FEED_CHECK, │
│ check_button=DORM_CHECK, │
│ 305 │ │ │ │ │ │ skip_first_screenshot=True) │
│ 306 │
│ │
│ ┌─────────────────────────────── locals ───────────────────────────────┐ │
│ │ collect = True │ │
│ │ feed = True │ │
│ │ self = <module.dorm.dorm.RewardDorm object at 0x000002C3D61DDB48> │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ E:\ProgramData\Pycharm\AzurLaneAutoScript\module\dorm\dorm.py:273 in dorm_feed │
│ │
│ 270 │ │ logger.hr('Dorm feed') │
│ 271 │ │ │
│ 272 │ │ for n in range(10): │
│ > 273 │ │ │ if not self.dorm_feed_once(): │
│ 274 │ │ │ │ logger.info('Dorm feed finished') │
│ 275 │ │ │ │ return n │
│ 276 │
│ │
│ ┌───────────────────────────── locals ──────────────────────────────┐ │
│ │ n = 1 │ │
│ │ self = <module.dorm.dorm.RewardDorm object at 0x000002C3D61DDB48> │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ E:\ProgramData\Pycharm\AzurLaneAutoScript\module\dorm\dorm.py:250 in dorm_feed_once │
│ │
│ 247 │ │ self.device.screenshot() │
│ 248 │ │ self.handle_info_bar() │
│ 249 │ │ │
│ > 250 │ │ food, fill = self.dorm_food_get() │
│ 251 │ │ │
│ 252 │ │ FOOD_FILTER.load(self.config.Dorm_FeedFilter) │
│ 253 │ │ for selected in FOOD_FILTER.apply(food): │
│ │
│ ┌───────────────────────────── locals ──────────────────────────────┐ │
│ │ self = <module.dorm.dorm.RewardDorm object at 0x000002C3D61DDB48> │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ E:\ProgramData\Pycharm\AzurLaneAutoScript\module\dorm\dorm.py:232 in dorm_food_get │
│ │
│ 229 │ │ │ in: DORM_FEED_CHECK │
│ 230 │ │ """ │
│ 231 │ │ has_food = [self._dorm_has_food(button) for button in self._dorm_food.buttons] │
│ > 232 │ │ amount = self._dorm_food_ocr.ocr(self.device.image) │
│ 233 │ │ amount = [a if hf else 0 for a, hf in zip(amount, has_food)] │
│ 234 │ │ food = [Food(feed=f, amount=a) for f, a in zip(FOOD_FEED_AMOUNT, amount)] │
│ 235 │ │ _, fill, _ = OCR_FILL.ocr(self.device.image) │
│ │
│ ┌─────────────────────────────── locals ────────────────────────────────┐ │
│ │ has_food = [True, True, True, False, False, False] │ │
│ │ self = <module.dorm.dorm.RewardDorm object at 0x000002C3D61DDB48> │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ E:\ProgramData\Pycharm\AzurLaneAutoScript\module\ocr\ocr.py:95 in ocr │
│ │
│ 92 │ │ # self.cnocr.debug(image_list) │
│ 93 │ │ │
│ 94 │ │ result_list = self.cnocr.ocr_for_single_lines(image_list) │
│ > 95 │ │ result_list = [self.after_process(result) for result in result_list] │
│ 96 │ │ │
│ 97 │ │ if len(self.buttons) == 1: │
│ 98 │ │ │ result_list = result_list[0] │
│ │
│ ┌───────────────────────────────── locals ─────────────────────────────────┐ │
│ │ direct_ocr = False │ │
│ │ image = array([[[148, 150, 148], │ │
│ │ │ │ [148, 150, 148], │ │
│ │ │ │ [148, 150, 148], │ │
│ │ │ │ ..., │ │
│ │ │ │ [ 90, 89, 82], │ │
│ │ │ │ [ 90, 89, 82], │ │
│ │ │ │ [ 90, 89, 82]], │ │
│ │ │ │ │
│ │ │ [[148, 150, 148], │ │
│ │ │ │ [148, 150, 148], │ │
│ │ │ │ [148, 150, 148], │ │
│ │ │ │ ..., │ │
│ │ │ │ [ 90, 89, 82], │ │
│ │ │ │ [ 90, 89, 82], │ │
│ │ │ │ [ 90, 89, 82]], │ │
│ │ │ │ │
│ │ │ [[148, 150, 148], │ │
│ │ │ │ [148, 150, 148], │ │
│ │ │ │ [148, 150, 148], │ │
│ │ │ │ ..., │ │
│ │ │ │ [ 90, 89, 82], │ │
│ │ │ │ [ 90, 89, 82], │ │
│ │ │ │ [ 90, 89, 82]], │ │
│ │ │ │ │
│ │ │ ..., │ │
│ │ │ │ │
│ │ │ [[156, 154, 156], │ │
│ │ │ │ [156, 154, 156], │ │
│ │ │ │ [156, 154, 156], │ │
│ │ │ │ ..., │ │
│ │ │ │ [156, 154, 156], │ │
│ │ │ │ [156, 154, 156], │ │
│ │ │ │ [156, 154, 156]], │ │
│ │ │ │ │
│ │ │ [[156, 154, 156], │ │
│ │ │ │ [156, 154, 156], │ │
│ │ │ │ [156, 154, 156], │ │
│ │ │ │ ..., │ │
│ │ │ │ [156, 154, 156], │ │
│ │ │ │ [156, 154, 156], │ │
│ │ │ │ [156, 154, 156]], │ │
│ │ │ │ │
│ │ │ [[156, 154, 156], │ │
│ │ │ │ [156, 154, 156], │ │
│ │ │ │ [156, 154, 156], │ │
│ │ │ │ ..., │ │
│ │ │ │ [156, 154, 156], │ │
│ │ │ │ [156, 154, 156], │ │
│ │ │ │ [156, 154, 156]]], dtype=uint8) │ │
│ │ image_list = [ │ │
│ │ │ array([[255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ [255, 255, 98, ..., 255, 255, 255], │ │
│ │ │ ..., │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255]], dtype=uint8), │ │
│ │ │ array([[255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ ..., │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255]], dtype=uint8), │ │
│ │ │ array([[255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ ..., │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255], │ │
│ │ │ [255, 255, 255, ..., 255, 255, 255]], dtype=uint8), │ │
│ │ │ array([[98, 98, 82, ..., 48, 48, 48], │ │
│ │ │ [98, 98, 98, ..., 48, 48, 48], │ │
│ │ │ [98, 98, 98, ..., 48, 48, 48], │ │
│ │ │ ..., │ │
│ │ │ [66, 66, 66, ..., 48, 48, 48], │ │
│ │ │ [48, 48, 48, ..., 48, 48, 48], │ │
│ │ │ [48, 48, 48, ..., 48, 48, 48]], dtype=uint8), │ │
│ │ │ array([[32, 32, 32, ..., 40, 48, 40], │ │
│ │ │ [66, 66, 66, ..., 48, 40, 40], │ │
│ │ │ [66, 66, 66, ..., 40, 40, 48], │ │
│ │ │ ..., │ │
│ │ │ [64, 64, 64, ..., 40, 48, 40], │ │
│ │ │ [64, 56, 56, ..., 48, 40, 40], │ │
│ │ │ [56, 56, 56, ..., 40, 40, 48]], dtype=uint8), │ │
│ │ │ array([[66, 72, 56, ..., 40, 64, 56], │ │
│ │ │ [66, 66, 66, ..., 48, 64, 56], │ │
│ │ │ [66, 66, 72, ..., 56, 64, 56], │ │
│ │ │ ..., │ │
│ │ │ [56, 64, 64, ..., 40, 48, 40], │ │
│ │ │ [56, 56, 56, ..., 48, 40, 40], │ │
│ │ │ [56, 48, 56, ..., 40, 40, 48]], dtype=uint8) │ │
│ │ ] │ │
│ │ result_list = [ │ │
│ │ │ ['4', '8', '5', '4'], │ │
│ │ │ ['-', '-', '-', '1', '3', '3'], │ │
│ │ │ ['1', '1'], │ │
│ │ │ ['H', 'D'], │ │
│ │ │ ['Q'], │ │
│ │ │ ['H', 'M', '0'] │ │
│ │ ] │ │
│ │ self = <module.ocr.ocr.Digit object at 0x000002C3D61ED3C8> │ │
│ │ start_time = 1660783353.4458077 │ │
│ └──────────────────────────────────────────────────────────────────────────┘ │
│ │
│ E:\ProgramData\Pycharm\AzurLaneAutoScript\module\ocr\ocr.py:95 in <listcomp> │
│ │
│ 92 │ │ # self.cnocr.debug(image_list) │
│ 93 │ │ │
│ 94 │ │ result_list = self.cnocr.ocr_for_single_lines(image_list) │
│ > 95 │ │ result_list = [self.after_process(result) for result in result_list] │
│ 96 │ │ │
│ 97 │ │ if len(self.buttons) == 1: │
│ 98 │ │ │ result_list = result_list[0] │
│ │
│ ┌─────────────────────────── locals ───────────────────────────┐ │
│ │ .0 = <list_iterator object at 0x000002C3D61C9F08> │ │
│ │ result = ['-', '-', '-', '1', '3', '3'] │ │
│ │ self = <module.ocr.ocr.Digit object at 0x000002C3D61ED3C8> │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
│ E:\ProgramData\Pycharm\AzurLaneAutoScript\module\ocr\ocr.py:118 in after_process │
│ │
│ 115 │ │
│ 116 │ def after_process(self, result): │
│ 117 │ │ result = super().after_process(result) │
│ > 118 │ │ result = int(result) if result else 0 │
│ 119 │ │ │
│ 120 │ │ return result │
│ 121 │
│ │
│ ┌──────────────────────────── locals ─────────────────────────────┐ │
│ │ __class__ = <class 'module.ocr.ocr.Digit'> │ │
│ │ result = '---133' │ │
│ │ self = <module.ocr.ocr.Digit object at 0x000002C3D61ED3C8> │ │
│ └─────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
ValueError: invalid literal for int() with base 10: '---133'
2022-08-18 08:42:34.148 | WARNING | Saving error: ./log/error/1660783354148
截图
No response
还有别的吗?
No response