Ana içeriğe geç

Mistral OCR: Pratik Örneklerle Bir Rehber

Mistral’ın OCR API’sini Python ile kullanarak belgelerden metin ve görseller çıkarmayı ve OCR yeteneklerini uygulamalara entegre etmeyi öğrenin.
· 12 dk. oku

Yapay Zeka ile Keşfedin

Geçen hafta Mistral, yenilikçi bir optik karakter tanıma (OCR) API’si olan Mistral OCR’ı yayınladı. Bu API, yapay zekânın belgeleri ve görselleri anlama yeteneklerinde yeni bir standart belirliyor. Görseller, matematiksel ifadeler, tablolar ve daha fazlasını içeren belgeleri yüksek doğrulukla işleyip ayrıştırabiliyor.

Bu yazıda, Mistral OCR’ı Python ile adım adım nasıl kullanacağınızı anlatacağım. Belgelerle, görsellerle nasıl çalışabileceğinizi ve istemleri belgelerle birleştirmek için sohbet özelliğiyle nasıl entegre edebileceğinizi göstereceğim.

Mistral OCR Nedir?

Optik karakter tanıma (OCR), taranmış kâğıt belgeler, PDF dosyaları veya dijital bir kamera ile çekilmiş görseller gibi farklı türde belgeleri düzenlenebilir ve aranabilir verilere dönüştüren bir teknolojidir.

OCR, görsellerdeki metin karakterlerini tespit ederek, desenlerini analiz ederek ve bu görsel öğeleri makine tarafından kodlanmış metne çevirerek çalışır. Bu teknoloji, basılı materyallerle etkileşim biçimimizi dönüştürdü; tarihî arşivlerin dijitalleştirilmesinden iş formlarından veri girişi otomasyonuna kadar pek çok kullanım alanı mümkün oldu.

Mistral’ın OCR API’si bu alanda önemli bir ilerlemeyi temsil ediyor ve geliştiricilere görsellerden ve belgelerden metni son derece yüksek doğrulukla çıkarmak için güçlü bir araç sunuyor.

Mistral OCR örneği

Kaynak: Mistral

Yalnızca metni tespit eden geleneksel OCR çözümlerinden farklı olarak, Mistral’ın API’si belgelerin bağlamını ve yapısını anlamak için gelişmiş yapay zekâ modelleri kullanır; içeriği çıkarırken biçimlendirmeyi korur. Bu sayede, karmaşık yerleşimleri tanıyabilir, başlıklar ile gövde metnini ayırt edebilir ve tabloları ile çok sütunlu formatları doğru biçimde yorumlayabilir.

Mistral’ın OCR API’sini özellikle özel kılan şey, Mistral’ın dil anlama yetenekleriyle entegrasyonudur. Sistem yalnızca metni çıkarmakla kalmaz—onu kavrar.

Bu da API’nin metni tanımanın ötesine geçerek belge içeriği hakkında soruları yanıtlayabildiği, bilgiyi özetleyebildiği veya belirli veri noktalarını çıkarabildiği daha gelişmiş belge işleme iş akışlarını mümkün kılar.

Ayrıca Mistral’ın OCR API’si birden fazla dil ve karakter kümesiyle çalışacak şekilde tasarlanmıştır; bu da onu küresel uygulamalar için esnek kılar. Kesin metin tanıma ile derin dil anlama kombinasyonu, Mistral’ın çözümünü yalnızca basit bir OCR aracı değil, yeni nesil bir belge zekâsı çözümü olarak konumlandırır.

Mistral OCR Fiyatlandırma ve Limitler

Mistral OCR API ücretsiz değildir; ancak 1.000 sayfa için yalnızca 1 $ (sayfa başına 0,001 $) ücretlendirilir. Bana göre bu oldukça rekabetçi ve uygun fiyatlıdır.

Belge dosyaları 50 MB’ı geçmemeli ve 1.000 sayfadan uzun olmamalıdır.

Daha fazla bilgiye fiyatlandırma sayfalarından ulaşabilirsiniz.

Mistral OCR API Kurulumu

Şuraya gidin: Mistral API anahtarı sayfası ve "Create new key" düğmesine tıklayın.

Anahtar oluşturma formunda, bir ad ve son kullanma tarihi verebiliriz.

  • Birden fazla projemiz varsa ve her biri farklı bir anahtar kullanıyorsa, adlandırma amaçlar için yararlıdır. Bu eğitim için boş bırakabiliriz.
  • Son kullanma tarihi, anahtarı yanlışlıkla paylaşırsak insanların anahtarımıza sonsuza kadar erişmesini engellemek için faydalıdır.

API anahtar formu mistral

Anahtarı oluşturduktan sonra kopyalayın ve betiği yazacağımız aynı klasörde .env adlı bir dosya oluşturun. 

Mistral OCR kullanımı için bir API anahtarı oluşturma

Anahtarı aşağıdaki biçimde dosyaya yapıştırın:

MISTRAL_API_KEY=<paste_api_key_here>

GitHub kullanıyorsanız, API anahtarını GitHub’a yüklememek için bu dosyayı .gitignore içine eklediğinizden emin olun.

Python Ortam Kurulumu

Mistral’ın OCR API’sini Python ile kullanmak için aşağıdaki paketleri kurun:

  • mistralai: Mistral’ın API’siyle etkileşim kurmak için sağladığı paket.
  • python-dotenv: API anahtarını .env dosyasından kolayca yüklemek için bir paket.
  • datauri: Görsel verisini işlemek ve dosyalara kaydetmek için kullanılan paket.

Bunları şu komutla kurabiliriz:

pip install mistralai python-dotenv datauri

Kurulumunuzun varsayılan Python kurulumunuzla çakışmamasını sağlamak için ayrı bir ortam oluşturmanızı öneririm. Bunu yapmanın bir yolu da Anaconda kullanmaktır:

conda create -n mistral -y python=3.9
conda activate mistral
pip install mistralai python-dotenv datauri

İlk komut, Python 3.9 kullanan mistral adlı bir ortam oluşturur. Ardından bu ortamı etkinleştirir ve yukarıda belirtilen paketleri kurarız.

Mistral OCR ile Etkileşim Kuracak Python Betiğini Oluşturma

Mistral’ın OCR API’sine ilk isteğimizi nasıl yapabileceğimize bakalım.

Gerekli bağımlılıkları içe aktarın

.env dosyasıyla aynı klasörde ocr.py adlı yeni bir Python betiği oluşturun ve gerekli paketleri içe aktarın:

from mistralai import Mistral
from dotenv import load_dotenv
import datauri
import os

Ayrıca, ortamdan API anahtarını bir değişkene yüklemek için kullandığımız os paketini de içe aktardığımıza dikkat edin. Yerleşik bir paket olduğu için kurulum gerektirmez.

API anahtarını yükleyin ve Mistral istemcisini başlatın

Sonraki adımda, API anahtarını yüklemek ve Mistral istemcisini başlatmak için şu satırları ekliyoruz:

load_dotenv()
api_key = os.environ["MISTRAL_API_KEY"]
client = Mistral(api_key=api_key)

Mistral OCR API’sine istek göndermek

OCR API’yi kullanmanın en basit yolu, çevrimiçi barındırılan bir PDF’in URL’sini vermektir. Bu örnek için, arXiv’de (araştırma makalelerinin ön baskı versiyonlarını barındıran bir platform) barındırılan bu Mistral 7B makalesini kullanalım:

ocr_response = client.ocr.process(
  model="mistral-ocr-latest",
  document={
    "type": "document_url",
    "document_url": "https://arxiv.org/pdf/2501.00663",
  },
)
print(ocr_response)

Daha sonra python ocr.py komutuyla betiği çalıştırabiliriz. Bu aşağıdaki yanıtı üretecektir:

pages=[OCRPageObject(index=0, markdown='# Mistral 7B \n\nAlbert Q. Jiang,
...

Yanıt yapısı

Yanıt birkaç alan içerir. Tüm ayrıntılar Mistral’ın API dokümantasyonunda mevcuttur. Özellikle her sayfanın markdown metnini içeren pages alanı bizim için önemlidir.

PDF dosyasıyla eşleştiğini görmek için sayfa sayısını yazdırabiliriz:

print(len(ocr_response.pages))

Sonuç:

9

Her sayfanın birkaç alanı vardır. En önemlileri şunlardır:

  • markdown: Sayfanın markdown içeriği.
  • images: Sayfadaki görseller.

Örneğin, ilk sayfanın markdown içeriğini şu şekilde yazdırabiliriz:

print(ocr_response.pages[0].markdown)
# Mistral 7B 

Albert Q. Jiang, Alexandre Sablayrolles, Arthur Mensch, Chris Bamford, Devendra Singh Chaplot, Diego de las Casas, Florian Bressand, Gianna Lengyel, Guillaume Lample, Lucile Saulnier, Lélio Renard Lavaud, Marie-Anne Lachaux, Pierre Stock, Teven Le Scao, Thibaut Lavril, Thomas Wang, Timothée Lacroix, William El Sayed

![img-0.jpeg](img-0.jpeg)

#### Abstract

We introduce Mistral 7B, a 7-billion-parameter language
...

Bir PDF dosyasını Markdown’a dönüştürme

Bir PDF’i Markdown’a dönüştürmek için tüm sayfalar üzerinde dolaşır ve her birinin Markdown içeriğini bir dosyaya yazarız. Bunu yapan bir fonksiyon şu şekildedir.

def create_markdown_file(ocr_response, output_filename = "output.md"):
  with open(output_filename, "wt") as f:
    for page in ocr_response.pages:
      f.write(page.markdown)

İşte orijinal PDF dosyasıyla ürettiğimiz Markdown dosyasının yan yana karşılaştırması:

Mistral OCR kullanarak bir PDF'i markdown'a dönüştürme

Görselleri işleme

Önceki örnekte, Markdown dosyasının PDF’deki görselleri içermediğini gördük. Bunun sebebi yalnızca Markdown metnini oluşturmuş, görsel dosyalarını yaratmamış olmamız.

Markdown çıktısına bakarsak bir görsel referansı olduğunu görürüz:

...
![img-0.jpeg](img-0.jpeg)
...

Ancak bu görsel görüntülenmiyor. Her sayfadaki görseller images özniteliğinde saklanır.

for page in ocr_response.pages:
  print(page.images)

Çıktı:

[OCRImageObject(id='img-0.jpeg', top_left_x=425, top_left_y=600, bottom_right_x=1283, bottom_right_y=893, image_base64=None)]
[OCRImageObject(id='img-1.jpeg', top_left_x=294, top_left_y=638, bottom_right_x=1405, bottom_right_y=1064, image_base64=None)]
[OCRImageObject(id='img-2.jpeg', top_left_x=294, top_left_y=191, bottom_right_x=1405, bottom_right_y=380, image_base64=None)]
[OCRImageObject(id='img-3.jpeg', top_left_x=292, top_left_y=204, bottom_right_x=1390, bottom_right_y=552, image_base64=None)]
[OCRImageObject(id='img-4.jpeg', top_left_x=464, top_left_y=202, bottom_right_x=1232, bottom_right_y=734, image_base64=None)]
[]
[OCRImageObject(id='img-5.jpeg', top_left_x=727, top_left_y=794, bottom_right_x=975, bottom_right_y=1047, image_base64=None)]
[]
[]

Yukarıdaki çıktıda gerçekten de img-0.jpeg referansının olduğunu görüyoruz. Ancak veri mevcut değil: image_base64=None.

Görsel verisini elde etmek için, include_image_base64=True parametresini ekleyerek OCR isteğini görsel verisini de içerecek şekilde düzenlememiz gerekir.

ocr_response = client.ocr.process(
  model="mistral-ocr-latest",
  document={
    "type": "document_url",
    "document_url": "https://arxiv.org/pdf/2310.06825",
  },
  include_image_base64=True,
)

Görselleri tekrar yazdırırsak image_base_64 alanlarının artık dolu olduğunu görürüz. Alan adının da belirttiği gibi, görsel verisi base64 olarak saklanır. Base64 görsel gösteriminin ayrıntılarına girmeyeceğiz. Bunun yerine, daha önce kurduğumuz datauri paketini kullanarak bir görseli dosyaya yazan bir fonksiyon veriyoruz:

def save_image(image):
    parsed = datauri.parse(image.image_base64)
    with open(image.id, "wb") as file:
      file.write(parsed.data)

Şimdi create_markdown_file() fonksiyonunu tüm görselleri de dosyalara yazacak şekilde güncelleyebiliriz:

def create_markdown_file(ocr_response, output_filename = "output.md"):
  with open(output_filename, "wt") as f:
    for page in ocr_response.pages:
      f.write(page.markdown)
      for image in page.images:
        save_image(image)

Güncellenen kodu çalıştırıp Markdown ön izlemesini yeniden oluşturursak görselleri görürüz.

Belge görsellerini işleme

Yerel bir dosya kullanma

Yukarıdaki örnekte, halihazırda barındırılan bir dosya kullandık. Bilgisayarımızdaki bir PDF dosyasıyla çalışmak için Mistral API, client.files.upload() fonksiyonuyla dosya yüklemeye izin verir. PDF dosyasının myfile.pdf olduğunu ve betikle aynı klasörde bulunduğunu varsayarsak, bunu şu şekilde yaparız:

filename = "myfile.pdf"
uploaded_pdf = client.files.upload(
  file={
    "file_name": filename,
    "content": open(filename, "rb"),
  },
  purpose="ocr"
)

Bu şekilde yüklenen her dosyaya onu referans göstermek için gerekli benzersiz bir kimlik atanır. Buna sonucu id özniteliğiyle bu şekilde erişebiliriz:

print(uploaded_pdf.id)

Bu dosyada OCR gerçekleştirmek için URL’sini sağlamamız gerekir. Dosya kimliğini vererek client.files.get_signed_url() fonksiyonuyla alabiliriz:

signed_url = client.files.get_signed_url(file_id=uploaded_pdf.id)

Hepsini bir araya getirerek, Mistral API’sini kullanarak bir dosyayı yükleyen ve URL’sini döndüren bir fonksiyon yazabiliriz:

def upload_pdf(filename):
  uploaded_pdf = client.files.upload(
    file={
      "file_name": filename,
      "content": open(filename, "rb"),
    },
    purpose="ocr"
  )
  signed_url = client.files.get_signed_url(file_id=uploaded_pdf.id)
  return signed_url.url

Yerel bir dosyayla OCR isteği yapmaya örnek:

ocr_response = client.ocr.process(
  model="mistral-ocr-latest",
  document={
    "type": "document_url",
    "document_url": upload_pdf("myfile.pdf"),
  },
  include_image_base64=True,
)

Başka bir dosya kullanmak için myfile.pdf yerine kullanmak istediğimiz dosyanın adını yazarız.

Bir görsel üzerinde OCR

OCR API, görsel girdileriyle de çalışır. Bir görsel kullanmak için document_url yerine image_url türünü kullanırız:

ocr_response = client.ocr.process(
  model="mistral-ocr-latest",
  document={
    "type": "image_url",
    "image_url": <url of the image>,
  },
)

Yukarıdaki örnekte, <url of the image> kısmını görselin URL’siyle değiştirmemiz gerekir. 

Yerel bir görsel kullanmak için şu fonksiyonla yükleyebiliriz:

def load_image(image_path):
  import base64
  mime_type, _ = mimetypes.guess_type(image_path)
  with open(image_path, "rb") as image_file:
    image_data = image_file.read()
  base64_encoded = base64.b64encode(image_data).decode('utf-8')
  base64_url = f"data:{mime_type};base64,{base64_encoded}"
  return base64_url

Bu fonksiyon base64 paketini kullanır; yerleşik bir paket olduğundan kuruluma gerek yoktur.

receipt.jpeg adlı dosyaya kaydettiğimiz bu fiş üzerinde OCR yapmayı deneyelim:

OCR için fiş örneği

OCR isteğini, görseli bilgisayarımızdan yüklemek için load_image() fonksiyonunu kullanarak yapabiliriz:

ocr_response = client.ocr.process(
  model="mistral-ocr-latest",
  document={
    "type": "image_url",
    "image_url": load_image("receipt.jpeg"),
  },
)

Sonuç şu şekilde:

Görsellerle Mistral OCR kullanımı

Mükemmel olmaktan uzak, ancak sonuç çok da fena değil.

Mistral OCR’ı Sohbet ile Birleştirme

OCR, veriyi LLM’lerin kullanıma hazır bir metin formatına dönüştürmenin verimli bir yoludur. Mistral API’si, LLM isteklerinde belgeler ve istemlerin birleştirilmesine olanak tanır. Arka planda, belgeleri LLM’in tüketimi için işlemek üzere OCR API’si kullanılır.

Bunu, bu eğitim boyunca referans verdiğimiz makaleyi özetlemek için kullanmayı deneyelim.

Mistral sohbet API’sini ilk kez kullanıyorsanız, nasıl çalıştığına dair ayrıntılara burada girmeyeceğimiz için bu kapsamlı Mistral rehberini okumanız yararlı olabilir.

İşte makalenin kolay anlaşılır bir açıklamasını istemek için tam bir Python örneği:

from mistralai import Mistral
import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.environ["MISTRAL_API_KEY"]
client = Mistral(api_key=api_key)
messages = [
  {
    "role": "user",
    "content": [
      {
        "type": "text",
        "text": "Explain this article in detail to someone who doesn't have a technical background",
      },
      {
        "type": "document_url",
        "document_url": "https://arxiv.org/pdf/2310.06825",
      },
    ],
  }
]
chat_response = client.chat.complete(
  model="mistral-small-latest",
  messages=messages,
)
print(chat_response.choices[0].message.content)

Dosyanın, yukarıda öğrendiğimizle aynı formatta sağlandığına dikkat edin:

{
  "type": "document_url",
  "document_url": "https://arxiv.org/pdf/2310.06825",
}

Mistral OCR için Gerçek Dünya Uygulamaları

Artık Mistral OCR’ı Python projelerinize nasıl uygulayacağınızı öğrendiğinize göre, öğrendiklerimizi uygulayabileceğiniz bazı pratik kullanım alanlarını inceleyelim.

Araştırma makalesi analizi

Bilimsel makalelerden metin, denklemler, tablolar ve şekilleri çıkararak kişiselleştirilmiş bir araştırma asistanı oluşturabilirsiniz. Önemli bulguları özetleyen, yöntem detaylarını çıkaran veya alanınızdaki makalelerin aranabilir bir veritabanını oluşturan bir sistem geliştirebilirsiniz.

Belge dijitalleştirme projeleri

Fiziksel arşivleri veya taranmış belgeleri aranabilir dijital koleksiyonlara dönüştürebilirsiniz. Bu, özellikle korunması ve kolay erişim gerektiren tarihî belgeler, aile kayıtları veya kurumsal arşivler için değerlidir.

Çok dilli belge işleme

Mistral OCR’ın çok dilli yeteneklerini çeşitli dillerdeki belgeleri işlemek için kullanabilirsiniz. Bu, farklı alfabelerdeki belgelerden bilgi çıkarması gereken uluslararası işletmeler, çeviri hizmetleri veya küresel araştırma projeleri için yararlı olabilir.

Eğitsel içerik yönetimi

Ders kitaplarını, ders slaytlarını ve el yazısı notları dijital formatlara dönüştürebilirsiniz. Temel kavramları, formülleri ve diyagramları çıkaran; kişiselleştirilmiş çalışma materyalleri veya soru bankaları oluşturan bir sistem kurun.

Finansal belge işleme

Faturalardan, fişlerden, finansal tablolardan veya vergi belgelerinden veri çıkarımını otomatikleştirebilirsiniz. Bu, muhasebe süreçlerini kolaylaştırabilir veya gider yönetimi ve finansal analizde yardımcı olabilir.

Sonuç

Mistral’ın OCR API’si, belgelerden ve görsellerden metin çıkarmak ve anlamak için güçlü bir araç sunar. Bu eğitimde, bu yeteneği çeşitli belge işleme görevleri için nasıl kurup kullanabileceğimizi inceledik.

Bu eğitimdeki adımları takip ederek, ister arşivleri dijitalleştirin, ister veri girişini otomatikleştirin, ister akıllı belge yönetim sistemleri kurun; Mistral’ın OCR’ını uygulamalarınıza entegre edebilirsiniz. Teknoloji gelişmeye devam ettikçe, fiziksel belgeler ile dijital iş akışları arasındaki boşluğu daha da kapatan, daha doğru ve bağlama duyarlı belge işleme yetenekleri bekleyebiliriz.

François Aubry

Yazar

François Aubry

CheapGPT’te full-stack mühendisi ve kurucuyum. Öğretmek her zaman tutkum oldu. Öğrencilik yıllarımdan itibaren diğer öğrencilere ders verme ve yardımcı olma fırsatlarını hevesle aradım. Bu tutku beni doktora yapmaya yönlendirdi; bu süreçte akademik çalışmalarımı desteklemek için araştırma görevlisi olarak da görev aldım. O yıllarda, geleneksel sınıf ortamında bağlar kurmaktan ve öğrenmeyi kolaylaştırmaktan büyük bir tatmin duydum. Ancak çevrim içi öğrenme platformlarının ortaya çıkmasıyla birlikte dijital eğitimin dönüştürücü potansiyelini fark ettim. Nitekim üniversitemizde bu tür bir platformun geliştirilmesinde aktif rol aldım. Geleneksel öğretim ilkelerini yenilikçi dijital yöntemlerle bütünleştirmeye derinden bağlıyım. Tutkum, yalnızca ilgi çekici ve bilgilendirici olmakla kalmayan, aynı zamanda bu dijital çağdaki öğrenenler için erişilebilir kurslar tasarlamaktır.

Konular

İlgili