# การดำเนินการรู้จำข้อความ (OCR)

บทนี้จะแนะนำวิธีการใช้ OCR เพื่อช่วยในการดำเนินการกับอินเทอร์เฟซ ในสถานการณ์เช่นแอปพลิเคชันเกม selector ของอินเทอร์เฟซทั่วไปอาจไม่สามารถใช้งานได้ ในกรณีนี้ คุณสามารถเลือกใช้วิธีการของ OCR เพื่อดำเนินการได้ วิธีการรู้จำด้วย OCR รองรับเฉพาะการดำเนินการเช่น ตรวจสอบว่า element มีอยู่หรือไม่, คลิก, จับภาพหน้าจอ เป็นต้น ไลบรารี OCR backend รองรับการใช้งาน paddleocr, easyocr และอินเทอร์เฟซ HTTP backend ที่กำหนดเอง

## การตั้งค่า OCR Backend

ก่อนที่จะใช้วิธีการรู้จำด้วย OCR คุณต้องตั้งค่า OCR backend ก่อน โดยคุณจำเป็นต้อง**ติดตั้งไลบรารีที่จำเป็นล่วงหน้า**ด้วยตนเอง

```{attention}
หากเป็นการทำงานแบบคลัสเตอร์ กล่าวคือต้องควบคุมอุปกรณ์หลายเครื่องบนคอมพิวเตอร์เครื่องเดียวกัน โปรดสร้าง OCR HTTP interface ของคุณเอง การใช้ paddleocr หรือ easyocr โดยตรงจะใช้หน่วยความจำหรือทรัพยากรการคำนวณของเครื่องจำนวนมาก เนื่องจากแต่ละ process จะทำการโหลดซ้ำ
```

ใช้ paddleocr เป็น backend, คุณภาพของภาพหน้าจอที่ใช้ในการรู้จำคือ 80, และใช้การเร่งความเร็วด้วย GPU

```python
d.setup_ocr_backend("paddleocr", quality=80, use_gpu=True, drop_score=0.85, use_space_char=True)
```

ใช้ easyocr เป็น backend, คุณภาพของภาพหน้าจอที่ใช้ในการรู้จำคือ 80, รู้จำภาษาจีนตัวย่อและภาษาอังกฤษ

```python
d.setup_ocr_backend("easyocr", ["ch_sim", "en"], quality=80)
```

พารามิเตอร์เพิ่มเติมใน `setup_ocr_backend` ควรเป็นพารามิเตอร์สำหรับสร้าง instance ของคลาสนั้นๆ หากคุณไม่เข้าใจว่าพารามิเตอร์ข้างต้นเขียนอย่างไร โปรดดูพารามิเตอร์การสร้าง instance อย่างเป็นทางการด้านล่างและเปรียบเทียบกับตัวอย่างข้างต้น

```python
paddleocr.PaddleOCR(use_gpu=True, drop_score=0.85, use_space_char=True)
easyocr.Reader(["ch_sim", "en"])
```

OCR backend ที่กำหนดเอง ส่วนใหญ่ใช้สำหรับควบคุมอุปกรณ์จำนวนมากหรือในกรณีที่เครื่องไม่มีการเร่งความเร็วด้วย GPU คุณสามารถ deploy โค้ดการรู้จำที่คุณเขียนขึ้นเป็น HTTP service และร้องขอการรู้จำระยะไกลภายใน backend ที่กำหนดเองได้ คุณจำเป็นต้องสืบทอดและเขียน `MyCustomOcrBackend` ด้วยตนเอง และจัดรูปแบบผลลัพธ์การรู้จำตามรูปแบบที่กำหนด คุณยังสามารถค้นหาคำจำกัดความของรูปแบบการตอบกลับได้ในไฟล์ `paddle_ocr_http_backend.py` ที่เรามีให้ และคุณยังสามารถแก้ไขเล็กน้อยเพื่อ deploy service นี้ได้โดยตรง

```python
class HttpOcrBackend(CustomOcrBackend):
    def __init__(self, url, auth):
        self.auth = auth
        self.url = url
    def ocr(self, image: bytes):
        r = requests.post(url, headers={"X-Auth": self.auth},
                                                    data=image)
        return r.json()
```

จากนั้นตั้งค่าบริการ backend สำหรับการรู้จำ OCR เป็นคลาสบริการที่คุณกำหนดเอง

```python
d.setup_ocr_backend(HttpOcrBackend, "http://server/ocr", "Secret")
```

## OCR Selector

ปัจจุบัน OCR selector รองรับเฉพาะประเภทต่อไปนี้

### text

จับคู่ `text` ทั้งหมด

```python
element = d.ocr(text="我的")
```

### textContains

จับคู่ข้อความที่包含 (contains)

```python
element = d.ocr(textContains="我的")
```

### textMatches

จับคู่ข้อความด้วย Regular Expression

```python
element = d.ocr(textMatches=".*?我的")
```

## การดำเนินการ OCR

ปัจจุบัน OCR selector รองรับเฉพาะการดำเนินการที่เกี่ยวข้องต่อไปนี้

### click

คลิกที่ element ที่เลือก

```python
element.click()
```

### click_exists

หากมีอยู่ ให้คลิกที่ element ที่เลือก

```python
element.click_exists()
```

### exists

ตรวจสอบว่า element มีอยู่หรือไม่

```python
element = d.ocr(textMatches=".*?我的")
```

### screenshot

จับภาพหน้าจอของ element ที่ตรงกัน

```python
element.screenshot(100, ).save("element.png")
```

### info

รับข้อมูล OCR ที่ตรงกัน

```python
element.info()
```

```{tip}
หาก OCR ยังคงไม่สามารถแก้ปัญหาของคุณได้ คุณยังสามารถลองใช้อินเทอร์เฟซการจับคู่คุณลักษณะของภาพ (image feature matching) เพื่อทำการจับคู่ภาพได้
```