File size: 7,881 Bytes
be8d0f3 c579034 0aff634 ed2b9aa edcd1d0 0aff634 ed2b9aa 144cc69 0aff634 73e907d b206c61 0aff634 ed2b9aa b379fd3 3a27273 b379fd3 edcd1d0 ed2b9aa fec7940 db7d9e9 fec7940 73e907d c3efa14 73e907d 7f1c645 db7d9e9 7d12ca3 db7d9e9 c3efa14 fec7940 db7d9e9 73e907d db7d9e9 73e907d 0aff634 73e907d 0aff634 73e907d fec7940 1b45c09 73e907d fec7940 0aff634 db7d9e9 fec7940 c3efa14 fec7940 e3ab5e9 73e907d 7f1c645 73e907d 0aff634 fec7940 db7d9e9 73e907d fec7940 73e907d fec7940 73e907d 7f1c645 db7d9e9 b379fd3 7f1c645 993e801 c579034 993e801 c579034 3a27273 c579034 0d0c13c 7f1c645 c579034 0e432d3 ed2b9aa 7f1c645 0e432d3 7f1c645 993e801 7f1c645 b379fd3 851e239 7f1c645 993e801 7f1c645 851e239 7f1c645 993e801 7f1c645 e09a9ba c579034 e5b1de1 fec7940 e5b1de1 fec7940 db7d9e9 fec7940 4b752f7 e5b1de1 fec7940 db7d9e9 fec7940 e5b1de1 fec7940 e5b1de1 7f1c645 0aff634 73e907d 7f1c645 |
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 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
import io
import os
import streamlit as st
import requests
from transformers import pipeline
from PIL import Image
import sqlite3
import json
# Initialize Streamlit app
st.set_page_config(page_title="Image Caption Generator", layout="wide")
API_URL = "https://api-inference.huggingface.co/models/bigscience/bloom"
@st.cache_resource
##Bloom
# HF_TOKEN = os.environ["HF_TOKEN"]
# headers = {"Authorization": f"Bearer {HF_TOKEN}"}
def translate(prompt_ , to_lang):
input_prompt = "translate this"
seed = 42
prompt = f"Instruction : Given an English input sentence translate it into {to_lang} sentence. \n input : \"{prompt_}\" \n {to_lang} : "
if len(prompt) == 0:
prompt = input_prompt
json_ = {
"inputs": prompt,
"parameters": {
"top_p": 0.9,
"temperature": 1.1,
"max_new_tokens": 250,
"return_full_text": False,
"do_sample": False,
"seed": seed,
"early_stopping": False,
"length_penalty": 0.0,
"eos_token_id": None,
},
"options": {
"use_cache": True,
"wait_for_model": True,
},
}
response = requests.request("POST", API_URL, json=json_) # headers=headers
# output = response.json()
output = json.loads(response.content.decode("utf-8"))
output_tmp = output[0]['generated_text']
solution = output_tmp.split(f"\n{to_lang}:")[0]
if '\n\n' in solution:
final_solution = solution.split("\n\n")[0]
else:
final_solution = solution
return final_solution
# Image to Text
def image_to_text(url):
# Load a transformer
image_to_text = pipeline("image-to-text", model="Salesforce/blip-image-captioning-base")
text = image_to_text(url)[0]['generated_text']
return text
# Constants
SIGNUP_SUCCESS_MSG = "Signup successful! You can now login."
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
)
''')
# Function for signup section
def signup_section():
st.markdown(f"<p style='{heading_style}'>Signup</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("Signup"):
if not new_username or not new_password or not new_email:
st.error("All fields are required for signup.")
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)
# Function for 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"You are 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 while trying to log in: {e}")
def predict(cap_col, img, target_language):
captions = []
pred_caption = image_to_text(img)
cap_col.markdown('#### Predicted Captions:')
if target_language == 'English':
captions.append(pred_caption)
else:
translated_caption = translate(pred_caption, target_language)
captions.append(translated_caption)
# for _ in range(4):
#pred_caption = image_to_text(img)
# if pred_caption not in captions:
# translated_caption = translate(pred_caption, target_language)
# captions.append(translated_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: white; 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)
def generate_caption_section():
st.markdown('<h1 style="text-align:center; font-family:Comic sans; width:fit-content; font-size:2em; color:white; text-shadow: 1px 2px 3px #000000;">IMAGE CAPTION GENERATOR</h1>', unsafe_allow_html=True)
col1, col2 = st.columns(2)
# Image URL input
img_url = st.text_input(label='Enter Image URL')
# Language selection dropdown
target_language = st.selectbox('Select Target Language', ['English', 'Spanish'], index=0)
# Process image and generate captions
if img_url:
img = Image.open(requests.get(img_url, stream=True).raw)
img = img.convert('RGB')
col1.image(img, caption="Input Image", use_column_width=True)
predict(col2, img, target_language)
def main():
# Create the database table if it doesn't exist
create_table()
# Define the navigation tabs
tabs = ["Signup", "Login", "Generate Caption"]
# Select the active tab based on user input
selected_tab = st.selectbox("Navigation", tabs)
# Route to the appropriate section based on the selected tab
if selected_tab == "Signup":
signup_section()
elif selected_tab == "Login":
login_section()
elif selected_tab == "Generate Caption":
# Check if the user is logged in before allowing access to the image caption generation
if 'username' in st.session_state:
generate_caption_section()
else:
st.write("Please login to access this feature.")
if __name__ == "__main__":
main()
|