File size: 4,555 Bytes
659b71a 7496a0d 659b71a 51aa4b0 7496a0d 51aa4b0 7496a0d 51aa4b0 7496a0d 659b71a 7496a0d 659b71a c9ed9d2 7496a0d 659b71a c9ed9d2 659b71a bdca1f2 9cca1b7 7a45f5b 7496a0d c9ed9d2 18fac15 7496a0d 18fac15 5f56fa3 7496a0d 659b71a 18fac15 99b4e4a 18fac15 99b4e4a 7496a0d 659b71a 5f56fa3 659b71a 7496a0d 9f10f4b dfa1dab 38b1507 dfa1dab 7496a0d a68ae60 fdb0ac9 659b71a 7496a0d 659b71a 7496a0d 659b71a 7496a0d 659b71a a28b6b5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
import streamlit as st
from PIL import Image
import tensorflow as tf
import numpy as np
from keras.preprocessing.image import img_to_array
from tensorflow.keras.models import load_model
import os
# Load custom CTC Layer if necessary
class CTCLayer(tf.keras.layers.Layer):
def __init__(self, name=None):
super().__init__(name=name)
self.loss_fn = tf.keras.backend.ctc_batch_cost
def call(self, y_true, y_pred, input_length, label_length):
# Compute the training-time loss value and add it
# to the layer using `self.add_loss()`.
loss = self.loss_fn(y_true, y_pred, input_length, label_length)
self.add_loss(loss)
# On test time, just return the computed loss
return loss
# Load the trained model with a custom CTC layer if needed
@st.cache_resource
def load_model():
model_path = "model_ocr.h5" # Update with the correct model file path
model = tf.keras.models.load_model(model_path, custom_objects={"CTCLayer": CTCLayer})
return model
model = load_model()
# Menambahkan definisi img_width dan img_height
img_width, img_height = 200, 50 # Ganti sesuai dimensi input gambar yang digunakan oleh model Anda
# Definisikan max_length (misalnya panjang label maksimal)
max_length = 50 # Ganti sesuai dengan panjang label teks maksimal yang diinginkan
# Pemetaan karakter yang mencakup huruf (kapital dan kecil) serta angka
characters = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
# Function to preprocess the image
def prepare_image(img):
# Resize gambar sesuai dengan ukuran yang diharapkan oleh model
img = img.resize((img_width, img_height)) # Resize to (200, 50)
# Konversi gambar ke array
img_array = img_to_array(img)
# Tambahkan dimensi untuk batch (menjadi 1, 50, 200) dan reshape ke bentuk (1, 50, 200, 1)
img_array = np.expand_dims(img_array, axis=0) # Tambahkan dimensi untuk batch
img_array = np.transpose(img_array, (0, 2, 1, 3)) # Mengubah urutan dimensi menjadi (1, 200, 50, 1)
# Menyusun input_length dan label_length untuk model OCR
input_length = np.ones((img_array.shape[0], 1)) * (img_width // 4) # Sesuaikan dengan input panjang
label_length = np.ones((img_array.shape[0], 1)) * max_length # Example label length
# Menambahkan input dummy untuk label (jika perlu untuk prediksi)
dummy_label = np.zeros((img_array.shape[0], max_length)) # Input dummy jika model mengharapkan label input
# Melakukan prediksi
preds = model.predict([img_array, input_length, label_length, dummy_label]) # Berikan 4 input
pred_texts = decode_batch_predictions(preds)
return pred_texts, preds
def decode_batch_predictions(pred):
pred_texts = []
# Loop untuk setiap batch (jika ada lebih dari satu batch)
for i in range(pred.shape[0]):
# Ambil argmax untuk mendapatkan indeks karakter yang diprediksi (yaitu karakter yang paling mungkin)
pred_indices = np.argmax(pred[i], axis=-1) # Cari indeks dengan probabilitas tertinggi
# Sekarang kita memetakan indeks ini ke karakter, mengecualikan nilai yang tidak valid seperti -1 atau 0 (padding)
pred_text = ''.join([characters[int(c)] for c in pred_indices if c != -1 and c != 0])
pred_texts.append(pred_text) # Simpan teks hasil decoding untuk batch yang sedang diproses
return pred_texts
def run():
st.title("OCR Model Deployment")
# Upload image
img_file = st.file_uploader("Choose an Image", type=["jpg", "png"])
if img_file is not None:
img = Image.open(img_file).convert('L') # Convert to grayscale if needed
st.image(img, use_column_width=True)
# Save the uploaded image
upload_dir = './upload_images/'
os.makedirs(upload_dir, exist_ok=True)
save_image_path = os.path.join(upload_dir, img_file.name)
with open(save_image_path, "wb") as f:
f.write(img_file.getbuffer())
# Process the image and make prediction
pred_texts = prepare_image(img)
# Show predicted text
st.success(f"**Predicted Text: {pred_texts[0]}**")
if __name__ == "__main__":
run()
|