Mari buat sepertimana Apple AI Math Notes
Minggu lepas Apple melalui WWDC 2024 mengumumkan kerjasama dengan OpenAI dalam memasukkan “Apple Intelligence (AI)” dalam perisian yang mereka tawarkan. Antara yang menarik perhatian orang ramai adalah Apple Math Notes. Anda semua boleh tengok video Apple Math Notes tersebut di sini:
Dalam video tersebut, Apple menunjukkan keupayaan perisian math notes mereka yang mampu melakukan kiraan sekali lalu pada sebarang persamaan matematik yang ditulis di atas iPad. Demonstrasi yang ditunjukkan itu betul-betul menabjubkan, tapi percayakah anda, bila saya cakap yang kita pun boleh buat benda yang sama?
Dalam tutorial kali ini, saya akan tunjukkan bagaimana untuk menghasilkan implementasi asas Apple Math Notes
OCR: Rahsia di sebalik Apple Math Notes?
Kali pertama menonton video tersebut, saya mengagak yang Apple dan OpenAI menggunakan model AI yang sudah dilatih untuk melakukan OCR (Optical Character Recognition). Sudah tentulah OpenAI menggunakan model AI multimodal mereka (model AI yang boleh memproses berbagai input dari teks, image, video dan juga audio) yang terkini, GPT-4o. Tapi penggunaan GPT-4o akan melibatkan kos dan memerlukan API key. Bagi yang sudah mempunyai API key dari OpenAI, boleh terus ke GitHub untuk melihat implementasi Apple Math Notes menggunakan streamlit. Boleh layari di bawah:
GitHub - maercaestro/megat-ai-notes
Contribute to maercaestro/megat-ai-notes development by creating an account on GitHub.github.com
Untuk tutorial ini, kita hanya akan menggunakan implementasi yang paling asas, paling ringkas. Kita hanya akan mengeluarkan teks dari image menggunakan model AI yang memang dilatih untuk melakukan pengecaman karakter secara optikal (OCR). Dalam kes ini kita akan menggunakan enjin tesseract dari Google. Jadi sebelum itu eloklah kita install dulu tesseract dalam sistem kita.
#install dulu tesseract
!pip install pytesseractKemudian mari kita load dulu semua library dan package yang diperlukan
import pytesseract
from PIL import Image
import re
import matplotlib.pyplot as pltKemudian mari kita buat fungsi untuk mengekstrak tesk dari image. Kita akan gunakan Pillow untuk membuka image dan tesseract untuk mengekstrak teks dari image, dan teks itu kita akan lalukan ke dalam regular expression (regex) bagi mencari segala nombor (digit) dan juga simbol operasi matematik (+,-,x,/). Berikut adalah kodnya
def extract_expression_from_image(image_path):
#buka image menggunakan library Pillow
image = Image.open(image_path)
# gunakan tesseract untuk ekstrak semua teks dari image tersebut
text = pytesseract.image_to_string(image)
# gunakan regex untuk mencari pattern string yang kita nak. perhatikan yang kita hanya perlukan digit dan juga semua simbol operasi matematik
expression = re.findall(r'[0-9\+\-\*\/\(\)x=\s]+', text)
if expression:
# gabungkan bagi membentuk persamaan yang lengkap
full_expression = ''.join(expression).replace(' ', '')
# gantikan 'x' dengan '*' untuk darab, sebab python tak kenal x sebagai darab
full_expression = full_expression.replace('x', '*')
return full_expression
else:
return NoneKemudian, kita akan cuba untuk selesaikan persamaan yang sudah diesktrak tersebut melalu fungsi di bawah:
def evaluate_expression(expression):
try:
# gunakan eval untuk menilai persamaan matematik yang dah diekstrak
result = eval(expression)
return result
except Exception as e:
return str(e)Kemudian mari kita gabungkan kedua-dua fungsi ini dalam satu fungsi yang terus boleh mengekstrak persamaan dari imej dan menilai persamaan tersebut. Penilaian yang dibuat akan dibandingkan dengan tesk yang diekstrak.
def process_image(image_path):
# keluarkan persamaan dari imej
expression = extract_expression_from_image(image_path)
if expression:
print(f"Persamaan yang diekstrak: {expression}")
# kira persamaan tersebut
result = evaluate_expression(expression)
print(f"Hasil: {result}")
# bandingkan persamaan dengan hasilnya
comparison = f"{expression} = {result}"
print(f"Perbandingan: {comparison}")
# paparkan imej
image = Image.open(image_path)
plt.imshow(image)
plt.axis('off')
plt.title(f"Persamaan yang diekstrak: {expression}\nHasil: {result}")
plt.show()
else:
print("Tiada persamaan matematik ditemui.")Dah selesai. Mari kita cuba uji beberapa kali:
Tapi tak semuanya berhasil, boleh tengok pada percubaan ke-4 yang ianya tak mampu menilai dengan baik gambar yang dimuat naik
Mudah bukan? Diharapkan semua bolehlah mencuba sendiri implementasi ini. Tapi yang mana nak cuba menggunakan model OpenAI, anda boleh salin sahaja kod saya dalam link GitHub yang saya kongsi di atas.






