piperod91 commited on
Commit
8dc677a
·
1 Parent(s): f4141ed

Update closest images display: convert gallery to table format with full specimen names

Browse files

- Convert closest images gallery to HTML table format
- Display full specimen names (e.g., Fabaceae_Robinia_lesquereuxi_Florissant_FLFO_002604B) instead of just folder names
- Extract specimen names using path.split('/')[-1] method
- Add uniform table styling (remove alternating row colors)
- Update labels.py: fix duplicate entries and match with user's plant family list
- Add error handling for Git LFS pickle files
- Improve dark mode support for user guide
- Add CSV generation script for fossil examples

Files changed (7) hide show
  1. SETUP.md +60 -0
  2. app.py +316 -50
  3. closest_sample.py +114 -12
  4. create_fossil_csv.py +207 -0
  5. fossil_responses_with_images.csv +868 -0
  6. labels.py +12 -12
  7. run.sh +20 -0
SETUP.md ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Setup Instructions
2
+
3
+ ## Prerequisites
4
+ - Python 3.11+
5
+ - Virtual environment (already created in `venv/`)
6
+
7
+ ## Quick Start
8
+
9
+ ### Option 1: Using the run script (Recommended)
10
+ ```bash
11
+ ./run.sh
12
+ ```
13
+
14
+ ### Option 2: Manual setup
15
+
16
+ 1. **Create a `.env` file** in the root directory with your HuggingFace read token:
17
+ ```bash
18
+ echo "READ_TOKEN=your_huggingface_read_token_here" > .env
19
+ ```
20
+
21
+ To get a HuggingFace token:
22
+ 1. Go to https://huggingface.co/settings/tokens
23
+ 2. Create a new token with "Read" permissions
24
+ 3. Copy the token and paste it in your `.env` file
25
+
26
+ 2. **Activate the virtual environment:**
27
+ ```bash
28
+ source venv/bin/activate
29
+ ```
30
+
31
+ 3. **Run the application:**
32
+ ```bash
33
+ python app.py
34
+ ```
35
+
36
+ ## What Happens on First Run
37
+
38
+ The app will automatically download:
39
+ - **Models** to `model_classification/` directory (from `Serrelab/fossil_classification_models`)
40
+ - **SAM Model** to `model/` directory (from `Serrelab/SAM_Leaves`)
41
+ - **Datasets** to `dataset/` and `images/` directories (from `Serrelab/Fossils` and `Serrelab/image_examples_gradio`)
42
+
43
+ **Note:** These downloads require a valid `READ_TOKEN` in your `.env` file.
44
+
45
+ ## Accessing the App
46
+
47
+ Once running, the app will be available at:
48
+ - **Local URL:** http://localhost:7860
49
+ - The URL will be displayed in the terminal when the app starts
50
+
51
+ ## Troubleshooting
52
+
53
+ ### "401 Unauthorized" Error
54
+ - Make sure you have created a `.env` file with a valid `READ_TOKEN`
55
+ - Verify your token has "Read" permissions at https://huggingface.co/settings/tokens
56
+
57
+ ### Models Already Downloaded
58
+ - If models are already present in `model_classification/` and `model/` directories, the app will skip downloading
59
+ - You can still run the app without a token if models are already present
60
+
app.py CHANGED
@@ -22,6 +22,9 @@ from inference_resnet_v2 import get_resnet_model,inference_resnet_embedding_v2,i
22
  from inference_beit import get_triplet_model_beit
23
  import pathlib
24
  import tensorflow as tf
 
 
 
25
  from closest_sample import get_images,get_diagram
26
 
27
 
@@ -55,22 +58,23 @@ Code: <a href='https://github.com/orgs/serre-lab/projects/2' target='_blank'>Git
55
  """
56
 
57
  USER_GUIDE = """
58
- <div style='background-color: #f0f0f0; padding: 20px; border-radius: 10px;'>
59
- <h2 style='font-size: 22px;'>❗️ User Guide</h2>
60
- <p style='font-size: 16px;'>Welcome to the interactive fossil exploration tool. Here's how to get started:</p>
61
- <ul style='font-size: 16px;'>
62
- <li><strong>Upload an Image:</strong> Drag and drop or choose from given samples to upload images of fossils.</li>
63
- <li><strong>Process Image:</strong> After uploading, click the 'Process Image' button to analyze the image.</li>
64
- <li><strong>Explore Results:</strong> Switch to the 'Workbench' tab to check out detailed analysis and results.</li>
65
- </ul>
66
- <h3 style='font-size: 18px;'>Tips</h3>
67
- <ul style='font-size: 16px;'>
68
- <li>Zoom into images on the workbench for finer details.</li>
69
- <li>Use the examples below as references for what types of images to upload.</li>
70
- </ul>
71
- <p style='font-size: 16px;'>Enjoy exploring! 🌟</p>
72
- </div>
73
- """
 
74
 
75
  TIPS = """
76
  ## Tips
@@ -195,9 +199,9 @@ def get_embeddings(input_image,model_name):
195
 
196
  def find_closest(input_image,model_name):
197
  embedding = get_embeddings(input_image,model_name)
198
- classes, paths = get_images(embedding,model_name)
199
  #outputs = classes+paths
200
- return classes,paths
201
 
202
  def generate_diagram_closest(input_image,model_name,top_k):
203
  embedding = get_embeddings(input_image,model_name)
@@ -219,14 +223,112 @@ def explain_image(input_image,model_name,explain_method,nb_samples):
219
  return classes,exp_list
220
 
221
  def setup_examples():
222
- paths = sorted(pathlib.Path('images/').rglob('*.jpg'))
223
- samples = [path.as_posix() for path in paths if 'selected fossil examples' in str(path)][:23]
224
- examples_fossils = gr.Examples(samples, inputs=input_image,examples_per_page=8,label='Fossils Examples from the dataset')
225
- samples=[[path.as_posix()] for path in paths if 'leaves' in str(path) ][:19]
226
- examples_leaves = gr.Examples(samples, inputs=input_image,examples_per_page=8,label='Leaves Examples from the dataset')
227
- return examples_fossils,examples_leaves
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
228
 
229
  def preprocess_image(image, output_size=(300, 300)):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
230
  #shape (height, width, channels)
231
  h, w = image.shape[:2]
232
 
@@ -255,9 +357,28 @@ def increase_brightness(img, value=30):
255
  img_bright = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
256
  return img_bright
257
  def update_display(image):
258
- original_image = image
259
- processed_image = preprocess_image(image)
260
- instruction = "Image ready. Please switch to the 'Specimen Workbench' tab to check out further analysis and outputs."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
261
  model_name = "Fossils 142"
262
 
263
  # gr.Dropdown(
@@ -287,17 +408,45 @@ def update_display(image):
287
  class_predicted = None # gr.Label(label='Class Predicted',num_top_classes=10)
288
  exp_gallery = None
289
  # gr.Gallery(label="Explanation Heatmaps for top 5 predicted classes", show_label=False,elem_id="gallery",columns=[5], rows=[1],height='auto', allow_preview=True, preview=None)
290
- closest_gallery = None
291
  # gr.Gallery(label="Closest Images", show_label=False,elem_id="gallery",columns=[5], rows=[1],height='auto', allow_preview=True, preview=None)
292
  diagram= None
293
  # gr.Image(label = 'Bar Chart')
294
- return original_image,processed_image,processed_image,instruction,model_name,explain_method,sampling_size,top_k,class_predicted,exp_gallery,closest_gallery,diagram
295
  def update_slider_visibility(explain_method):
296
  bool = explain_method=="Rise"
297
  return {sampling_size: gr.Slider(1, 5000, value=2000, label="Sampling Size in Rise", visible=bool, interactive=True)}
298
 
299
  #minimalist theme
300
- with gr.Blocks(theme='sudeepshouche/minimalist') as demo:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
301
 
302
  with gr.Tab(" Florrissant Fossils"):
303
  gr.Markdown(HEADER)
@@ -305,12 +454,13 @@ with gr.Blocks(theme='sudeepshouche/minimalist') as demo:
305
  with gr.Column():
306
  gr.Markdown(USER_GUIDE)
307
  with gr.Column(scale=2):
308
- with gr.Column(scale=2):
309
- instruction_text = gr.Textbox(label="Instructions", value="Upload/Choose an image and click 'Process Image'.")
310
- input_image = gr.Image(label="Input",width="100%",container=True)
311
- process_button = gr.Button("Process Image",icon = "https://www.svgrepo.com/show/13672/play-button.svg")
312
- with gr.Column(scale=1):
313
- examples_fossils,examples_leaves = setup_examples()
 
314
 
315
  gr.Markdown(CITATION)
316
 
@@ -404,10 +554,8 @@ with gr.Blocks(theme='sudeepshouche/minimalist') as demo:
404
  with gr.Accordion('Closest Fossil Images'):
405
  gr.Markdown("Finding 5 closest images in the dataset")
406
 
407
- with gr.Row():
408
- closest_gallery = gr.Gallery(label="Closest Images", show_label=False,elem_id="gallery",columns=[5], rows=[1],height='auto', allow_preview=True, preview=None)
409
- #.style(grid=[1, 5], height=200, width=200)
410
-
411
  find_closest_btn = gr.Button("Find Closest Images",icon = "https://www.svgrepo.com/show/13672/play-button.svg")
412
 
413
  #segment_button.click(segment_image, inputs=input_image, outputs=segmented_image)
@@ -448,15 +596,133 @@ with gr.Blocks(theme='sudeepshouche/minimalist') as demo:
448
 
449
  #find_closest_btn.click(find_closest, inputs=[input_image,model_name], outputs=[label_closest_image_0,label_closest_image_1,label_closest_image_2,label_closest_image_3,label_closest_image_4,closest_image_0,closest_image_1,closest_image_2,closest_image_3,closest_image_4])
450
  def update_closest_outputs(input_image,model_name):
451
- labels, images = find_closest(input_image,model_name)
452
- #labels_html = "".join([f'<div style="display: inline-block; text-align: center; width: 18%;">{label}</div>' for label in labels])
453
- #labels_markdown = f"<div style='width: 100%; text-align: center;'>{labels_html}</div>"
454
- image_caption=[]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
455
  for i in range(5):
456
- image_caption.append((images[i],labels[i]))
457
- return image_caption
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
458
 
459
- find_closest_btn.click(fn=update_closest_outputs, inputs=[original_image,model_name], outputs=[closest_gallery])
460
  #classify_segmented_button.click(classify_image, inputs=[segmented_image,model_name], outputs=class_predicted)
461
 
462
  generate_diagram.click(generate_diagram_closest, inputs=[original_image,model_name,top_k], outputs=diagram)
@@ -464,7 +730,7 @@ with gr.Blocks(theme='sudeepshouche/minimalist') as demo:
464
  process_button.click(
465
  fn=update_display,
466
  inputs=input_image,
467
- outputs=[original_image,input_image,workbench_image,instruction_text,model_name,explain_method,sampling_size,top_k,class_predicted,exp_gallery,closest_gallery,diagram]
468
  )
469
 
470
 
@@ -473,7 +739,7 @@ with gr.Blocks(theme='sudeepshouche/minimalist') as demo:
473
  demo.queue() # manage multiple incoming requests
474
 
475
  if os.getenv('SYSTEM') == 'spaces':
476
- demo.launch(width='40%')
477
  #,auth=(os.environ.get('USERNAME'), os.environ.get('PASSWORD'))
478
  else:
479
- demo.launch()
 
22
  from inference_beit import get_triplet_model_beit
23
  import pathlib
24
  import tensorflow as tf
25
+ import pandas as pd
26
+ import re
27
+ import random
28
  from closest_sample import get_images,get_diagram
29
 
30
 
 
58
  """
59
 
60
  USER_GUIDE = """
61
+ <div class="user-guide-wrapper">
62
+ ### ❗️ User Guide
63
+
64
+ Welcome to the interactive fossil exploration tool. Here's how to get started:
65
+
66
+ - **Upload an Image:** Drag and drop or choose from given samples to upload images of fossils.
67
+ - **Process Image:** After uploading, click the 'Process Image' button to analyze the image.
68
+ - **Explore Results:** Switch to the 'Workbench' tab to check out detailed analysis and results.
69
+
70
+ #### Tips
71
+
72
+ - Zoom into images on the workbench for finer details.
73
+ - Use the examples below as references for what types of images to upload.
74
+
75
+ Enjoy exploring! 🌟
76
+ </div>
77
+ """
78
 
79
  TIPS = """
80
  ## Tips
 
199
 
200
  def find_closest(input_image,model_name):
201
  embedding = get_embeddings(input_image,model_name)
202
+ classes, paths, filenames = get_images(embedding,model_name)
203
  #outputs = classes+paths
204
+ return classes, paths, filenames
205
 
206
  def generate_diagram_closest(input_image,model_name,top_k):
207
  embedding = get_embeddings(input_image,model_name)
 
223
  return classes,exp_list
224
 
225
  def setup_examples():
226
+ """
227
+ Setup example images from the CSV file with fossil responses.
228
+ Prioritizes 'Plausible' entries, then includes 'Not Sure' entries.
229
+ """
230
+ # Use absolute path to ensure CSV is found regardless of working directory
231
+ csv_path = os.path.join(os.path.dirname(__file__), 'fossil_responses_with_images.csv')
232
+ fossil_samples = []
233
+
234
+ # Try to load from CSV first
235
+ print(f"DEBUG: Looking for CSV at: {csv_path}")
236
+ print(f"DEBUG: CSV exists: {os.path.exists(csv_path)}")
237
+ if os.path.exists(csv_path):
238
+ try:
239
+ df = pd.read_csv(csv_path)
240
+ print(f"DEBUG: CSV file found with {len(df)} rows")
241
+
242
+ # Extract URLs from HYPERLINK format: =HYPERLINK("url", "text")
243
+ def extract_url(hyperlink_str):
244
+ if pd.isna(hyperlink_str) or not hyperlink_str:
245
+ return None
246
+ # Convert to string and handle escaped quotes
247
+ url_str = str(hyperlink_str)
248
+ # Match URL - handle both escaped and unescaped quotes
249
+ # Pattern: https:// followed by characters until quote or comma
250
+ match = re.search(r'https://[^",\']+', url_str)
251
+ if match:
252
+ return match.group(0)
253
+ return None
254
+
255
+ # Filter entries with valid image URLs
256
+ df['Image_URL'] = df['Image URL'].apply(extract_url)
257
+ df_valid = df[df['Image_URL'].notna()].copy()
258
+ print(f"DEBUG: Found {len(df_valid)} entries with valid URLs")
259
+
260
+ if len(df_valid) > 0:
261
+ # Prioritize Plausible entries, then Not Sure
262
+ plausible = df_valid[df_valid['User Selection'] == 'Plausible'].head(15)
263
+ not_sure = df_valid[df_valid['User Selection'] == 'Not Sure'].head(8)
264
+
265
+ # Combine and use as fossil examples
266
+ fossil_samples = plausible['Image_URL'].tolist() + not_sure['Image_URL'].tolist()
267
+
268
+ # Shuffle the list to randomize the order
269
+ random.shuffle(fossil_samples)
270
+
271
+ print(f"DEBUG: Loaded {len(fossil_samples)} fossil examples from CSV (shuffled)")
272
+ print(f"DEBUG: - {len(plausible)} Plausible entries")
273
+ print(f"DEBUG: - {len(not_sure)} Not Sure entries")
274
+ if len(fossil_samples) > 0:
275
+ print(f"DEBUG: - Sample URL: {fossil_samples[0]}")
276
+ else:
277
+ print("DEBUG: No valid URLs found in CSV")
278
+
279
+ except Exception as e:
280
+ print(f"DEBUG: Error loading CSV examples: {e}")
281
+ import traceback
282
+ traceback.print_exc()
283
+ fossil_samples = []
284
+ else:
285
+ print(f"DEBUG: CSV file not found at {csv_path}")
286
+
287
+ # No fallback - only use CSV URLs
288
+ if not fossil_samples:
289
+ print("WARNING: No fossil samples loaded from CSV. Examples will be empty.")
290
+
291
+ # Gradio Examples can handle URLs directly - they will fetch and display the images
292
+ # Pass URLs as the first argument - Gradio will automatically fetch and display them
293
+ # Note: Gradio downloads URLs to temp directory, which is normal behavior
294
+ print(f"DEBUG: Final fossil_samples count: {len(fossil_samples)}")
295
+ if len(fossil_samples) > 0:
296
+ print(f"DEBUG: First fossil sample (should be URL): {fossil_samples[0]}")
297
+ print(f"DEBUG: Is URL: {fossil_samples[0].startswith('http') if fossil_samples else False}")
298
+
299
+ examples_fossils = gr.Examples(
300
+ fossil_samples,
301
+ inputs=input_image,
302
+ examples_per_page=6, # Reduced for better spacing and organization
303
+ label='Leaf fossil examples from the dataset',
304
+ elem_id="fossil-examples"
305
+ )
306
+ return examples_fossils
307
 
308
  def preprocess_image(image, output_size=(300, 300)):
309
+ """
310
+ Preprocess image for display.
311
+ Handles both numpy arrays and PIL images.
312
+ """
313
+ # Convert PIL Image to numpy array if needed
314
+ if hasattr(image, 'size'): # PIL Image
315
+ image = np.array(image)
316
+
317
+ # Ensure image is a numpy array
318
+ if not isinstance(image, np.ndarray):
319
+ raise ValueError(f"Expected numpy array or PIL Image, got {type(image)}")
320
+
321
+ # Handle grayscale images (add channel dimension)
322
+ if len(image.shape) == 2:
323
+ image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
324
+ # Handle RGBA images (convert to RGB)
325
+ elif len(image.shape) == 3 and image.shape[2] == 4:
326
+ image = cv2.cvtColor(image, cv2.COLOR_RGBA2BGR)
327
+ # Ensure RGB images are converted to BGR for OpenCV
328
+ elif len(image.shape) == 3 and image.shape[2] == 3:
329
+ # Assume RGB, convert to BGR
330
+ image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
331
+
332
  #shape (height, width, channels)
333
  h, w = image.shape[:2]
334
 
 
357
  img_bright = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
358
  return img_bright
359
  def update_display(image):
360
+ if image is None:
361
+ return None, None, None, "Please upload or select an image first.", "Fossils 142", "Rise", 10, 50, None, None, None, None
362
+
363
+ try:
364
+ print(f"DEBUG: update_display called with image type: {type(image)}")
365
+ if hasattr(image, 'shape'):
366
+ print(f"DEBUG: Image shape: {image.shape}")
367
+
368
+ original_image = image
369
+ processed_image = preprocess_image(image)
370
+
371
+ # Convert BGR back to RGB for display (Gradio expects RGB)
372
+ if len(processed_image.shape) == 3:
373
+ processed_image = cv2.cvtColor(processed_image, cv2.COLOR_BGR2RGB)
374
+
375
+ instruction = "Image ready. Please switch to the 'Specimen Workbench' tab to check out further analysis and outputs."
376
+ print("DEBUG: Image processed successfully")
377
+ except Exception as e:
378
+ print(f"DEBUG: Error in update_display: {e}")
379
+ import traceback
380
+ traceback.print_exc()
381
+ return None, None, None, f"Error processing image: {str(e)}", "Fossils 142", "Rise", 10, 50, None, None, None, None
382
  model_name = "Fossils 142"
383
 
384
  # gr.Dropdown(
 
408
  class_predicted = None # gr.Label(label='Class Predicted',num_top_classes=10)
409
  exp_gallery = None
410
  # gr.Gallery(label="Explanation Heatmaps for top 5 predicted classes", show_label=False,elem_id="gallery",columns=[5], rows=[1],height='auto', allow_preview=True, preview=None)
411
+ closest_table = None
412
  # gr.Gallery(label="Closest Images", show_label=False,elem_id="gallery",columns=[5], rows=[1],height='auto', allow_preview=True, preview=None)
413
  diagram= None
414
  # gr.Image(label = 'Bar Chart')
415
+ return original_image,processed_image,processed_image,instruction,model_name,explain_method,sampling_size,top_k,class_predicted,exp_gallery,closest_table,diagram
416
  def update_slider_visibility(explain_method):
417
  bool = explain_method=="Rise"
418
  return {sampling_size: gr.Slider(1, 5000, value=2000, label="Sampling Size in Rise", visible=bool, interactive=True)}
419
 
420
  #minimalist theme
421
+ custom_css = """
422
+ .user-guide-wrapper {
423
+ padding: 20px;
424
+ border-radius: 10px;
425
+ border: 1px solid rgba(128, 128, 128, 0.3);
426
+ background-color: #f0f0f0 !important;
427
+ }
428
+ .dark .user-guide-wrapper,
429
+ [data-theme*="dark"] .user-guide-wrapper,
430
+ .gradio-container.dark .user-guide-wrapper,
431
+ body.dark .user-guide-wrapper {
432
+ background-color: #1e1e1e !important;
433
+ color: #ffffff !important;
434
+ }
435
+ .dark .user-guide-wrapper h3,
436
+ .dark .user-guide-wrapper h4,
437
+ .dark .user-guide-wrapper p,
438
+ .dark .user-guide-wrapper ul,
439
+ .dark .user-guide-wrapper li,
440
+ [data-theme*="dark"] .user-guide-wrapper h3,
441
+ [data-theme*="dark"] .user-guide-wrapper h4,
442
+ [data-theme*="dark"] .user-guide-wrapper p,
443
+ [data-theme*="dark"] .user-guide-wrapper ul,
444
+ [data-theme*="dark"] .user-guide-wrapper li {
445
+ color: #ffffff !important;
446
+ }
447
+ """
448
+
449
+ with gr.Blocks(theme='sudeepshouche/minimalist', css=custom_css) as demo:
450
 
451
  with gr.Tab(" Florrissant Fossils"):
452
  gr.Markdown(HEADER)
 
454
  with gr.Column():
455
  gr.Markdown(USER_GUIDE)
456
  with gr.Column(scale=2):
457
+ instruction_text = gr.Textbox(label="Instructions", value="Upload/Choose an image and click 'Process Image'.")
458
+ input_image = gr.Image(label="Input",width="100%",container=True)
459
+ process_button = gr.Button("Process Image",icon = "https://www.svgrepo.com/show/13672/play-button.svg")
460
+ with gr.Column(scale=1):
461
+ with gr.Accordion("📸 Example Fossils", open=True):
462
+ gr.Markdown("<p style='font-size: 14px; margin-bottom: 10px;'>Click on any example below to load it:</p>")
463
+ examples_fossils = setup_examples()
464
 
465
  gr.Markdown(CITATION)
466
 
 
554
  with gr.Accordion('Closest Fossil Images'):
555
  gr.Markdown("Finding 5 closest images in the dataset")
556
 
557
+ closest_table = gr.HTML(label="Closest Images Table")
558
+
 
 
559
  find_closest_btn = gr.Button("Find Closest Images",icon = "https://www.svgrepo.com/show/13672/play-button.svg")
560
 
561
  #segment_button.click(segment_image, inputs=input_image, outputs=segmented_image)
 
596
 
597
  #find_closest_btn.click(find_closest, inputs=[input_image,model_name], outputs=[label_closest_image_0,label_closest_image_1,label_closest_image_2,label_closest_image_3,label_closest_image_4,closest_image_0,closest_image_1,closest_image_2,closest_image_3,closest_image_4])
598
  def update_closest_outputs(input_image,model_name):
599
+ labels, images, filenames = find_closest(input_image,model_name)
600
+
601
+ # Create HTML table with images and full specimen names
602
+ table_html = """
603
+ <style>
604
+ .closest-images-table {
605
+ width: 100%;
606
+ border-collapse: collapse;
607
+ margin: 20px 0;
608
+ }
609
+ .closest-images-table th {
610
+ background-color: #f0f0f0;
611
+ padding: 12px;
612
+ text-align: left;
613
+ border: 1px solid #ddd;
614
+ font-weight: bold;
615
+ }
616
+ .closest-images-table td {
617
+ padding: 12px;
618
+ border: 1px solid #ddd;
619
+ vertical-align: middle;
620
+ }
621
+ .closest-images-table tr:nth-child(even) {
622
+ background-color: inherit;
623
+ }
624
+ .closest-images-table img {
625
+ max-width: 200px;
626
+ max-height: 200px;
627
+ object-fit: contain;
628
+ border-radius: 4px;
629
+ display: block;
630
+ margin: 0 auto;
631
+ }
632
+ .specimen-name {
633
+ font-size: 16px;
634
+ font-weight: bold;
635
+ color: #0066cc;
636
+ font-family: monospace;
637
+ }
638
+ .plant-family {
639
+ font-size: 14px;
640
+ font-weight: 500;
641
+ }
642
+ </style>
643
+ <table class="closest-images-table">
644
+ <thead>
645
+ <tr>
646
+ <th>Rank</th>
647
+ <th>Image</th>
648
+ <th>Plant Family</th>
649
+ <th>Specimen Name</th>
650
+ </tr>
651
+ </thead>
652
+ <tbody>
653
+ """
654
+
655
+ import os
656
+ import base64
657
+ from PIL import Image
658
+ import numpy as np
659
+
660
  for i in range(5):
661
+ rank = i + 1
662
+ # Handle image - convert to base64 for HTML display
663
+ img_src = ""
664
+
665
+ if isinstance(images[i], str) and os.path.exists(images[i]):
666
+ # Local file path - convert to base64
667
+ try:
668
+ with open(images[i], 'rb') as f:
669
+ img_data = f.read()
670
+ img_base64 = base64.b64encode(img_data).decode('utf-8')
671
+ img_src = f"data:image/jpeg;base64,{img_base64}"
672
+ except Exception as e:
673
+ print(f"Error loading image {images[i]}: {e}")
674
+ img_src = ""
675
+ elif isinstance(images[i], np.ndarray):
676
+ # NumPy array - convert to PIL and then base64
677
+ try:
678
+ img = Image.fromarray(images[i])
679
+ import io
680
+ buffer = io.BytesIO()
681
+ img.save(buffer, format='JPEG')
682
+ img_base64 = base64.b64encode(buffer.getvalue()).decode('utf-8')
683
+ img_src = f"data:image/jpeg;base64,{img_base64}"
684
+ except Exception as e:
685
+ print(f"Error converting numpy array to image: {e}")
686
+ img_src = ""
687
+ elif hasattr(images[i], 'save'):
688
+ # PIL Image
689
+ try:
690
+ import io
691
+ buffer = io.BytesIO()
692
+ images[i].save(buffer, format='JPEG')
693
+ img_base64 = base64.b64encode(buffer.getvalue()).decode('utf-8')
694
+ img_src = f"data:image/jpeg;base64,{img_base64}"
695
+ except Exception as e:
696
+ print(f"Error converting PIL image: {e}")
697
+ img_src = ""
698
+
699
+ plant_family = labels[i] if labels[i] else "Unknown"
700
+ specimen_name = filenames[i] if (i < len(filenames) and filenames[i] and len(filenames[i]) > 0) else "N/A"
701
+
702
+ # Debug output
703
+ print(f"DEBUG: Rank {rank} - Family: {plant_family}, Specimen: {specimen_name}, Image: {images[i]}")
704
+ print(f"DEBUG: filenames array length: {len(filenames)}, filenames[{i}]: {filenames[i] if i < len(filenames) else 'OUT OF RANGE'}")
705
+
706
+ table_html += f"""
707
+ <tr>
708
+ <td style="text-align: center; font-weight: bold; width: 60px; font-size: 18px;">{rank}</td>
709
+ <td style="text-align: center;">
710
+ <img src="{img_src}" alt="Closest image {rank}" />
711
+ <div style="margin-top: 8px; font-size: 12px; color: #666; word-break: break-all;">{specimen_name}</div>
712
+ </td>
713
+ <td class="plant-family">{plant_family}</td>
714
+ <td class="specimen-name" style="word-break: break-all;">{specimen_name}</td>
715
+ </tr>
716
+ """
717
+
718
+ table_html += """
719
+ </tbody>
720
+ </table>
721
+ """
722
+
723
+ return table_html
724
 
725
+ find_closest_btn.click(fn=update_closest_outputs, inputs=[original_image,model_name], outputs=[closest_table])
726
  #classify_segmented_button.click(classify_image, inputs=[segmented_image,model_name], outputs=class_predicted)
727
 
728
  generate_diagram.click(generate_diagram_closest, inputs=[original_image,model_name,top_k], outputs=diagram)
 
730
  process_button.click(
731
  fn=update_display,
732
  inputs=input_image,
733
+ outputs=[original_image,input_image,workbench_image,instruction_text,model_name,explain_method,sampling_size,top_k,class_predicted,exp_gallery,closest_table,diagram]
734
  )
735
 
736
 
 
739
  demo.queue() # manage multiple incoming requests
740
 
741
  if os.getenv('SYSTEM') == 'spaces':
742
+ demo.launch(width='40%', debug=True)
743
  #,auth=(os.environ.get('USERNAME'), os.environ.get('PASSWORD'))
744
  else:
745
+ demo.launch(debug=True)
closest_sample.py CHANGED
@@ -9,6 +9,86 @@ import matplotlib.pyplot as plt
9
  from collections import Counter
10
 
11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  if not os.path.exists('dataset'):
13
  REPO_ID='Serrelab/Fossils'
14
  token = os.environ.get('READ_TOKEN')
@@ -55,17 +135,18 @@ def download_public_image(url, destination_path):
55
  def get_images(embedding,model_name):
56
 
57
  if model_name in ['Rock 170','Mummified 170']:
58
- pca_fossils = pk.load(open('pca_fossils_170_finer.pkl','rb'))
59
- pca_leaves = pk.load(open('pca_leaves_170_finer.pkl','rb'))
60
  embedding_fossils = np.load('dataset/embedding_fossils_170_finer.npy')
61
  #embedding_leaves = np.load('embedding_leaves.npy')
62
  elif model_name in ['Fossils 142']:
63
- pca_fossils = pk.load(open('pca_fossils_142_resnet.pkl','rb'))
64
- pca_leaves = pk.load(open('pca_leaves_142_resnet.pkl','rb'))
65
  embedding_fossils = np.load('dataset/embedding_fossils_142_finer.npy')
66
  #embedding_leaves = np.load('embedding_leaves.npy')
67
  else:
68
  print(f'{model_name} not recognized')
 
69
  #pca_embedding_fossils = pca_fossils.transform(embedding_fossils[:,-1])
70
 
71
  pca_d =pca_distance(pca_fossils,embedding,embedding_fossils,top_k=5)
@@ -80,40 +161,61 @@ def get_images(embedding,model_name):
80
 
81
  local_paths = []
82
  classes = []
 
83
  for i, path in enumerate(paths):
84
  local_file_path = f'image_{i}.jpg'
 
85
  if 'Florissant_Fossil/512/full/jpg/' in path:
86
  public_path = path.replace('/gpfs/data/tserre/irodri15/Fossils/new_data/leavesdb-v1_1/images/Fossil/Florissant_Fossil/512/full/jpg/', folder_florissant)
87
  elif 'General_Fossil/512/full/jpg/' in path:
88
  public_path = path.replace('/gpfs/data/tserre/irodri15/Fossils/new_data/leavesdb-v1_1/images/Fossil/General_Fossil/512/full/jpg/', folder_general)
89
  else:
90
  print("no match found")
91
- print(public_path)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  download_public_image(public_path, local_file_path)
93
- names = []
 
 
 
 
94
  parts = [part for part in public_path.split('/') if part]
95
- part = parts[-2]
96
  classes.append(part)
97
  local_paths.append(local_file_path)
98
  #paths= [path.replace('/gpfs/data/tserre/irodri15/Fossils/new_data/leavesdb-v1_1/images/Fossil/Florissant_Fossil/512/full/jpg/',
99
  # '/media/data_cifs/projects/prj_fossils/data/processed_data/leavesdb-v1_1/images/Fossil/Florissant_Fossil/original/full/jpg/') for path in paths]
100
 
101
- return classes, local_paths
102
 
103
  def get_diagram(embedding,top_k,model_name):
104
 
105
  if model_name in ['Rock 170','Mummified 170']:
106
- pca_fossils = pk.load(open('pca_fossils_170_finer.pkl','rb'))
107
- pca_leaves = pk.load(open('pca_leaves_170_finer.pkl','rb'))
108
  embedding_fossils = np.load('dataset/embedding_fossils_170_finer.npy')
109
  #embedding_leaves = np.load('embedding_leaves.npy')
110
  elif model_name in ['Fossils 142']:
111
- pca_fossils = pk.load(open('pca_fossils_142_resnet.pkl','rb'))
112
- pca_leaves = pk.load(open('pca_leaves_142_resnet.pkl','rb'))
113
  embedding_fossils = np.load('dataset/embedding_fossils_142_finer.npy')
114
  #embedding_leaves = np.load('embedding_leaves.npy')
115
  else:
116
  print(f'{model_name} not recognized')
 
117
 
118
  #pca_embedding_fossils = pca_fossils.transform(embedding_fossils[:,-1])
119
 
 
9
  from collections import Counter
10
 
11
 
12
+ def is_git_lfs_pointer(filepath):
13
+ """Check if a file is a Git LFS pointer file instead of actual binary data."""
14
+ try:
15
+ with open(filepath, 'r') as f:
16
+ first_line = f.readline().strip()
17
+ return first_line == 'version https://git-lfs.github.com/spec/v1'
18
+ except:
19
+ return False
20
+
21
+
22
+ def load_pickle_safe(filepath):
23
+ """Safely load a pickle file, checking if it's a Git LFS pointer."""
24
+ if not os.path.exists(filepath):
25
+ raise FileNotFoundError(f"Pickle file not found: {filepath}")
26
+
27
+ if is_git_lfs_pointer(filepath):
28
+ print(f"Warning: {filepath} is a Git LFS pointer file. Attempting to download actual file...")
29
+ import subprocess
30
+ import sys
31
+
32
+ # Try to download using git lfs pull
33
+ try:
34
+ # Get the directory of the file
35
+ file_dir = os.path.dirname(os.path.abspath(filepath))
36
+ file_name = os.path.basename(filepath)
37
+
38
+ # Try git lfs pull in the file's directory
39
+ result = subprocess.run(
40
+ ['git', 'lfs', 'pull', '--include', file_name],
41
+ cwd=file_dir if file_dir else '.',
42
+ capture_output=True,
43
+ text=True,
44
+ timeout=60
45
+ )
46
+
47
+ if result.returncode == 0:
48
+ print(f"Successfully downloaded {filepath} from Git LFS")
49
+ # Check again if it's still a pointer
50
+ if is_git_lfs_pointer(filepath):
51
+ raise ValueError(
52
+ f"Error: {filepath} is still a Git LFS pointer after pull attempt.\n"
53
+ f"Please ensure Git LFS is properly configured:\n"
54
+ f" 1. Run 'git lfs install'\n"
55
+ f" 2. Run 'git lfs pull' in the repository root"
56
+ )
57
+ else:
58
+ raise ValueError(
59
+ f"Error: {filepath} is a Git LFS pointer file.\n"
60
+ f"Failed to download using 'git lfs pull': {result.stderr}\n"
61
+ f"Please manually download the file:\n"
62
+ f" cd {file_dir if file_dir else '.'}\n"
63
+ f" git lfs pull --include {file_name}"
64
+ )
65
+ except subprocess.TimeoutExpired:
66
+ raise ValueError(
67
+ f"Timeout while trying to download {filepath} from Git LFS.\n"
68
+ f"Please manually run: git lfs pull"
69
+ )
70
+ except FileNotFoundError:
71
+ raise ValueError(
72
+ f"Error: {filepath} is a Git LFS pointer file, but 'git' command not found.\n"
73
+ f"Please install Git LFS and run 'git lfs pull'"
74
+ )
75
+ except Exception as e:
76
+ raise ValueError(
77
+ f"Error: {filepath} is a Git LFS pointer file.\n"
78
+ f"Failed to download automatically: {e}\n"
79
+ f"Please manually run: git lfs pull"
80
+ )
81
+
82
+ try:
83
+ with open(filepath, 'rb') as f:
84
+ return pk.load(f)
85
+ except pk.UnpicklingError as e:
86
+ raise ValueError(
87
+ f"Error loading pickle file {filepath}: {e}\n"
88
+ f"This might be a Git LFS pointer file. Please ensure Git LFS is installed and run 'git lfs pull'."
89
+ )
90
+
91
+
92
  if not os.path.exists('dataset'):
93
  REPO_ID='Serrelab/Fossils'
94
  token = os.environ.get('READ_TOKEN')
 
135
  def get_images(embedding,model_name):
136
 
137
  if model_name in ['Rock 170','Mummified 170']:
138
+ pca_fossils = load_pickle_safe('pca_fossils_170_finer.pkl')
139
+ pca_leaves = load_pickle_safe('pca_leaves_170_finer.pkl')
140
  embedding_fossils = np.load('dataset/embedding_fossils_170_finer.npy')
141
  #embedding_leaves = np.load('embedding_leaves.npy')
142
  elif model_name in ['Fossils 142']:
143
+ pca_fossils = load_pickle_safe('pca_fossils_142_resnet.pkl')
144
+ pca_leaves = load_pickle_safe('pca_leaves_142_resnet.pkl')
145
  embedding_fossils = np.load('dataset/embedding_fossils_142_finer.npy')
146
  #embedding_leaves = np.load('embedding_leaves.npy')
147
  else:
148
  print(f'{model_name} not recognized')
149
+ raise ValueError(f'{model_name} not recognized')
150
  #pca_embedding_fossils = pca_fossils.transform(embedding_fossils[:,-1])
151
 
152
  pca_d =pca_distance(pca_fossils,embedding,embedding_fossils,top_k=5)
 
161
 
162
  local_paths = []
163
  classes = []
164
+ filenames = []
165
  for i, path in enumerate(paths):
166
  local_file_path = f'image_{i}.jpg'
167
+ public_path = None
168
  if 'Florissant_Fossil/512/full/jpg/' in path:
169
  public_path = path.replace('/gpfs/data/tserre/irodri15/Fossils/new_data/leavesdb-v1_1/images/Fossil/Florissant_Fossil/512/full/jpg/', folder_florissant)
170
  elif 'General_Fossil/512/full/jpg/' in path:
171
  public_path = path.replace('/gpfs/data/tserre/irodri15/Fossils/new_data/leavesdb-v1_1/images/Fossil/General_Fossil/512/full/jpg/', folder_general)
172
  else:
173
  print("no match found")
174
+ filenames.append("") # Empty filename if no match
175
+ classes.append("Unknown")
176
+ local_paths.append("")
177
+ continue
178
+
179
+ # Extract the full specimen name from the original path using split('/')[-1]
180
+ # e.g., /gpfs/.../Fabaceae/Fabaceae_Robinia_lesquereuxi_Florissant_FLFO_002604B.jpg
181
+ # -> Fabaceae_Robinia_lesquereuxi_Florissant_FLFO_002604B.jpg (then remove extension)
182
+ import os
183
+ original_filename = path.split('/')[-1] # Get the last part of the path (filename)
184
+ full_specimen_name = os.path.splitext(original_filename)[0] # Remove extension
185
+
186
+ print(f"Original path: {path}")
187
+ print(f"Full specimen name: {full_specimen_name}")
188
+ print(f"Public path: {public_path}")
189
  download_public_image(public_path, local_file_path)
190
+
191
+ # Use the full specimen name from the original filename
192
+ filenames.append(full_specimen_name)
193
+
194
+ # Extract plant family from public_path for classes
195
  parts = [part for part in public_path.split('/') if part]
196
+ part = parts[-2] # Plant family is the folder name in the URL
197
  classes.append(part)
198
  local_paths.append(local_file_path)
199
  #paths= [path.replace('/gpfs/data/tserre/irodri15/Fossils/new_data/leavesdb-v1_1/images/Fossil/Florissant_Fossil/512/full/jpg/',
200
  # '/media/data_cifs/projects/prj_fossils/data/processed_data/leavesdb-v1_1/images/Fossil/Florissant_Fossil/original/full/jpg/') for path in paths]
201
 
202
+ return classes, local_paths, filenames
203
 
204
  def get_diagram(embedding,top_k,model_name):
205
 
206
  if model_name in ['Rock 170','Mummified 170']:
207
+ pca_fossils = load_pickle_safe('pca_fossils_170_finer.pkl')
208
+ pca_leaves = load_pickle_safe('pca_leaves_170_finer.pkl')
209
  embedding_fossils = np.load('dataset/embedding_fossils_170_finer.npy')
210
  #embedding_leaves = np.load('embedding_leaves.npy')
211
  elif model_name in ['Fossils 142']:
212
+ pca_fossils = load_pickle_safe('pca_fossils_142_resnet.pkl')
213
+ pca_leaves = load_pickle_safe('pca_leaves_142_resnet.pkl')
214
  embedding_fossils = np.load('dataset/embedding_fossils_142_finer.npy')
215
  #embedding_leaves = np.load('embedding_leaves.npy')
216
  else:
217
  print(f'{model_name} not recognized')
218
+ raise ValueError(f'{model_name} not recognized')
219
 
220
  #pca_embedding_fossils = pca_fossils.transform(embedding_fossils[:,-1])
221
 
create_fossil_csv.py ADDED
@@ -0,0 +1,207 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Create CSV file from JSON response files and HTML image links.
4
+
5
+ This script:
6
+ 1. Parses all JSON files from ../Unknown/ directory
7
+ 2. Filters entries where User Selection is not null and not "Not Applicable"
8
+ 3. Extracts image URLs from index.html by matching fossil names
9
+ 4. Creates a CSV file with Serial Number, Fossil Name, User Selection, and Image URL
10
+ """
11
+
12
+ import json
13
+ import os
14
+ import glob
15
+ import re
16
+ import csv
17
+ from typing import List, Dict, Optional
18
+ from collections import defaultdict
19
+
20
+ # Paths
21
+ SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
22
+ UNKNOWN_DIR = os.path.join(os.path.dirname(SCRIPT_DIR), "Unknown")
23
+ HTML_FILE = os.path.join(UNKNOWN_DIR, "index.html")
24
+ OUTPUT_CSV = os.path.join(SCRIPT_DIR, "fossil_responses_with_images.csv")
25
+
26
+
27
+ def load_json_files(json_dir: str) -> List[Dict]:
28
+ """
29
+ Load all JSON response files and extract valid entries.
30
+
31
+ Args:
32
+ json_dir: Directory containing JSON files
33
+
34
+ Returns:
35
+ List of dictionaries with Serial Number, Fossil Name, User Selection
36
+ """
37
+ all_entries = []
38
+ json_files = glob.glob(os.path.join(json_dir, "unidentified_fossil_responses*.json"))
39
+
40
+ print(f"Found {len(json_files)} JSON files")
41
+
42
+ for json_file in json_files:
43
+ try:
44
+ with open(json_file, 'r', encoding='utf-8') as f:
45
+ data = json.load(f)
46
+
47
+ # Filter entries: exclude null, "Not Applicable", and "Impossible"
48
+ valid_entries = [
49
+ entry for entry in data
50
+ if entry.get("User Selection") is not None
51
+ and entry.get("User Selection") != "Not Applicable"
52
+ and entry.get("User Selection") != "Impossible"
53
+ ]
54
+
55
+ all_entries.extend(valid_entries)
56
+ print(f" {os.path.basename(json_file)}: {len(valid_entries)} valid entries")
57
+
58
+ except Exception as e:
59
+ print(f"Error loading {json_file}: {e}")
60
+ continue
61
+
62
+ # Remove duplicates based on Serial Number and Fossil Name combination
63
+ seen = set()
64
+ unique_entries = []
65
+ for entry in all_entries:
66
+ key = (entry.get("Serial Number"), entry.get("Fossil Name"))
67
+ if key not in seen:
68
+ seen.add(key)
69
+ unique_entries.append(entry)
70
+ else:
71
+ # If duplicate, keep the one with a User Selection (prefer non-null)
72
+ existing_idx = next(i for i, e in enumerate(unique_entries) if (e.get("Serial Number"), e.get("Fossil Name")) == key)
73
+ if entry.get("User Selection") and not unique_entries[existing_idx].get("User Selection"):
74
+ unique_entries[existing_idx] = entry
75
+
76
+ print(f"\nTotal unique valid entries: {len(unique_entries)}")
77
+ return unique_entries
78
+
79
+
80
+ def extract_image_urls_from_html(html_file: str) -> Dict[str, str]:
81
+ """
82
+ Extract image URLs from HTML file by parsing img tags with fossil-image class.
83
+ Uses line-by-line parsing for better performance on large files.
84
+
85
+ Args:
86
+ html_file: Path to index.html file
87
+
88
+ Returns:
89
+ Dictionary mapping fossil_name to image_url
90
+ """
91
+ image_urls = {}
92
+
93
+ if not os.path.exists(html_file):
94
+ print(f"Warning: HTML file not found: {html_file}")
95
+ return image_urls
96
+
97
+ print(f"\nParsing HTML file: {html_file}")
98
+
99
+ try:
100
+ # Use line-by-line parsing for better performance
101
+ current_fossil_name = None
102
+
103
+ with open(html_file, 'r', encoding='utf-8') as f:
104
+ for line in f:
105
+ # Look for fossil name in fossil-name td
106
+ fossil_name_match = re.search(r'<td class="fossil-name">.*?>(.*?)</a>', line)
107
+ if fossil_name_match:
108
+ fossil_name = re.sub(r'<[^>]+>', '', fossil_name_match.group(1)).strip()
109
+ if fossil_name:
110
+ current_fossil_name = fossil_name
111
+
112
+ # Look for image URL in fossil-image td
113
+ image_match = re.search(r'<td class="fossil-image"><img src="(https://storage\.googleapis\.com/serrelab/fossil_lens/inference_concepts2/[^"]+)"', line)
114
+ if image_match and current_fossil_name:
115
+ image_url = image_match.group(1)
116
+ image_urls[current_fossil_name] = image_url
117
+ current_fossil_name = None # Reset after finding image
118
+
119
+ print(f"Extracted {len(image_urls)} image URLs from HTML")
120
+
121
+ except Exception as e:
122
+ print(f"Error parsing HTML file: {e}")
123
+ import traceback
124
+ traceback.print_exc()
125
+
126
+ return image_urls
127
+
128
+
129
+ def create_csv(entries: List[Dict], image_urls: Dict[str, str], output_file: str):
130
+ """
131
+ Create CSV file with fossil data and image URLs.
132
+
133
+ Args:
134
+ entries: List of fossil entries from JSON files
135
+ image_urls: Dictionary mapping fossil names to image URLs
136
+ output_file: Path to output CSV file
137
+ """
138
+ print(f"\nCreating CSV file: {output_file}")
139
+
140
+ # Sort entries by Serial Number
141
+ entries.sort(key=lambda x: x.get("Serial Number", 0))
142
+
143
+ # Count matches
144
+ matched_count = 0
145
+ unmatched_count = 0
146
+
147
+ with open(output_file, 'w', newline='', encoding='utf-8') as csvfile:
148
+ fieldnames = ['Serial Number', 'Fossil Name', 'User Selection', 'Image URL']
149
+ writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
150
+
151
+ writer.writeheader()
152
+
153
+ for entry in entries:
154
+ fossil_name = entry.get("Fossil Name", "")
155
+ image_url = image_urls.get(fossil_name, "")
156
+
157
+ if image_url:
158
+ matched_count += 1
159
+ else:
160
+ unmatched_count += 1
161
+
162
+ # Format as Excel hyperlink: =HYPERLINK("url", "View Image")
163
+ if image_url:
164
+ formatted_url = f'=HYPERLINK("{image_url}", "View Image")'
165
+ else:
166
+ formatted_url = ""
167
+
168
+ writer.writerow({
169
+ 'Serial Number': entry.get("Serial Number", ""),
170
+ 'Fossil Name': fossil_name,
171
+ 'User Selection': entry.get("User Selection", ""),
172
+ 'Image URL': formatted_url
173
+ })
174
+
175
+ print(f"\nCSV file created successfully!")
176
+ print(f" Total entries: {len(entries)}")
177
+ print(f" Matched with image URLs: {matched_count}")
178
+ print(f" Unmatched (no image URL): {unmatched_count}")
179
+
180
+
181
+ def main():
182
+ """Main function to orchestrate the CSV creation process."""
183
+ print("=" * 60)
184
+ print("Creating CSV from JSON responses and HTML image links")
185
+ print("=" * 60)
186
+
187
+ # Step 1: Load and filter JSON files
188
+ entries = load_json_files(UNKNOWN_DIR)
189
+
190
+ if not entries:
191
+ print("No valid entries found. Exiting.")
192
+ return
193
+
194
+ # Step 2: Extract image URLs from HTML
195
+ image_urls = extract_image_urls_from_html(HTML_FILE)
196
+
197
+ # Step 3: Create CSV file
198
+ create_csv(entries, image_urls, OUTPUT_CSV)
199
+
200
+ print("\n" + "=" * 60)
201
+ print(f"Done! Output file: {OUTPUT_CSV}")
202
+ print("=" * 60)
203
+
204
+
205
+ if __name__ == "__main__":
206
+ main()
207
+
fossil_responses_with_images.csv ADDED
@@ -0,0 +1,868 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Serial Number,Fossil Name,User Selection,Image URL
2
+ 2,CU_0387cu,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0387cu/image.jpg"", ""View Image"")"
3
+ 3,FLFO_002787A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002787A/image.jpg"", ""View Image"")"
4
+ 7,CU_0761cu,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0761cu/image.jpg"", ""View Image"")"
5
+ 9,FLFO_010163A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010163A/image.jpg"", ""View Image"")"
6
+ 10,CU_0814cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0814cu/image.jpg"", ""View Image"")"
7
+ 11,CU_0301cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0301cu/image.jpg"", ""View Image"")"
8
+ 13,CU_0803,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0803/image.jpg"", ""View Image"")"
9
+ 16,FLFO_003196,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003196/image.jpg"", ""View Image"")"
10
+ 17,CU_0270,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0270/image.jpg"", ""View Image"")"
11
+ 18,CU_0812,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0812/image.jpg"", ""View Image"")"
12
+ 19,CU_0761cu1,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0761cu1/image.jpg"", ""View Image"")"
13
+ 21,FLFO_004161B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004161B/image.jpg"", ""View Image"")"
14
+ 22,FLFO_006644B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006644B/image.jpg"", ""View Image"")"
15
+ 23,FLFO_010746,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010746/image.jpg"", ""View Image"")"
16
+ 24,FLFO_010417A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010417A/image.jpg"", ""View Image"")"
17
+ 26,FLFO_010826,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010826/image.jpg"", ""View Image"")"
18
+ 27,FLFO_008595,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008595/image.jpg"", ""View Image"")"
19
+ 28,CU_0461cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0461cu/image.jpg"", ""View Image"")"
20
+ 29,CU_0796,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0796/image.jpg"", ""View Image"")"
21
+ 31,FLFO_010176A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010176A/image.jpg"", ""View Image"")"
22
+ 33,FLFO_010071B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010071B/image.jpg"", ""View Image"")"
23
+ 35,CU_1367,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_1367/image.jpg"", ""View Image"")"
24
+ 36,FLFO_005584A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_005584A/image.jpg"", ""View Image"")"
25
+ 41,FLFO_006114B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006114B/image.jpg"", ""View Image"")"
26
+ 42,FLFO_002447A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002447A/image.jpg"", ""View Image"")"
27
+ 44,CU_0801,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0801/image.jpg"", ""View Image"")"
28
+ 45,FLFO_003117,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003117/image.jpg"", ""View Image"")"
29
+ 46,FLFO_011541B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011541B/image.jpg"", ""View Image"")"
30
+ 47,FLFO_002617A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002617A/image.jpg"", ""View Image"")"
31
+ 48,CU_0217,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0217/image.jpg"", ""View Image"")"
32
+ 49,FLFO_003490B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003490B/image.jpg"", ""View Image"")"
33
+ 50,FLFO_006174B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006174B/image.jpg"", ""View Image"")"
34
+ 51,FLFO_010122,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010122/image.jpg"", ""View Image"")"
35
+ 53,CU_0894,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0894/image.jpg"", ""View Image"")"
36
+ 54,FLFO_008599B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008599B/image.jpg"", ""View Image"")"
37
+ 55,CU_0206,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0206/image.jpg"", ""View Image"")"
38
+ 57,CU_0489,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0489/image.jpg"", ""View Image"")"
39
+ 59,CU_0761,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0761/image.jpg"", ""View Image"")"
40
+ 60,FLFO_11115B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_11115B/image.jpg"", ""View Image"")"
41
+ 61,CU_0301,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0301/image.jpg"", ""View Image"")"
42
+ 63,FLFO_003600B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003600B/image.jpg"", ""View Image"")"
43
+ 64,FLFO_011061,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011061/image.jpg"", ""View Image"")"
44
+ 66,FLFO_005768B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_005768B/image.jpg"", ""View Image"")"
45
+ 68,FLFO_006046,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006046/image.jpg"", ""View Image"")"
46
+ 70,CU_0728,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0728/image.jpg"", ""View Image"")"
47
+ 71,CU_0907,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0907/image.jpg"", ""View Image"")"
48
+ 72,FLFO_003042B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003042B/image.jpg"", ""View Image"")"
49
+ 79,FLFO_002682B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002682B/image.jpg"", ""View Image"")"
50
+ 80,FLFO_002799B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002799B/image.jpg"", ""View Image"")"
51
+ 83,FLFO_002826,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002826/image.jpg"", ""View Image"")"
52
+ 84,FLFO_010770B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010770B/image.jpg"", ""View Image"")"
53
+ 85,CU_0662cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0662cu/image.jpg"", ""View Image"")"
54
+ 87,FLFO_004161A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004161A/image.jpg"", ""View Image"")"
55
+ 88,CU_0074,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0074/image.jpg"", ""View Image"")"
56
+ 89,FLFO_008586A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008586A/image.jpg"", ""View Image"")"
57
+ 94,FLFO_004598_2,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004598_2/image.jpg"", ""View Image"")"
58
+ 96,FLFO_005788,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_005788/image.jpg"", ""View Image"")"
59
+ 98,CU_0683,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0683/image.jpg"", ""View Image"")"
60
+ 99,FLFO_010321B 2,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010321B 2/image.jpg"", ""View Image"")"
61
+ 100,FLFO_011062,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011062/image.jpg"", ""View Image"")"
62
+ 101,CU_0730,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0730/image.jpg"", ""View Image"")"
63
+ 102,FLFO_011121B,Plausible,
64
+ 103,FLFO_010877B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010877B/image.jpg"", ""View Image"")"
65
+ 104,FLFO_011049A_L1,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011049A_L1/image.jpg"", ""View Image"")"
66
+ 105,FLFO_010307,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010307/image.jpg"", ""View Image"")"
67
+ 106,CU_0512cu,Plausible,
68
+ 107,CU_0755,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0755/image.jpg"", ""View Image"")"
69
+ 109,CU_0731cu,Plausible,
70
+ 110,FLFO_003351B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003351B/image.jpg"", ""View Image"")"
71
+ 111,FLFO_010570B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010570B/image.jpg"", ""View Image"")"
72
+ 112,CU_0819,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0819/image.jpg"", ""View Image"")"
73
+ 114,CU_0888,Not Sure,
74
+ 115,CU_0783cu,Not Sure,
75
+ 116,CU_0662,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0662/image.jpg"", ""View Image"")"
76
+ 117,FLFO_003166A,Not Sure,
77
+ 118,FLFO_010901A,Not Sure,
78
+ 119,CU_0901,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0901/image.jpg"", ""View Image"")"
79
+ 120,FLFO_010347B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010347B/image.jpg"", ""View Image"")"
80
+ 121,CU_0512,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0512/image.jpg"", ""View Image"")"
81
+ 122,CU_0220,Not Sure,
82
+ 123,FLFO_008529B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008529B/image.jpg"", ""View Image"")"
83
+ 125,CU_0118cu,Not Sure,
84
+ 126,CU_0503,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0503/image.jpg"", ""View Image"")"
85
+ 127,FLFO_011579,Plausible,
86
+ 128,FLFO_004784,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004784/image.jpg"", ""View Image"")"
87
+ 130,FLFO_003005,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003005/image.jpg"", ""View Image"")"
88
+ 131,FLFO_010038A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010038A/image.jpg"", ""View Image"")"
89
+ 132,CU_0244,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0244/image.jpg"", ""View Image"")"
90
+ 133,CU_0271,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0271/image.jpg"", ""View Image"")"
91
+ 136,CU_0110,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0110/image.jpg"", ""View Image"")"
92
+ 137,CU_0301cu2,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0301cu2/image.jpg"", ""View Image"")"
93
+ 138,FLFO_003041A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003041A/image.jpg"", ""View Image"")"
94
+ 139,FLFO_006832B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006832B/image.jpg"", ""View Image"")"
95
+ 140,CU_0747,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0747/image.jpg"", ""View Image"")"
96
+ 141,CU_0895,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0895/image.jpg"", ""View Image"")"
97
+ 142,FLFO_002628A,Plausible,
98
+ 143,CU_0846cu,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0846cu/image.jpg"", ""View Image"")"
99
+ 145,CU_0904,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0904/image.jpg"", ""View Image"")"
100
+ 146,CU_0386cu,Plausible,
101
+ 147,FLFO_010814A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010814A/image.jpg"", ""View Image"")"
102
+ 148,FLFO_010221,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010221/image.jpg"", ""View Image"")"
103
+ 151,FLFO_008997A,Not Sure,
104
+ 152,CU_0884,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0884/image.jpg"", ""View Image"")"
105
+ 153,FLFO_004720A,Not Sure,
106
+ 154,FLFO_011092,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011092/image.jpg"", ""View Image"")"
107
+ 155,FLFO_010759,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010759/image.jpg"", ""View Image"")"
108
+ 158,FLFO_011121A,Not Sure,
109
+ 159,CU_0487,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0487/image.jpg"", ""View Image"")"
110
+ 160,CU_0663cu,Plausible,
111
+ 161,CU_0751,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0751/image.jpg"", ""View Image"")"
112
+ 162,FLFO_004637,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004637/image.jpg"", ""View Image"")"
113
+ 163,FLFO_009788,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_009788/image.jpg"", ""View Image"")"
114
+ 165,CU_0755cu,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0755cu/image.jpg"", ""View Image"")"
115
+ 166,CU_0084,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0084/image.jpg"", ""View Image"")"
116
+ 167,FLFO_010011,Plausible,
117
+ 169,CU_0154,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0154/image.jpg"", ""View Image"")"
118
+ 173,FLFO_003260A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003260A/image.jpg"", ""View Image"")"
119
+ 175,FLFO_005679,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_005679/image.jpg"", ""View Image"")"
120
+ 176,FLFO_011453,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011453/image.jpg"", ""View Image"")"
121
+ 180,FLFO_009686,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_009686/image.jpg"", ""View Image"")"
122
+ 182,FLFO_002799A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002799A/image.jpg"", ""View Image"")"
123
+ 183,FLFO_002637B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002637B/image.jpg"", ""View Image"")"
124
+ 184,CU_0209,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0209/image.jpg"", ""View Image"")"
125
+ 186,CU_0177,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0177/image.jpg"", ""View Image"")"
126
+ 187,FLFO_004762B,Not Sure,
127
+ 188,FLFO_008995A,Plausible,
128
+ 190,CU_0740,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0740/image.jpg"", ""View Image"")"
129
+ 191,FLFO_010733B,Not Sure,
130
+ 192,FLFO_003213,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003213/image.jpg"", ""View Image"")"
131
+ 193,FLFO_010159,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010159/image.jpg"", ""View Image"")"
132
+ 195,CU_0332,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0332/image.jpg"", ""View Image"")"
133
+ 196,FLFO_003260B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003260B/image.jpg"", ""View Image"")"
134
+ 197,FLFO_003388B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003388B/image.jpg"", ""View Image"")"
135
+ 198,FLFO_010803A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010803A/image.jpg"", ""View Image"")"
136
+ 199,FLFO_011542A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011542A/image.jpg"", ""View Image"")"
137
+ 200,FLFO_002443A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002443A/image.jpg"", ""View Image"")"
138
+ 201,FLFO_010863A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010863A/image.jpg"", ""View Image"")"
139
+ 202,FLFO_006848B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006848B/image.jpg"", ""View Image"")"
140
+ 205,FLFO_006733A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006733A/image.jpg"", ""View Image"")"
141
+ 206,CU_0332cu,Not Sure,
142
+ 207,FLFO_010168B_L2,Plausible,
143
+ 208,FLFO_002741A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002741A/image.jpg"", ""View Image"")"
144
+ 209,FLFO_002767B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002767B/image.jpg"", ""View Image"")"
145
+ 210,CU_0864,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0864/image.jpg"", ""View Image"")"
146
+ 211,CU_0510cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0510cu/image.jpg"", ""View Image"")"
147
+ 212,FLFO_011049A_L2,Plausible,
148
+ 213,CU_0479cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0479cu/image.jpg"", ""View Image"")"
149
+ 215,CU_0190cu,Not Sure,
150
+ 217,FLFO_011361B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011361B/image.jpg"", ""View Image"")"
151
+ 218,FLFO_010863B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010863B/image.jpg"", ""View Image"")"
152
+ 219,FLFO_011454B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011454B/image.jpg"", ""View Image"")"
153
+ 223,CU_0442cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0442cu/image.jpg"", ""View Image"")"
154
+ 224,FLFO_011036A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011036A/image.jpg"", ""View Image"")"
155
+ 227,CU_0211,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0211/image.jpg"", ""View Image"")"
156
+ 228,CU_0778cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0778cu/image.jpg"", ""View Image"")"
157
+ 229,CU_0900,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0900/image.jpg"", ""View Image"")"
158
+ 230,FLFO_010529A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010529A/image.jpg"", ""View Image"")"
159
+ 232,CU_0756cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0756cu/image.jpg"", ""View Image"")"
160
+ 234,FLFO_011095A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011095A/image.jpg"", ""View Image"")"
161
+ 235,FLFO_005672B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_005672B/image.jpg"", ""View Image"")"
162
+ 236,FLFO_011023,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011023/image.jpg"", ""View Image"")"
163
+ 237,FLFO_010901B,Not Sure,
164
+ 239,FLFO_010252A,Not Sure,
165
+ 240,FLFO_010405,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010405/image.jpg"", ""View Image"")"
166
+ 241,FLFO_002901B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002901B/image.jpg"", ""View Image"")"
167
+ 242,FLFO_010379B,Plausible,
168
+ 245,FLFO_010809B,Plausible,
169
+ 246,FLFO_011336,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011336/image.jpg"", ""View Image"")"
170
+ 247,FLFO_003572B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003572B/image.jpg"", ""View Image"")"
171
+ 249,FLFO_010311B,Not Sure,
172
+ 250,FLFO_006733B,Plausible,
173
+ 252,CU_0478cu1,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0478cu1/image.jpg"", ""View Image"")"
174
+ 253,CU_0789,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0789/image.jpg"", ""View Image"")"
175
+ 254,FLFO_004609,Plausible,
176
+ 255,FLFO_004603,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004603/image.jpg"", ""View Image"")"
177
+ 256,CU_0657,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0657/image.jpg"", ""View Image"")"
178
+ 257,FLFO_009708A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_009708A/image.jpg"", ""View Image"")"
179
+ 258,FLFO_004565A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004565A/image.jpg"", ""View Image"")"
180
+ 259,FLFO_010321B,Plausible,
181
+ 260,CU_0410,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0410/image.jpg"", ""View Image"")"
182
+ 261,FLFO_004015A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004015A/image.jpg"", ""View Image"")"
183
+ 262,CU_0662cpt,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0662cpt/image.jpg"", ""View Image"")"
184
+ 263,CU_0830,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0830/image.jpg"", ""View Image"")"
185
+ 264,FLFO_011520A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011520A/image.jpg"", ""View Image"")"
186
+ 265,FLFO_006114A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006114A/image.jpg"", ""View Image"")"
187
+ 266,FLFO_003514,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003514/image.jpg"", ""View Image"")"
188
+ 267,FLFO_006872B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006872B/image.jpg"", ""View Image"")"
189
+ 269,CU_0740cu,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0740cu/image.jpg"", ""View Image"")"
190
+ 271,CU_0747cu1,Not Sure,
191
+ 272,CU_0619,Plausible,
192
+ 274,CU_0846,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0846/image.jpg"", ""View Image"")"
193
+ 275,CU_0906,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0906/image.jpg"", ""View Image"")"
194
+ 276,CU_0783,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0783/image.jpg"", ""View Image"")"
195
+ 278,FLFO_011096B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011096B/image.jpg"", ""View Image"")"
196
+ 279,FLFO_000126,Plausible,
197
+ 280,FLFO_010973B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010973B/image.jpg"", ""View Image"")"
198
+ 281,CU_0780,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0780/image.jpg"", ""View Image"")"
199
+ 282,FLFO_004600,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004600/image.jpg"", ""View Image"")"
200
+ 285,FLFO_010576A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010576A/image.jpg"", ""View Image"")"
201
+ 286,FLFO_003572A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003572A/image.jpg"", ""View Image"")"
202
+ 288,FLFO_002438,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002438/image.jpg"", ""View Image"")"
203
+ 289,FLFO_004597,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004597/image.jpg"", ""View Image"")"
204
+ 290,FLFO_004895A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004895A/image.jpg"", ""View Image"")"
205
+ 291,FLFO_006692,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006692/image.jpg"", ""View Image"")"
206
+ 292,FLFO_006146,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006146/image.jpg"", ""View Image"")"
207
+ 293,FLFO_004720B,Not Sure,
208
+ 294,CU_0332cu-2,Not Sure,
209
+ 295,CU_0652cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0652cu/image.jpg"", ""View Image"")"
210
+ 296,FLFO_011094B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011094B/image.jpg"", ""View Image"")"
211
+ 297,FLFO_002489A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002489A/image.jpg"", ""View Image"")"
212
+ 298,CU_0801cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0801cu/image.jpg"", ""View Image"")"
213
+ 299,FLFO_010262B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010262B/image.jpg"", ""View Image"")"
214
+ 300,FLFO_008571A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008571A/image.jpg"", ""View Image"")"
215
+ 301,CU_0657cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0657cu/image.jpg"", ""View Image"")"
216
+ 302,FLFO_011130,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011130/image.jpg"", ""View Image"")"
217
+ 303,CU_0336cpt,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0336cpt/image.jpg"", ""View Image"")"
218
+ 304,FLFO_006912B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006912B/image.jpg"", ""View Image"")"
219
+ 305,CU_0739cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0739cu/image.jpg"", ""View Image"")"
220
+ 306,FLFO_010168B_L1,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010168B_L1/image.jpg"", ""View Image"")"
221
+ 307,FLFO_003188,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003188/image.jpg"", ""View Image"")"
222
+ 308,CU_0833,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0833/image.jpg"", ""View Image"")"
223
+ 309,FLFO_006940A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006940A/image.jpg"", ""View Image"")"
224
+ 310,CU_0246,Not Sure,
225
+ 311,FLFO_002581B,Plausible,
226
+ 312,CU_0815,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0815/image.jpg"", ""View Image"")"
227
+ 313,FLFO_010311A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010311A/image.jpg"", ""View Image"")"
228
+ 314,FLFO_004935,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004935/image.jpg"", ""View Image"")"
229
+ 315,FLFO_004742A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004742A/image.jpg"", ""View Image"")"
230
+ 316,CU_0179,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0179/image.jpg"", ""View Image"")"
231
+ 317,FLFO_011745,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011745/image.jpg"", ""View Image"")"
232
+ 318,FLFO_008513,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008513/image.jpg"", ""View Image"")"
233
+ 320,CU_0721,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0721/image.jpg"", ""View Image"")"
234
+ 322,FLFO_004794,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004794/image.jpg"", ""View Image"")"
235
+ 323,FLFO_002786B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002786B/image.jpg"", ""View Image"")"
236
+ 326,FLFO_010576B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010576B/image.jpg"", ""View Image"")"
237
+ 327,CU_1033cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_1033cu/image.jpg"", ""View Image"")"
238
+ 328,CU_0833cu1,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0833cu1/image.jpg"", ""View Image"")"
239
+ 330,FLFO_011199B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011199B/image.jpg"", ""View Image"")"
240
+ 331,FLFO_004895B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004895B/image.jpg"", ""View Image"")"
241
+ 332,FLFO_011094A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011094A/image.jpg"", ""View Image"")"
242
+ 334,CU_0244cu,Not Sure,
243
+ 335,FLFO_003350B,Not Sure,
244
+ 336,FLFO_011450B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011450B/image.jpg"", ""View Image"")"
245
+ 338,FLFO_002444B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002444B/image.jpg"", ""View Image"")"
246
+ 339,FLFO_011655,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011655/image.jpg"", ""View Image"")"
247
+ 340,FLFO_006174A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006174A/image.jpg"", ""View Image"")"
248
+ 341,CU_0118,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0118/image.jpg"", ""View Image"")"
249
+ 342,FLFO_008586B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008586B/image.jpg"", ""View Image"")"
250
+ 343,FLFO_002740B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002740B/image.jpg"", ""View Image"")"
251
+ 344,FLFO_003351A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003351A/image.jpg"", ""View Image"")"
252
+ 345,FLFO_006632B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006632B/image.jpg"", ""View Image"")"
253
+ 346,CU_0814,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0814/image.jpg"", ""View Image"")"
254
+ 348,FLFO_004844,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004844/image.jpg"", ""View Image"")"
255
+ 349,FLFO_002483,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002483/image.jpg"", ""View Image"")"
256
+ 350,FLFO_008564B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008564B/image.jpg"", ""View Image"")"
257
+ 351,FLFO_000888,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_000888/image.jpg"", ""View Image"")"
258
+ 353,FLFO_009791A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_009791A/image.jpg"", ""View Image"")"
259
+ 354,FLFO_006961B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006961B/image.jpg"", ""View Image"")"
260
+ 355,CU_0673cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0673cu/image.jpg"", ""View Image"")"
261
+ 357,FLFO_011691,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011691/image.jpg"", ""View Image"")"
262
+ 358,FLFO_011049B_L1,Not Sure,
263
+ 359,CU_0772,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0772/image.jpg"", ""View Image"")"
264
+ 360,FLFO_011100B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011100B/image.jpg"", ""View Image"")"
265
+ 361,FLFO_008968A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008968A/image.jpg"", ""View Image"")"
266
+ 362,FLFO_003952B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003952B/image.jpg"", ""View Image"")"
267
+ 363,FLFO_003350A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003350A/image.jpg"", ""View Image"")"
268
+ 364,CU_0754cu,Not Sure,
269
+ 365,FLFO_003234,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003234/image.jpg"", ""View Image"")"
270
+ 366,CU_0741cu1,Not Sure,
271
+ 367,FLFO_011658,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011658/image.jpg"", ""View Image"")"
272
+ 368,CU_0798cu,Not Sure,
273
+ 370,CU_0882,Plausible,
274
+ 371,FLFO_003551,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003551/image.jpg"", ""View Image"")"
275
+ 372,CU_0818,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0818/image.jpg"", ""View Image"")"
276
+ 373,FLFO_005677B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_005677B/image.jpg"", ""View Image"")"
277
+ 374,FLFO_008529A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008529A/image.jpg"", ""View Image"")"
278
+ 375,CU_0726,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0726/image.jpg"", ""View Image"")"
279
+ 377,CU_0503cu,Plausible,
280
+ 378,FLFO_010071A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010071A/image.jpg"", ""View Image"")"
281
+ 380,CU_0742,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0742/image.jpg"", ""View Image"")"
282
+ 381,FLFO_002767A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002767A/image.jpg"", ""View Image"")"
283
+ 384,FLFO_003231B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003231B/image.jpg"", ""View Image"")"
284
+ 385,FLFO_010744A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010744A/image.jpg"", ""View Image"")"
285
+ 388,FLFO_010252B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010252B/image.jpg"", ""View Image"")"
286
+ 389,FLFO_010052A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010052A/image.jpg"", ""View Image"")"
287
+ 390,FLFO_002769B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002769B/image.jpg"", ""View Image"")"
288
+ 391,CU_0513cu2,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0513cu2/image.jpg"", ""View Image"")"
289
+ 394,FLFO_011511,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011511/image.jpg"", ""View Image"")"
290
+ 395,CU_0830cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0830cu/image.jpg"", ""View Image"")"
291
+ 396,FLFO_010529B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010529B/image.jpg"", ""View Image"")"
292
+ 397,FLFO_010656B,Plausible,
293
+ 398,FLFO_003388A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003388A/image.jpg"", ""View Image"")"
294
+ 399,CU_0207,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0207/image.jpg"", ""View Image"")"
295
+ 400,FLFO_010790A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010790A/image.jpg"", ""View Image"")"
296
+ 401,FLFO_008511B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008511B/image.jpg"", ""View Image"")"
297
+ 402,CU_0769cu1,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0769cu1/image.jpg"", ""View Image"")"
298
+ 403,FLFO_010459B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010459B/image.jpg"", ""View Image"")"
299
+ 404,FLFO_006078,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006078/image.jpg"", ""View Image"")"
300
+ 406,FLFO_011235B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011235B/image.jpg"", ""View Image"")"
301
+ 409,FLFO_006912A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006912A/image.jpg"", ""View Image"")"
302
+ 410,CU_0491cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0491cu/image.jpg"", ""View Image"")"
303
+ 411,FLFO_010656A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010656A/image.jpg"", ""View Image"")"
304
+ 412,FLFO_002879A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002879A/image.jpg"", ""View Image"")"
305
+ 413,CU_0820,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0820/image.jpg"", ""View Image"")"
306
+ 414,CU_0510,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0510/image.jpg"", ""View Image"")"
307
+ 416,CU_0197,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0197/image.jpg"", ""View Image"")"
308
+ 417,FLFO_004929,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004929/image.jpg"", ""View Image"")"
309
+ 418,FLFO_011029,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011029/image.jpg"", ""View Image"")"
310
+ 420,FLFO_003301A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003301A/image.jpg"", ""View Image"")"
311
+ 422,FLFO_003600A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003600A/image.jpg"", ""View Image"")"
312
+ 424,FLFO_002901A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002901A/image.jpg"", ""View Image"")"
313
+ 425,FLFO_008538B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008538B/image.jpg"", ""View Image"")"
314
+ 427,CU_0401cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0401cu/image.jpg"", ""View Image"")"
315
+ 428,FLFO_011305,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011305/image.jpg"", ""View Image"")"
316
+ 429,FLFO_006644A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006644A/image.jpg"", ""View Image"")"
317
+ 433,CU_0489cu,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0489cu/image.jpg"", ""View Image"")"
318
+ 434,CU_0805,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0805/image.jpg"", ""View Image"")"
319
+ 438,FLFO_003492B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003492B/image.jpg"", ""View Image"")"
320
+ 439,FLFO_011100A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011100A/image.jpg"", ""View Image"")"
321
+ 441,CU_0189,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0189/image.jpg"", ""View Image"")"
322
+ 442,FLFO_002786A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002786A/image.jpg"", ""View Image"")"
323
+ 443,CU_0454,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0454/image.jpg"", ""View Image"")"
324
+ 444,FLFO_011087B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011087B/image.jpg"", ""View Image"")"
325
+ 445,CU_0654,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0654/image.jpg"", ""View Image"")"
326
+ 447,CU_0729,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0729/image.jpg"", ""View Image"")"
327
+ 448,FLFO_002420B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002420B/image.jpg"", ""View Image"")"
328
+ 449,FLFO_002702,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002702/image.jpg"", ""View Image"")"
329
+ 450,FLFO_008590B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008590B/image.jpg"", ""View Image"")"
330
+ 451,FLFO_008995B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008995B/image.jpg"", ""View Image"")"
331
+ 452,CU_1032,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_1032/image.jpg"", ""View Image"")"
332
+ 453,CU_0741,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0741/image.jpg"", ""View Image"")"
333
+ 455,FLFO_004707B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004707B/image.jpg"", ""View Image"")"
334
+ 456,CU_0770,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0770/image.jpg"", ""View Image"")"
335
+ 458,CU_0896,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0896/image.jpg"", ""View Image"")"
336
+ 463,CU_0329,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0329/image.jpg"", ""View Image"")"
337
+ 464,CU_0901cpt,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0901cpt/image.jpg"", ""View Image"")"
338
+ 465,FLFO_010650B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010650B/image.jpg"", ""View Image"")"
339
+ 466,FLFO_003258,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003258/image.jpg"", ""View Image"")"
340
+ 467,CU_0686,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0686/image.jpg"", ""View Image"")"
341
+ 468,CU_0409,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0409/image.jpg"", ""View Image"")"
342
+ 469,CU_0122,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0122/image.jpg"", ""View Image"")"
343
+ 470,FLFO_003490A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003490A/image.jpg"", ""View Image"")"
344
+ 471,FLFO_002926A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002926A/image.jpg"", ""View Image"")"
345
+ 472,FLFO_010329A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010329A/image.jpg"", ""View Image"")"
346
+ 473,CU_0513,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0513/image.jpg"", ""View Image"")"
347
+ 474,FLFO_002597,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002597/image.jpg"", ""View Image"")"
348
+ 475,CU_0198cpt,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0198cpt/image.jpg"", ""View Image"")"
349
+ 476,CU_0440,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0440/image.jpg"", ""View Image"")"
350
+ 477,FLFO_010463A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010463A/image.jpg"", ""View Image"")"
351
+ 478,FLFO_010519A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010519A/image.jpg"", ""View Image"")"
352
+ 479,FLFO_010163B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010163B/image.jpg"", ""View Image"")"
353
+ 480,CU_0486,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0486/image.jpg"", ""View Image"")"
354
+ 481,FLFO_009675,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_009675/image.jpg"", ""View Image"")"
355
+ 483,FLFO_002728,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002728/image.jpg"", ""View Image"")"
356
+ 485,CU_1364,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_1364/image.jpg"", ""View Image"")"
357
+ 486,CU_0902cu,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0902cu/image.jpg"", ""View Image"")"
358
+ 487,FLFO_011019A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011019A/image.jpg"", ""View Image"")"
359
+ 488,CU_0307,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0307/image.jpg"", ""View Image"")"
360
+ 489,CU_0687,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0687/image.jpg"", ""View Image"")"
361
+ 490,FLFO_009259,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_009259/image.jpg"", ""View Image"")"
362
+ 491,CU_0448cu,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0448cu/image.jpg"", ""View Image"")"
363
+ 494,CU_0754,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0754/image.jpg"", ""View Image"")"
364
+ 495,FLFO_010423A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010423A/image.jpg"", ""View Image"")"
365
+ 496,FLFO_011361A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011361A/image.jpg"", ""View Image"")"
366
+ 497,CU_0745,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0745/image.jpg"", ""View Image"")"
367
+ 498,FLFO_006940B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006940B/image.jpg"", ""View Image"")"
368
+ 499,FLFO_010680B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010680B/image.jpg"", ""View Image"")"
369
+ 500,CU_0641,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0641/image.jpg"", ""View Image"")"
370
+ 502,FLFO_005584B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_005584B/image.jpg"", ""View Image"")"
371
+ 503,FLFO_011133A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011133A/image.jpg"", ""View Image"")"
372
+ 504,FLFO_010409A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010409A/image.jpg"", ""View Image"")"
373
+ 505,FLFO_002682A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002682A/image.jpg"", ""View Image"")"
374
+ 506,CU_0461,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0461/image.jpg"", ""View Image"")"
375
+ 507,FLFO_011133B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011133B/image.jpg"", ""View Image"")"
376
+ 508,FLFO_011147B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011147B/image.jpg"", ""View Image"")"
377
+ 510,FLFO_010562B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010562B/image.jpg"", ""View Image"")"
378
+ 511,FLFO_008967,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008967/image.jpg"", ""View Image"")"
379
+ 512,FLFO_010168B_L3,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010168B_L3/image.jpg"", ""View Image"")"
380
+ 513,CU_0279,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0279/image.jpg"", ""View Image"")"
381
+ 514,FLFO_010806A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010806A/image.jpg"", ""View Image"")"
382
+ 515,FLFO_002741B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002741B/image.jpg"", ""View Image"")"
383
+ 516,FLFO_010459A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010459A/image.jpg"", ""View Image"")"
384
+ 519,FLFO_003152,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003152/image.jpg"", ""View Image"")"
385
+ 520,FLFO_010137,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010137/image.jpg"", ""View Image"")"
386
+ 521,FLFO_003175A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003175A/image.jpg"", ""View Image"")"
387
+ 522,CU_0809,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0809/image.jpg"", ""View Image"")"
388
+ 523,FLFO_011502B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011502B/image.jpg"", ""View Image"")"
389
+ 527,FLFO_010699A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010699A/image.jpg"", ""View Image"")"
390
+ 529,CU_0194cpt,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0194cpt/image.jpg"", ""View Image"")"
391
+ 531,FLFO_003240,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003240/image.jpg"", ""View Image"")"
392
+ 532,FLFO_011080A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011080A/image.jpg"", ""View Image"")"
393
+ 534,CU_0673,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0673/image.jpg"", ""View Image"")"
394
+ 535,CU_0833cu,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0833cu/image.jpg"", ""View Image"")"
395
+ 536,FLFO_004124A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004124A/image.jpg"", ""View Image"")"
396
+ 537,FLFO_005677A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_005677A/image.jpg"", ""View Image"")"
397
+ 538,FLFO_011199A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011199A/image.jpg"", ""View Image"")"
398
+ 539,FLFO_011115A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011115A/image.jpg"", ""View Image"")"
399
+ 540,FLFO_003952A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003952A/image.jpg"", ""View Image"")"
400
+ 542,CU_0301cu1,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0301cu1/image.jpg"", ""View Image"")"
401
+ 543,CU_0512cu1,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0512cu1/image.jpg"", ""View Image"")"
402
+ 545,CU_0511,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0511/image.jpg"", ""View Image"")"
403
+ 547,FLFO_008571B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008571B/image.jpg"", ""View Image"")"
404
+ 548,FLFO_004443B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004443B/image.jpg"", ""View Image"")"
405
+ 549,FLFO_004708B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004708B/image.jpg"", ""View Image"")"
406
+ 550,FLFO_010662A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010662A/image.jpg"", ""View Image"")"
407
+ 551,FLFO_004519A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004519A/image.jpg"", ""View Image"")"
408
+ 553,FLFO_002703,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002703/image.jpg"", ""View Image"")"
409
+ 555,FLFO_010650A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010650A/image.jpg"", ""View Image"")"
410
+ 556,FLFO_009029B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_009029B/image.jpg"", ""View Image"")"
411
+ 557,FLFO_004838A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004838A/image.jpg"", ""View Image"")"
412
+ 558,FLFO_010738A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010738A/image.jpg"", ""View Image"")"
413
+ 559,FLFO_010780A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010780A/image.jpg"", ""View Image"")"
414
+ 560,FLFO_011019B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011019B/image.jpg"", ""View Image"")"
415
+ 562,CU_0752,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0752/image.jpg"", ""View Image"")"
416
+ 563,FLFO_011025,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011025/image.jpg"", ""View Image"")"
417
+ 566,CU_0180,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0180/image.jpg"", ""View Image"")"
418
+ 567,FLFO_011518,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011518/image.jpg"", ""View Image"")"
419
+ 568,FLFO_010897A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010897A/image.jpg"", ""View Image"")"
420
+ 570,FLFO_009286,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_009286/image.jpg"", ""View Image"")"
421
+ 571,FLFO_002623B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002623B/image.jpg"", ""View Image"")"
422
+ 572,FLFO_005678,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_005678/image.jpg"", ""View Image"")"
423
+ 574,FLFO_009680,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_009680/image.jpg"", ""View Image"")"
424
+ 576,FLFO_010993B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010993B/image.jpg"", ""View Image"")"
425
+ 577,FLFO_009859,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_009859/image.jpg"", ""View Image"")"
426
+ 578,FLFO_010031,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010031/image.jpg"", ""View Image"")"
427
+ 580,FLFO_004519B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004519B/image.jpg"", ""View Image"")"
428
+ 581,FLFO_010734B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010734B/image.jpg"", ""View Image"")"
429
+ 582,FLFO_006872A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006872A/image.jpg"", ""View Image"")"
430
+ 583,FLFO_010415A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010415A/image.jpg"", ""View Image"")"
431
+ 584,CU_0448,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0448/image.jpg"", ""View Image"")"
432
+ 586,CU_0198pt,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0198pt/image.jpg"", ""View Image"")"
433
+ 587,FLFO_010052B 2,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010052B 2/image.jpg"", ""View Image"")"
434
+ 588,FLFO_003180A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003180A/image.jpg"", ""View Image"")"
435
+ 590,FLFO_002868B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002868B/image.jpg"", ""View Image"")"
436
+ 591,FLFO_002676B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002676B/image.jpg"", ""View Image"")"
437
+ 592,FLFO_010347A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010347A/image.jpg"", ""View Image"")"
438
+ 593,FLFO_002743A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002743A/image.jpg"", ""View Image"")"
439
+ 595,FLFO_004608,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004608/image.jpg"", ""View Image"")"
440
+ 596,FLFO_008564A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008564A/image.jpg"", ""View Image"")"
441
+ 597,CU_0810,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0810/image.jpg"", ""View Image"")"
442
+ 598,FLFO_011181,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011181/image.jpg"", ""View Image"")"
443
+ 599,FLFO_002709,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002709/image.jpg"", ""View Image"")"
444
+ 602,CU_0214,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0214/image.jpg"", ""View Image"")"
445
+ 603,CU_0652,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0652/image.jpg"", ""View Image"")"
446
+ 604,CU_0247,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0247/image.jpg"", ""View Image"")"
447
+ 606,FLFO_004708A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_004708A/image.jpg"", ""View Image"")"
448
+ 607,FLFO_011520B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_011520B/image.jpg"", ""View Image"")"
449
+ 901,FLFO_003420A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_003420A/image.jpg"", ""View Image"")"
450
+ 902,CU_0387,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0387/image.jpg"", ""View Image"")"
451
+ 903,FLFO_000095,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_000095/image.jpg"", ""View Image"")"
452
+ 904,CU_0157,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0157/image.jpg"", ""View Image"")"
453
+ 905,FLFO_002638A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002638A/image.jpg"", ""View Image"")"
454
+ 910,CU_0753,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0753/image.jpg"", ""View Image"")"
455
+ 911,CU_0770cu,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0770cu/image.jpg"", ""View Image"")"
456
+ 913,FLFO_010519B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010519B/image.jpg"", ""View Image"")"
457
+ 914,CU_0743cu1,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0743cu1/image.jpg"", ""View Image"")"
458
+ 915,CU_0122cu,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0122cu/image.jpg"", ""View Image"")"
459
+ 917,FLFO_002489B,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002489B/image.jpg"", ""View Image"")"
460
+ 919,FLFO_008977,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_008977/image.jpg"", ""View Image"")"
461
+ 920,CU_0693cu,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0693cu/image.jpg"", ""View Image"")"
462
+ 922,CU_0192cu2,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0192cu2/image.jpg"", ""View Image"")"
463
+ 927,CU_0798,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0798/image.jpg"", ""View Image"")"
464
+ 928,FLFO_002869A,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_002869A/image.jpg"", ""View Image"")"
465
+ 929,FLFO_010973A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010973A/image.jpg"", ""View Image"")"
466
+ 930,FLFO_006689,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006689/image.jpg"", ""View Image"")"
467
+ 931,CU_0779,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0779/image.jpg"", ""View Image"")"
468
+ 932,CU_0489cu1,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0489cu1/image.jpg"", ""View Image"")"
469
+ 934,FLFO_010429,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010429/image.jpg"", ""View Image"")"
470
+ 938,CU_0902,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0902/image.jpg"", ""View Image"")"
471
+ 939,FLFO_010308A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_010308A/image.jpg"", ""View Image"")"
472
+ 940,FLFO_006939B,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_006939B/image.jpg"", ""View Image"")"
473
+ 942,CU_0752cu,Not Sure,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/CU_0752cu/image.jpg"", ""View Image"")"
474
+ 943,FLFO_005672A,Plausible,"=HYPERLINK(""https://storage.googleapis.com/serrelab/fossil_lens/inference_concepts2/FLFO_005672A/image.jpg"", ""View Image"")"
475
+ 945,FLFO_009700,Plausible,
476
+ 949,FLFO_011574A,Plausible,
477
+ 950,FLFO_009028,Plausible,
478
+ 952,FLFO_010695,Plausible,
479
+ 953,FLFO_009252A,Plausible,
480
+ 956,FLFO_006246A,Not Sure,
481
+ 960,FLFO_004112A,Not Sure,
482
+ 962,FLFO_011657,Plausible,
483
+ 964,FLFO_002771A,Not Sure,
484
+ 965,FLFO_002921A,Plausible,
485
+ 966,FLFO_010948,Not Sure,
486
+ 967,FLFO_002586A,Plausible,
487
+ 968,FLFO_002894B,Plausible,
488
+ 969,FLFO_005783A,Plausible,
489
+ 970,FLFO_003622,Plausible,
490
+ 972,FLFO_004839A,Not Sure,
491
+ 973,FLFO_010064B,Not Sure,
492
+ 977,FLFO_002664,Not Sure,
493
+ 979,FLFO_008986,Not Sure,
494
+ 983,FLFO_009702,Not Sure,
495
+ 986,FLFO_000441,Plausible,
496
+ 987,FLFO_004466A,Not Sure,
497
+ 991,FLFO_010895B,Not Sure,
498
+ 993,FLFO_002600,Plausible,
499
+ 994,FLFO_008554A_L1,Not Sure,
500
+ 995,FLFO_008889B,Not Sure,
501
+ 996,FLFO_008992A,Plausible,
502
+ 997,FLFO_010977,Not Sure,
503
+ 998,FLFO_010689A,Not Sure,
504
+ 999,FLFO_011679B,Not Sure,
505
+ 1000,FLFO_005644,Not Sure,
506
+ 1001,FLFO_009054A-2,Plausible,
507
+ 1002,FLFO_005553A,Not Sure,
508
+ 1006,FLFO_004860B,Plausible,
509
+ 1009,FLFO_008887,Not Sure,
510
+ 1012,FLFO_008541A,Plausible,
511
+ 1015,FLFO_003134,Plausible,
512
+ 1017,FLFO_010756A,Not Sure,
513
+ 1018,FLFO_002988,Not Sure,
514
+ 1021,FLFO_004904,Not Sure,
515
+ 1025,FLFO_011662A,Plausible,
516
+ 1027,FLFO_011134,Plausible,
517
+ 1029,FLFO_006854B,Plausible,
518
+ 1030,FLFO_002627A,Plausible,
519
+ 1039,FLFO_004854,Not Sure,
520
+ 1041,FLFO_009591A,Plausible,
521
+ 1053,FLFO_011122A,Not Sure,
522
+ 1054,FLFO_009267B,Not Sure,
523
+ 1055,FLFO_004641B,Not Sure,
524
+ 1057,FLFO_006700B,Not Sure,
525
+ 1058,FLFO_007123A_L,Not Sure,
526
+ 1059,FLFO_011185,Not Sure,
527
+ 1062,FLFO_004563,Not Sure,
528
+ 1063,CU_0549,Plausible,
529
+ 1064,FLFO_003279A,Not Sure,
530
+ 1070,FLFO_002691B,Not Sure,
531
+ 1072,FLFO_004454,Not Sure,
532
+ 1073,FLFO_003137A,Plausible,
533
+ 1074,FLFO_010388A,Not Sure,
534
+ 1076,FLFO_004353A,Not Sure,
535
+ 1077,FLFO_006428 Petiole,Not Sure,
536
+ 1078,FLFO_009607,Not Sure,
537
+ 1080,FLFO_004635A,Not Sure,
538
+ 1081,FLFO_002450,Not Sure,
539
+ 1085,FLFO_004554B,Not Sure,
540
+ 1088,FLFO_010375B,Plausible,
541
+ 1089,CU_0530cpt,Plausible,
542
+ 1093,FLFO_009077A,Plausible,
543
+ 1096,FLFO_009043,Plausible,
544
+ 1099,FLFO_010162,Not Sure,
545
+ 1101,CU_0331cu,Not Sure,
546
+ 1102,FLFO_011265B,Plausible,
547
+ 1103,FLFO_008570B,Not Sure,
548
+ 1106,FLFO_008554A_L2,Not Sure,
549
+ 1107,FLFO_010820,Plausible,
550
+ 1108,FLFO_002897A,Not Sure,
551
+ 1109,FLFO_003345,Not Sure,
552
+ 1111,FLFO_004560,Plausible,
553
+ 1112,FLFO_008840,Plausible,
554
+ 1113,FLFO_010211A,Plausible,
555
+ 1115,FLFO_006949B,Not Sure,
556
+ 1116,FLFO_010797,Plausible,
557
+ 1118,FLFO_006144A,Not Sure,
558
+ 1119,FLFO_010110,Not Sure,
559
+ 1120,FLFO_010727B,Plausible,
560
+ 1124,CU_0310-1,Plausible,
561
+ 1125,FLFO_011612,Not Sure,
562
+ 1127,FLFO_010140,Not Sure,
563
+ 1129,FLFO_002631A,Not Sure,
564
+ 1130,FLFO_010872A,Not Sure,
565
+ 1132,FLFO_006373B,Not Sure,
566
+ 1135,FLFO_010342B,Plausible,
567
+ 1136,FLFO_005578A,Not Sure,
568
+ 1137,FLFO_000530,Not Sure,
569
+ 1139,FLFO_003228B,Not Sure,
570
+ 1140,FLFO_008822B,Plausible,
571
+ 1145,FLFO_011391A,Not Sure,
572
+ 1146,FLFO_011373_L,Plausible,
573
+ 1149,FLFO_010088A,Plausible,
574
+ 1152,FLFO_009747B,Not Sure,
575
+ 1155,FLFO_006296_L1,Plausible,
576
+ 1156,FLFO_004363,Plausible,
577
+ 1157,FLFO_010849B,Not Sure,
578
+ 1158,FLFO_005645,Not Sure,
579
+ 1159,FLFO_009063,Plausible,
580
+ 1164,FLFO_004839B,Not Sure,
581
+ 1165,FLFO_009150B,Plausible,
582
+ 1167,FLFO_009033,Plausible,
583
+ 1169,FLFO_004690,Not Sure,
584
+ 1170,FLFO_006424B,Plausible,
585
+ 1171,FLFO_008557A,Plausible,
586
+ 1173,FLFO_009715A,Not Sure,
587
+ 1174,FLFO_011320,Plausible,
588
+ 1175,FLFO_006866A,Plausible,
589
+ 1176,FLFO_003339A,Not Sure,
590
+ 1178,FLFO_011575B,Plausible,
591
+ 1180,FLFO_003593A,Not Sure,
592
+ 1182,FLFO_010953,Not Sure,
593
+ 1183,FLFO_003811,Not Sure,
594
+ 1185,FLFO_011463,Not Sure,
595
+ 1189,FLFO_011501B,Plausible,
596
+ 1190,FLFO_010942,Plausible,
597
+ 1192,FLFO_000529,Not Sure,
598
+ 1193,FLFO_002892A,Not Sure,
599
+ 1196,FLFO_004931,Plausible,
600
+ 1198,FLFO_008554B,Not Sure,
601
+ 1199,FLFO_006120B,Not Sure,
602
+ 1200,FLFO_002626B,Not Sure,
603
+ 1201,FLFO_006726B,Not Sure,
604
+ 1202,FLFO_003302,Not Sure,
605
+ 1203,FLFO_006369B,Not Sure,
606
+ 1205,FLFO_010740A,Not Sure,
607
+ 1206,FLFO_010210B,Not Sure,
608
+ 1207,FLFO_011200A,Not Sure,
609
+ 1208,FLFO_010022A,Not Sure,
610
+ 1210,FLFO_011120B,Not Sure,
611
+ 1211,CU_0584,Not Sure,
612
+ 1212,FLFO_004401,Not Sure,
613
+ 1213,FLFO_010277B,Plausible,
614
+ 1214,FLFO_004822,Not Sure,
615
+ 1216,FLFO_011046B,Plausible,
616
+ 1217,FLFO_010594,Plausible,
617
+ 1218,FLFO_011152A,Not Sure,
618
+ 1220,FLFO_004765A,Plausible,
619
+ 1221,FLFO_009074,Not Sure,
620
+ 1222,FLFO_009017,Not Sure,
621
+ 1226,FLFO_002873A,Plausible,
622
+ 1228,CU_1370,Not Sure,
623
+ 1230,FLFO_002467B,Not Sure,
624
+ 1231,FLFO_004242,Not Sure,
625
+ 1236,FLFO_003412A,Plausible,
626
+ 1237,FLFO_011360A,Not Sure,
627
+ 1239,FLFO_009689,Not Sure,
628
+ 1240,FLFO_011387,Not Sure,
629
+ 1243,FLFO_011558,Not Sure,
630
+ 1244,FLFO_004126B,Not Sure,
631
+ 1245,FLFO_006296,Plausible,
632
+ 1246,FLFO_011170,Not Sure,
633
+ 1247,FLFO_010548B,Not Sure,
634
+ 1248,FLFO_011037B,Not Sure,
635
+ 1253,FLFO_010740B,Plausible,
636
+ 1254,FLFO_010870A,Not Sure,
637
+ 1257,FLFO_011004,Not Sure,
638
+ 1258,FLFO_004671,Not Sure,
639
+ 1259,FLFO_004334B,Plausible,
640
+ 1260,FLFO_000440,Plausible,
641
+ 1263,FLFO_000842,Not Sure,
642
+ 1264,FLFO_003308,Not Sure,
643
+ 1268,CU_0677cu,Not Sure,
644
+ 1272,FLFO_004900,Not Sure,
645
+ 1274,FLFO_009139_1,Plausible,
646
+ 1275,FLFO_011046A,Plausible,
647
+ 1276,FLFO_010720A,Not Sure,
648
+ 1277,CU_0581,Not Sure,
649
+ 1283,FLFO_010552A,Not Sure,
650
+ 1284,FLFO_003235,Not Sure,
651
+ 1285,FLFO_003248,Not Sure,
652
+ 1287,FLFO_000536,Plausible,
653
+ 1290,CU_0582,Not Sure,
654
+ 1292,FLFO_009370,Not Sure,
655
+ 1294,FLFO_008604B,Not Sure,
656
+ 1296,FLFO_010591B,Not Sure,
657
+ 1297,FLFO_004719A,Not Sure,
658
+ 1298,FLFO_009697,Plausible,
659
+ 1299,FLFO_002718,Plausible,
660
+ 1301,FLFO_005647B,Plausible,
661
+ 1302,FLFO_010088B,Plausible,
662
+ 1304,FLFO_008991B,Plausible,
663
+ 1305,FLFO_010548A,Not Sure,
664
+ 1307,FLFO_011363,Plausible,
665
+ 1309,FLFO_010095,Plausible,
666
+ 1310,FLFO_010208,Plausible,
667
+ 1316,FLFO_006956,Plausible,
668
+ 1317,FLFO_008526A,Not Sure,
669
+ 1318,CU_0296cptcu,Plausible,
670
+ 1320,FLFO_011516A,Not Sure,
671
+ 1322,FLFO_004112B,Plausible,
672
+ 1324,FLFO_006361B,Not Sure,
673
+ 1326,FLFO_008503B,Not Sure,
674
+ 1329,FLFO_010342A_L2,Not Sure,
675
+ 1330,FLFO_006648,Plausible,
676
+ 1331,FLFO_002803A,Not Sure,
677
+ 1332,FLFO_004278A,Plausible,
678
+ 1334,FLFO_009979,Not Sure,
679
+ 1335,FLFO_006152,Not Sure,
680
+ 1338,FLFO_006176,Not Sure,
681
+ 1339,FLFO_006861B,Not Sure,
682
+ 1340,FLFO_002669,Not Sure,
683
+ 1341,FLFO_003759,Not Sure,
684
+ 1342,FLFO_008503A,Not Sure,
685
+ 1346,FLFO_003287B,Plausible,
686
+ 1347,FLFO_002866A,Plausible,
687
+ 1349,CU_0320,Plausible,
688
+ 1350,FLFO_003279B,Plausible,
689
+ 1352,FLFO_002828,Plausible,
690
+ 1354,FLFO_002768B,Not Sure,
691
+ 1355,FLFO_009676,Plausible,
692
+ 1361,FLFO_002940,Plausible,
693
+ 1362,FLFO_010064A,Plausible,
694
+ 1363,FLFO_008557B,Not Sure,
695
+ 1364,FLFO_002724,Plausible,
696
+ 1368,FLFO_011681,Not Sure,
697
+ 1369,FLFO_006627,Plausible,
698
+ 1370,FLFO_002739B,Plausible,
699
+ 1372,FLFO_005710A,Not Sure,
700
+ 1373,FLFO_010401A,Plausible,
701
+ 1374,FLFO_009054B,Plausible,
702
+ 1376,CU_0583,Not Sure,
703
+ 1378,FLFO_008992B,Not Sure,
704
+ 1381,FLFO_011107B,Not Sure,
705
+ 1383,FLFO_005647A,Plausible,
706
+ 1384,FLFO_006092B,Not Sure,
707
+ 1385,FLFO_009594B,Plausible,
708
+ 1387,FLFO_002439,Plausible,
709
+ 1388,FLFO_010077B,Not Sure,
710
+ 1391,FLFO_002602,Plausible,
711
+ 1392,FLFO_009137B,Plausible,
712
+ 1393,FLFO_008982B,Not Sure,
713
+ 1394,FLFO_004835B,Plausible,
714
+ 1395,FLFO_006142,Not Sure,
715
+ 1396,FLFO_004615,Not Sure,
716
+ 1397,FLFO_002583,Plausible,
717
+ 1398,FLFO_002892B,Not Sure,
718
+ 1399,FLFO_011050B_L2,Plausible,
719
+ 1400,CU_0531cu1,Plausible,
720
+ 1401,FLFO_002627B,Plausible,
721
+ 1405,FLFO_010136,Not Sure,
722
+ 1406,FLFO_010800B,Plausible,
723
+ 1407,FLFO_006159_L2,Plausible,
724
+ 1409,FLFO_009283,Plausible,
725
+ 1412,FLFO_000838,Plausible,
726
+ 1413,FLFO_009151B,Not Sure,
727
+ 1416,FLFO_000523 2,Not Sure,
728
+ 1417,FLFO_010076A,Not Sure,
729
+ 1418,FLFO_011172,Plausible,
730
+ 1420,FLFO_006846A,Plausible,
731
+ 1424,FLFO_011201_2,Plausible,
732
+ 1425,FLFO_010756B,Not Sure,
733
+ 1427,FLFO_009050,Plausible,
734
+ 1428,FLFO_010470B,Not Sure,
735
+ 1429,FLFO_004340A,Not Sure,
736
+ 1431,FLFO_009073,Plausible,
737
+ 1433,FLFO_003412B,Plausible,
738
+ 1435,FLFO_010211B,Not Sure,
739
+ 1437,FLFO_010919B,Not Sure,
740
+ 1438,FLFO_009079,Plausible,
741
+ 1442,FLFO_004870,Plausible,
742
+ 1444,FLFO_004852,Not Sure,
743
+ 1445,FLFO_004350A,Not Sure,
744
+ 1450,FLFO_006129,Plausible,
745
+ 1453,FLFO_011002A,Not Sure,
746
+ 1455,FLFO_006339,Plausible,
747
+ 1456,FLFO_010180B,Plausible,
748
+ 1460,FLFO_003414,Plausible,
749
+ 1461,FLFO_001051,Plausible,
750
+ 1462,FLFO_009591B,Plausible,
751
+ 1463,CU_1362,Plausible,
752
+ 1464,FLFO_010063B,Plausible,
753
+ 1467,FLFO_002625A,Plausible,
754
+ 1468,FLFO_004679A,Plausible,
755
+ 1469,FLFO_005669B,Plausible,
756
+ 1471,FLFO_0011648_1,Plausible,
757
+ 1474,FLFO_003339B,Plausible,
758
+ 1475,FLFO_000848,Not Sure,
759
+ 1477,FLFO_000850,Plausible,
760
+ 1478,FLFO_002390,Not Sure,
761
+ 1483,FLFO_009833B,Plausible,
762
+ 1487,FLFO_009372A,Plausible,
763
+ 1488,FLFO_011128,Plausible,
764
+ 1489,FLFO_009051B,Plausible,
765
+ 1490,FLFO_008583B,Plausible,
766
+ 1493,FLFO_003775,Plausible,
767
+ 1500,FLFO_004864,Not Sure,
768
+ 1501,FLFO_002698A,Plausible,
769
+ 1502,FLFO_009715B,Plausible,
770
+ 1503,FLFO_002467A,Plausible,
771
+ 1505,FLFO_004778B,Plausible,
772
+ 1509,FLFO_010209B,Plausible,
773
+ 1510,FLFO_010947,Plausible,
774
+ 1512,FLFO_011391B,Not Sure,
775
+ 1513,FLFO_010552B,Not Sure,
776
+ 1515,FLFO_008577A,Plausible,
777
+ 1517,FLFO_004334A,Not Sure,
778
+ 1518,CU_0123cu,Not Sure,
779
+ 1520,FLFO_004776,Plausible,
780
+ 1528,CU_0532,Plausible,
781
+ 1534,FLFO_005646A,Plausible,
782
+ 1535,CU_0331,Not Sure,
783
+ 1536,FLFO_006421B,Plausible,
784
+ 1538,FLFO_009256B,Not Sure,
785
+ 1539,FLFO_009038,Plausible,
786
+ 1542,FLFO_010361A,Not Sure,
787
+ 1543,FLFO_009150A,Plausible,
788
+ 1544,FLFO_003445B,Not Sure,
789
+ 1546,FLFO_008983B,Not Sure,
790
+ 1547,FLFO_011236_L,Plausible,
791
+ 1548,FLFO_010206A,Not Sure,
792
+ 1549,FLFO_009706A,Not Sure,
793
+ 1551,FLFO_000522,Not Sure,
794
+ 1552,FLFO_011037A,Not Sure,
795
+ 1553,FLFO_011352B,Not Sure,
796
+ 1554,FLFO_006695B,Not Sure,
797
+ 1555,FLFO_010209A,Not Sure,
798
+ 1556,FLFO_008541B,Plausible,
799
+ 1557,FLFO_008876_L,Not Sure,
800
+ 1558,FLFO_006699A,Plausible,
801
+ 1559,FLFO_009315B,Plausible,
802
+ 1561,FLFO_004781,Not Sure,
803
+ 1562,FLFO_002625B,Not Sure,
804
+ 1563,FLFO_002679B,Not Sure,
805
+ 1566,FLFO_008961,Not Sure,
806
+ 1567,FLFO_006144B,Not Sure,
807
+ 1568,FLFO_011509,Not Sure,
808
+ 1571,FLFO_010710A,Not Sure,
809
+ 1572,FLFO_006339 copy,Plausible,
810
+ 1575,FLFO_010218A,Plausible,
811
+ 1576,FLFO_002694A,Not Sure,
812
+ 1578,FLFO_011473,Plausible,
813
+ 1579,CU_0546cu,Plausible,
814
+ 1584,CU_0583cu,Plausible,
815
+ 1585,FLFO_002458,Plausible,
816
+ 1588,FLFO_002609A,Plausible,
817
+ 1591,FLFO_003466A,Not Sure,
818
+ 1594,FLFO_009023,Plausible,
819
+ 1595,FLFO_006876B,Not Sure,
820
+ 1599,FLFO_006369A,Not Sure,
821
+ 1602,FLFO_010958B,Not Sure,
822
+ 1603,FLFO_006428,Not Sure,
823
+ 1604,FLFO_011575A,Not Sure,
824
+ 1605,FLFO_004719B,Not Sure,
825
+ 1606,FLFO_009016,Plausible,
826
+ 1611,FLFO_008554B_L2,Not Sure,
827
+ 1612,FLFO_008723,Plausible,
828
+ 1613,FLFO_009069,Plausible,
829
+ 1616,FLFO_010216,Plausible,
830
+ 1617,FLFO_0011648,Not Sure,
831
+ 1619,FLFO_009152,Plausible,
832
+ 1632,FLFO_010470A,Not Sure,
833
+ 1633,FLFO_009071,Not Sure,
834
+ 1636,CU_0518,Plausible,
835
+ 1640,FLFO_002894A,Plausible,
836
+ 1644,FLFO_009057,Plausible,
837
+ 1645,FLFO_009078,Plausible,
838
+ 1647,FLFO_005690B,Not Sure,
839
+ 1649,FLFO_009042,Plausible,
840
+ 1651,FLFO_011174,Not Sure,
841
+ 1655,FLFO_009012,Not Sure,
842
+ 1658,FLFO_010895A,Not Sure,
843
+ 1659,FLFO_008821B,Not Sure,
844
+ 1660,FLFO_010640A,Not Sure,
845
+ 1661,FLFO_010093B,Not Sure,
846
+ 1665,FLFO_003771A,Not Sure,
847
+ 1666,FLFO_006861A,Not Sure,
848
+ 1667,FLFO_000844,Plausible,
849
+ 1668,FLFO_009052B,Plausible,
850
+ 1672,FLFO_009983,Not Sure,
851
+ 1673,FLFO_008775,Plausible,
852
+ 1675,FLFO_004624,Plausible,
853
+ 1676,FLFO_011161A,Plausible,
854
+ 1684,FLFO_011124B,Plausible,
855
+ 1686,FLFO_010361B,Not Sure,
856
+ 1689,FLFO_008888,Not Sure,
857
+ 1690,FLFO_004847A,Not Sure,
858
+ 1695,FLFO_010771A,Not Sure,
859
+ 1698,CU_0310,Not Sure,
860
+ 1699,FLFO_006373A,Not Sure,
861
+ 1703,FLFO_010884,Not Sure,
862
+ 1704,FLFO_003395B,Not Sure,
863
+ 1708,FLFO_004819,Plausible,
864
+ 1709,CU_0546,Plausible,
865
+ 1711,FLFO_004337A,Not Sure,
866
+ 1717,FLFO_009130B,Plausible,
867
+ 1718,FLFO_002739A,Plausible,
868
+ 1722,FLFO_003294A,Plausible,
labels.py CHANGED
@@ -178,15 +178,15 @@ for i in range(171):
178
  lookup_140 = {0: 'Anacardiaceae',
179
  1: 'Berberidaceae',
180
  2: 'Betulaceae',
181
- 3: 'Cupressaceae',
182
- 4: 'Dryopteridaceae',
183
  5: 'Fabaceae',
184
  6: 'Fagaceae',
185
  7: 'Juglandaceae',
186
  8: 'Lauraceae',
187
  9: 'Meliaceae',
188
  10: 'Myrtaceae',
189
- 11: 'Pinaceae',
190
  12: 'Rhamnaceae',
191
  13: 'Rosaceae',
192
  14: 'Salicaceae',
@@ -194,16 +194,16 @@ lookup_140 = {0: 'Anacardiaceae',
194
  16: 'Ulmaceae',
195
  17: 'Viburnaceae',
196
  18: 'Vitaceae',
197
- 19: 'Araceae',
198
  20: 'Grossulariaceae',
199
  21: 'Hydrangeaceae',
200
- 22: 'Taxaceae',
201
  23: 'Achariaceae',
202
  24: 'Actinidiaceae',
203
  25: 'Altingiaceae',
204
  26: 'Amaranthaceae',
205
  27: 'Annonaceae',
206
- 28: 'Apiaceae',
207
  29: 'Apocynaceae',
208
  30: 'Aquifoliaceae',
209
  31: 'Araliaceae',
@@ -212,7 +212,7 @@ lookup_140 = {0: 'Anacardiaceae',
212
  34: 'Bignoniaceae',
213
  35: 'Boraginaceae',
214
  36: 'Burseraceae',
215
- 37: 'Buxaceae',
216
  38: 'Calophyllaceae',
217
  39: 'Calycanthaceae',
218
  40: 'Campanulaceae',
@@ -220,7 +220,7 @@ lookup_140 = {0: 'Anacardiaceae',
220
  42: 'Cannabaceae',
221
  43: 'Capparaceae',
222
  44: 'Caprifoliaceae',
223
- 45: 'Cardiopteridaceae',
224
  46: 'Celastraceae',
225
  47: 'Chloranthaceae',
226
  48: 'Chrysobalanaceae',
@@ -229,7 +229,7 @@ lookup_140 = {0: 'Anacardiaceae',
229
  51: 'Connaraceae',
230
  52: 'Coriariaceae',
231
  53: 'Cornaceae',
232
- 54: 'Crassulaceae',
233
  55: 'Cucurbitaceae',
234
  56: 'Cunoniaceae',
235
  57: 'Dilleniaceae',
@@ -243,7 +243,7 @@ lookup_140 = {0: 'Anacardiaceae',
243
  65: 'Garryaceae',
244
  66: 'Geraniaceae',
245
  67: 'Gesneriaceae',
246
- 68: 'Gnetaceae',
247
  69: 'Hamamelidaceae',
248
  70: 'Humiriaceae',
249
  71: 'Hypericaceae',
@@ -260,7 +260,7 @@ lookup_140 = {0: 'Anacardiaceae',
260
  82: 'Magnoliaceae',
261
  83: 'Malpighiaceae',
262
  84: 'Malvaceae',
263
- 85: 'Marantaceae',
264
  86: 'Melastomataceae',
265
  87: 'Menispermaceae',
266
  88: 'Monimiaceae',
@@ -302,7 +302,7 @@ lookup_140 = {0: 'Anacardiaceae',
302
  124: 'Schisandraceae',
303
  125: 'Scrophulariaceae',
304
  126: 'Simaroubaceae',
305
- 127: 'Smilacaceae',
306
  128: 'Solanaceae',
307
  129: 'Staphyleaceae',
308
  130: 'Stemonuraceae',
 
178
  lookup_140 = {0: 'Anacardiaceae',
179
  1: 'Berberidaceae',
180
  2: 'Betulaceae',
181
+ 3: 'Crassulaceae',
182
+ 4: 'Cardiopteridaceae',
183
  5: 'Fabaceae',
184
  6: 'Fagaceae',
185
  7: 'Juglandaceae',
186
  8: 'Lauraceae',
187
  9: 'Meliaceae',
188
  10: 'Myrtaceae',
189
+ 11: 'Apiaceae',
190
  12: 'Rhamnaceae',
191
  13: 'Rosaceae',
192
  14: 'Salicaceae',
 
194
  16: 'Ulmaceae',
195
  17: 'Viburnaceae',
196
  18: 'Vitaceae',
197
+ 19: 'Acanthaceae',
198
  20: 'Grossulariaceae',
199
  21: 'Hydrangeaceae',
200
+ 22: 'Buxaceae',
201
  23: 'Achariaceae',
202
  24: 'Actinidiaceae',
203
  25: 'Altingiaceae',
204
  26: 'Amaranthaceae',
205
  27: 'Annonaceae',
206
+ 28: 'Cleomaceae',
207
  29: 'Apocynaceae',
208
  30: 'Aquifoliaceae',
209
  31: 'Araliaceae',
 
212
  34: 'Bignoniaceae',
213
  35: 'Boraginaceae',
214
  36: 'Burseraceae',
215
+ 37: 'Clethraceae',
216
  38: 'Calophyllaceae',
217
  39: 'Calycanthaceae',
218
  40: 'Campanulaceae',
 
220
  42: 'Cannabaceae',
221
  43: 'Capparaceae',
222
  44: 'Caprifoliaceae',
223
+ 45: 'Cercidiphyllaceae',
224
  46: 'Celastraceae',
225
  47: 'Chloranthaceae',
226
  48: 'Chrysobalanaceae',
 
229
  51: 'Connaraceae',
230
  52: 'Coriariaceae',
231
  53: 'Cornaceae',
232
+ 54: 'Trochodendraceae',
233
  55: 'Cucurbitaceae',
234
  56: 'Cunoniaceae',
235
  57: 'Dilleniaceae',
 
243
  65: 'Garryaceae',
244
  66: 'Geraniaceae',
245
  67: 'Gesneriaceae',
246
+ 68: 'Gunneraceae',
247
  69: 'Hamamelidaceae',
248
  70: 'Humiriaceae',
249
  71: 'Hypericaceae',
 
260
  82: 'Magnoliaceae',
261
  83: 'Malpighiaceae',
262
  84: 'Malvaceae',
263
+ 85: 'Hernandiaceae',
264
  86: 'Melastomataceae',
265
  87: 'Menispermaceae',
266
  88: 'Monimiaceae',
 
302
  124: 'Schisandraceae',
303
  125: 'Scrophulariaceae',
304
  126: 'Simaroubaceae',
305
+ 127: 'Atherospermataceae',
306
  128: 'Solanaceae',
307
  129: 'Staphyleaceae',
308
  130: 'Stemonuraceae',
run.sh ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # Activate virtual environment
4
+ source venv/bin/activate
5
+
6
+ # Check if .env file exists
7
+ if [ ! -f .env ]; then
8
+ echo "⚠️ Warning: .env file not found!"
9
+ echo ""
10
+ echo "Please create a .env file with your HuggingFace READ_TOKEN:"
11
+ echo " READ_TOKEN=your_token_here"
12
+ echo ""
13
+ echo "Get your token from: https://huggingface.co/settings/tokens"
14
+ echo ""
15
+ read -p "Press Enter to continue anyway (models may fail to download) or Ctrl+C to exit..."
16
+ fi
17
+
18
+ # Run the app
19
+ python app.py
20
+