mjwong commited on
Commit
d773a3f
·
verified ·
1 Parent(s): 84ff921

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +29 -11
app.py CHANGED
@@ -29,6 +29,14 @@ MODEL_NAME = os.getenv(
29
  "hf-hub:imageomics/bioclip"
30
  )
31
 
 
 
 
 
 
 
 
 
32
  # Load BioCLIP Model from Hugging Face
33
  logger.info("Loading model from Hugging Face...")
34
  model, _, preprocess = create_model_and_transforms(MODEL_NAME)
@@ -38,13 +46,14 @@ model = model.to(device)
38
  logger.info(f"Model loaded on device successfully: {device}")
39
 
40
  # Gradio App Function
41
- def app_function(uploaded_image: Optional[np.ndarray]) -> Tuple[str, Optional[str], Optional[str], str]:
42
  """Main function for the Gradio app.
43
 
44
  Processes the uploaded image, performs semantic search, and returns a summary, species information, and HTML output.
45
 
46
  Args:
47
  uploaded_image (Optional[np.ndarray]): Uploaded image as a NumPy array.
 
48
 
49
  Returns:
50
  Tuple[str, Optional[str], Optional[str], str]: Summary, proposed scientific name, proposed common name, and HTML output.
@@ -53,6 +62,10 @@ def app_function(uploaded_image: Optional[np.ndarray]) -> Tuple[str, Optional[st
53
  logger.error("app_function: No image uploaded.")
54
  return "No image uploaded", None, None, ""
55
 
 
 
 
 
56
  try:
57
  image = Image.fromarray(uploaded_image)
58
  except Exception as e:
@@ -67,7 +80,7 @@ def app_function(uploaded_image: Optional[np.ndarray]) -> Tuple[str, Optional[st
67
  logger.exception("app_function: Error encoding image. Uploaded image shape: %s. Exception: %s", getattr(uploaded_image, 'shape', 'N/A'), e)
68
  return f"Error encoding image: {e}", None, None, ""
69
 
70
- payload = {"query_embedding": query_embedding, "country_code": "sg"}
71
  headers = {"x-api-key": API_GATEWAY_API_KEY}
72
  logger.info("app_function: Calling API Gateway with payload (embedding sample: %s...)", query_embedding[:5])
73
 
@@ -205,17 +218,22 @@ with gr.Blocks(title="Wildlife Semantic Search with BioCLIP") as demo:
205
  with gr.Column(scale=30):
206
  gr.Markdown(
207
  """
208
- ### Welcome to Ecologist – Singapore's AI-powered biodiversity explorer!
209
 
210
- **Ecologist** identifies wildlife species found in Singapore from an uploaded photo.
211
 
212
- Powered by multimodal image retrieval and visual encoding with [BioCLIP](https://huggingface.co/imageomics/bioclip), the system extracts features from the image and matches them against a specialized database of Singapore's diverse flora and fauna.
213
 
214
- Both scientific and common names are provided within seconds, along with visually similar images that offer context about Singapore's rich natural heritage.
215
 
216
- Ecologist is a step towards celebrating and preserving the island country’s unique wildlife through AI.
217
  """
218
  )
 
 
 
 
 
219
 
220
  # Row 2: Image Upload with a fixed display container.
221
  with gr.Row(variant="panel"):
@@ -276,7 +294,7 @@ with gr.Blocks(title="Wildlife Semantic Search with BioCLIP") as demo:
276
  gr.Markdown(
277
  """
278
  **Disclaimer:**
279
- Not intended for commercial use, no user data is stored or used for training purposes, and all retrieval data is sourced from [iNaturalist](https://inaturalist.org/). Results may vary depending on the input image.
280
 
281
  **References:**
282
  This project is inspired by the work on [Biome](https://huggingface.co/spaces/govtech/Biome) from GovTech Singapore.
@@ -287,15 +305,15 @@ with gr.Blocks(title="Wildlife Semantic Search with BioCLIP") as demo:
287
  )
288
 
289
  # Wrapping the function to only forward the necessary outputs.
290
- def wrapper(uploaded_image):
291
- summary, proposed_scientific, proposed_common, boxes_html = app_function(uploaded_image)
292
 
293
  # Print the summary for debugging
294
  # print(summary)
295
 
296
  return proposed_scientific, proposed_common, boxes_html
297
 
298
- submit_button.click(fn=wrapper, inputs=image_input, outputs=[proposed_scientific_output, proposed_common_output, html_output])
299
 
300
  if __name__ == "__main__":
301
  demo.launch()
 
29
  "hf-hub:imageomics/bioclip"
30
  )
31
 
32
+ # Load country code mappings from the JSON file
33
+ # Assumes the JSON file is located in the same directory as app.py.
34
+ logger.info("Loading country code mappings...")
35
+ country_codes_path = os.path.join(os.path.dirname(__file__), "country_codes.json")
36
+ with open(country_codes_path, "r") as f:
37
+ country_code_mappings = json.load(f)
38
+ logger.info("Country code mappings loaded successfully.")
39
+
40
  # Load BioCLIP Model from Hugging Face
41
  logger.info("Loading model from Hugging Face...")
42
  model, _, preprocess = create_model_and_transforms(MODEL_NAME)
 
46
  logger.info(f"Model loaded on device successfully: {device}")
47
 
48
  # Gradio App Function
49
+ def app_function(uploaded_image: Optional[np.ndarray], country: Optional[str]) -> Tuple[str, Optional[str], Optional[str], str]:
50
  """Main function for the Gradio app.
51
 
52
  Processes the uploaded image, performs semantic search, and returns a summary, species information, and HTML output.
53
 
54
  Args:
55
  uploaded_image (Optional[np.ndarray]): Uploaded image as a NumPy array.
56
+ country (Optional[str]): Country for filtering the search results.
57
 
58
  Returns:
59
  Tuple[str, Optional[str], Optional[str], str]: Summary, proposed scientific name, proposed common name, and HTML output.
 
62
  logger.error("app_function: No image uploaded.")
63
  return "No image uploaded", None, None, ""
64
 
65
+ if country is None:
66
+ logger.error("app_function: No country selected.")
67
+ return "No country selected", None, None, ""
68
+
69
  try:
70
  image = Image.fromarray(uploaded_image)
71
  except Exception as e:
 
80
  logger.exception("app_function: Error encoding image. Uploaded image shape: %s. Exception: %s", getattr(uploaded_image, 'shape', 'N/A'), e)
81
  return f"Error encoding image: {e}", None, None, ""
82
 
83
+ payload = {"query_embedding": query_embedding, "country_code": country_code_mappings.get(country, "")}
84
  headers = {"x-api-key": API_GATEWAY_API_KEY}
85
  logger.info("app_function: Calling API Gateway with payload (embedding sample: %s...)", query_embedding[:5])
86
 
 
218
  with gr.Column(scale=30):
219
  gr.Markdown(
220
  """
221
+ ### Welcome to Ecologist – an AI-powered biodiversity explorer!
222
 
223
+ **Ecologist** identifies wildlife species found in your selected country from an uploaded photo.
224
 
225
+ Powered by multimodal image retrieval and visual encoding with [BioCLIP](https://huggingface.co/imageomics/bioclip), the system extracts features from the image and matches them against a specialized database of the country's diverse flora and fauna.
226
 
227
+ Both scientific and common names are provided within seconds, along with visually similar images that offer context about the country's rich natural heritage.
228
 
229
+ Ecologist is a step towards celebrating and preserving the world’s unique wildlife through AI.
230
  """
231
  )
232
+ country_dropdown = gr.Dropdown(
233
+ label="Select Country",
234
+ choices=["Singapore"],
235
+ value="Singapore"
236
+ )
237
 
238
  # Row 2: Image Upload with a fixed display container.
239
  with gr.Row(variant="panel"):
 
294
  gr.Markdown(
295
  """
296
  **Disclaimer:**
297
+ Intended for non-commercial use, no user data is stored or used for training purposes, and all retrieval data is sourced from [iNaturalist](https://inaturalist.org/). Results may vary depending on the input image.
298
 
299
  **References:**
300
  This project is inspired by the work on [Biome](https://huggingface.co/spaces/govtech/Biome) from GovTech Singapore.
 
305
  )
306
 
307
  # Wrapping the function to only forward the necessary outputs.
308
+ def wrapper(uploaded_image, country):
309
+ summary, proposed_scientific, proposed_common, boxes_html = app_function(uploaded_image, country)
310
 
311
  # Print the summary for debugging
312
  # print(summary)
313
 
314
  return proposed_scientific, proposed_common, boxes_html
315
 
316
+ submit_button.click(fn=wrapper, inputs=[image_input, country_dropdown], outputs=[proposed_scientific_output, proposed_common_output, html_output])
317
 
318
  if __name__ == "__main__":
319
  demo.launch()