piperod91 Cursor commited on
Commit
3a6d124
·
1 Parent(s): 840717a

App: launch only when __main__; 2024 embeddings (extant/fossils), Euclidean NN, include predicted family in top 5; recompute script

Browse files
all_fossils_filtered_100.csv DELETED
The diff for this file is too large to render. See raw diff
 
app.py CHANGED
@@ -225,13 +225,30 @@ def get_embeddings(input_image,model_name):
225
  return None
226
 
227
 
228
- def find_closest(input_image,model_name):
229
- embedding = get_embeddings(input_image,model_name)
230
- from closest_sample import get_images
231
- classes, paths, filenames = get_images(embedding,model_name)
232
- #outputs = classes+paths
 
 
 
 
 
 
 
 
 
 
 
233
  return classes, paths, filenames
234
 
 
 
 
 
 
 
235
  def generate_diagram_closest(input_image,model_name,top_k):
236
  embedding = get_embeddings(input_image,model_name)
237
  from closest_sample import get_diagram
@@ -486,7 +503,7 @@ def increase_brightness(img, value=30):
486
  def update_display(image, specimen_id=""):
487
  if image is None:
488
  specimen_label = "**Specimen ID:** —"
489
- return None, None, None, "Please upload or select an image first.", "Fossils 142", "Saliency", 10, 50, None, None, None, None, specimen_label
490
  try:
491
  print(f"DEBUG: update_display called with image type: {type(image)}")
492
  if hasattr(image, 'shape'):
@@ -506,7 +523,7 @@ def update_display(image, specimen_id=""):
506
  import traceback
507
  traceback.print_exc()
508
  specimen_label = "**Specimen ID:** —"
509
- return None, None, None, f"Error processing image: {str(e)}", "Fossils 142", "Saliency", 10, 50, None, None, None, None, specimen_label
510
  model_name = "Fossils 142"
511
 
512
  # gr.Dropdown(
@@ -535,13 +552,11 @@ def update_display(image, specimen_id=""):
535
  # gr.Slider(10,200,value=50,label="Number of Closest Samples for Distribution Chart",interactive=True,info="Choose between 10 and 200")
536
  class_predicted = None
537
  exp_gallery = None
538
- # 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)
539
  closest_table = None
540
- # gr.Gallery(label="Closest Images", show_label=False,elem_id="gallery",columns=[5], rows=[1],height='auto', allow_preview=True, preview=None)
541
- diagram= None
542
- # gr.Image(label = 'Bar Chart')
543
  specimen_label = f"**Specimen ID:** {specimen_id}" if specimen_id else "**Specimen ID:** — (uploaded image)"
544
- return original_image,processed_image,processed_image,instruction,model_name,explain_method,sampling_size,top_k,class_predicted,exp_gallery,closest_table,diagram,specimen_label
545
  def update_slider_visibility(explain_method):
546
  bool = explain_method=="Rise"
547
  return {sampling_size: gr.Slider(1, 5000, value=2000, label="Sampling Size in Rise", visible=bool, interactive=True)}
@@ -904,12 +919,20 @@ with gr.Blocks(theme='sudeepshouche/minimalist', css=custom_css) as demo:
904
  # label_closest_image_4 = gr.Markdown('')
905
  # closest_image_4 = gr.Image(label='Fifth Closest Image',image_mode='contain',width=200, height=200)
906
  # find_closest_btn = gr.Button("Find Closest Images")
907
- with gr.Accordion('Closest Fossil Images'):
908
- gr.Markdown("Finding 5 closest images in the dataset")
909
-
910
- closest_table = gr.HTML(label="Closest Images Table")
911
-
912
- find_closest_btn = gr.Button("Find Closest Images",icon = "https://www.svgrepo.com/show/13672/play-button.svg")
 
 
 
 
 
 
 
 
913
 
914
  #segment_button.click(segment_image, inputs=input_image, outputs=segmented_image)
915
  classify_image_button.click(classify_image, inputs=[original_image,model_name], outputs=class_predicted)
@@ -946,151 +969,104 @@ with gr.Blocks(theme='sudeepshouche/minimalist', css=custom_css) as demo:
946
  generate_explanations.click(fn=update_exp_outputs, inputs=[original_image,model_name,explain_method,sampling_size,heatmap_alpha], outputs=[exp_gallery])
947
 
948
  #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])
949
- def update_closest_outputs(input_image,model_name):
950
- labels, images, filenames = find_closest(input_image,model_name)
951
-
952
- # Create HTML table with images and full specimen names
 
953
  table_html = """
954
  <style>
955
- .closest-images-table {
956
- width: 100%;
957
- border-collapse: collapse;
958
- margin: 20px 0;
959
- }
960
- .closest-images-table th {
961
- background-color: #f0f0f0;
962
- padding: 12px;
963
- text-align: left;
964
- border: 1px solid #ddd;
965
- font-weight: bold;
966
- }
967
- .closest-images-table td {
968
- padding: 12px;
969
- border: 1px solid #ddd;
970
- vertical-align: middle;
971
- }
972
- .closest-images-table tr:nth-child(even) {
973
- background-color: inherit;
974
- }
975
- .closest-images-table img {
976
- max-width: 200px;
977
- max-height: 200px;
978
- object-fit: contain;
979
- border-radius: 4px;
980
- display: block;
981
- margin: 0 auto;
982
- }
983
- .specimen-name {
984
- font-size: 16px;
985
- font-weight: bold;
986
- color: #0066cc;
987
- font-family: monospace;
988
- }
989
- .plant-family {
990
- font-size: 14px;
991
- font-weight: 500;
992
- }
993
  </style>
994
  <table class="closest-images-table">
995
- <thead>
996
- <tr>
997
- <th>Rank</th>
998
- <th>Image</th>
999
- <th>Plant Family</th>
1000
- <th>Specimen Name</th>
1001
- </tr>
1002
- </thead>
1003
  <tbody>
1004
  """
1005
-
1006
- import os
1007
- import base64
1008
- from PIL import Image
1009
- import numpy as np
1010
-
1011
  for i in range(5):
1012
  rank = i + 1
1013
- # Handle image - convert to base64 for HTML display
1014
  img_src = ""
1015
-
1016
- if isinstance(images[i], str) and os.path.exists(images[i]):
1017
- # Local file path - convert to base64
1018
- try:
1019
- with open(images[i], 'rb') as f:
1020
- img_data = f.read()
1021
- img_base64 = base64.b64encode(img_data).decode('utf-8')
1022
- img_src = f"data:image/jpeg;base64,{img_base64}"
1023
- except Exception as e:
1024
- print(f"Error loading image {images[i]}: {e}")
1025
- img_src = ""
1026
- elif isinstance(images[i], np.ndarray):
1027
- # NumPy array - convert to PIL and then base64
1028
- try:
1029
- img = Image.fromarray(images[i])
1030
- import io
1031
- buffer = io.BytesIO()
1032
- img.save(buffer, format='JPEG')
1033
- img_base64 = base64.b64encode(buffer.getvalue()).decode('utf-8')
1034
- img_src = f"data:image/jpeg;base64,{img_base64}"
1035
- except Exception as e:
1036
- print(f"Error converting numpy array to image: {e}")
1037
- img_src = ""
1038
- elif hasattr(images[i], 'save'):
1039
- # PIL Image
1040
- try:
1041
- import io
1042
- buffer = io.BytesIO()
1043
- images[i].save(buffer, format='JPEG')
1044
- img_base64 = base64.b64encode(buffer.getvalue()).decode('utf-8')
1045
- img_src = f"data:image/jpeg;base64,{img_base64}"
1046
- except Exception as e:
1047
- print(f"Error converting PIL image: {e}")
1048
- img_src = ""
1049
-
1050
- plant_family = labels[i] if labels[i] else "Unknown"
1051
- specimen_name = filenames[i] if (i < len(filenames) and filenames[i] and len(filenames[i]) > 0) else "N/A"
1052
-
1053
- # Debug output
1054
- print(f"DEBUG: Rank {rank} - Family: {plant_family}, Specimen: {specimen_name}, Image: {images[i]}")
1055
- print(f"DEBUG: filenames array length: {len(filenames)}, filenames[{i}]: {filenames[i] if i < len(filenames) else 'OUT OF RANGE'}")
1056
-
1057
- table_html += f"""
1058
- <tr>
1059
- <td style="text-align: center; font-weight: bold; width: 60px; font-size: 18px;">{rank}</td>
1060
- <td style="text-align: center;">
1061
- <img src="{img_src}" alt="Closest image {rank}" />
1062
- <div style="margin-top: 8px; font-size: 12px; color: #666; word-break: break-all;">{specimen_name}</div>
1063
- </td>
1064
- <td class="plant-family">{plant_family}</td>
1065
- <td class="specimen-name" style="word-break: break-all;">{specimen_name}</td>
1066
- </tr>
1067
- """
1068
-
1069
- table_html += """
1070
- </tbody>
1071
- </table>
1072
- """
1073
-
1074
  return table_html
1075
 
1076
- find_closest_btn.click(fn=update_closest_outputs, inputs=[original_image,model_name], outputs=[closest_table])
 
 
 
 
 
 
1077
  #classify_segmented_button.click(classify_image, inputs=[segmented_image,model_name], outputs=class_predicted)
1078
 
1079
  generate_diagram.click(generate_diagram_closest, inputs=[original_image,model_name,top_k], outputs=diagram)
1080
 
1081
  process_button.click(
1082
- fn=update_display,
1083
- inputs=[input_image, specimen_id_state],
1084
- outputs=[original_image,input_image,workbench_image,instruction_text,model_name,explain_method,sampling_size,top_k,class_predicted,exp_gallery,closest_table,diagram,workbench_specimen_label]
1085
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1086
 
1087
-
1088
-
1089
-
1090
- demo.queue() # manage multiple incoming requests
1091
-
1092
- if os.getenv('SYSTEM') == 'spaces':
1093
- demo.launch(width='40%', debug=True, prevent_thread_lock=False)
1094
- #,auth=(os.environ.get('USERNAME'), os.environ.get('PASSWORD'))
1095
- else:
1096
- demo.launch(debug=True, prevent_thread_lock=False)
 
 
 
 
 
 
 
 
 
 
 
225
  return None
226
 
227
 
228
+ def _top_predicted_class(class_predicted):
229
+ """Extract the top predicted class name from Gradio Label output (dict or list)."""
230
+ if not class_predicted:
231
+ return None
232
+ if isinstance(class_predicted, dict):
233
+ return next(iter(class_predicted), None)
234
+ if isinstance(class_predicted, list) and class_predicted:
235
+ item = class_predicted[0]
236
+ return item[0] if isinstance(item, (list, tuple)) else item
237
+ return None
238
+
239
+
240
+ def find_closest(input_image, model_name, predicted_class=None):
241
+ embedding = get_embeddings(input_image, model_name)
242
+ from closest_sample import get_images, get_images_fossils
243
+ classes, paths, filenames = get_images(embedding, model_name, predicted_class=predicted_class)
244
  return classes, paths, filenames
245
 
246
+
247
+ def find_closest_fossils(input_image, model_name, predicted_class=None):
248
+ embedding = get_embeddings(input_image, model_name)
249
+ from closest_sample import get_images_fossils
250
+ return get_images_fossils(embedding, model_name, predicted_class=predicted_class)
251
+
252
  def generate_diagram_closest(input_image,model_name,top_k):
253
  embedding = get_embeddings(input_image,model_name)
254
  from closest_sample import get_diagram
 
503
  def update_display(image, specimen_id=""):
504
  if image is None:
505
  specimen_label = "**Specimen ID:** —"
506
+ return None, None, None, "Please upload or select an image first.", "Fossils 142", "Saliency", 10, 50, None, None, None, None, None, specimen_label
507
  try:
508
  print(f"DEBUG: update_display called with image type: {type(image)}")
509
  if hasattr(image, 'shape'):
 
523
  import traceback
524
  traceback.print_exc()
525
  specimen_label = "**Specimen ID:** —"
526
+ return None, None, None, f"Error processing image: {str(e)}", "Fossils 142", "Saliency", 10, 50, None, None, None, None, None, specimen_label
527
  model_name = "Fossils 142"
528
 
529
  # gr.Dropdown(
 
552
  # gr.Slider(10,200,value=50,label="Number of Closest Samples for Distribution Chart",interactive=True,info="Choose between 10 and 200")
553
  class_predicted = None
554
  exp_gallery = None
 
555
  closest_table = None
556
+ closest_fossils_table = None
557
+ diagram = None
 
558
  specimen_label = f"**Specimen ID:** {specimen_id}" if specimen_id else "**Specimen ID:** — (uploaded image)"
559
+ return original_image, processed_image, processed_image, instruction, model_name, explain_method, sampling_size, top_k, class_predicted, exp_gallery, closest_table, closest_fossils_table, diagram, specimen_label
560
  def update_slider_visibility(explain_method):
561
  bool = explain_method=="Rise"
562
  return {sampling_size: gr.Slider(1, 5000, value=2000, label="Sampling Size in Rise", visible=bool, interactive=True)}
 
919
  # label_closest_image_4 = gr.Markdown('')
920
  # closest_image_4 = gr.Image(label='Fifth Closest Image',image_mode='contain',width=200, height=200)
921
  # find_closest_btn = gr.Button("Find Closest Images")
922
+ with gr.Accordion('Closest Extant Leaves'):
923
+ gr.Markdown(
924
+ "5 closest extant leaves (2024 dataset). **Ordered from most to least similar.** "
925
+ "Neighbors are chosen by *embedding* similarity (visual), not by predicted family; "
926
+ "if you ran **Classify Image** first, we try to include at least one from the top-predicted family when possible."
927
+ )
928
+ closest_table = gr.HTML(label="Closest Extant Table")
929
+ with gr.Accordion('Closest Fossils'):
930
+ gr.Markdown(
931
+ "5 closest fossil images (reference fossil dataset). **Ordered from most to least similar.** "
932
+ "Same logic: embedding similarity + at least one from predicted family when you have run Classify Image."
933
+ )
934
+ closest_fossils_table = gr.HTML(label="Closest Fossils Table")
935
+ find_closest_btn = gr.Button("Find Closest Images", icon="https://www.svgrepo.com/show/13672/play-button.svg")
936
 
937
  #segment_button.click(segment_image, inputs=input_image, outputs=segmented_image)
938
  classify_image_button.click(classify_image, inputs=[original_image,model_name], outputs=class_predicted)
 
969
  generate_explanations.click(fn=update_exp_outputs, inputs=[original_image,model_name,explain_method,sampling_size,heatmap_alpha], outputs=[exp_gallery])
970
 
971
  #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])
972
+ def _closest_table_html(labels, images, filenames):
973
+ import os
974
+ import base64
975
+ import io
976
+ from PIL import Image
977
  table_html = """
978
  <style>
979
+ .closest-images-table { width: 100%; border-collapse: collapse; margin: 20px 0; }
980
+ .closest-images-table th { background-color: #f0f0f0; padding: 12px; text-align: left; border: 1px solid #ddd; font-weight: bold; }
981
+ .closest-images-table td { padding: 12px; border: 1px solid #ddd; vertical-align: middle; }
982
+ .closest-images-table img { max-width: 200px; max-height: 200px; object-fit: contain; border-radius: 4px; display: block; margin: 0 auto; }
983
+ .specimen-name { font-size: 16px; font-weight: bold; color: #0066cc; font-family: monospace; }
984
+ .plant-family { font-size: 14px; font-weight: 500; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
985
  </style>
986
  <table class="closest-images-table">
987
+ <thead><tr><th>Rank (1 = most similar)</th><th>Image</th><th>Plant Family</th><th>Specimen Name</th></tr></thead>
 
 
 
 
 
 
 
988
  <tbody>
989
  """
 
 
 
 
 
 
990
  for i in range(5):
991
  rank = i + 1
 
992
  img_src = ""
993
+ if i < len(images):
994
+ if isinstance(images[i], str) and images[i] and os.path.exists(images[i]):
995
+ try:
996
+ with open(images[i], 'rb') as f:
997
+ img_src = f"data:image/jpeg;base64,{base64.b64encode(f.read()).decode('utf-8')}"
998
+ except Exception:
999
+ pass
1000
+ elif isinstance(images[i], np.ndarray):
1001
+ try:
1002
+ img = Image.fromarray(images[i])
1003
+ buf = io.BytesIO()
1004
+ img.save(buf, format='JPEG')
1005
+ img_src = f"data:image/jpeg;base64,{base64.b64encode(buf.getvalue()).decode('utf-8')}"
1006
+ except Exception:
1007
+ pass
1008
+ elif hasattr(images[i], 'save'):
1009
+ try:
1010
+ buf = io.BytesIO()
1011
+ images[i].save(buf, format='JPEG')
1012
+ img_src = f"data:image/jpeg;base64,{base64.b64encode(buf.getvalue()).decode('utf-8')}"
1013
+ except Exception:
1014
+ pass
1015
+ plant_family = labels[i] if i < len(labels) and labels[i] else "Unknown"
1016
+ specimen_name = filenames[i] if (i < len(filenames) and filenames[i]) else "N/A"
1017
+ table_html += f'<tr><td style="text-align: center; font-weight: bold; width: 60px; font-size: 18px;">{rank}</td><td style="text-align: center;"><img src="{img_src}" alt="Closest {rank}" /><div style="margin-top: 8px; font-size: 12px; color: #666; word-break: break-all;">{specimen_name}</div></td><td class="plant-family">{plant_family}</td><td class="specimen-name" style="word-break: break-all;">{specimen_name}</td></tr>'
1018
+ table_html += "</tbody></table>"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1019
  return table_html
1020
 
1021
+ def update_closest_outputs(input_image, model_name, class_predicted):
1022
+ predicted_class = _top_predicted_class(class_predicted)
1023
+ extant_labels, extant_images, extant_filenames = find_closest(input_image, model_name, predicted_class=predicted_class)
1024
+ fossil_labels, fossil_images, fossil_filenames = find_closest_fossils(input_image, model_name, predicted_class=predicted_class)
1025
+ return _closest_table_html(extant_labels, extant_images, extant_filenames), _closest_table_html(fossil_labels, fossil_images, fossil_filenames)
1026
+
1027
+ find_closest_btn.click(fn=update_closest_outputs, inputs=[original_image, model_name, class_predicted], outputs=[closest_table, closest_fossils_table])
1028
  #classify_segmented_button.click(classify_image, inputs=[segmented_image,model_name], outputs=class_predicted)
1029
 
1030
  generate_diagram.click(generate_diagram_closest, inputs=[original_image,model_name,top_k], outputs=diagram)
1031
 
1032
  process_button.click(
1033
+ fn=update_display,
1034
+ inputs=[input_image, specimen_id_state],
1035
+ outputs=[
1036
+ original_image,
1037
+ input_image,
1038
+ workbench_image,
1039
+ instruction_text,
1040
+ model_name,
1041
+ explain_method,
1042
+ sampling_size,
1043
+ top_k,
1044
+ class_predicted,
1045
+ exp_gallery,
1046
+ closest_table,
1047
+ closest_fossils_table,
1048
+ diagram,
1049
+ workbench_specimen_label,
1050
+ ],
1051
+ )
1052
 
1053
+
1054
+ demo.queue() # manage multiple incoming requests
1055
+
1056
+
1057
+ def main():
1058
+ """
1059
+ Entry point for running the Gradio app.
1060
+
1061
+ Kept separate so that other modules (e.g. embedding scripts) can safely
1062
+ import from this file (such as `get_model`) without launching the UI.
1063
+ """
1064
+ if os.getenv("SYSTEM") == "spaces":
1065
+ demo.launch(width="40%", debug=True, prevent_thread_lock=False)
1066
+ # ,auth=(os.environ.get('USERNAME'), os.environ.get('PASSWORD'))
1067
+ else:
1068
+ demo.launch(debug=True, prevent_thread_lock=False)
1069
+
1070
+
1071
+ if __name__ == "__main__":
1072
+ main()
closest_sample.py CHANGED
@@ -174,6 +174,68 @@ def pca_distance(pca, sample, embedding, top_k):
174
  # Return exactly top_k neighbors (not top_k+1)
175
  return filtered_indices[:top_k]
176
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177
  def return_paths(argsorted,files):
178
  paths= []
179
  for i in argsorted:
@@ -189,18 +251,42 @@ def download_public_image(url, destination_path):
189
  else:
190
  print(f"Failed to download image from bucket. Status code: {response.status_code}")
191
 
192
- def get_images(embedding,model_name):
193
-
194
- if model_name in ['Rock 170','Mummified 170']:
195
  pca_fossils = load_pickle_safe('pca_fossils_170_finer.pkl')
196
  pca_leaves = load_pickle_safe('pca_leaves_170_finer.pkl')
197
  embedding_fossils = np.load('dataset/embedding_fossils_170_finer.npy')
198
- #embedding_leaves = np.load('embedding_leaves.npy')
199
  elif model_name in ['Fossils 142', 'Fossils BEiT']:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
  pca_fossils = load_pickle_safe('pca_fossils_142_resnet.pkl')
201
  pca_leaves = load_pickle_safe('pca_leaves_142_resnet.pkl')
202
  embedding_fossils = np.load('dataset/embedding_fossils_142_finer.npy')
203
- #embedding_leaves = np.load('embedding_leaves.npy')
204
  else:
205
  print(f'{model_name} not recognized')
206
  raise ValueError(f'{model_name} not recognized')
@@ -236,7 +322,6 @@ def get_images(embedding,model_name):
236
  # Extract the full specimen name from the original path using split('/')[-1]
237
  # e.g., /gpfs/.../Fabaceae/Fabaceae_Robinia_lesquereuxi_Florissant_FLFO_002604B.jpg
238
  # -> Fabaceae_Robinia_lesquereuxi_Florissant_FLFO_002604B.jpg (then remove extension)
239
- import os
240
  original_filename = path.split('/')[-1] # Get the last part of the path (filename)
241
  full_specimen_name = os.path.splitext(original_filename)[0] # Remove extension
242
 
@@ -258,6 +343,83 @@ def get_images(embedding,model_name):
258
 
259
  return classes, local_paths, filenames
260
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
261
  def get_diagram(embedding,top_k,model_name):
262
 
263
  if model_name in ['Rock 170','Mummified 170']:
@@ -266,10 +428,45 @@ def get_diagram(embedding,top_k,model_name):
266
  embedding_fossils = np.load('dataset/embedding_fossils_170_finer.npy')
267
  #embedding_leaves = np.load('embedding_leaves.npy')
268
  elif model_name in ['Fossils 142', 'Fossils BEiT']:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
269
  pca_fossils = load_pickle_safe('pca_fossils_142_resnet.pkl')
270
  pca_leaves = load_pickle_safe('pca_leaves_142_resnet.pkl')
271
  embedding_fossils = np.load('dataset/embedding_fossils_142_finer.npy')
272
- #embedding_leaves = np.load('embedding_leaves.npy')
273
  else:
274
  print(f'{model_name} not recognized')
275
  raise ValueError(f'{model_name} not recognized')
 
174
  # Return exactly top_k neighbors (not top_k+1)
175
  return filtered_indices[:top_k]
176
 
177
+
178
+ def pca_distance_simple(pca, sample, embedding, top_k):
179
+ """
180
+ Nearest neighbors using plain Euclidean distance in embedding space
181
+ (no PCA projection), without fossils_pd filtering.
182
+ Used for 2024 Extant / fossil embeddings + paths list.
183
+ """
184
+ sample = np.asarray(sample).reshape(-1)
185
+ embedding = np.asarray(embedding)
186
+ if embedding.ndim > 2:
187
+ embedding = embedding.reshape(-1, embedding.shape[-1])
188
+ embedding = _strip_label_column_if_present(embedding)
189
+ if embedding.ndim != 2:
190
+ raise ValueError(f"Expected 2D embedding array for neighbors, got shape {embedding.shape}")
191
+ # Euclidean distance in raw embedding space
192
+ distances = np.linalg.norm(embedding - sample, axis=1)
193
+ sorted_indices = np.argsort(distances)
194
+ return sorted_indices[:top_k]
195
+
196
+
197
+ def pca_distance_simple_with_predicted(
198
+ pca, sample, embedding, top_k, families, predicted_class
199
+ ):
200
+ """
201
+ Like pca_distance_simple (Euclidean in embedding space), but ensures at least one of the top_k is from
202
+ predicted_class when possible (so the top 5 can include the predicted family).
203
+ families: list of family label per embedding index; predicted_class: str or None.
204
+ """
205
+ sample = np.asarray(sample).reshape(-1)
206
+ embedding = np.asarray(embedding)
207
+ if embedding.ndim > 2:
208
+ embedding = embedding.reshape(-1, embedding.shape[-1])
209
+ embedding = _strip_label_column_if_present(embedding)
210
+ if embedding.ndim != 2:
211
+ raise ValueError(f"Expected 2D embedding array for neighbors, got shape {embedding.shape}")
212
+ distances = np.linalg.norm(embedding - sample, axis=1)
213
+ sorted_indices = np.argsort(distances)
214
+ top_indices = list(sorted_indices[:top_k])
215
+ if not predicted_class or len(families) != len(distances):
216
+ return np.array(top_indices)
217
+ top_families = [families[i] for i in top_indices]
218
+ if predicted_class in top_families:
219
+ return np.array(top_indices)
220
+ in_class = [j for j in range(len(families)) if families[j] == predicted_class]
221
+ if not in_class:
222
+ return np.array(top_indices)
223
+ best_in_class = in_class[np.argmin(distances[in_class])]
224
+ # Replace worst of top_k with closest from predicted class, then re-sort by distance
225
+ result = top_indices[: top_k - 1] + [best_in_class]
226
+ result = [result[i] for i in np.argsort(distances[result])]
227
+ return np.array(result)
228
+
229
+
230
+ def _load_2024_paths(paths_txt):
231
+ """Load paths from 2024 paths file (one path per line)."""
232
+ for candidate in (os.path.join(os.path.dirname(__file__), paths_txt), paths_txt):
233
+ if os.path.isfile(candidate):
234
+ with open(candidate, "r", encoding="utf-8") as f:
235
+ return [line.strip() for line in f if line.strip()]
236
+ return None
237
+
238
+
239
  def return_paths(argsorted,files):
240
  paths= []
241
  for i in argsorted:
 
251
  else:
252
  print(f"Failed to download image from bucket. Status code: {response.status_code}")
253
 
254
+ def get_images(embedding, model_name, predicted_class=None):
255
+ if model_name in ['Rock 170', 'Mummified 170']:
 
256
  pca_fossils = load_pickle_safe('pca_fossils_170_finer.pkl')
257
  pca_leaves = load_pickle_safe('pca_leaves_170_finer.pkl')
258
  embedding_fossils = np.load('dataset/embedding_fossils_170_finer.npy')
 
259
  elif model_name in ['Fossils 142', 'Fossils BEiT']:
260
+ emb_2024_npy = os.path.join(os.path.dirname(__file__), "dataset", "embedding_fossils_142_2024.npy")
261
+ emb_2024_txt = "dataset/embedding_fossils_142_2024_paths.txt"
262
+ paths_2024 = _load_2024_paths(emb_2024_txt)
263
+ if paths_2024 and os.path.isfile(emb_2024_npy):
264
+ embedding_fossils_2024 = np.load(emb_2024_npy)
265
+ if len(paths_2024) == len(embedding_fossils_2024):
266
+ pca_fossils = load_pickle_safe('pca_fossils_142_resnet.pkl')
267
+ families = []
268
+ for path in paths_2024:
269
+ parts = [p for p in path.replace("\\", "/").split("/") if p]
270
+ families.append(parts[-2] if len(parts) >= 2 else "Unknown")
271
+ if predicted_class:
272
+ pca_d = pca_distance_simple_with_predicted(
273
+ pca_fossils, embedding, embedding_fossils_2024, 5, families, predicted_class
274
+ )
275
+ else:
276
+ pca_d = pca_distance_simple(pca_fossils, embedding, embedding_fossils_2024, top_k=5)
277
+ local_paths = []
278
+ classes = []
279
+ filenames = []
280
+ for i, idx in enumerate(pca_d):
281
+ path = paths_2024[idx]
282
+ local_paths.append(path if os.path.isfile(path) else "")
283
+ filenames.append(os.path.splitext(os.path.basename(path))[0])
284
+ parts = [p for p in path.replace("\\", "/").split("/") if p]
285
+ classes.append(parts[-2] if len(parts) >= 2 else "Unknown")
286
+ return classes, local_paths, filenames
287
  pca_fossils = load_pickle_safe('pca_fossils_142_resnet.pkl')
288
  pca_leaves = load_pickle_safe('pca_leaves_142_resnet.pkl')
289
  embedding_fossils = np.load('dataset/embedding_fossils_142_finer.npy')
 
290
  else:
291
  print(f'{model_name} not recognized')
292
  raise ValueError(f'{model_name} not recognized')
 
322
  # Extract the full specimen name from the original path using split('/')[-1]
323
  # e.g., /gpfs/.../Fabaceae/Fabaceae_Robinia_lesquereuxi_Florissant_FLFO_002604B.jpg
324
  # -> Fabaceae_Robinia_lesquereuxi_Florissant_FLFO_002604B.jpg (then remove extension)
 
325
  original_filename = path.split('/')[-1] # Get the last part of the path (filename)
326
  full_specimen_name = os.path.splitext(original_filename)[0] # Remove extension
327
 
 
343
 
344
  return classes, local_paths, filenames
345
 
346
+
347
+ def get_images_fossils(embedding, model_name, predicted_class=None):
348
+ """
349
+ Use 2024 fossil embeddings (from fossils path) when available;
350
+ otherwise fall back to original finer.npy + fossils_pd + GCS. Fossils 142 / BEiT only.
351
+ When predicted_class is set, ensures at least one of the top 5 is from that family when possible.
352
+ """
353
+ if model_name not in ['Fossils 142', 'Fossils BEiT']:
354
+ return ["—"] * 5, [""] * 5, [""] * 5
355
+
356
+ emb_fossils_npy = os.path.join(os.path.dirname(__file__), "dataset", "embedding_fossils_142_2024_fossils.npy")
357
+ emb_fossils_txt = "dataset/embedding_fossils_142_2024_fossils_paths.txt"
358
+ paths_fossils = _load_2024_paths(emb_fossils_txt)
359
+ if paths_fossils and os.path.isfile(emb_fossils_npy):
360
+ embedding_fossils_2024 = np.load(emb_fossils_npy)
361
+ if len(paths_fossils) == len(embedding_fossils_2024):
362
+ pca_fossils = load_pickle_safe('pca_fossils_142_resnet.pkl')
363
+ families = []
364
+ for path in paths_fossils:
365
+ parts = [p for p in path.replace("\\", "/").split("/") if p]
366
+ families.append(parts[-2] if len(parts) >= 2 else "Unknown")
367
+ if predicted_class:
368
+ pca_d = pca_distance_simple_with_predicted(
369
+ pca_fossils, embedding, embedding_fossils_2024, 5, families, predicted_class
370
+ )
371
+ else:
372
+ pca_d = pca_distance_simple(pca_fossils, embedding, embedding_fossils_2024, top_k=5)
373
+ local_paths = []
374
+ classes = []
375
+ filenames = []
376
+ for idx in pca_d:
377
+ path = paths_fossils[idx]
378
+ local_paths.append(path if os.path.isfile(path) else "")
379
+ filenames.append(os.path.splitext(os.path.basename(path))[0])
380
+ parts = [p for p in path.replace("\\", "/").split("/") if p]
381
+ classes.append(parts[-2] if len(parts) >= 2 else "Unknown")
382
+ return classes, local_paths, filenames
383
+
384
+ # Fallback: original fossil set + GCS
385
+ pca_fossils = load_pickle_safe('pca_fossils_142_resnet.pkl')
386
+ embedding_fossils = np.load('dataset/embedding_fossils_142_finer.npy')
387
+ pca_d = pca_distance(pca_fossils, embedding, embedding_fossils, top_k=5)
388
+ fossils_paths = fossils_pd['file_name'].values
389
+ paths = return_paths(pca_d, fossils_paths)
390
+
391
+ folder_florissant = 'https://storage.googleapis.com/serrelab/prj_fossils/2024/Florissant_Fossil_v2.0/'
392
+ folder_general = 'https://storage.googleapis.com/serrelab/prj_fossils/2024/General_Fossil_v2.0/'
393
+
394
+ local_paths = []
395
+ classes = []
396
+ filenames = []
397
+ for i, path in enumerate(paths):
398
+ local_file_path = f'fossil_image_{i}.jpg'
399
+ public_path = None
400
+ if 'Florissant_Fossil/512/full/jpg/' in path:
401
+ public_path = path.replace('/gpfs/data/tserre/irodri15/Fossils/new_data/leavesdb-v1_1/images/Fossil/Florissant_Fossil/512/full/jpg/', folder_florissant)
402
+ elif 'General_Fossil/512/full/jpg/' in path:
403
+ public_path = path.replace('/gpfs/data/tserre/irodri15/Fossils/new_data/leavesdb-v1_1/images/Fossil/General_Fossil/512/full/jpg/', folder_general)
404
+ else:
405
+ filenames.append("")
406
+ classes.append("Unknown")
407
+ local_paths.append("")
408
+ continue
409
+ original_filename = path.split('/')[-1]
410
+ full_specimen_name = os.path.splitext(original_filename)[0]
411
+ download_public_image(public_path, local_file_path)
412
+ filenames.append(full_specimen_name)
413
+ parts = [part for part in public_path.split('/') if part]
414
+ classes.append(parts[-2])
415
+ local_paths.append(local_file_path)
416
+ while len(classes) < 5:
417
+ classes.append("—")
418
+ local_paths.append("")
419
+ filenames.append("")
420
+ return classes, local_paths, filenames
421
+
422
+
423
  def get_diagram(embedding,top_k,model_name):
424
 
425
  if model_name in ['Rock 170','Mummified 170']:
 
428
  embedding_fossils = np.load('dataset/embedding_fossils_170_finer.npy')
429
  #embedding_leaves = np.load('embedding_leaves.npy')
430
  elif model_name in ['Fossils 142', 'Fossils BEiT']:
431
+ emb_2024_npy = os.path.join(os.path.dirname(__file__), "dataset", "embedding_fossils_142_2024.npy")
432
+ emb_2024_txt = "dataset/embedding_fossils_142_2024_paths.txt"
433
+ paths_2024 = _load_2024_paths(emb_2024_txt)
434
+ if paths_2024 and os.path.isfile(emb_2024_npy):
435
+ embedding_fossils_2024 = np.load(emb_2024_npy)
436
+ if len(paths_2024) == len(embedding_fossils_2024):
437
+ pca_fossils = load_pickle_safe('pca_fossils_142_resnet.pkl')
438
+ pca_d = pca_distance_simple(pca_fossils, embedding, embedding_fossils_2024, top_k=top_k)
439
+ classes = []
440
+ for idx in pca_d:
441
+ path = paths_2024[idx]
442
+ parts = [p for p in path.replace("\\", "/").split("/") if p]
443
+ classes.append(parts[-2] if len(parts) >= 2 else "Unknown")
444
+ class_counts = Counter(classes)
445
+ if not class_counts:
446
+ fig, ax = plt.subplots()
447
+ ax.text(0.5, 0.5, "No valid neighbors available", ha="center", va="center")
448
+ ax.axis("off")
449
+ diagram_path = "class_distribution_chart.png"
450
+ plt.savefig(diagram_path)
451
+ plt.close()
452
+ return diagram_path
453
+ sorted_class_counts = sorted(class_counts.items(), key=lambda item: item[1], reverse=True)
454
+ sorted_classes, sorted_frequencies = zip(*sorted_class_counts)
455
+ colors = plt.cm.viridis(np.linspace(0, 1, len(sorted_classes)))
456
+ fig, ax = plt.subplots()
457
+ ax.bar(sorted_classes, sorted_frequencies, color=colors)
458
+ ax.set_xlabel('Plant Family')
459
+ ax.set_ylabel('Frequency')
460
+ ax.set_title('Distribution of Plant Family of '+str(top_k) +' Closest Samples')
461
+ ax.set_xticklabels(sorted_classes, rotation=45, ha='right')
462
+ diagram_path = 'class_distribution_chart.png'
463
+ plt.tight_layout()
464
+ plt.savefig(diagram_path)
465
+ plt.close()
466
+ return diagram_path
467
  pca_fossils = load_pickle_safe('pca_fossils_142_resnet.pkl')
468
  pca_leaves = load_pickle_safe('pca_leaves_142_resnet.pkl')
469
  embedding_fossils = np.load('dataset/embedding_fossils_142_finer.npy')
 
470
  else:
471
  print(f'{model_name} not recognized')
472
  raise ValueError(f'{model_name} not recognized')
fossil_responses_with_images.csv DELETED
@@ -1,868 +0,0 @@
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,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fossils_paths.csv DELETED
The diff for this file is too large to render. See raw diff
 
recompute_embeddings_2024.py ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from typing import List
3
+
4
+ import numpy as np
5
+ from PIL import Image
6
+
7
+ from app import get_model
8
+ from inference_resnet_v2 import inference_resnet_embedding_v2
9
+
10
+
11
+ # Base directory containing 2024 data.
12
+ BASE_DIR = "/Users/pipe/Documents/Brown/Fossils/2024"
13
+
14
+ # Subfolders to use for fossil similarity embeddings (fossils path).
15
+ FOSSIL_ROOTS = [
16
+ os.path.join(BASE_DIR, "Florissant_Fossil_v2.0"),
17
+ os.path.join(BASE_DIR, "General_Fossil_v2.0"),
18
+ ]
19
+
20
+ # Output locations (relative to fossil_app/ when run from there).
21
+ EMBEDDINGS_NPY = os.path.join("dataset", "embedding_fossils_142_2024_fossils.npy")
22
+ PATHS_TXT = os.path.join("dataset", "embedding_fossils_142_2024_fossils_paths.txt")
23
+
24
+
25
+ def iter_image_paths(roots: List[str]) -> List[str]:
26
+ """Collect all image paths under the given roots."""
27
+ exts = (".jpg", ".jpeg", ".png", ".webp")
28
+ paths: List[str] = []
29
+ for root in roots:
30
+ if not os.path.isdir(root):
31
+ print(f"WARNING: root directory not found: {root}")
32
+ continue
33
+ for dirpath, _, filenames in os.walk(root):
34
+ for fn in filenames:
35
+ if not fn.lower().endswith(exts):
36
+ continue
37
+
38
+ stem, _ = os.path.splitext(fn)
39
+ stem_lower = stem.lower()
40
+
41
+ # Skip "unidentified" and "II." IDs if they appear
42
+ if stem_lower.startswith("unidentified") or stem.startswith("II."):
43
+ print(f"SKIP (unidentified / II.* ID): {os.path.join(dirpath, fn)}")
44
+ continue
45
+
46
+ # We are already scoping to Extant_Leaves via FOSSIL_ROOTS,
47
+ # so we accept all remaining JPG/PNG/WEBP files here.
48
+ paths.append(os.path.join(dirpath, fn))
49
+ return sorted(paths)
50
+
51
+
52
+ def load_image_rgb(path: str) -> np.ndarray:
53
+ """Load an image from disk as RGB numpy array."""
54
+ img = Image.open(path).convert("RGB")
55
+ return np.array(img, dtype=np.uint8)
56
+
57
+
58
+ def main() -> None:
59
+ os.makedirs(os.path.dirname(EMBEDDINGS_NPY), exist_ok=True)
60
+
61
+ # Load the latest Fossils 142 model via the same helper the app uses.
62
+ model, n_classes = get_model("Fossils 142")
63
+ print(f"Loaded model for 'Fossils 142' with {n_classes} classes.")
64
+
65
+ image_paths = iter_image_paths(FOSSIL_ROOTS)
66
+ print(f"Found {len(image_paths)} images under {BASE_DIR}.")
67
+ if not image_paths:
68
+ print("No images found. Check BASE_DIR and FOSSIL_ROOTS paths.")
69
+ return
70
+
71
+ embeddings: List[np.ndarray] = []
72
+
73
+ # Open path mapping file for reproducibility.
74
+ with open(PATHS_TXT, "w", encoding="utf-8") as f_paths:
75
+ for idx, path in enumerate(image_paths):
76
+ if idx % 100 == 0:
77
+ print(f"[{idx}/{len(image_paths)}] Processing {path}")
78
+ try:
79
+ img = load_image_rgb(path)
80
+ emb = inference_resnet_embedding_v2(
81
+ img, model, size=384, n_classes=n_classes
82
+ )
83
+ embeddings.append(emb.astype(np.float32))
84
+ f_paths.write(path + "\n")
85
+ except Exception as e:
86
+ print(f"ERROR processing {path}: {e}")
87
+
88
+ if not embeddings:
89
+ print("No embeddings were computed.")
90
+ return
91
+
92
+ embs_arr = np.stack(embeddings, axis=0)
93
+ np.save(EMBEDDINGS_NPY, embs_arr)
94
+ print(f"Saved embeddings array {embs_arr.shape} to {EMBEDDINGS_NPY}")
95
+ print(f"Saved path list to {PATHS_TXT}")
96
+
97
+
98
+ if __name__ == "__main__":
99
+ main()
100
+