文字識別技術升級:Airtest與PaddleOCR模型的協作小技巧

AirtestProject發表於2024-07-05

此文章來源於專案官方公眾號:“AirtestProject”
版權宣告:允許轉載,但轉載必須保留原連結;請勿用作商業或者非法用途

一、前言

在進行自動化測試的過程中,ocr文字識別一直是大家最想要實現以及最需要的能力,今天就來介紹一個由百度飛漿提供的一個免費的ocr識別庫——PaddleOCR,以及探討一下,PaddleOCRAirtest協作能擦出怎麼樣的火花~

二、PaddleOCR介紹

PaddleOCR是百度飛漿AI研發的一個ocr工具庫,目前支援多種目標識別,更多的介紹可以戳官方專案去看看:https://github.com/PaddlePaddle/PaddleOCR,我們今天來講講,在與Airtest協作中,我們可能會用到PaddleOCR的什麼功能。

在使用PaddleOCR之前,需要在自己的本地環境中安裝對應的PaddleOCR庫,方便我們後續呼叫。我們建議是安裝到本地的python環境內,後續將AirtestIDE的python環境更換為本地python環境即可。

#安裝PaddlePaddle
pip install paddlepaddle

#安裝PaddleOCR whl包
pip install paddleocr

在開始使用之前,我們來了解一下PaddleOCR識別的效果以及返回的情況,PaddleOCR主要是透過我們傳入需要識別的圖片,透過呼叫PaddleOCR模型庫,去進行識別並返回識別結果或識別後的圖片,例如下圖這樣:

透過PaddleOCR識別列印文字資訊如下,分別以列表的形式返回了所識別到的文字的左上角座標、右上角座標、右下角座標、左下角座標、識別到的文字以及識別置信度:

[[[154.0, 9.0], [492.0, 9.0], [492.0, 33.0], [154.0, 33.0]], ('小學數學第八冊第三單元測試題', 0.9987085461616516)]
[[[238.0, 47.0], [319.0, 47.0], [319.0, 66.0], [238.0, 66.0]], ('(小數乘法)', 0.9819607138633728)]
[[[109.0, 80.0], [160.0, 80.0], [160.0, 103.0], [109.0, 103.0]], ('姓名:', 0.9986250996589661)]
[[[305.0, 81.0], [358.0, 81.0], [358.0, 104.0], [305.0, 104.0]], ('班別:', 0.9987398982048035)]
.............

接下來,我們來看一下如何使用PaddleOCR庫來識別影像中的文字,並與Airtest進行聯動,實現基於ocr的文字識別點選功能。

首先,我們需要匯入PaddleOCR庫,並準備好要識別的圖片檔案。透過呼叫PaddleOCR的介面,我們可以將圖片路徑作為引數傳入。在識別過程中,PaddleOCR會在result變數中返回識別結果,其中包括文字框的座標和對應的文字內容。

from paddleocr import PaddleOCR, draw_ocr

# Paddleocr目前支援的多語言語種可以透過修改lang引數進行切換
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch")  # need to run only once to download and load model into memory
img_path = './imgs/11.jpg'
#開始ocr識別圖片文字資訊
result = ocr.ocr(img_path, cls=True)

透過PaddleOCR獲取的影像中的文字資訊,我們可以利用Airtest提供的介面和語句,建立一個名為ocr_touch()的函式。這個函式將執行以下步驟:

  1. 使用Airtest進行螢幕截圖。
  2. 將截圖傳遞給PaddleOCR進行文字識別。
  3. PaddleOCR獲取識別到的文字及其在影像中的位置座標。
  4. 利用Airtest根據座標資訊點選文字的中心點。

透過這種方式,ocr_touch()函式將實現從識別到點選的自動化操作,簡化了整個流程。具體參考程式碼如下

def ocr_touch(target_text) :
     # 截圖
    pic_path=r"./now.png"
    snapshot(pic_path)
    
        # 使用PaddleOCR識別文字
    ocr_result = ocr.ocr(pic_path, cls=True)
    
    # 遍歷識別結果,找到目標文字的座標
    target_coords = None
    for line in ocr_result:
        for word_info in line:
            #獲取識別結果的文字資訊
            textinfo = word_info[1][0]
            print(textinfo)
            
            if target_text in textinfo:
                # 獲取文字的座標(中心點)
                x1, y1 = word_info[0][0]
                x2, y2 = word_info[0][2]
                target_coords = ((x1 + x2) / 2, (y1 + y2) / 2)
                break
        if target_coords:
            break

    # 點選座標
    if target_coords:
        touch(target_coords)
    else:
        print(f"未找到目標文字:{target_text}")

三、PaddleOCR與Airtest協作案例

那麼我們一起來透過一個小案例來看一下,在日常測試中的表現情況吧~

參考程式碼:

# -*- encoding=utf8 -*-
__author__ = "Airtest"

from airtest.core.api import *

auto_setup(__file__)

from paddleocr import PaddleOCR

def ocr_touch(target_text) :
     # 截圖當前畫面
    pic_path=r"./now.png"
    snapshot(pic_path)
    
     # 使用PaddleOCR識別圖片文字
    ocr_result = ocr.ocr(pic_path, cls=True)
    
    # 遍歷識別結果,找到目標文字的座標
    target_coords = None
    for line in ocr_result:
        for word_info in line:
            #獲取識別結果的文字資訊
            textinfo = word_info[1][0]
            print(textinfo)
            
            if target_text in textinfo:
                # 獲取文字的座標(中心點)
                x1, y1 = word_info[0][0]
                x2, y2 = word_info[0][2]
                target_coords = ((x1 + x2) / 2, (y1 + y2) / 2)
                break
        if target_coords:
            break

    # 使用Airtest點選座標
    if target_coords:
        touch(target_coords)
    else:
        print(f"未找到目標文字:{target_text}")


if __name__ == "__main__":
    
    # 初始化PaddleOCR
    ocr = PaddleOCR(use_angle_cls=True, lang='ch')  # 可以根據需要選擇語言
    
    #開啟微博
    start_app("com.sina.weibo")
    wait(Template(r"tpl1719891218354.png", record_pos=(0.021, 0.998), resolution=(1080, 2520)))

    # 傳入並點選“發現”
    ocr_touch("發現")
    wait(Template(r"tpl1719891346582.png", record_pos=(0.008, -0.957), resolution=(1080, 2520)))
    
    
    # 傳入並點選“更多熱搜”
    ocr_touch("更多熱搜")
    wait(Template(r"tpl1719891584526.png", record_pos=(-0.291, -0.606), resolution=(1080, 2520)))

    # 傳入並點選“熱搜”
    ocr_touch("熱搜")

四、Airtest_ocr的表現情況

Airtest私有云內,我們也有對應的一款商業化的Airtest-ocr的文字識別庫,這個庫已經封裝好對應的ocr的識別以及對應的操作執行能力,具體介紹可以看往期推文,我們是封裝好了日常使用較多的操作,在購買我們的商業化版本後,可以直接呼叫的~

# 點選某文字
ocr_touch("開始")
# 與 ocr_click("開始") 等價

# 雙擊某文字
ocr_double_click("開始")

# 某些情況下,文字處於按鈕附近(比如按鈕下方),使用offset設定點選偏移量
ocr_touch("開始", offset=(0, -20))
# 以“開始”文字的中心為起點, x軸不偏移,y軸向上偏移20個畫素點
ocr_double_click("開始", offset=(0, -20))

# 指定高優先順序區域 (version>=1.0.10)
ocr_touch("開始", location=(100, 100), threshold=0.98)
# 對於置信度高於0.98的多個 “開始”, 優先點選靠近 (100,100) 的

# ocr_swipe 與 swipe函式類似
ocr_swipe("生活", "學習")
# 從“生活”滑向“學習”
ocr_swipe("生活", vector=(0, 100))
# 從“生活”向下滑動100個畫素
ocr_swipe((780, 1842), (780, 1000))
# 從座標1滑向座標2
......

我們Airtest-ocr的圖片文字識別情況如下圖:

PaddleOCR相比,我們Airtest-ocr除了可以直接識別傳入圖片內容外,還可以動態識別所連線的裝置畫面。具體的動態識別情況如下(在本地python環境中已加入Airtest-ocr庫)

五、小結

我們本期推文介紹了PaddleOCR的文字識別能力,以及如何與Airtest協作,實現在指令碼中可以ocr文字識別並點選的操作。當然,我們這裡只是簡單的封裝實現了一個識別文字並點選的操作,還有更多的日常操作可以透過自己的需求去進行封裝實現。或者有需要的同學,也可以聯絡我們,購買我們Airtest私有云,就可以直接呼叫Airtest-ocr的操作介面~

如果在測試的過程中,遇到了問題,或者有任何想要深入瞭解的知識點,歡迎在官方交流群(526033840)裡告訴我們或者提交issue,也歡迎大家投稿其他不同的使用小技巧。


AirtestIDE下載:airtest.netease.com/
Airtest 教程官網:airtest.doc.io.netease.com/
搭建企業私有云服務:airlab.163.com/b2b

官方答疑 Q 群:526033840

相關文章