Tesseract'ı API olarak çalıştırın
veya kendi barındırdığınız servis olarak.
Tesseract'ı güvenle bir HTTP servisine sarın: üretim düzeyinde bir FastAPI uç noktası, süreç havuzu eşzamanlılığı, dil paketleri ve sağlık kontrolleri içeren bir Docker imajı, ölçekleme ve geri basınç ile sunucusuz dağıtım — yönetilen OCR API'lerine karşı gizlilik ve maliyet dengeleriyle.
TL;DR — minimal bir servis
CLI'yi veya pytesseract bağlayıcısını HTTP'nin arkasına sarın. Görsel altyapınızdan asla çıkmaz.
pip install fastapi uvicorn python-multipart pytesseract pillow
# önce motoru + dil paketlerini kurun (kurulum kılavuzuna bakın)
uvicorn app:app --host 0.0.0.0 --port 8000Sonra çağırın: curl -F "file=@fatura.png" "http://localhost:8000/ocr?lang=tur". Tesseract'ın kendisi kurulum kılavuzuna göre kurulur.
Önce tasarım kararları
Üç seçim tüm servisi şekillendirir.
| Karar | Seçenekler | Kılavuz |
|---|---|---|
| Eşzamanlı vs eşzamansız | Bloke eden istek vs iş kuyruğu | Birkaç saniyede tamamlanan tek görseller için eşzamanlı; büyük veya toplu belgeler için eşzamansız iş kimlikleri. |
| Girdi | multipart yükleme vs base64 JSON | İkili görseller için multipart tercih edin; base64 yalnızca istemci dosya yükleyemediğinde (~%33 boyut ekler). |
| Çıktı | Düz metin, JSON, hOCR/ALTO, aranabilir PDF | Varsayılan olarak JSON döndürün; düzen için hOCR ve arşivler için PDF indirme URL'si sunun. |
Uç nokta başına birincil niyet bir tane. /ocr metin döndürmeye devam etsin; PDF'ler ve düzen verileri için ayrı uç noktalar ekleyin.
Üretim düzeyinde bir Python servisi (FastAPI)
Doğrulama, boyut sınırları, zaman aşımı ve OCR'ı olay döngüsünün dışında çalıştırma.
import asyncio, io
from concurrent.futures import ProcessPoolExecutor
from fastapi import FastAPI, File, UploadFile, HTTPException, Query
from PIL import Image
import pytesseract
app = FastAPI(title="Tesseract OCR API")
pool = ProcessPoolExecutor(max_workers=4)
MAX_BYTES = 10 * 1024 * 1024 # 10 MB
LANGS = {"eng", "deu", "fra", "tur"}
def _ocr(data: bytes, lang: str) -> str:
image = Image.open(io.BytesIO(data))
return pytesseract.image_to_string(image, lang=lang)
@app.get("/health")
def health():
return {"status": "ok"}
@app.post("/ocr")
async def ocr(file: UploadFile = File(...), lang: str = Query("tur")):
if lang not in LANGS:
raise HTTPException(400, "Desteklenmeyen dil")
data = await file.read()
if len(data) > MAX_BYTES:
raise HTTPException(413, "Dosya çok büyük")
loop = asyncio.get_running_loop()
try:
text = await asyncio.wait_for(loop.run_in_executor(pool, _ocr, data, lang), timeout=30)
except asyncio.TimeoutError:
raise HTTPException(504, "OCR zaman aşımı")
return {"text": text, "lang": lang}Önemli noktalar: dilleri beyaz listeye alın, kod çözmeden önce bayt sınırı uygulayın, OCR'ı bir süreç havuzunda çalıştırın ve gerçek süreyi sınırlayın. Tam pytesseract API'si için Python kılavuzuna bakın.
Konteynerleştirin
Kopyaların aynı olması için Tesseract'ı ve dil paketlerini imaja dahil edin.
FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
tesseract-ocr tesseract-ocr-eng tesseract-ocr-tur \
libgl1 libglib2.0-0 && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 8000
HEALTHCHECK CMD python -c "import urllib.request;urllib.request.urlopen('http://localhost:8000/health')"
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "2"]İmajı küçük tutmak için yalnızca gereken dil paketlerini ekleyin. Kurulum kılavuzu Docker ve tessdata yerleşimini daha ayrıntılı ele alır.
Eşzamanlılık ve ölçekleme
OCR CPU'ya bağlıdır — iş parçacıklarıyla değil, süreçlerle paralelleştirin.
- Süreç havuzu veya CLI alt süreçleri: Python'un GIL'i iş parçacığı havuzunun OCR'ı hızlandırmasını engeller.
ProcessPoolExecutorveya birtesseractalt süreç havuzu kullanın. - Worker vs kopya: konteyner başına birkaç uvicorn worker çalıştırın ve yük dengeleyici arkasında kopyaları yatay ölçekleyin.
- Kuyruklar: ani yük veya uzun belgeler için yüklemeyi kabul edin, bir iş kimliği döndürün ve bir kuyruktan (Celery, RQ veya bir broker) işleyin.
- Geri basınç: kuyruğu sınırlayın ve doygunlukta gecikmenin patlamasına izin vermek yerine
429ile reddedin. - Kaynak sınırları: worker başına CPU/bellek sabitleyin ve kötü bir görselin bir kopyayı tıkamaması için OCR zaman aşımı belirleyin.
Güvenlik ve gizlilik
Kendi barındırma, ekiplerin Tesseract'ı seçmesinin başlıca nedenidir.
- Veri çıkışı yok: görseller ağınızda kalır — hukuki, tıbbi ve finansal belgeler için önemlidir.
- Girdiyi doğrulayın: yalnızca uzantıyı değil MIME türünü ve sihirli baytları kontrol edin; try/except içinde kod çözün.
- Kaynakları sınırlayın: maksimum yükleme boyutu, istek başına zaman aşımı ve sıkıştırma bombalarına karşı bellek tavanı.
- Kimlik doğrulayın: önüne bir API anahtarı veya ağ geçidi koyun; OCR uç noktalarını kötüye kullanmak pahalıdır.
- Meta verileri kaldırın: dosyaları saklıyorsanız EXIF'i kaldırın ve orijinalleri düzenli olarak silin.
Sunucusuz ve konteyner platformları
- Konteyner çalışma zamanları: Cloud Run, AWS Lambda konteyner imajları ve Fly.io, sunucu yönetmeden bir Tesseract imajı çalıştırır.
- Soğuk başlangıçlar: dil paketleri içeren bir Tesseract imajı büyüktür, bu yüzden soğuk başlangıçlar yavaştır — gecikmeye duyarlı trafik için bir örneği sıcak tutun.
- Sınırlar: belleği ve zaman aşımını artırın; küçük varsayılan zaman aşımı büyük belgeleri sonlandırır.
- Geçici disk: geçici dosyaları yalnızca
/tmp'ye yazın; dosya sistemini tek kullanımlık sayın.
Kendi barındırılan Tesseract vs yönetilen OCR API'leri
| Boyut | Kendi barındırılan Tesseract | Yönetilen OCR API |
|---|---|---|
| Maliyet | Sabit altyapı; sayfa başına ücret yok | İstek/sayfa başına ödeme; hacimle ölçeklenir |
| Gizlilik | Belgeler ağınızdan asla çıkmaz | Belgeler üçüncü tarafa gönderilir |
| Doğruluk | Temiz baskıda güçlü; alana göre ayarlanabilir | Zor taramalarda ve el yazısında genellikle daha güçlü |
| Kontrol | Tam: sürümler, diller, özel modeller | Sağlayıcının yol haritası ve kotaları |
| Operasyon | Siz işletirsiniz: ölçekleme, güncellemeler, izleme | Tamamen yönetilen |
Birçok ekip yüksek hacimli, gizliliğe duyarlı işler için Tesseract'ı kendi barındırır ve yalnızca zor belgelerin azınlığı için yönetilen bir API'ye başvurur.
API SSS
Tesseract OCR'ı API olarak nasıl çalıştırırım?
CLI'yi veya pytesseract'ı FastAPI/Flask içine sarın, POST /ocr uç noktasını açın ve konteynerleştirin. Görseller altyapınızda kalır.
İş parçacığı mı süreç mi?
Süreçler. OCR CPU'ya bağlıdır ve GIL iş parçacığı paralelliğini engeller; ProcessPoolExecutor veya CLI alt süreçlerini kullanın.
Kendi barındırılan bir API gizli mi?
Evet: yüklenen görseller yerel olarak işlenir ve üçüncü taraflara asla gönderilmez; yönetilen OCR API'lerinden farklı olarak.
Sunucusuz çalışabilir mi?
Evet, Cloud Run, Lambda konteyner imajları veya Fly.io gibi konteyner platformlarında; soğuk başlangıçlara ve dil paketleriyle imaj boyutuna dikkat edin.
Hangi biçimleri döndürebilirim?
Düz metin, güven değerli JSON, hOCR/ALTO veya indirme URL'si üzerinden aranabilir PDF.