Garvitj commited on
Commit
f857fca
·
verified ·
1 Parent(s): 894efe2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +225 -73
app.py CHANGED
@@ -1,4 +1,119 @@
1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  # import gradio as gr
3
  # from transformers import pipeline
4
  # import pytesseract
@@ -7,35 +122,48 @@
7
  # from typing import List
8
  # import requests
9
 
 
 
 
 
 
10
  # # Initialize sentence transformer model
11
  # model1 = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
12
 
13
- # # Hugging Face API details
14
- # API_URL = "https://api-inference.huggingface.co/models/openai-community/gpt2"
15
- # headers = {"Authorization": f"Bearer {hf_TsCTtXxnvpmhFKABqKmcVLyLEhjQPsITSVx}"}
16
 
17
- # # Function to interact with Hugging Face API for GPT-2
18
- # def query(payload):
19
- # response = requests.post(API_URL, headers=headers, json=payload)
20
- # return response.json()
 
21
 
22
- # # Function to generate text response from GPT-2 model using Hugging Face API
23
- # def generate_response(prompt):
24
- # response = query({"inputs": prompt})
25
-
26
- # # Check if the response contains the expected format
27
- # if isinstance(response, list) and len(response) > 0 and 'generated_text' in response[0]:
28
- # return response[0]['generated_text']
29
- # else:
30
- # # Log the response if something unexpected is returned
31
- # print("Unexpected response format:", response)
32
- # return "Sorry, I couldn't generate a response."
33
-
34
 
35
- # # Function to generate text response from GPT-2 model using Hugging Face API
36
- # # def generate_response(prompt):
37
- # # response = query({"inputs": prompt})
38
- # # return response[0]['generated_text']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
 
40
  # # Extract text from an image using Tesseract
41
  # def extract_text_from_image(filepath: str, languages: List[str]):
@@ -74,13 +202,15 @@
74
  # similarity_score = calculate_similarity(student_answer, model_answer)
75
  # grade = get_grade(similarity_score)
76
  # feedback = f"Student's answer: {student_answer}\nTeacher's answer: {model_answer}"
77
- # prompt=f"the student got grades: {grade} when Student's answer is: {student_answer} and Teacher's answer is: {model_answer}. justify the grades given to student"
78
  # return grade, similarity_score * 100, feedback, prompt
79
 
80
  # # Main interface function for Gradio
81
- # def gradio_interface(image, languages: List[str], prompt=""):
82
- # grade, similarity_score, feedback,prompt = evaluate_answer(image, languages)
83
- # response = generate_response(prompt)
 
 
84
  # return grade, similarity_score, feedback, response
85
 
86
  # # Get available Tesseract languages
@@ -91,7 +221,7 @@
91
  # fn=gradio_interface,
92
  # inputs=[
93
  # gr.Image(type="filepath", label="Input"),
94
- # gr.CheckboxGroup(language_choices, type="value", value=['eng'], label='language'),
95
  # gr.Textbox(lines=2, placeholder="Enter your prompt here", label="Prompt")
96
  # ],
97
  # outputs=[
@@ -106,6 +236,7 @@
106
  # )
107
 
108
  # if __name__ == "__main__":
 
109
  # interface.launch()
110
 
111
 
@@ -121,31 +252,36 @@ from sentence_transformers import SentenceTransformer, util
121
  from PIL import Image
122
  from typing import List
123
  import requests
 
 
 
124
 
125
- # Initialize sentence transformer model
126
- model1 = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
 
127
 
128
- # Initialize Groq client
 
129
  client = Groq(api_key=os.environ.get("GROQ_API_KEY"))
130
 
131
- # System prompt for Groq
 
 
 
132
  system_prompt = {
133
  "role": "system",
134
  "content": "You are a useful assistant. You reply with efficient answers."
135
  }
136
 
137
- # Function to interact with Groq for generating response
138
  async def chat_groq(message, history):
139
  messages = [system_prompt]
140
-
141
  for msg in history:
142
  messages.append({"role": "user", "content": str(msg[0])})
143
  messages.append({"role": "assistant", "content": str(msg[1])})
144
-
145
  messages.append({"role": "user", "content": str(message)})
146
 
147
  response_content = ''
148
-
149
  stream = client.chat.completions.create(
150
  model="llama3-70b-8192",
151
  messages=messages,
@@ -153,70 +289,87 @@ async def chat_groq(message, history):
153
  temperature=1.3,
154
  stream=True
155
  )
156
-
157
  for chunk in stream:
158
  content = chunk.choices[0].delta.content
159
  if content:
160
- response_content += chunk.choices[0].delta.content
161
  yield response_content
162
 
163
- # Extract text from an image using Tesseract
164
- def extract_text_from_image(filepath: str, languages: List[str]):
165
- image = Image.open(filepath)
166
- lang_str = '+'.join(languages) # Join languages for Tesseract
167
- return pytesseract.image_to_string(image=image, lang=lang_str)
 
 
 
 
 
 
 
 
 
 
 
 
 
168
 
169
- # Function to get embeddings for text using SentenceTransformer
170
- def get_embedding(text):
171
- return model1.encode(text, convert_to_tensor=True)
172
 
173
- # Calculate similarity between two texts using cosine similarity
174
- def calculate_similarity(text1, text2):
175
- embedding1 = get_embedding(text1)
176
- embedding2 = get_embedding(text2)
177
- similarity = util.pytorch_cos_sim(embedding1, embedding2)
178
- return similarity.item()
179
 
180
- # Assign grades based on similarity score
181
  def get_grade(similarity_score):
182
- if similarity_score >= 0.9:
183
  return 5
184
- elif similarity_score >= 0.8:
185
  return 4
186
- elif similarity_score >= 0.7:
187
  return 3
188
- elif similarity_score >= 0.6:
189
  return 2
190
  else:
191
  return 1
192
 
193
- # Function to evaluate student's answer by comparing it to a model answer
194
- def evaluate_answer(image, languages):
195
- student_answer = extract_text_from_image(image, languages)
196
- model_answer = "The process of photosynthesis helps plants produce glucose using sunlight."
197
- similarity_score = calculate_similarity(student_answer, model_answer)
198
  grade = get_grade(similarity_score)
199
- feedback = f"Student's answer: {student_answer}\nTeacher's answer: {model_answer}"
200
- prompt = f"The student got grade: {grade} when the student's answer is: {student_answer} and the teacher's answer is: {model_answer}. Justify the grade given to the student."
201
- return grade, similarity_score * 100, feedback, prompt
202
 
203
- # Main interface function for Gradio
 
 
 
 
 
 
 
204
  async def gradio_interface(image, languages: List[str], prompt="", history=[]):
205
- grade, similarity_score, feedback, prompt = evaluate_answer(image, languages)
 
 
 
206
  response = ""
207
  async for result in chat_groq(prompt, history):
208
- response = result # Get the Groq response
209
- return grade, similarity_score, feedback, response
210
 
211
- # Get available Tesseract languages
212
- language_choices = pytesseract.get_languages()
213
 
214
  # Define Gradio interface
215
  interface = gr.Interface(
216
  fn=gradio_interface,
217
  inputs=[
218
  gr.Image(type="filepath", label="Input"),
219
- gr.CheckboxGroup(language_choices, type="value", value=['eng'], label='Language'),
220
  gr.Textbox(lines=2, placeholder="Enter your prompt here", label="Prompt")
221
  ],
222
  outputs=[
@@ -231,5 +384,4 @@ interface = gr.Interface(
231
  )
232
 
233
  if __name__ == "__main__":
234
- interface.queue()
235
  interface.launch()
 
1
 
2
+ # # import gradio as gr
3
+ # # from transformers import pipeline
4
+ # # import pytesseract
5
+ # # from sentence_transformers import SentenceTransformer, util
6
+ # # from PIL import Image
7
+ # # from typing import List
8
+ # # import requests
9
+
10
+ # # # Initialize sentence transformer model
11
+ # # model1 = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
12
+
13
+ # # # Hugging Face API details
14
+ # # API_URL = "https://api-inference.huggingface.co/models/openai-community/gpt2"
15
+ # # headers = {"Authorization": f"Bearer {hf_TsCTtXxnvpmhFKABqKmcVLyLEhjQPsITSVx}"}
16
+
17
+ # # # Function to interact with Hugging Face API for GPT-2
18
+ # # def query(payload):
19
+ # # response = requests.post(API_URL, headers=headers, json=payload)
20
+ # # return response.json()
21
+
22
+ # # # Function to generate text response from GPT-2 model using Hugging Face API
23
+ # # def generate_response(prompt):
24
+ # # response = query({"inputs": prompt})
25
+
26
+ # # # Check if the response contains the expected format
27
+ # # if isinstance(response, list) and len(response) > 0 and 'generated_text' in response[0]:
28
+ # # return response[0]['generated_text']
29
+ # # else:
30
+ # # # Log the response if something unexpected is returned
31
+ # # print("Unexpected response format:", response)
32
+ # # return "Sorry, I couldn't generate a response."
33
+
34
+
35
+ # # # Function to generate text response from GPT-2 model using Hugging Face API
36
+ # # # def generate_response(prompt):
37
+ # # # response = query({"inputs": prompt})
38
+ # # # return response[0]['generated_text']
39
+
40
+ # # # Extract text from an image using Tesseract
41
+ # # def extract_text_from_image(filepath: str, languages: List[str]):
42
+ # # image = Image.open(filepath)
43
+ # # lang_str = '+'.join(languages) # Join languages for Tesseract
44
+ # # return pytesseract.image_to_string(image=image, lang=lang_str)
45
+
46
+ # # # Function to get embeddings for text using SentenceTransformer
47
+ # # def get_embedding(text):
48
+ # # return model1.encode(text, convert_to_tensor=True)
49
+
50
+ # # # Calculate similarity between two texts using cosine similarity
51
+ # # def calculate_similarity(text1, text2):
52
+ # # embedding1 = get_embedding(text1)
53
+ # # embedding2 = get_embedding(text2)
54
+ # # similarity = util.pytorch_cos_sim(embedding1, embedding2)
55
+ # # return similarity.item()
56
+
57
+ # # # Assign grades based on similarity score
58
+ # # def get_grade(similarity_score):
59
+ # # if similarity_score >= 0.9:
60
+ # # return 5
61
+ # # elif similarity_score >= 0.8:
62
+ # # return 4
63
+ # # elif similarity_score >= 0.7:
64
+ # # return 3
65
+ # # elif similarity_score >= 0.6:
66
+ # # return 2
67
+ # # else:
68
+ # # return 1
69
+
70
+ # # # Function to evaluate student's answer by comparing it to a model answer
71
+ # # def evaluate_answer(image, languages):
72
+ # # student_answer = extract_text_from_image(image, languages)
73
+ # # model_answer = "The process of photosynthesis helps plants produce glucose using sunlight."
74
+ # # similarity_score = calculate_similarity(student_answer, model_answer)
75
+ # # grade = get_grade(similarity_score)
76
+ # # feedback = f"Student's answer: {student_answer}\nTeacher's answer: {model_answer}"
77
+ # # prompt=f"the student got grades: {grade} when Student's answer is: {student_answer} and Teacher's answer is: {model_answer}. justify the grades given to student"
78
+ # # return grade, similarity_score * 100, feedback, prompt
79
+
80
+ # # # Main interface function for Gradio
81
+ # # def gradio_interface(image, languages: List[str], prompt=""):
82
+ # # grade, similarity_score, feedback,prompt = evaluate_answer(image, languages)
83
+ # # response = generate_response(prompt)
84
+ # # return grade, similarity_score, feedback, response
85
+
86
+ # # # Get available Tesseract languages
87
+ # # language_choices = pytesseract.get_languages()
88
+
89
+ # # # Define Gradio interface
90
+ # # interface = gr.Interface(
91
+ # # fn=gradio_interface,
92
+ # # inputs=[
93
+ # # gr.Image(type="filepath", label="Input"),
94
+ # # gr.CheckboxGroup(language_choices, type="value", value=['eng'], label='language'),
95
+ # # gr.Textbox(lines=2, placeholder="Enter your prompt here", label="Prompt")
96
+ # # ],
97
+ # # outputs=[
98
+ # # gr.Text(label="Grade"),
99
+ # # gr.Number(label="Similarity Score (%)"),
100
+ # # gr.Text(label="Feedback"),
101
+ # # gr.Text(label="Generated Response")
102
+ # # ],
103
+ # # title="Automated Grading System",
104
+ # # description="Upload an image of your answer sheet to get a grade from 1 to 5, similarity score, and feedback based on the model answer.",
105
+ # # live=True
106
+ # # )
107
+
108
+ # # if __name__ == "__main__":
109
+ # # interface.launch()
110
+
111
+
112
+
113
+
114
+
115
+ # import os
116
+ # from groq import Groq
117
  # import gradio as gr
118
  # from transformers import pipeline
119
  # import pytesseract
 
122
  # from typing import List
123
  # import requests
124
 
125
+
126
+
127
+ # import os
128
+ # os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "constant-jigsaw-437209-r0-22d4c9dadcc9.json"
129
+
130
  # # Initialize sentence transformer model
131
  # model1 = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
132
 
133
+ # # Initialize Groq client
134
+ # client = Groq(api_key=os.environ.get("GROQ_API_KEY"))
 
135
 
136
+ # # System prompt for Groq
137
+ # system_prompt = {
138
+ # "role": "system",
139
+ # "content": "You are a useful assistant. You reply with efficient answers."
140
+ # }
141
 
142
+ # # Function to interact with Groq for generating response
143
+ # async def chat_groq(message, history):
144
+ # messages = [system_prompt]
 
 
 
 
 
 
 
 
 
145
 
146
+ # for msg in history:
147
+ # messages.append({"role": "user", "content": str(msg[0])})
148
+ # messages.append({"role": "assistant", "content": str(msg[1])})
149
+
150
+ # messages.append({"role": "user", "content": str(message)})
151
+
152
+ # response_content = ''
153
+
154
+ # stream = client.chat.completions.create(
155
+ # model="llama3-70b-8192",
156
+ # messages=messages,
157
+ # max_tokens=1024,
158
+ # temperature=1.3,
159
+ # stream=True
160
+ # )
161
+
162
+ # for chunk in stream:
163
+ # content = chunk.choices[0].delta.content
164
+ # if content:
165
+ # response_content += chunk.choices[0].delta.content
166
+ # yield response_content
167
 
168
  # # Extract text from an image using Tesseract
169
  # def extract_text_from_image(filepath: str, languages: List[str]):
 
202
  # similarity_score = calculate_similarity(student_answer, model_answer)
203
  # grade = get_grade(similarity_score)
204
  # feedback = f"Student's answer: {student_answer}\nTeacher's answer: {model_answer}"
205
+ # prompt = f"The student got grade: {grade} when the student's answer is: {student_answer} and the teacher's answer is: {model_answer}. Justify the grade given to the student."
206
  # return grade, similarity_score * 100, feedback, prompt
207
 
208
  # # Main interface function for Gradio
209
+ # async def gradio_interface(image, languages: List[str], prompt="", history=[]):
210
+ # grade, similarity_score, feedback, prompt = evaluate_answer(image, languages)
211
+ # response = ""
212
+ # async for result in chat_groq(prompt, history):
213
+ # response = result # Get the Groq response
214
  # return grade, similarity_score, feedback, response
215
 
216
  # # Get available Tesseract languages
 
221
  # fn=gradio_interface,
222
  # inputs=[
223
  # gr.Image(type="filepath", label="Input"),
224
+ # gr.CheckboxGroup(language_choices, type="value", value=['eng'], label='Languaage'),
225
  # gr.Textbox(lines=2, placeholder="Enter your prompt here", label="Prompt")
226
  # ],
227
  # outputs=[
 
236
  # )
237
 
238
  # if __name__ == "__main__":
239
+ # interface.queue()
240
  # interface.launch()
241
 
242
 
 
252
  from PIL import Image
253
  from typing import List
254
  import requests
255
+ from nltk.metrics.distance import edit_distance # Levenshtein distance
256
+ from google.cloud import vision
257
+ import io
258
 
259
+ # Set up environment
260
+ os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "constant-jigsaw-437209-r0-22d4c9dadcc9.json"
261
+ tess.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
262
 
263
+ # Initialize models
264
+ model1 = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
265
  client = Groq(api_key=os.environ.get("GROQ_API_KEY"))
266
 
267
+ # Initialize Google Vision Client
268
+ vision_client = vision.ImageAnnotatorClient()
269
+
270
+ # Define system prompt for Groq
271
  system_prompt = {
272
  "role": "system",
273
  "content": "You are a useful assistant. You reply with efficient answers."
274
  }
275
 
276
+ # Groq chat function
277
  async def chat_groq(message, history):
278
  messages = [system_prompt]
 
279
  for msg in history:
280
  messages.append({"role": "user", "content": str(msg[0])})
281
  messages.append({"role": "assistant", "content": str(msg[1])})
 
282
  messages.append({"role": "user", "content": str(message)})
283
 
284
  response_content = ''
 
285
  stream = client.chat.completions.create(
286
  model="llama3-70b-8192",
287
  messages=messages,
 
289
  temperature=1.3,
290
  stream=True
291
  )
 
292
  for chunk in stream:
293
  content = chunk.choices[0].delta.content
294
  if content:
295
+ response_content += content
296
  yield response_content
297
 
298
+ # Extract text using Google Vision OCR
299
+ def extract_text_from_image(image_path):
300
+ with io.open(image_path, 'rb') as image_file:
301
+ content = image_file.read()
302
+ image = vision.Image(content=content)
303
+ response = vision_client.text_detection(image=image, image_context={"language_hints": ["en"]})
304
+ texts = response.text_annotations
305
+ if texts:
306
+ return texts[0].description
307
+ return "No text detected."
308
+
309
+ # Function to calculate text similarity (embedding + Levenshtein distance)
310
+ def calculate_similarity(text1, text2):
311
+ embedding1 = model1.encode(text1, convert_to_tensor=True)
312
+ embedding2 = model1.encode(text2, convert_to_tensor=True)
313
+
314
+ # Cosine similarity of embeddings
315
+ cosine_similarity = util.pytorch_cos_sim(embedding1, embedding2).item()
316
 
317
+ # Levenshtein distance (word order similarity)
318
+ word_order_similarity = 1 - (edit_distance(text1.split(), text2.split()) / max(len(text1.split()), len(text2.split())))
 
319
 
320
+ # Combine similarity scores
321
+ alpha = 0.7 # Weighting factor
322
+ combined_similarity = (alpha * cosine_similarity) + ((1 - alpha) * word_order_similarity)
323
+ return combined_similarity, word_order_similarity, cosine_similarity
 
 
324
 
325
+ # Function to map similarity score to grade
326
  def get_grade(similarity_score):
327
+ if similarity_score >= 1:
328
  return 5
329
+ elif similarity_score >= 0.9:
330
  return 4
331
+ elif similarity_score >= 0.8:
332
  return 3
333
+ elif similarity_score >= 0.75:
334
  return 2
335
  else:
336
  return 1
337
 
338
+ # Evaluate answer based on similarity with the model answer
339
+ def evaluate_answer(student_answer):
340
+ model_answer = "Photosynthesis is the process plants use to make their own food using sunlight. They take in carbon dioxide from the air and water from the soil. Using sunlight, they convert these into glucose (a type of sugar that gives them energy) and oxygen, which they release back into the air."
341
+
342
+ similarity_score, ws, cs = calculate_similarity(student_answer, model_answer)
343
  grade = get_grade(similarity_score)
344
+
345
+ feedback = generate_feedback(student_answer, model_answer)
346
+ return grade, similarity_score * 100, feedback, ws, cs
347
 
348
+ # Function to generate feedback
349
+ def generate_feedback(student_answer, model_answer):
350
+ feedback = []
351
+ if student_answer.lower() not in model_answer.lower():
352
+ feedback.append("The answer is not closely aligned with the model answer.")
353
+ return " ".join(feedback) if feedback else "Answer is well aligned with the model."
354
+
355
+ # Gradio interface for interaction
356
  async def gradio_interface(image, languages: List[str], prompt="", history=[]):
357
+ student_answer = extract_text_from_image(image)
358
+ grade, similarity_score, feedback, ws, cs = evaluate_answer(student_answer)
359
+
360
+ # Generate response using Groq chat
361
  response = ""
362
  async for result in chat_groq(prompt, history):
363
+ response = result
 
364
 
365
+ return grade, similarity_score, feedback, response
 
366
 
367
  # Define Gradio interface
368
  interface = gr.Interface(
369
  fn=gradio_interface,
370
  inputs=[
371
  gr.Image(type="filepath", label="Input"),
372
+ gr.CheckboxGroup(['eng', 'fra', 'spa'], type="value", value=['eng'], label='Language'),
373
  gr.Textbox(lines=2, placeholder="Enter your prompt here", label="Prompt")
374
  ],
375
  outputs=[
 
384
  )
385
 
386
  if __name__ == "__main__":
 
387
  interface.launch()