File size: 6,718 Bytes
c579034 0aff634 ed2b9aa 0aff634 ed2b9aa 0aff634 73e907d 0aff634 ed2b9aa fec7940 7d12ca3 fec7940 73e907d c3efa14 73e907d c3efa14 7d12ca3 0aff634 c3efa14 fec7940 7d12ca3 73e907d 7d12ca3 73e907d 0aff634 73e907d 0aff634 73e907d fec7940 73e907d fec7940 0aff634 7d12ca3 fec7940 c3efa14 fec7940 e3ab5e9 73e907d 0aff634 fec7940 7d12ca3 73e907d fec7940 73e907d fec7940 73e907d 7d12ca3 0aff634 7d12ca3 c579034 ed2b9aa c579034 ed2b9aa c579034 c9c0096 c579034 ed2b9aa c579034 7d12ca3 e5b1de1 fec7940 e5b1de1 fec7940 7d12ca3 fec7940 e5b1de1 fec7940 7d12ca3 fec7940 e5b1de1 fec7940 e5b1de1 fec7940 e5b1de1 3691b02 fec7940 ed2b9aa fec7940 c579034 fec7940 7d12ca3 fec7940 7d12ca3 fec7940 7d12ca3 fec7940 e5b1de1 7d12ca3 0aff634 ed2b9aa 7d12ca3 ed2b9aa 73e907d 7d12ca3 |
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 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
import io
import os
import streamlit as st
import requests
from PIL import Image
from model import get_caption_model, generate_caption
from googletrans import Translator
import sqlite3
# Initialize Streamlit app
st.set_page_config(page_title="Image Caption Generator", layout="wide")
translator = Translator()
@st.cache_resource
def get_model():
return get_caption_model()
caption_model = get_model()
# Constants
SIGNUP_SUCCESS_MSG = "Registration successful! You can now log in."
SIGNUP_ERROR_EXISTING_USER = "Username already exists. Please choose a different username."
LOGIN_SUCCESS_MSG = "Login successful!"
LOGIN_ERROR_INVALID_CREDENTIALS = "Login failed. Invalid username or password."
# Define CSS styles
heading_style = "font-size: 24px; font-weight: bold; text-align: center;"
input_style = "margin-top: 10px; padding: 5px; width: 100%;"
# Function to create the SQLite table if it doesn't exist
@st.cache_resource
def create_table():
with sqlite3.connect("login.db") as conn:
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
password TEXT NOT NULL,
email TEXT NOT NULL,
role TEXT NOT NULL
)
''')
# Signup section
def signup_section():
st.markdown(f"<p style='{heading_style}'>Register</p>", unsafe_allow_html=True)
new_username = st.text_input("New Username", key="new_username", help="Choose a unique username")
new_password = st.text_input("New Password", type="password", key="new_password", help="Password should be at least 8 characters long")
new_email = st.text_input("Email", key="new_email", help="Enter a valid email address")
if st.button("Register"):
if not new_username or not new_password or not new_email:
st.error("All fields are required for registration.")
return
role = "user"
try:
with sqlite3.connect("login.db") as conn:
cursor = conn.cursor()
cursor.execute("INSERT INTO users (username, password, email, role) VALUES (?, ?, ?, ?)",
(new_username, new_password, new_email, role))
st.success(SIGNUP_SUCCESS_MSG)
st.balloons()
except sqlite3.IntegrityError:
st.error(SIGNUP_ERROR_EXISTING_USER)
# Login section
def login_section():
st.markdown(f"<p style='{heading_style}'>Login</p>", unsafe_allow_html=True)
username = st.text_input("Username", key="login_username", help="Enter your username")
password = st.text_input("Password", type="password", key="login_password",help="Enter your password")
if st.button("Login"):
if not username or not password:
st.error("Username and password are required for login.")
return
try:
with sqlite3.connect("login.db") as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
user = cursor.fetchone()
if user and user[2] == password:
st.success(LOGIN_SUCCESS_MSG)
st.write(f"Logged in as: {user[1]}")
st.session_state.username = username
st.session_state.selected_tab = "Generate Caption"
st.balloons()
else:
st.error(LOGIN_ERROR_INVALID_CREDENTIALS)
except sqlite3.OperationalError as e:
st.error(f"An error occurred during login: {e}")
# Predict the caption
def predict(cap_col):
captions = []
pred_caption = generate_caption('tmp.jpg', caption_model)
cap_col.markdown('#### Predicted Captions:')
captions.append(pred_caption)
for _ in range(4):
pred_caption = generate_caption('tmp.jpg', caption_model, add_noise=True)
if pred_caption not in captions:
captions.append(pred_caption)
cap_col.markdown('<div class="caption-container">', unsafe_allow_html=True)
for c in captions:
cap_col.markdown(f'<div class="cap-line" style="color: black; background-color: light grey; padding: 5px; margin-bottom: 5px; font-family: \'Palatino Linotype\', \'Book Antiqua\', Palatino, serif;">{c}</div>', unsafe_allow_html=True)
cap_col.markdown('</div>', unsafe_allow_html=True)
# Main function
def main():
# Create the database table if it doesn't exist
create_table()
# Define the navigation tabs
tabs = ["Register", "Login", "Generate Caption"]
# Select the active tab based on user input
selected_tab = st.sidebar.selectbox("Navigation", tabs)
# Route to the appropriate section based on the selected tab
if selected_tab == "Register":
signup_section()
elif selected_tab == "Login":
login_section()
elif selected_tab == "Generate Caption":
# Check if a user is logged in before accessing the caption generation feature
if hasattr(st.session_state, "username"):
st.markdown(f"<p style='{heading_style}'>Generate Caption</p>", unsafe_allow_html=True)
st.markdown("Upload an image to generate a caption:")
with st.sidebar:
st.title("Options")
selected_languages = st.multiselect("Select languages for translation:", ['en', 'ta', 'hi', 'zh-cn', 'es', 'fr', 'de', 'it', 'ja'])
img_url = st.text_input("Enter Image URL:")
img_upload = st.file_uploader("Upload Image:", type=['jpg', 'png', 'jpeg'])
col1, col2 = st.columns(2)
if img_url or img_upload:
if img_url:
img = Image.open(requests.get(img_url, stream=True).raw)
else:
img = Image.open(img_upload)
img = img.convert('RGB')
col1.image(img, caption="Input Image", use_column_width=True)
img.save('tmp.jpg')
predict(col2)
# Rest of the code for displaying the generated caption and translations, and editing the caption
st.markdown("<p style='font-size: 24px; font-weight: bold; margin-bottom: 20px;'>Generated Caption:</p>", unsafe_allow_html=True)
st.write(generated_caption)
# Rest of the code for displaying and editing the caption in different languages
else:
st.write("Please log in to access this feature.")
# Remove temporary image file
if img_url or img_upload:
os.remove('tmp.jpg')
if __name__ == "__main__":
main()
|