Devesh Pant
v0
1b870f4
import cv2
import numpy as np
import streamlit as st
from run_yolo import get_layout_results
from order_text_blocks import get_ordered_data
from run_ocr import OCR
from main import driver
import json
import pandas as pd
colors = {
'Articles': [0, 0, 0], # Red
'Advertisement': [0, 255, 0], # Green
'Headlines': [0, 0, 255], # Blue
'Sub-headlines': [255, 255, 0], # Yellow
'Graphics': [255, 0, 255], # Magenta
'Images': [128, 0, 128], # Purple
'Tables': [0, 255, 255], # Teal
'Header': [0, 0, 0], # Black
'Text Block': [255, 0, 0]
}
try:
st.set_page_config(layout="wide", page_title="Newspaper Layout Detection and OCR Demo")
st.markdown("<h1 style='text-align: center; color: #333;'>Newspaper Layout Detection and OCR Demo</h1>", unsafe_allow_html=True)
# Streamlit UI for user input
uploaded_image = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])
language_name = st.text_input("Enter the language name: (hin, en, mal, tel, tam, kan))")
submit_button = st.button("Submit")
# Check if the user clicked the submit button
if submit_button:
# Check if image and language are provided
if uploaded_image is not None and language_name:
# Convert Streamlit file uploader to OpenCV image
image_bytes = uploaded_image.read()
nparr = np.frombuffer(image_bytes, np.uint8)
img_ori = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
img = img_ori.copy()
st.markdown("<p style='text-align: center; color: red'>Image Uploaded Successfully!</p>", unsafe_allow_html=True)
# Continue with the rest of the code...
output_dict, article_ocr_dict = driver(img_ori, language_name, st)
# Create a list to store dictionaries for OCR results
image_data = []
# Visualizing Results
itr = 1
for art_key in article_ocr_dict:
art_coords = art_key.split('_')
art_x1, art_y1, art_x2, art_y2 = int(art_coords[0]), int(art_coords[1]), int(art_coords[2]), int(art_coords[3])
# Mark the article bounding box with dark green color
img_ori = cv2.rectangle(img, (art_x1, art_y1), (art_x2, art_y2), (0, 0, 0), 4)
# Put the article number on the image in large font
img_ori = cv2.putText(img_ori, str(itr), (art_x1, art_y1), cv2.FONT_HERSHEY_SIMPLEX, 3, (0, 0, 255), 3, cv2.LINE_AA)
ocr_dict = article_ocr_dict[art_key]
# Initialize variables to store OCR text for each type
headlines_text = ''
subheadlines_text = ''
textblocks_text = ''
for obj_key in ocr_dict:
# obj_key is either of Headlines, Sub-headlines, Text Block
obj_list = ocr_dict[obj_key]
for obj_dict in obj_list:
for key in obj_dict:
coords = key.split('_')
x1, y1, x2, y2 = int(coords[0]), int(coords[1]), int(coords[2]), int(coords[3])
# Mark the bounding box with color corresponding to the object type
img = cv2.rectangle(img, (x1, y1), (x2, y2), colors[obj_key], 2)
# Add the OCR text to the corresponding variable
if obj_key == 'Headlines':
headlines_text += obj_dict[key] + '\n'
elif obj_key == 'Sub-headlines':
subheadlines_text += obj_dict[key] + '\n'
elif obj_key == 'Text Block':
textblocks_text += obj_dict[key] + '\n'
# Add a dictionary to the list for the current article
image_data.append({'Article': itr, 'Headlines': headlines_text, 'Subheadlines': subheadlines_text, 'Textblocks': textblocks_text})
itr += 1
# Create a DataFrame from the list of dictionaries
image_df = pd.DataFrame(image_data)
# Use Streamlit columns to display the image and results side by side
col1, col2 = st.columns(2)
# Display the image with marked bounding boxes in the left column
col1.image(img_ori, use_column_width=True, channels="BGR", caption="Image with Marked Bounding Boxes")
# Display the DataFrame for OCR results for the whole image in the right column
col2.table(image_df.set_index('Article').style.set_table_styles([{'selector': 'th', 'props': [('text-align', 'center')]}]))
except Exception as e:
st.exception(e)