Spaces:
Running
on
Zero
Running
on
Zero
update theme
Browse files- app.py +18 -8
- hort/utils/renderer.py +8 -0
app.py
CHANGED
|
@@ -12,6 +12,7 @@ from ultralytics import YOLO
|
|
| 12 |
from pathlib import Path
|
| 13 |
import argparse
|
| 14 |
import json
|
|
|
|
| 15 |
from torchvision import transforms
|
| 16 |
from typing import Dict, Optional
|
| 17 |
from PIL import Image, ImageDraw
|
|
@@ -175,13 +176,17 @@ def run_model(image, conf, IoU_threshold=0.5):
|
|
| 175 |
|
| 176 |
reconstructions = {'verts': verts, 'palm': palm, 'objtrans': objtrans, 'objpcs': pointclouds_up, 'cam_t': cam_t, 'right': is_right, 'img_size': 224, 'focal': scaled_focal_length}
|
| 177 |
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
|
|
|
|
|
|
|
|
|
| 181 |
|
|
|
|
| 182 |
|
| 183 |
def render_reconstruction(image, conf, IoU_threshold=0.3):
|
| 184 |
-
input_img, num_dets, reconstructions = run_model(image, conf, IoU_threshold=0.5)
|
| 185 |
# Render front view
|
| 186 |
misc_args = dict(mesh_base_color=LIGHT_PURPLE, point_base_color=STEEL_BLUE, scene_bg_color=(1, 1, 1), focal_length=reconstructions['focal'])
|
| 187 |
cam_view = renderer.render_rgba(reconstructions['verts'], reconstructions['objpcs'] + reconstructions['palm'] + reconstructions['objtrans'], cam_t=reconstructions['cam_t'], render_res=(224, 224), is_right=True, **misc_args)
|
|
@@ -190,7 +195,7 @@ def render_reconstruction(image, conf, IoU_threshold=0.3):
|
|
| 190 |
input_img = np.concatenate([input_img, np.ones_like(input_img[:,:,:1])], axis=2) # Add alpha channel
|
| 191 |
input_img_overlay = input_img[:,:,:3] * (1-cam_view[:,:,3:]) + cam_view[:,:,:3] * cam_view[:,:,3:]
|
| 192 |
|
| 193 |
-
return input_img_overlay, f'{num_dets} hands detected'
|
| 194 |
|
| 195 |
|
| 196 |
header = ('''
|
|
@@ -215,8 +220,12 @@ header = ('''
|
|
| 215 |
<a href='https://github.com/zerchen/hort'><img src='https://img.shields.io/badge/GitHub-Code-black?style=flat&logo=github&logoColor=white'></a>
|
| 216 |
''')
|
| 217 |
|
| 218 |
-
|
| 219 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 220 |
|
| 221 |
gr.Markdown(header)
|
| 222 |
|
|
@@ -229,9 +238,10 @@ with gr.Blocks(title="HORT: Monocular Hand-held Objects Reconstruction with Tran
|
|
| 229 |
|
| 230 |
with gr.Column():
|
| 231 |
reconstruction = gr.Image(label="Reconstructions", type="numpy")
|
|
|
|
| 232 |
hands_detected = gr.Textbox(label="Hands Detected")
|
| 233 |
|
| 234 |
-
submit.click(fn=render_reconstruction, inputs=[input_image, threshold], outputs=[reconstruction, hands_detected])
|
| 235 |
|
| 236 |
with gr.Row():
|
| 237 |
example_images = gr.Examples([
|
|
|
|
| 12 |
from pathlib import Path
|
| 13 |
import argparse
|
| 14 |
import json
|
| 15 |
+
import trimesh
|
| 16 |
from torchvision import transforms
|
| 17 |
from typing import Dict, Optional
|
| 18 |
from PIL import Image, ImageDraw
|
|
|
|
| 176 |
|
| 177 |
reconstructions = {'verts': verts, 'palm': palm, 'objtrans': objtrans, 'objpcs': pointclouds_up, 'cam_t': cam_t, 'right': is_right, 'img_size': 224, 'focal': scaled_focal_length}
|
| 178 |
|
| 179 |
+
camera_translation = cam_t.copy()
|
| 180 |
+
hand_mesh = renderer.mesh(verts, camera_translation, LIGHT_PURPLE, is_right=is_right)
|
| 181 |
+
obj_pcd = trimesh.PointCloud(reconstructions['objpcs'] + reconstructions['palm'] + reconstructions['objtrans'] + camera_translation, colors=[70, 130, 180, 255])
|
| 182 |
+
scene = trimesh.Scene([hand_mesh, obj_pcd])
|
| 183 |
+
scene_path = "/tmp/test.glb"
|
| 184 |
+
scene.export(scene_path)
|
| 185 |
|
| 186 |
+
return crop_img_cv2[..., ::-1].astype(np.float32) / 255.0, len(detections), reconstructions, scene_path
|
| 187 |
|
| 188 |
def render_reconstruction(image, conf, IoU_threshold=0.3):
|
| 189 |
+
input_img, num_dets, reconstructions, scene_path = run_model(image, conf, IoU_threshold=0.5)
|
| 190 |
# Render front view
|
| 191 |
misc_args = dict(mesh_base_color=LIGHT_PURPLE, point_base_color=STEEL_BLUE, scene_bg_color=(1, 1, 1), focal_length=reconstructions['focal'])
|
| 192 |
cam_view = renderer.render_rgba(reconstructions['verts'], reconstructions['objpcs'] + reconstructions['palm'] + reconstructions['objtrans'], cam_t=reconstructions['cam_t'], render_res=(224, 224), is_right=True, **misc_args)
|
|
|
|
| 195 |
input_img = np.concatenate([input_img, np.ones_like(input_img[:,:,:1])], axis=2) # Add alpha channel
|
| 196 |
input_img_overlay = input_img[:,:,:3] * (1-cam_view[:,:,3:]) + cam_view[:,:,:3] * cam_view[:,:,3:]
|
| 197 |
|
| 198 |
+
return input_img_overlay, f'{num_dets} hands detected', scene_path
|
| 199 |
|
| 200 |
|
| 201 |
header = ('''
|
|
|
|
| 220 |
<a href='https://github.com/zerchen/hort'><img src='https://img.shields.io/badge/GitHub-Code-black?style=flat&logo=github&logoColor=white'></a>
|
| 221 |
''')
|
| 222 |
|
| 223 |
+
theme = gr.themes.Ocean()
|
| 224 |
+
theme.set(
|
| 225 |
+
checkbox_label_background_fill_selected="*button_primary_background_fill",
|
| 226 |
+
checkbox_label_text_color_selected="*button_primary_text_color",
|
| 227 |
+
)
|
| 228 |
+
with gr.Blocks(theme=theme, title="HORT: Monocular Hand-held Objects Reconstruction with Transformers", css=".gradio-container") as demo:
|
| 229 |
|
| 230 |
gr.Markdown(header)
|
| 231 |
|
|
|
|
| 238 |
|
| 239 |
with gr.Column():
|
| 240 |
reconstruction = gr.Image(label="Reconstructions", type="numpy")
|
| 241 |
+
output_meshes = gr.Model3D(height=300, zoom_speed=0.5, pan_speed=0.5)
|
| 242 |
hands_detected = gr.Textbox(label="Hands Detected")
|
| 243 |
|
| 244 |
+
submit.click(fn=render_reconstruction, inputs=[input_image, threshold], outputs=[reconstruction, hands_detected, output_meshes])
|
| 245 |
|
| 246 |
with gr.Row():
|
| 247 |
example_images = gr.Examples([
|
hort/utils/renderer.py
CHANGED
|
@@ -280,6 +280,14 @@ class Renderer:
|
|
| 280 |
mesh.apply_transform(rot)
|
| 281 |
return mesh
|
| 282 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 283 |
def render_rgba(
|
| 284 |
self,
|
| 285 |
vertices: np.array,
|
|
|
|
| 280 |
mesh.apply_transform(rot)
|
| 281 |
return mesh
|
| 282 |
|
| 283 |
+
def mesh(self, vertices, camera_translation, mesh_base_color=(1.0, 1.0, 0.9), rot_axis=[1,0,0], rot_angle=0, is_right=1):
|
| 284 |
+
vertex_colors = np.array([(*mesh_base_color, 1.0)] * vertices.shape[0])
|
| 285 |
+
if is_right:
|
| 286 |
+
mesh = trimesh.Trimesh(vertices.copy() + camera_translation, self.faces.copy(), vertex_colors=vertex_colors)
|
| 287 |
+
else:
|
| 288 |
+
mesh = trimesh.Trimesh(vertices.copy() + camera_translation, self.faces_left.copy(), vertex_colors=vertex_colors)
|
| 289 |
+
return mesh
|
| 290 |
+
|
| 291 |
def render_rgba(
|
| 292 |
self,
|
| 293 |
vertices: np.array,
|