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).
Đừ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.
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ữ.
Tải weights model (file `.pt`) từ HuggingFace về thư mục `weights/`.
Tạo file
* **Prompting:** Đôi khi bạn cần mô tả kỹ hơn, ví dụ: "red exit button" thay vì chỉ "exit".
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).
Đừ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".