Biến màn hình thành API: Hồi sinh phần mềm "cổ lỗ sĩ" bằng OmniParser và Python

AI Hunter

Member
Biến màn hình thành API: Hồi sinh phần mềm "cổ lỗ sĩ" bằng OmniParser và Python

Công ty bạn bắt nhập liệu vào một phần mềm kế toán từ thời Windows XP?
Nó không có API, không hỗ trợ database connection. Bạn muốn dùng Python để tự động hóa nhưng `pyautogui` quá mong manh (sai tọa độ là click trượt).

Biến màn hình thành API Hồi sinh phần mềm cổ lỗ sĩ bằng OmniParser và Python.jpg

Đừng lo, Microsoft vừa tung ra OmniParser - một mô hình AI Vision chuyên trị các giao diện người dùng (UI).
Cơ chế rất đơn giản:
1. Chụp ảnh màn hình.
2. OmniParser "nhìn" và tìm ra vị trí của nút bấm/ô nhập liệu dựa trên mô tả văn bản.
3. Python điều khiển chuột click vào vị trí đó.

Kết quả? Bạn có thể thao tác trên mọi phần mềm như thể nó có API xịn.

1. OmniParser hoạt động thế nào?​

OmniParser không phải là OCR (nhận diện chữ) thông thường. Nó được huấn luyện trên hàng triệu icon, nút bấm, menu của Windows/Mac/Web.

Nó trả về tọa độ (Bounding Box) của bất kỳ thành phần nào trên màn hình, dù đó là một icon "Cái đĩa mềm" (Save) không có chữ.

2. Chuẩn bị môi trường​

Bạn cần GPU để chạy model này mượt mà (khoảng 4-8GB VRAM).

Bash:
# 1. Clone repo của OmniParser
git clone https://github.com/microsoft/OmniParser.git
cd OmniParser

# 2. Cài đặt thư viện
pip install -r requirements.txt
pip install pyautogui opencv-python mss

Tải weights model (file `.pt`) từ HuggingFace về thư mục `weights/`.

3. Triển khai Code (Python)​


Tạo file smart_rpa.py. Chúng ta sẽ kết hợp **OmniParser** (để nhìn) và **PyAutoGUI** (để hành động).

Bước 1: Hàm "Mắt thần" (Vision)​

Hàm này chụp màn hình và nhờ OmniParser tìm tọa độ của một thành phần UI.

Python:
from utils import get_yolo_model, get_caption_model_processor # Import từ OmniParser repo
from PIL import Image
import mss
import torch

# Load Model
yolo_model = get_yolo_model(model_path='weights/icon_detect/best.pt')
caption_model, processor = get_caption_model_processor(model_path='weights/icon_caption')

def find_element_on_screen(text_description):
    """
    Chụp màn hình và tìm tọa độ (x, y) của phần tử khớp với mô tả.
    """
    # 1. Chụp màn hình
    with mss.mss() as sct:
        filename = sct.shot(mon=-1, output='current_screen.png')
  
    image = Image.open('current_screen.png')
  
    # 2. OmniParser phân tích (Detection + Captioning)
    # Model sẽ trả về danh sách các box và mô tả của chúng
    # (Code này đơn giản hóa logic inference của thư viện để dễ hiểu)
    boxes, texts = run_omni_inference(image, yolo_model, caption_model, processor)
  
    # 3. Tìm box khớp với mô tả
    for i, label in enumerate(texts):
        if text_description.lower() in label.lower():
            box = boxes[i] # [x1, y1, x2, y2]
            center_x = (box[0] + box[2]) / 2
            center_y = (box[1] + box[3]) / 2
            return center_x, center_y
          
    return None, None

Bước 2: Hàm "Cánh tay" (Action)​

Python:
import pyautogui
import time

def click_element(description):
    print(f"🤖 Đang tìm: '{description}'...")
    x, y = find_element_on_screen(description)
  
    if x and y:
        print(f"✅ Đã thấy tại ({x}, {y}). Click!")
        pyautogui.moveTo(x, y, duration=0.5) # Di chuyển chuột tự nhiên
        pyautogui.click()
    else:
        print(f"❌ Không tìm thấy '{description}' trên màn hình.")

def type_text(text):
    print(f"⌨️ Nhập liệu: {text}")
    pyautogui.write(text, interval=0.1)

Bước 3: Kịch bản Automation (Ví dụ: Máy tính Windows)​

Hãy thử tự động hóa phần mềm Calculator (Máy tính) cổ điển.

Python:
def main():
    # Giả sử ứng dụng Calculator đang mở
  
    # 1. Click số 7
    click_element("number 7 button")
    time.sleep(0.5)
  
    # 2. Click dấu cộng
    click_element("plus sign button")
    time.sleep(0.5)
  
    # 3. Click số 5
    click_element("number 5 button")
    time.sleep(0.5)
  
    # 4. Click dấu bằng
    click_element("equals button")
  
    print("✨ Hoàn thành tác vụ!")

if __name__ == "__main__":
    main()

4. Tại sao giải pháp này "Bất tử"?​

Khác với cách cũ (hard-code tọa độ):
  • Di chuyển cửa sổ thoải mái: OmniParser tìm theo hình ảnh, nên nút bấm chạy đi đâu nó cũng tìm ra.
  • Độ phân giải khác nhau: Chạy trên màn hình 1080p hay 4K đều nhận diện đúng.
  • Hiểu ngữ nghĩa: Bạn bảo nó tìm nút "Save", nó sẽ tìm icon đĩa mềm hoặc nút có chữ Save.

5. Lưu ý thực tế​

* **Độ trễ:** OmniParser cần khoảng 0.5s - 1s để xử lý một khung hình (trên GPU thường). Nó phù hợp với các tác vụ văn phòng chậm rãi, không phù hợp để chơi game thời gian thực.
* **Prompting:** Đôi khi bạn cần mô tả kỹ hơn, ví dụ: "red exit button" thay vì chỉ "exit".

Kết luận​

Với OmniParser, ranh giới giữa "Modern App" (có API) và "Legacy App" (không API) đã bị xóa nhòa. Giờ đây, mọi phần mềm hiển thị được lên màn hình đều có thể điều khiển được bằng Python.
 
Back
Top