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()