AzurLaneAutoScript icon indicating copy to clipboard operation
AzurLaneAutoScript copied to clipboard

多Alas实例共享同一OCR服务时,字符白名单可能冲突

Open LmeSzinc opened this issue 2 years ago • 0 comments

在提问之前...

  • [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

如何复现

  1. 在 config/deploy.yaml 中打开 UseOcrServer 和 StartOcrServer,重启alas
  2. 像往常一样使用alas
  3. 在另外一处打开 UseOcrServer,调用alas代码执行繁重的ocr任务
  4. 等待问题出现

预期行为

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

LmeSzinc avatar Aug 19 '22 13:08 LmeSzinc