init
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +1 -0
- README.md +2 -2
- app.py +226 -0
- gradio_example_images/baloo.png +3 -0
- gradio_example_images/bear1.png +3 -0
- gradio_example_images/bear2.png +3 -0
- gradio_example_images/bear3.png +3 -0
- gradio_example_images/bear4.png +3 -0
- gradio_example_images/bears/.DS_Store +0 -0
- gradio_example_images/bears/baloo.png +3 -0
- gradio_example_images/bears/bear1.png +3 -0
- gradio_example_images/bears/bear2.png +3 -0
- gradio_example_images/bears/bear3.png +3 -0
- gradio_example_images/bears/bear4.png +3 -0
- gradio_example_images/bears/dumbo.png +3 -0
- gradio_example_images/bears/elephant1.png +3 -0
- gradio_example_images/bears/elephant2.png +3 -0
- gradio_example_images/bears/horse1.png +3 -0
- gradio_example_images/bears/horse2.png +3 -0
- gradio_example_images/bears/horse3.png +3 -0
- gradio_example_images/bears/horseanime.png +3 -0
- gradio_example_images/bears/mylittlepony.png +3 -0
- gradio_example_images/bears/phanpy.png +3 -0
- gradio_example_images/bears/ponyta.png +3 -0
- gradio_example_images/bears/winnie.png +3 -0
- gradio_example_images/dumbo.png +3 -0
- gradio_example_images/elephant1.png +3 -0
- gradio_example_images/elephant2.png +3 -0
- gradio_example_images/horse1.png +3 -0
- gradio_example_images/horse2.png +3 -0
- gradio_example_images/horse3.png +3 -0
- gradio_example_images/horseanime.png +3 -0
- gradio_example_images/mylittlepony.png +3 -0
- gradio_example_images/phanpy.png +3 -0
- gradio_example_images/ponyta.png +3 -0
- gradio_example_images/winnie.png +3 -0
- models/shapes/bear.obj +0 -0
- models/shapes/elephant.obj +0 -0
- models/shapes/horse.obj +0 -0
- models/weights/bear.pth +3 -0
- models/weights/bear_cse.pth +3 -0
- models/weights/bear_lbo.pth +3 -0
- models/weights/elephant.pth +3 -0
- models/weights/elephant_cse.pth +3 -0
- models/weights/elephant_lbo.pth +3 -0
- models/weights/horse.pth +3 -0
- models/weights/horse_cse.pth +3 -0
- models/weights/horse_lbo.pth +3 -0
- models/weights/sphere_faces.pth +3 -0
- models/weights/sphere_verts.pth +3 -0
.gitattributes
CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
*.png filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1 |
---
|
2 |
title: Shic
|
3 |
-
emoji:
|
4 |
colorFrom: purple
|
5 |
-
colorTo:
|
6 |
sdk: gradio
|
7 |
sdk_version: 4.39.0
|
8 |
app_file: app.py
|
|
|
1 |
---
|
2 |
title: Shic
|
3 |
+
emoji: 📊
|
4 |
colorFrom: purple
|
5 |
+
colorTo: green
|
6 |
sdk: gradio
|
7 |
sdk_version: 4.39.0
|
8 |
app_file: app.py
|
app.py
ADDED
@@ -0,0 +1,226 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import os
|
3 |
+
import numpy as np
|
4 |
+
import trimesh as tm
|
5 |
+
from src.model import DinoV2
|
6 |
+
from src.shape_model import CSE
|
7 |
+
from PIL import Image, ImageDraw
|
8 |
+
import torch
|
9 |
+
from torchvision import transforms
|
10 |
+
import matplotlib.pyplot as plt
|
11 |
+
import hashlib
|
12 |
+
|
13 |
+
def image_hash(image):
|
14 |
+
"""Generate a hash for an image."""
|
15 |
+
image_bytes = image.tobytes()
|
16 |
+
hash_function = hashlib.sha256()
|
17 |
+
hash_function.update(image_bytes)
|
18 |
+
return hash_function.hexdigest()
|
19 |
+
|
20 |
+
|
21 |
+
#device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
22 |
+
device = torch.device('cpu')
|
23 |
+
models = {}
|
24 |
+
for class_name in ['bear', 'horse', 'elephant']:
|
25 |
+
print(f'Loading model weights for {class_name}')
|
26 |
+
models[class_name] = {
|
27 |
+
'image_encoder': DinoV2(16),
|
28 |
+
'cse': CSE(class_name=class_name, num_basis=64, device=device)
|
29 |
+
}
|
30 |
+
models[class_name]['image_encoder'].load_state_dict(torch.load(f'./models/weights/{class_name}.pth', map_location=device))
|
31 |
+
models[class_name]['cse'].load_state_dict(torch.load(f'./models/weights/{class_name}_cse.pth', map_location=device))
|
32 |
+
models[class_name]['cse'].functional_basis = torch.load(f'./models/weights/{class_name}_lbo.pth', map_location=device)
|
33 |
+
|
34 |
+
models[class_name]['image_encoder'] = models[class_name]['image_encoder'].to(device)
|
35 |
+
models[class_name]['cse'] = models[class_name]['cse'].to(device)
|
36 |
+
models[class_name]['cse'].functional_basis = models[class_name]['cse'].functional_basis.to(device)
|
37 |
+
models[class_name]['cse'].weight_matrix = models[class_name]['cse'].weight_matrix.to(device)
|
38 |
+
|
39 |
+
models[class_name]['shape_feats'] = models[class_name]['cse']().to(device)
|
40 |
+
|
41 |
+
# Convert PIL image to a format your model expects (e.g., torch.Tensor)
|
42 |
+
transform = transforms.Compose([
|
43 |
+
transforms.Resize((224, 224)),
|
44 |
+
transforms.ToTensor(),
|
45 |
+
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
|
46 |
+
])
|
47 |
+
|
48 |
+
cached_features = {'bear': {}, 'horse': {}, 'elephant': {}}
|
49 |
+
|
50 |
+
text_description = """
|
51 |
+
# Demo for SHIC: Shape-Image Correspondences with no Keypoint Superivision (ECCV 2024)
|
52 |
+
Project website: https://www.robots.ox.ac.uk/~vgg/research/shic/
|
53 |
+
|
54 |
+
- **Step 1:** First select a class (now it defaults to 'bear')
|
55 |
+
- **Step 2:** Upload an image of an animal from that class (or select one of the provided examples)
|
56 |
+
- **Step 3:** Click on the image (somewhere over the object) to see the image-to-shape correspondences. You can keep clicking on the input image to see new correspondences.
|
57 |
+
|
58 |
+
Notes:
|
59 |
+
- You can click and drag to rotate the 3D shape
|
60 |
+
- Currently the demo supports bears, horses, and elephants. Other classes coming soon!
|
61 |
+
- Make sure you have selected the correct class for your image (It works cross-class too though!)
|
62 |
+
"""
|
63 |
+
|
64 |
+
example_images_dir = './gradio_example_images/'
|
65 |
+
example_images_names = [
|
66 |
+
'bear1.png', 'bear2.png', 'bear3.png', 'winnie.png',
|
67 |
+
'horse1.png', 'horse2.png', 'mylittlepony.png', 'ponyta.png',
|
68 |
+
'elephant1.png', 'elephant2.png', 'dumbo.png', 'phanpy.png'
|
69 |
+
]
|
70 |
+
example_images = [os.path.join(example_images_dir, img) for img in example_images_names]
|
71 |
+
sphere_verts_ = torch.load(f'./models/weights/sphere_verts.pth', map_location=device)
|
72 |
+
sphere_faces_ = torch.load(f'./models/weights/sphere_faces.pth', map_location=device)
|
73 |
+
def center_crop(img):
|
74 |
+
"""
|
75 |
+
Center crops an image to the target size of 224x224.
|
76 |
+
"""
|
77 |
+
width, height = img.size # Get dimensions
|
78 |
+
# Calculate the target size for center cropping
|
79 |
+
target_size = min(width, height)
|
80 |
+
|
81 |
+
# Calculate the coordinates for center cropping
|
82 |
+
left = (width - target_size) // 2
|
83 |
+
top = (height - target_size) // 2
|
84 |
+
right = left + target_size
|
85 |
+
bottom = top + target_size
|
86 |
+
|
87 |
+
# Perform center cropping
|
88 |
+
cropped_img = img.crop((left, top, right, bottom))
|
89 |
+
|
90 |
+
return cropped_img
|
91 |
+
|
92 |
+
def draw_point_on_image(image, x_, y_):
|
93 |
+
"""Draws a red dot on a copy of the image at the specified point."""
|
94 |
+
# Make a copy of the image to avoid altering the original
|
95 |
+
image_copy = image.copy()
|
96 |
+
draw = ImageDraw.Draw(image_copy)
|
97 |
+
x, y = x_, y_ # Adjust these based on the actual structure of `point`
|
98 |
+
dot_radius = image.size[0] // 100
|
99 |
+
# Draw a red dot
|
100 |
+
draw.ellipse([(y-dot_radius, x-dot_radius), (y+dot_radius, x+dot_radius)], fill='red')
|
101 |
+
|
102 |
+
return image_copy
|
103 |
+
|
104 |
+
def rotate_y(vertices, angle_degrees):
|
105 |
+
angle_radians = np.radians(angle_degrees)
|
106 |
+
rotation_matrix = np.array([
|
107 |
+
[np.cos(angle_radians), 0, np.sin(angle_radians)],
|
108 |
+
[0, 1, 0],
|
109 |
+
[-np.sin(angle_radians), 0, np.cos(angle_radians)]
|
110 |
+
])
|
111 |
+
|
112 |
+
# Assuming vertices is a numpy array of shape (N, 3)
|
113 |
+
rotated_vertices = np.dot(vertices, rotation_matrix)
|
114 |
+
return rotated_vertices
|
115 |
+
|
116 |
+
def make_final_mesh(verts, faces, similarities):
|
117 |
+
vert_argmax = similarities.argmax(dim=1)
|
118 |
+
vertex = verts[vert_argmax]
|
119 |
+
color=[255, 0, 0]
|
120 |
+
|
121 |
+
vertex_colors=similarities.transpose(1,0).cpu().detach().numpy()
|
122 |
+
# to viridis color map
|
123 |
+
vertex_colors = plt.cm.viridis(vertex_colors)[:, 0, :3]
|
124 |
+
|
125 |
+
num_verts_so_far = len(verts)
|
126 |
+
|
127 |
+
|
128 |
+
# Create a sphere mesh
|
129 |
+
|
130 |
+
# Scale and translate the sphere to the desired location and size
|
131 |
+
scale_dot = 0.015 # radius of the sphere
|
132 |
+
translation = torch.tensor(vertex, device=device).unsqueeze(0) # desired location
|
133 |
+
|
134 |
+
verts_sphere = sphere_verts_ * scale_dot + translation # scale and translate vertices
|
135 |
+
faces_sphere = sphere_faces_ + num_verts_so_far # faces are the same
|
136 |
+
|
137 |
+
verts_rgb_sphere = torch.tensor([color], device=device).expand(verts_sphere.shape[0], -1)[None] / 255 # [1, N, 3]
|
138 |
+
|
139 |
+
|
140 |
+
# verts and all sphere verts
|
141 |
+
# concat np arrays verts + verts_sphere.cpu().numpy() (4936,3) (2562,3)
|
142 |
+
all_verts = np.concatenate([verts, verts_sphere.cpu().numpy()], axis=0)
|
143 |
+
all_faces = np.concatenate([faces, faces_sphere.cpu().numpy()], axis=0)
|
144 |
+
|
145 |
+
all_textures = np.concatenate([vertex_colors, verts_rgb_sphere.cpu().numpy()[0]], axis=0)
|
146 |
+
|
147 |
+
return tm.Trimesh(vertices=all_verts, faces=all_faces, vertex_colors=all_textures)
|
148 |
+
|
149 |
+
def process_mesh(image, class_name, x_, y_):
|
150 |
+
x_, y_ = x_, y_
|
151 |
+
h, w = image.size
|
152 |
+
|
153 |
+
x = torch.tensor(x_ * 224 / w)
|
154 |
+
y = torch.tensor(y_ * 224 / h)
|
155 |
+
|
156 |
+
hashed_image = image_hash(image)
|
157 |
+
if hashed_image in cached_features[class_name]:
|
158 |
+
feats = cached_features[class_name][hashed_image]
|
159 |
+
else:
|
160 |
+
|
161 |
+
image_tensor = transform(image).unsqueeze(0)
|
162 |
+
|
163 |
+
# Predict texture
|
164 |
+
feats = models[class_name]['image_encoder'](image_tensor.to(device))
|
165 |
+
|
166 |
+
cached_features[class_name][hashed_image] = feats
|
167 |
+
|
168 |
+
# print('feats shape', feats.shape)
|
169 |
+
|
170 |
+
sampled_feats = feats[:, :, x.long(), y.long()]
|
171 |
+
similarities = torch.einsum('ik, lk -> il', sampled_feats, models[class_name]['shape_feats'])
|
172 |
+
# normalize similarities
|
173 |
+
similarities = (similarities - similarities.min()) / (similarities.max() - similarities.min())
|
174 |
+
|
175 |
+
faces = models[class_name]['cse'].shape['faces'].cpu().numpy().copy()
|
176 |
+
verts = models[class_name]['cse'].shape['verts'].cpu().numpy().copy()
|
177 |
+
|
178 |
+
# rotate the shape 235
|
179 |
+
verts = rotate_y(verts, 145)
|
180 |
+
|
181 |
+
mesh = make_final_mesh(verts, faces, similarities)
|
182 |
+
# save as obj
|
183 |
+
mesh_path = './mesh.obj'
|
184 |
+
mesh.export(mesh_path)
|
185 |
+
|
186 |
+
return mesh_path
|
187 |
+
|
188 |
+
def update_output(image, class_name, evt: gr.SelectData):
|
189 |
+
if class_name is None:
|
190 |
+
class_name = 'bear'
|
191 |
+
# This function will be triggered when an image is clicked.
|
192 |
+
# evt contains the click event data, including the coordinates.
|
193 |
+
x_, y_ = evt.index[1], evt.index[0]
|
194 |
+
modified_image = draw_point_on_image(image, x_, y_)
|
195 |
+
mesh_path = process_mesh(image, class_name, x_, y_)
|
196 |
+
return modified_image, mesh_path # Replace with the actual model path
|
197 |
+
|
198 |
+
|
199 |
+
with gr.Blocks() as demo:
|
200 |
+
# choose a class
|
201 |
+
gr.Markdown(text_description)
|
202 |
+
|
203 |
+
|
204 |
+
with gr.Row(variant="panel"):
|
205 |
+
with gr.Column(scale=1):
|
206 |
+
class_name = gr.Dropdown(choices=['bear', 'horse', 'elephant'],
|
207 |
+
label="Select a class (defaults to 'bear')")
|
208 |
+
input_img = gr.Image(label="Input", type="pil", width=256)
|
209 |
+
gr.Examples(
|
210 |
+
examples = example_images,
|
211 |
+
inputs = [input_img],
|
212 |
+
cache_examples=False,
|
213 |
+
label='Feel free to use one of our provided examples!',
|
214 |
+
examples_per_page=30
|
215 |
+
)
|
216 |
+
with gr.Column(scale=1):
|
217 |
+
output_img = gr.Image(label="Selected Point", interactive=False, height=512)
|
218 |
+
with gr.Column(scale=1):
|
219 |
+
output = gr.Model3D(label='Pixel to Vertex Similarities', height=512)
|
220 |
+
|
221 |
+
|
222 |
+
|
223 |
+
input_img.select(update_output, [input_img, class_name], [output_img, output])
|
224 |
+
|
225 |
+
if __name__ == "__main__":
|
226 |
+
demo.launch(share=True)
|
gradio_example_images/baloo.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bear1.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bear2.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bear3.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bear4.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/.DS_Store
ADDED
Binary file (6.15 kB). View file
|
|
gradio_example_images/bears/baloo.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/bear1.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/bear2.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/bear3.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/bear4.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/dumbo.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/elephant1.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/elephant2.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/horse1.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/horse2.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/horse3.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/horseanime.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/mylittlepony.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/phanpy.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/ponyta.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/bears/winnie.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/dumbo.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/elephant1.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/elephant2.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/horse1.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/horse2.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/horse3.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/horseanime.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/mylittlepony.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/phanpy.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/ponyta.png
ADDED
![]() |
Git LFS Details
|
gradio_example_images/winnie.png
ADDED
![]() |
Git LFS Details
|
models/shapes/bear.obj
ADDED
The diff for this file is too large to render.
See raw diff
|
|
models/shapes/elephant.obj
ADDED
The diff for this file is too large to render.
See raw diff
|
|
models/shapes/horse.obj
ADDED
The diff for this file is too large to render.
See raw diff
|
|
models/weights/bear.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:231e2af384361aa7b093cf7cde646d25e7a3ad1c4ffd3b57c78c10cf9401fa41
|
3 |
+
size 121594483
|
models/weights/bear_cse.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:ef81c20f946a0855214546cac4e7fcc3a5415eb87e2192e4ed3d156881bad1a2
|
3 |
+
size 4907
|
models/weights/bear_lbo.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:836ef2b4255eec7608779518de80609a1bbdbaf6f6c5b358b6f2c6454ebfb2ab
|
3 |
+
size 1264363
|
models/weights/elephant.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:4b5ce66ccd2e39c8b686b489b24ce915dc4f77533aeb58493ead1aed7edfbeda
|
3 |
+
size 121594483
|
models/weights/elephant_cse.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:2b1e46929a6814228c4d2de44077ee70dad631135977b17baed222332ea8af83
|
3 |
+
size 4907
|
models/weights/elephant_lbo.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:5cbb99a00b32a1a62a8e00f0f3d719e526417981b4a7f93a31216dd4756342a1
|
3 |
+
size 1281259
|
models/weights/horse.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:c9a6ba20c3daa0ad689b77aa93de1f040e302bf205458bc38f6f771a361d4bdb
|
3 |
+
size 121594483
|
models/weights/horse_cse.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:b760d24a8d936b2ba55543475f2c0e739ce03ab8f388f31722a248e398fc4f3d
|
3 |
+
size 4907
|
models/weights/horse_lbo.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:8ece469e1600611053a06fbc670d1c0e71a785d4a35b55608d9ddbf901e439cd
|
3 |
+
size 1281771
|
models/weights/sphere_faces.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:9f4ab4a3248ffb242cfb5d1b0d726bcf56cb6de826e8ef287d0bf29520d99260
|
3 |
+
size 123627
|
models/weights/sphere_verts.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:3f6945509c384d61fcbbacfac4d61e4cdd909af610fcb8f6772a71bd7cff6f10
|
3 |
+
size 31467
|