TerryTogyThomas commited on
Commit
304e943
·
verified ·
1 Parent(s): a7756b6

Upload 15 files

Browse files
Files changed (16) hide show
  1. .gitattributes +1 -0
  2. README.md +1 -14
  3. app.py +72 -0
  4. assets/axis.obj +1663 -0
  5. assets/axis.png +0 -0
  6. assets/demo.png +3 -0
  7. inference.py +49 -0
  8. paths.py +4 -0
  9. render/__init__.py +3 -0
  10. render/canvas.py +51 -0
  11. render/core.py +378 -0
  12. render/model.py +31 -0
  13. render/speedup.py +102 -0
  14. requirements.txt +9 -0
  15. utils.py +305 -0
  16. vision_tower.py +161 -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
+ assets/demo.png filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,14 +1 @@
1
- ---
2
- title: 3d Object Orientation Estimation
3
- emoji: 🔥
4
- colorFrom: pink
5
- colorTo: gray
6
- sdk: gradio
7
- sdk_version: 6.8.0
8
- app_file: app.py
9
- pinned: false
10
- license: mit
11
- short_description: 3D object orientation estimation using DINOv2 with custom CP
12
- ---
13
-
14
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
+ # Spatial-vision
 
 
 
 
 
 
 
 
 
 
 
 
 
app.py ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from paths import *
3
+
4
+ from vision_tower import DINOv2_MLP
5
+ from transformers import AutoImageProcessor
6
+ import torch
7
+ from inference import *
8
+ from utils import *
9
+
10
+ from huggingface_hub import hf_hub_download
11
+ ckpt_path = hf_hub_download(repo_id="Viglong/Orient-Anything", filename="ronormsigma1/dino_weight.pt", repo_type="model", cache_dir='./', resume_download=True)
12
+ print(ckpt_path)
13
+
14
+ save_path = './'
15
+ device = 'cpu'
16
+ dino = DINOv2_MLP(
17
+ dino_mode = 'large',
18
+ in_dim = 1024,
19
+ out_dim = 360+180+360+2,
20
+ evaluate = True,
21
+ mask_dino = False,
22
+ frozen_back = False
23
+ )
24
+
25
+ dino.eval()
26
+ print('model create')
27
+ dino.load_state_dict(torch.load(ckpt_path, map_location='cpu'))
28
+ dino = dino.to(device)
29
+ print('weight loaded')
30
+ val_preprocess = AutoImageProcessor.from_pretrained(DINO_LARGE, cache_dir='./')
31
+
32
+ def infer_func(img, do_rm_bkg, do_infer_aug):
33
+ origin_img = Image.fromarray(img)
34
+ if do_infer_aug:
35
+ rm_bkg_img = background_preprocess(origin_img, True)
36
+ angles = get_3angle_infer_aug(origin_img, rm_bkg_img, dino, val_preprocess, device)
37
+ else:
38
+ rm_bkg_img = background_preprocess(origin_img, do_rm_bkg)
39
+ angles = get_3angle(rm_bkg_img, dino, val_preprocess, device)
40
+
41
+ phi = np.radians(angles[0])
42
+ theta = np.radians(angles[1])
43
+ gamma = angles[2]
44
+ confidence = float(angles[3])
45
+ if confidence > 0.5:
46
+ render_axis = render_3D_axis(phi, theta, gamma)
47
+ res_img = overlay_images_with_scaling(render_axis, rm_bkg_img)
48
+ else:
49
+ res_img = img
50
+
51
+ # axis_model = "axis.obj"
52
+ return [res_img, round(float(angles[0]), 2), round(float(angles[1]), 2), round(float(angles[2]), 2), round(float(angles[3]), 2)]
53
+
54
+ server = gr.Interface(
55
+ flagging_mode='never',
56
+ fn=infer_func,
57
+ inputs=[
58
+ gr.Image(height=512, width=512, label="upload your image"),
59
+ gr.Checkbox(label="Remove Background", value=True),
60
+ gr.Checkbox(label="Inference time augmentation", value=False)
61
+ ],
62
+ outputs=[
63
+ gr.Image(height=512, width=512, label="result image"),
64
+ # gr.Model3D(clear_color=[0.0, 0.0, 0.0, 0.0], label="3D Model"),
65
+ gr.Textbox(lines=1, label='Azimuth(0~360°)'),
66
+ gr.Textbox(lines=1, label='Polar(-90~90°)'),
67
+ gr.Textbox(lines=1, label='Rotation(-90~90°)'),
68
+ gr.Textbox(lines=1, label='Confidence(0~1)')
69
+ ]
70
+ )
71
+
72
+ server.launch()
assets/axis.obj ADDED
@@ -0,0 +1,1663 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Blender 4.2.1 LTS
2
+ mtllib axis.mtl
3
+ o X
4
+ v 28.000000 0.000000 0.000000
5
+ v 22.000000 0.292636 -1.471178
6
+ v 22.000000 0.574025 -1.385819
7
+ v 22.000000 0.833355 -1.247204
8
+ v 22.000000 1.060660 -1.060660
9
+ v 22.000000 1.247205 -0.833355
10
+ v 22.000000 1.385819 -0.574025
11
+ v 22.000000 1.471178 -0.292636
12
+ v 22.000000 1.500000 -0.000000
13
+ v 22.000000 1.471178 0.292636
14
+ v 22.000000 1.385819 0.574025
15
+ v 22.000000 1.247205 0.833355
16
+ v 22.000000 1.060660 1.060660
17
+ v 22.000000 0.833355 1.247204
18
+ v 22.000000 0.574025 1.385819
19
+ v 22.000000 0.292636 1.471178
20
+ v 22.000000 0.000000 1.500000
21
+ v 22.000000 -0.292635 1.471178
22
+ v 22.000000 -0.574025 1.385819
23
+ v 22.000000 -0.833355 1.247204
24
+ v 22.000000 -1.060660 1.060660
25
+ v 22.000000 -1.247204 0.833355
26
+ v 22.000000 -1.385819 0.574025
27
+ v 22.000000 -1.471178 0.292636
28
+ v 22.000000 -1.500000 0.000000
29
+ v 22.000000 -1.471178 -0.292636
30
+ v 22.000000 -1.385819 -0.574025
31
+ v 22.000000 -1.247204 -0.833355
32
+ v 22.000000 -1.060660 -1.060660
33
+ v 22.000000 -0.833355 -1.247204
34
+ v 22.000000 -0.574025 -1.385819
35
+ v 22.000000 -0.292635 -1.471178
36
+ v 22.000000 -0.000000 -1.500000
37
+ vn -1.0000 -0.0000 -0.0000
38
+ vn -1.0000 0.0001 -0.0000
39
+ vn -1.0000 -0.0001 -0.0000
40
+ vn 0.2414 0.0951 -0.9657
41
+ vn 0.2414 0.2817 -0.9286
42
+ vn 0.2414 0.4575 -0.8558
43
+ vn 0.2414 0.6156 -0.7501
44
+ vn 0.2414 0.7501 -0.6156
45
+ vn 0.2414 0.8558 -0.4574
46
+ vn 0.2414 0.9286 -0.2817
47
+ vn 0.2414 0.9657 -0.0951
48
+ vn 0.2414 0.9657 0.0951
49
+ vn 0.2414 0.9286 0.2817
50
+ vn 0.2414 0.8558 0.4574
51
+ vn 0.2414 0.7501 0.6156
52
+ vn 0.2414 0.6156 0.7501
53
+ vn 0.2414 0.4575 0.8558
54
+ vn 0.2414 0.2817 0.9286
55
+ vn 0.2414 0.0951 0.9657
56
+ vn 0.2414 -0.0951 0.9657
57
+ vn 0.2414 -0.2817 0.9286
58
+ vn 0.2414 -0.4575 0.8558
59
+ vn 0.2414 -0.6156 0.7501
60
+ vn 0.2414 -0.7501 0.6156
61
+ vn 0.2414 -0.8558 0.4575
62
+ vn 0.2414 -0.9286 0.2817
63
+ vn 0.2414 -0.9657 0.0951
64
+ vn 0.2414 -0.9657 -0.0951
65
+ vn 0.2414 -0.9286 -0.2817
66
+ vn 0.2414 -0.8558 -0.4575
67
+ vn 0.2414 -0.7501 -0.6156
68
+ vn 0.2414 -0.6156 -0.7501
69
+ vn 0.2414 -0.4575 -0.8558
70
+ vn 0.2414 -0.2817 -0.9286
71
+ vn 0.2414 -0.0951 -0.9657
72
+ vt 0.597858 0.736041
73
+ vt 0.735114 0.644330
74
+ vt 0.643402 0.507074
75
+ vt 0.506147 0.598785
76
+ vt 0.523575 0.686407
77
+ vt 0.555780 0.524503
78
+ vt 0.717685 0.556707
79
+ vt 0.685480 0.718612
80
+ vt 0.555780 0.718612
81
+ vt 0.506147 0.644330
82
+ vt 0.523575 0.556707
83
+ vt 0.597858 0.507074
84
+ vt 0.685480 0.524503
85
+ vt 0.735114 0.598785
86
+ vt 0.717685 0.686407
87
+ vt 0.643402 0.736041
88
+ vt 0.575961 0.729399
89
+ vt 0.538092 0.704096
90
+ vt 0.512789 0.666227
91
+ vt 0.503903 0.621557
92
+ vt 0.512789 0.576888
93
+ vt 0.538092 0.539019
94
+ vt 0.575961 0.513716
95
+ vt 0.620630 0.504831
96
+ vt 0.665299 0.513716
97
+ vt 0.703168 0.539019
98
+ vt 0.728471 0.576888
99
+ vt 0.737357 0.621557
100
+ vt 0.728471 0.666227
101
+ vt 0.703168 0.704096
102
+ vt 0.665299 0.729399
103
+ vt 0.620630 0.738284
104
+ vt 0.354677 0.736041
105
+ vt 0.377450 0.621557
106
+ vt 0.377450 0.738284
107
+ vt 0.332780 0.729399
108
+ vt 0.312600 0.718612
109
+ vt 0.294911 0.704096
110
+ vt 0.280395 0.686407
111
+ vt 0.269608 0.666227
112
+ vt 0.262966 0.644330
113
+ vt 0.260723 0.621557
114
+ vt 0.262966 0.598785
115
+ vt 0.269608 0.576888
116
+ vt 0.280395 0.556707
117
+ vt 0.294911 0.539019
118
+ vt 0.312600 0.524503
119
+ vt 0.332780 0.513716
120
+ vt 0.354677 0.507074
121
+ vt 0.377450 0.504831
122
+ vt 0.400222 0.507074
123
+ vt 0.422119 0.513716
124
+ vt 0.442299 0.524503
125
+ vt 0.459988 0.539019
126
+ vt 0.474504 0.556707
127
+ vt 0.485291 0.576888
128
+ vt 0.491933 0.598785
129
+ vt 0.494176 0.621557
130
+ vt 0.491933 0.644330
131
+ vt 0.485291 0.666227
132
+ vt 0.474504 0.686407
133
+ vt 0.459988 0.704096
134
+ vt 0.442299 0.718612
135
+ vt 0.422119 0.729399
136
+ vt 0.400222 0.736041
137
+ s 0
138
+ usemtl MI_YamahaMSP3_MatteBlack.004
139
+ f 2/1/1 26/2/1 18/3/1
140
+ f 10/4/1 6/5/1 2/1/1
141
+ f 18/3/1 14/6/1 10/4/1
142
+ f 26/2/1 22/7/1 18/3/1
143
+ f 2/1/1 30/8/1 26/2/1
144
+ f 6/5/1 4/9/1 2/1/1
145
+ f 10/4/1 8/10/1 6/5/1
146
+ f 14/6/1 12/11/1 10/4/1
147
+ f 18/3/1 16/12/1 14/6/1
148
+ f 22/7/1 20/13/1 18/3/1
149
+ f 26/2/1 24/14/1 22/7/1
150
+ f 30/8/1 28/15/1 26/2/1
151
+ f 2/1/1 32/16/1 30/8/1
152
+ f 4/9/1 3/17/1 2/1/1
153
+ f 6/5/2 5/18/2 4/9/2
154
+ f 8/10/3 7/19/3 6/5/3
155
+ f 10/4/1 9/20/1 8/10/1
156
+ f 12/11/3 11/21/3 10/4/3
157
+ f 14/6/2 13/22/2 12/11/2
158
+ f 16/12/1 15/23/1 14/6/1
159
+ f 18/3/1 17/24/1 16/12/1
160
+ f 20/13/1 19/25/1 18/3/1
161
+ f 22/7/3 21/26/3 20/13/3
162
+ f 24/14/2 23/27/2 22/7/2
163
+ f 26/2/1 25/28/1 24/14/1
164
+ f 28/15/2 27/29/2 26/2/2
165
+ f 30/8/3 29/30/3 28/15/3
166
+ f 32/16/1 31/31/1 30/8/1
167
+ f 2/1/1 33/32/1 32/16/1
168
+ f 2/33/4 1/34/4 33/35/4
169
+ f 3/36/5 1/34/5 2/33/5
170
+ f 18/3/1 10/4/1 2/1/1
171
+ f 4/37/6 1/34/6 3/36/6
172
+ f 5/38/7 1/34/7 4/37/7
173
+ f 6/39/8 1/34/8 5/38/8
174
+ f 7/40/9 1/34/9 6/39/9
175
+ f 8/41/10 1/34/10 7/40/10
176
+ f 9/42/11 1/34/11 8/41/11
177
+ f 10/43/12 1/34/12 9/42/12
178
+ f 11/44/13 1/34/13 10/43/13
179
+ f 12/45/14 1/34/14 11/44/14
180
+ f 13/46/15 1/34/15 12/45/15
181
+ f 14/47/16 1/34/16 13/46/16
182
+ f 15/48/17 1/34/17 14/47/17
183
+ f 16/49/18 1/34/18 15/48/18
184
+ f 17/50/19 1/34/19 16/49/19
185
+ f 18/51/20 1/34/20 17/50/20
186
+ f 19/52/21 1/34/21 18/51/21
187
+ f 20/53/22 1/34/22 19/52/22
188
+ f 21/54/23 1/34/23 20/53/23
189
+ f 22/55/24 1/34/24 21/54/24
190
+ f 23/56/25 1/34/25 22/55/25
191
+ f 24/57/26 1/34/26 23/56/26
192
+ f 25/58/27 1/34/27 24/57/27
193
+ f 26/59/28 1/34/28 25/58/28
194
+ f 27/60/29 1/34/29 26/59/29
195
+ f 28/61/30 1/34/30 27/60/30
196
+ f 29/62/31 1/34/31 28/61/31
197
+ f 30/63/32 1/34/32 29/62/32
198
+ f 31/64/33 1/34/33 30/63/33
199
+ f 32/65/34 1/34/34 31/64/34
200
+ f 33/35/35 1/34/35 32/65/35
201
+ o Xzhu
202
+ v 24.000000 0.097545 -0.490393
203
+ v 0.000000 0.097546 -0.490393
204
+ v 24.000000 0.191341 -0.461940
205
+ v 0.000000 0.191342 -0.461940
206
+ v 24.000000 0.277785 -0.415735
207
+ v 0.000000 0.277786 -0.415735
208
+ v 24.000000 0.353553 -0.353553
209
+ v 0.000000 0.353554 -0.353553
210
+ v 24.000000 0.415734 -0.277785
211
+ v 0.000000 0.415735 -0.277785
212
+ v 24.000000 0.461939 -0.191342
213
+ v 0.000000 0.461940 -0.191342
214
+ v 24.000000 0.490392 -0.097545
215
+ v 0.000000 0.490393 -0.097545
216
+ v 24.000000 0.499999 -0.000000
217
+ v 0.000000 0.500001 -0.000000
218
+ v 24.000000 0.490392 0.097545
219
+ v 0.000000 0.490393 0.097545
220
+ v 24.000000 0.461939 0.191342
221
+ v 0.000000 0.461940 0.191342
222
+ v 24.000000 0.415734 0.277785
223
+ v 0.000000 0.415735 0.277785
224
+ v 24.000000 0.353553 0.353553
225
+ v 0.000000 0.353554 0.353553
226
+ v 24.000000 0.277785 0.415735
227
+ v 0.000000 0.277786 0.415735
228
+ v 24.000000 0.191341 0.461940
229
+ v 0.000000 0.191342 0.461940
230
+ v 24.000000 0.097545 0.490393
231
+ v 0.000000 0.097546 0.490393
232
+ v 24.000000 -0.000001 0.500000
233
+ v 0.000000 0.000001 0.500000
234
+ v 24.000000 -0.097546 0.490393
235
+ v 0.000000 -0.097545 0.490393
236
+ v 24.000000 -0.191342 0.461940
237
+ v 0.000000 -0.191341 0.461940
238
+ v 24.000000 -0.277786 0.415735
239
+ v 0.000000 -0.277785 0.415735
240
+ v 24.000000 -0.353554 0.353553
241
+ v 0.000000 -0.353553 0.353553
242
+ v 24.000000 -0.415735 0.277785
243
+ v 0.000000 -0.415734 0.277785
244
+ v 24.000000 -0.461940 0.191342
245
+ v 0.000000 -0.461939 0.191342
246
+ v 24.000000 -0.490393 0.097545
247
+ v 0.000000 -0.490392 0.097545
248
+ v 24.000000 -0.500001 0.000000
249
+ v 0.000000 -0.499999 0.000000
250
+ v 24.000000 -0.490393 -0.097545
251
+ v 0.000000 -0.490392 -0.097545
252
+ v 24.000000 -0.461940 -0.191342
253
+ v 0.000000 -0.461939 -0.191342
254
+ v 24.000000 -0.415735 -0.277785
255
+ v 0.000000 -0.415734 -0.277785
256
+ v 24.000000 -0.353554 -0.353553
257
+ v 0.000000 -0.353553 -0.353553
258
+ v 24.000000 -0.277786 -0.415735
259
+ v 0.000000 -0.277785 -0.415735
260
+ v 24.000000 -0.191342 -0.461940
261
+ v 0.000000 -0.191341 -0.461940
262
+ v 24.000000 -0.097546 -0.490393
263
+ v 0.000000 -0.097545 -0.490393
264
+ v 24.000000 -0.000001 -0.500000
265
+ v 0.000000 0.000001 -0.500000
266
+ vn -1.0000 -0.0000 -0.0000
267
+ vn -0.0000 0.0980 -0.9952
268
+ vn -0.0000 0.2903 -0.9569
269
+ vn 1.0000 -0.0000 -0.0000
270
+ vn -0.0000 0.4714 -0.8819
271
+ vn -0.0000 0.6344 -0.7730
272
+ vn -0.0000 0.7730 -0.6344
273
+ vn -0.0000 0.8819 -0.4714
274
+ vn -0.0000 0.9569 -0.2903
275
+ vn -0.0000 0.9952 -0.0980
276
+ vn -0.0000 0.9952 0.0980
277
+ vn -0.0000 0.9569 0.2903
278
+ vn -0.0000 0.8819 0.4714
279
+ vn -0.0000 0.7730 0.6344
280
+ vn -0.0000 0.6344 0.7730
281
+ vn -0.0000 0.4714 0.8819
282
+ vn -0.0000 0.2903 0.9569
283
+ vn -0.0000 0.0980 0.9952
284
+ vn -0.0000 -0.0980 0.9952
285
+ vn -0.0000 -0.2903 0.9569
286
+ vn -0.0000 -0.4714 0.8819
287
+ vn -0.0000 -0.6344 0.7730
288
+ vn -0.0000 -0.7730 0.6344
289
+ vn -0.0000 -0.8819 0.4714
290
+ vn -0.0000 -0.9569 0.2903
291
+ vn -0.0000 -0.9952 0.0980
292
+ vn -0.0000 -0.9952 -0.0980
293
+ vn -0.0000 -0.9569 -0.2903
294
+ vn -0.0000 -0.8819 -0.4714
295
+ vn -0.0000 -0.7730 -0.6344
296
+ vn -0.0000 -0.6344 -0.7730
297
+ vn -0.0000 -0.4714 -0.8819
298
+ vn -0.0000 -0.2903 -0.9569
299
+ vn -0.0000 -0.0980 -0.9952
300
+ vt 0.597858 0.736041
301
+ vt 0.735114 0.644330
302
+ vt 0.643402 0.507074
303
+ vt 0.506147 0.598785
304
+ vt 0.523575 0.686407
305
+ vt 0.555780 0.524503
306
+ vt 0.717685 0.556707
307
+ vt 0.685480 0.718612
308
+ vt 0.555780 0.718612
309
+ vt 0.506147 0.644330
310
+ vt 0.523575 0.556707
311
+ vt 0.597858 0.507074
312
+ vt 0.685480 0.524503
313
+ vt 0.735114 0.598785
314
+ vt 0.717685 0.686407
315
+ vt 0.643402 0.736041
316
+ vt 0.575961 0.729399
317
+ vt 0.538092 0.704096
318
+ vt 0.512789 0.666227
319
+ vt 0.503903 0.621557
320
+ vt 0.512789 0.576888
321
+ vt 0.538092 0.539019
322
+ vt 0.575961 0.513716
323
+ vt 0.620630 0.504831
324
+ vt 0.665299 0.513716
325
+ vt 0.703168 0.539019
326
+ vt 0.728471 0.576888
327
+ vt 0.737357 0.621557
328
+ vt 0.728471 0.666227
329
+ vt 0.703168 0.704096
330
+ vt 0.665299 0.729399
331
+ vt 0.620630 0.738284
332
+ vt 0.271058 0.986328
333
+ vt 0.255859 0.986328
334
+ vt 0.255859 0.743148
335
+ vt 0.286257 0.986328
336
+ vt 0.271058 0.743148
337
+ vt 0.422119 0.729399
338
+ vt 0.269608 0.666227
339
+ vt 0.332780 0.513716
340
+ vt 0.485291 0.576888
341
+ vt 0.485291 0.666227
342
+ vt 0.422119 0.513716
343
+ vt 0.269608 0.576888
344
+ vt 0.332780 0.729399
345
+ vt 0.459988 0.704096
346
+ vt 0.494176 0.621557
347
+ vt 0.459988 0.539019
348
+ vt 0.377450 0.504831
349
+ vt 0.294911 0.539019
350
+ vt 0.260723 0.621557
351
+ vt 0.294911 0.704096
352
+ vt 0.377450 0.738284
353
+ vt 0.442299 0.718612
354
+ vt 0.474504 0.686407
355
+ vt 0.491933 0.644330
356
+ vt 0.491933 0.598785
357
+ vt 0.474504 0.556707
358
+ vt 0.442299 0.524503
359
+ vt 0.400222 0.507074
360
+ vt 0.354677 0.507074
361
+ vt 0.312600 0.524503
362
+ vt 0.280395 0.556707
363
+ vt 0.262966 0.598785
364
+ vt 0.262966 0.644330
365
+ vt 0.280395 0.686407
366
+ vt 0.312600 0.718612
367
+ vt 0.354677 0.736041
368
+ vt 0.400222 0.736041
369
+ vt 0.301456 0.986328
370
+ vt 0.286257 0.743148
371
+ vt 0.316654 0.986328
372
+ vt 0.301456 0.743148
373
+ vt 0.331853 0.986328
374
+ vt 0.316654 0.743148
375
+ vt 0.347052 0.986328
376
+ vt 0.331853 0.743148
377
+ vt 0.362251 0.986328
378
+ vt 0.347052 0.743148
379
+ vt 0.377450 0.986328
380
+ vt 0.362251 0.743148
381
+ vt 0.392648 0.986328
382
+ vt 0.377450 0.743148
383
+ vt 0.407847 0.986328
384
+ vt 0.392648 0.743148
385
+ vt 0.423046 0.986328
386
+ vt 0.407847 0.743148
387
+ vt 0.438245 0.986328
388
+ vt 0.423046 0.743148
389
+ vt 0.453443 0.986328
390
+ vt 0.438245 0.743148
391
+ vt 0.468642 0.986328
392
+ vt 0.453443 0.743148
393
+ vt 0.483841 0.986328
394
+ vt 0.468642 0.743148
395
+ vt 0.499040 0.986328
396
+ vt 0.483841 0.743148
397
+ vt 0.514239 0.986328
398
+ vt 0.499040 0.743148
399
+ vt 0.529437 0.986328
400
+ vt 0.514239 0.743148
401
+ vt 0.544636 0.986328
402
+ vt 0.529437 0.743148
403
+ vt 0.559835 0.986328
404
+ vt 0.544636 0.743148
405
+ vt 0.575034 0.986328
406
+ vt 0.559835 0.743148
407
+ vt 0.590232 0.986328
408
+ vt 0.575034 0.743148
409
+ vt 0.605431 0.986328
410
+ vt 0.590232 0.743148
411
+ vt 0.620630 0.986328
412
+ vt 0.605431 0.743148
413
+ vt 0.635829 0.986328
414
+ vt 0.620630 0.743148
415
+ vt 0.651028 0.986328
416
+ vt 0.635829 0.743148
417
+ vt 0.666226 0.986328
418
+ vt 0.651028 0.743148
419
+ vt 0.681425 0.986328
420
+ vt 0.666226 0.743148
421
+ vt 0.696624 0.986328
422
+ vt 0.681425 0.743148
423
+ vt 0.711823 0.986328
424
+ vt 0.696624 0.743148
425
+ vt 0.727022 0.986328
426
+ vt 0.711823 0.743148
427
+ vt 0.742220 0.986328
428
+ vt 0.727022 0.743148
429
+ vt 0.742220 0.743148
430
+ s 0
431
+ usemtl MI_YamahaMSP3_MatteBlack.004
432
+ f 35/66/36 83/67/36 67/68/36
433
+ f 51/69/36 43/70/36 35/66/36
434
+ f 67/68/36 59/71/36 51/69/36
435
+ f 83/67/36 75/72/36 67/68/36
436
+ f 35/66/36 91/73/36 83/67/36
437
+ f 43/70/36 39/74/36 35/66/36
438
+ f 51/69/36 47/75/36 43/70/36
439
+ f 59/71/36 55/76/36 51/69/36
440
+ f 67/68/36 63/77/36 59/71/36
441
+ f 75/72/36 71/78/36 67/68/36
442
+ f 83/67/36 79/79/36 75/72/36
443
+ f 91/73/36 87/80/36 83/67/36
444
+ f 35/66/36 95/81/36 91/73/36
445
+ f 39/74/36 37/82/36 35/66/36
446
+ f 43/70/36 41/83/36 39/74/36
447
+ f 47/75/36 45/84/36 43/70/36
448
+ f 51/69/36 49/85/36 47/75/36
449
+ f 55/76/36 53/86/36 51/69/36
450
+ f 59/71/36 57/87/36 55/76/36
451
+ f 63/77/36 61/88/36 59/71/36
452
+ f 67/68/36 65/89/36 63/77/36
453
+ f 71/78/36 69/90/36 67/68/36
454
+ f 75/72/36 73/91/36 71/78/36
455
+ f 79/79/36 77/92/36 75/72/36
456
+ f 83/67/36 81/93/36 79/79/36
457
+ f 87/80/36 85/94/36 83/67/36
458
+ f 91/73/36 89/95/36 87/80/36
459
+ f 95/81/36 93/96/36 91/73/36
460
+ f 35/66/36 97/97/36 95/81/36
461
+ f 34/98/37 96/99/37 97/100/37
462
+ f 36/101/38 34/98/38 35/102/38
463
+ f 92/103/39 44/104/39 60/105/39
464
+ f 76/106/39 84/107/39 92/103/39
465
+ f 60/105/39 68/108/39 76/106/39
466
+ f 44/104/39 52/109/39 60/105/39
467
+ f 92/103/39 36/110/39 44/104/39
468
+ f 84/107/39 88/111/39 92/103/39
469
+ f 76/106/39 80/112/39 84/107/39
470
+ f 68/108/39 72/113/39 76/106/39
471
+ f 60/105/39 64/114/39 68/108/39
472
+ f 52/109/39 56/115/39 60/105/39
473
+ f 44/104/39 48/116/39 52/109/39
474
+ f 36/110/39 40/117/39 44/104/39
475
+ f 92/103/39 96/118/39 36/110/39
476
+ f 88/111/39 90/119/39 92/103/39
477
+ f 84/107/39 86/120/39 88/111/39
478
+ f 80/112/39 82/121/39 84/107/39
479
+ f 76/106/39 78/122/39 80/112/39
480
+ f 72/113/39 74/123/39 76/106/39
481
+ f 68/108/39 70/124/39 72/113/39
482
+ f 64/114/39 66/125/39 68/108/39
483
+ f 60/105/39 62/126/39 64/114/39
484
+ f 56/115/39 58/127/39 60/105/39
485
+ f 52/109/39 54/128/39 56/115/39
486
+ f 48/116/39 50/129/39 52/109/39
487
+ f 44/104/39 46/130/39 48/116/39
488
+ f 40/117/39 42/131/39 44/104/39
489
+ f 36/110/39 38/132/39 40/117/39
490
+ f 96/118/39 34/133/39 36/110/39
491
+ f 92/103/39 94/134/39 96/118/39
492
+ f 38/135/40 36/101/40 37/136/40
493
+ f 40/137/41 38/135/41 39/138/41
494
+ f 42/139/42 40/137/42 41/140/42
495
+ f 44/141/43 42/139/43 43/142/43
496
+ f 46/143/44 44/141/44 45/144/44
497
+ f 48/145/45 46/143/45 47/146/45
498
+ f 50/147/46 48/145/46 49/148/46
499
+ f 52/149/47 50/147/47 51/150/47
500
+ f 54/151/48 52/149/48 53/152/48
501
+ f 56/153/49 54/151/49 55/154/49
502
+ f 58/155/50 56/153/50 57/156/50
503
+ f 60/157/51 58/155/51 59/158/51
504
+ f 62/159/52 60/157/52 61/160/52
505
+ f 64/161/53 62/159/53 63/162/53
506
+ f 66/163/54 64/161/54 65/164/54
507
+ f 68/165/55 66/163/55 67/166/55
508
+ f 70/167/56 68/165/56 69/168/56
509
+ f 72/169/57 70/167/57 71/170/57
510
+ f 74/171/58 72/169/58 73/172/58
511
+ f 76/173/59 74/171/59 75/174/59
512
+ f 78/175/60 76/173/60 77/176/60
513
+ f 80/177/61 78/175/61 79/178/61
514
+ f 82/179/62 80/177/62 81/180/62
515
+ f 84/181/63 82/179/63 83/182/63
516
+ f 86/183/64 84/181/64 85/184/64
517
+ f 88/185/65 86/183/65 87/186/65
518
+ f 90/187/66 88/185/66 89/188/66
519
+ f 92/189/67 90/187/67 91/190/67
520
+ f 94/191/68 92/189/68 93/192/68
521
+ f 96/193/69 94/191/69 95/194/69
522
+ f 67/68/36 51/69/36 35/66/36
523
+ f 34/98/37 97/100/37 35/102/37
524
+ f 36/101/38 35/102/38 37/136/38
525
+ f 60/105/39 76/106/39 92/103/39
526
+ f 38/135/40 37/136/40 39/138/40
527
+ f 40/137/41 39/138/41 41/140/41
528
+ f 42/139/42 41/140/42 43/142/42
529
+ f 44/141/43 43/142/43 45/144/43
530
+ f 46/143/44 45/144/44 47/146/44
531
+ f 48/145/45 47/146/45 49/148/45
532
+ f 50/147/46 49/148/46 51/150/46
533
+ f 52/149/47 51/150/47 53/152/47
534
+ f 54/151/48 53/152/48 55/154/48
535
+ f 56/153/49 55/154/49 57/156/49
536
+ f 58/155/50 57/156/50 59/158/50
537
+ f 60/157/51 59/158/51 61/160/51
538
+ f 62/159/52 61/160/52 63/162/52
539
+ f 64/161/53 63/162/53 65/164/53
540
+ f 66/163/54 65/164/54 67/166/54
541
+ f 68/165/55 67/166/55 69/168/55
542
+ f 70/167/56 69/168/56 71/170/56
543
+ f 72/169/57 71/170/57 73/172/57
544
+ f 74/171/58 73/172/58 75/174/58
545
+ f 76/173/59 75/174/59 77/176/59
546
+ f 78/175/60 77/176/60 79/178/60
547
+ f 80/177/61 79/178/61 81/180/61
548
+ f 82/179/62 81/180/62 83/182/62
549
+ f 84/181/63 83/182/63 85/184/63
550
+ f 86/183/64 85/184/64 87/186/64
551
+ f 88/185/65 87/186/65 89/188/65
552
+ f 90/187/66 89/188/66 91/190/66
553
+ f 92/189/67 91/190/67 93/192/67
554
+ f 94/191/68 93/192/68 95/194/68
555
+ f 96/193/69 95/194/69 97/195/69
556
+ o Y
557
+ v 0.000000 -0.000002 -28.000000
558
+ v -0.292636 -1.471180 -22.000000
559
+ v -0.574025 -1.385821 -22.000000
560
+ v -0.833355 -1.247206 -22.000000
561
+ v -1.060660 -1.060662 -22.000000
562
+ v -1.247204 -0.833357 -22.000000
563
+ v -1.385819 -0.574027 -22.000000
564
+ v -1.471178 -0.292637 -22.000000
565
+ v -1.500000 -0.000002 -22.000000
566
+ v -1.471178 0.292634 -22.000000
567
+ v -1.385819 0.574023 -22.000000
568
+ v -1.247204 0.833353 -22.000000
569
+ v -1.060660 1.060658 -22.000000
570
+ v -0.833355 1.247203 -22.000000
571
+ v -0.574025 1.385817 -22.000000
572
+ v -0.292636 1.471176 -22.000000
573
+ v 0.000000 1.499998 -22.000000
574
+ v 0.292636 1.471176 -22.000000
575
+ v 0.574025 1.385817 -22.000000
576
+ v 0.833355 1.247203 -22.000000
577
+ v 1.060660 1.060658 -22.000000
578
+ v 1.247204 0.833353 -22.000000
579
+ v 1.385819 0.574023 -22.000000
580
+ v 1.471178 0.292634 -22.000000
581
+ v 1.500000 -0.000002 -22.000000
582
+ v 1.471178 -0.292637 -22.000000
583
+ v 1.385819 -0.574027 -22.000000
584
+ v 1.247204 -0.833357 -22.000000
585
+ v 1.060660 -1.060662 -22.000000
586
+ v 0.833355 -1.247206 -22.000000
587
+ v 0.574025 -1.385821 -22.000000
588
+ v 0.292636 -1.471180 -22.000000
589
+ v 0.000000 -1.500002 -22.000000
590
+ vn -0.0000 -0.0000 1.0000
591
+ vn -0.0001 -0.0000 1.0000
592
+ vn 0.0001 -0.0000 1.0000
593
+ vn -0.0951 -0.9657 -0.2414
594
+ vn -0.2817 -0.9286 -0.2414
595
+ vn -0.4575 -0.8558 -0.2414
596
+ vn -0.6156 -0.7501 -0.2414
597
+ vn -0.7501 -0.6156 -0.2414
598
+ vn -0.8558 -0.4575 -0.2414
599
+ vn -0.9286 -0.2817 -0.2414
600
+ vn -0.9657 -0.0951 -0.2414
601
+ vn -0.9657 0.0951 -0.2414
602
+ vn -0.9286 0.2817 -0.2414
603
+ vn -0.8558 0.4575 -0.2414
604
+ vn -0.7501 0.6156 -0.2414
605
+ vn -0.6156 0.7501 -0.2414
606
+ vn -0.4574 0.8558 -0.2414
607
+ vn -0.2817 0.9286 -0.2414
608
+ vn -0.0951 0.9657 -0.2414
609
+ vn 0.0951 0.9657 -0.2414
610
+ vn 0.2817 0.9286 -0.2414
611
+ vn 0.4574 0.8558 -0.2414
612
+ vn 0.6156 0.7501 -0.2414
613
+ vn 0.7501 0.6156 -0.2414
614
+ vn 0.8558 0.4575 -0.2414
615
+ vn 0.9286 0.2817 -0.2414
616
+ vn 0.9657 0.0951 -0.2414
617
+ vn 0.9657 -0.0951 -0.2414
618
+ vn 0.9286 -0.2817 -0.2414
619
+ vn 0.8558 -0.4575 -0.2414
620
+ vn 0.7501 -0.6156 -0.2414
621
+ vn 0.6156 -0.7501 -0.2414
622
+ vn 0.4575 -0.8558 -0.2414
623
+ vn 0.2817 -0.9286 -0.2414
624
+ vn 0.0951 -0.9657 -0.2414
625
+ vt 0.847703 0.234951
626
+ vt 0.974738 0.150069
627
+ vt 0.889856 0.023035
628
+ vt 0.762822 0.107916
629
+ vt 0.778953 0.189013
630
+ vt 0.808759 0.039165
631
+ vt 0.958607 0.068972
632
+ vt 0.928801 0.218820
633
+ vt 0.808759 0.218820
634
+ vt 0.762822 0.150069
635
+ vt 0.778953 0.068972
636
+ vt 0.847703 0.023035
637
+ vt 0.928801 0.039165
638
+ vt 0.974738 0.107916
639
+ vt 0.958607 0.189013
640
+ vt 0.889856 0.234951
641
+ vt 0.827437 0.228803
642
+ vt 0.792388 0.205385
643
+ vt 0.768969 0.170336
644
+ vt 0.760746 0.128993
645
+ vt 0.768969 0.087650
646
+ vt 0.792388 0.052601
647
+ vt 0.827437 0.029182
648
+ vt 0.868780 0.020959
649
+ vt 0.910123 0.029182
650
+ vt 0.945172 0.052601
651
+ vt 0.968590 0.087650
652
+ vt 0.976814 0.128993
653
+ vt 0.968590 0.170336
654
+ vt 0.945172 0.205385
655
+ vt 0.910123 0.228803
656
+ vt 0.868780 0.237027
657
+ vt 0.622632 0.234951
658
+ vt 0.643709 0.128993
659
+ vt 0.643709 0.237027
660
+ vt 0.602366 0.228803
661
+ vt 0.583688 0.218820
662
+ vt 0.567317 0.205385
663
+ vt 0.553881 0.189013
664
+ vt 0.543898 0.170336
665
+ vt 0.537751 0.150069
666
+ vt 0.535675 0.128993
667
+ vt 0.537751 0.107916
668
+ vt 0.543898 0.087650
669
+ vt 0.553881 0.068972
670
+ vt 0.567317 0.052601
671
+ vt 0.583688 0.039165
672
+ vt 0.602366 0.029182
673
+ vt 0.622632 0.023035
674
+ vt 0.643709 0.020959
675
+ vt 0.664785 0.023035
676
+ vt 0.685052 0.029182
677
+ vt 0.703729 0.039165
678
+ vt 0.720101 0.052601
679
+ vt 0.733536 0.068972
680
+ vt 0.743519 0.087650
681
+ vt 0.749667 0.107916
682
+ vt 0.751743 0.128993
683
+ vt 0.749667 0.150069
684
+ vt 0.743519 0.170336
685
+ vt 0.733536 0.189013
686
+ vt 0.720101 0.205385
687
+ vt 0.703729 0.218820
688
+ vt 0.685052 0.228803
689
+ vt 0.664785 0.234951
690
+ s 0
691
+ usemtl MI_YamahaMSP3_MatteBlack.003
692
+ f 99/196/70 123/197/70 115/198/70
693
+ f 107/199/70 103/200/70 99/196/70
694
+ f 115/198/70 111/201/70 107/199/70
695
+ f 123/197/70 119/202/70 115/198/70
696
+ f 99/196/70 127/203/70 123/197/70
697
+ f 103/200/70 101/204/70 99/196/70
698
+ f 107/199/70 105/205/70 103/200/70
699
+ f 111/201/70 109/206/70 107/199/70
700
+ f 115/198/70 113/207/70 111/201/70
701
+ f 119/202/70 117/208/70 115/198/70
702
+ f 123/197/70 121/209/70 119/202/70
703
+ f 127/203/70 125/210/70 123/197/70
704
+ f 99/196/70 129/211/70 127/203/70
705
+ f 101/204/70 100/212/70 99/196/70
706
+ f 103/200/71 102/213/71 101/204/71
707
+ f 105/205/71 104/214/71 103/200/71
708
+ f 107/199/72 106/215/72 105/205/72
709
+ f 109/206/72 108/216/72 107/199/72
710
+ f 111/201/71 110/217/71 109/206/71
711
+ f 113/207/70 112/218/70 111/201/70
712
+ f 115/198/70 114/219/70 113/207/70
713
+ f 117/208/70 116/220/70 115/198/70
714
+ f 119/202/72 118/221/72 117/208/72
715
+ f 121/209/71 120/222/71 119/202/71
716
+ f 123/197/71 122/223/71 121/209/71
717
+ f 125/210/72 124/224/72 123/197/72
718
+ f 127/203/72 126/225/72 125/210/72
719
+ f 129/211/70 128/226/70 127/203/70
720
+ f 99/196/70 130/227/70 129/211/70
721
+ f 99/228/73 98/229/73 130/230/73
722
+ f 100/231/74 98/229/74 99/228/74
723
+ f 115/198/70 107/199/70 99/196/70
724
+ f 101/232/75 98/229/75 100/231/75
725
+ f 102/233/76 98/229/76 101/232/76
726
+ f 103/234/77 98/229/77 102/233/77
727
+ f 104/235/78 98/229/78 103/234/78
728
+ f 105/236/79 98/229/79 104/235/79
729
+ f 106/237/80 98/229/80 105/236/80
730
+ f 107/238/81 98/229/81 106/237/81
731
+ f 108/239/82 98/229/82 107/238/82
732
+ f 109/240/83 98/229/83 108/239/83
733
+ f 110/241/84 98/229/84 109/240/84
734
+ f 111/242/85 98/229/85 110/241/85
735
+ f 112/243/86 98/229/86 111/242/86
736
+ f 113/244/87 98/229/87 112/243/87
737
+ f 114/245/88 98/229/88 113/244/88
738
+ f 115/246/89 98/229/89 114/245/89
739
+ f 116/247/90 98/229/90 115/246/90
740
+ f 117/248/91 98/229/91 116/247/91
741
+ f 118/249/92 98/229/92 117/248/92
742
+ f 119/250/93 98/229/93 118/249/93
743
+ f 120/251/94 98/229/94 119/250/94
744
+ f 121/252/95 98/229/95 120/251/95
745
+ f 122/253/96 98/229/96 121/252/96
746
+ f 123/254/97 98/229/97 122/253/97
747
+ f 124/255/98 98/229/98 123/254/98
748
+ f 125/256/99 98/229/99 124/255/99
749
+ f 126/257/100 98/229/100 125/256/100
750
+ f 127/258/101 98/229/101 126/257/101
751
+ f 128/259/102 98/229/102 127/258/102
752
+ f 129/260/103 98/229/103 128/259/103
753
+ f 130/230/104 98/229/104 129/260/104
754
+ o Yzhu
755
+ v -0.097545 0.490392 -0.000000
756
+ v -0.097545 0.490391 -24.000000
757
+ v -0.191342 0.461939 -0.000000
758
+ v -0.191342 0.461938 -24.000000
759
+ v -0.277785 0.415734 -0.000000
760
+ v -0.277785 0.415733 -24.000000
761
+ v -0.353553 0.353553 -0.000000
762
+ v -0.353553 0.353552 -24.000000
763
+ v -0.415735 0.277785 -0.000000
764
+ v -0.415735 0.277784 -24.000000
765
+ v -0.461940 0.191341 -0.000000
766
+ v -0.461940 0.191340 -24.000000
767
+ v -0.490393 0.097545 -0.000000
768
+ v -0.490393 0.097544 -24.000000
769
+ v -0.500000 -0.000001 0.000000
770
+ v -0.500000 -0.000001 -24.000000
771
+ v -0.490393 -0.097546 0.000000
772
+ v -0.490393 -0.097547 -24.000000
773
+ v -0.461940 -0.191342 0.000000
774
+ v -0.461940 -0.191343 -24.000000
775
+ v -0.415735 -0.277786 0.000000
776
+ v -0.415735 -0.277787 -24.000000
777
+ v -0.353553 -0.353554 0.000000
778
+ v -0.353553 -0.353555 -24.000000
779
+ v -0.277785 -0.415735 0.000000
780
+ v -0.277785 -0.415736 -24.000000
781
+ v -0.191342 -0.461940 0.000000
782
+ v -0.191342 -0.461941 -24.000000
783
+ v -0.097545 -0.490393 0.000000
784
+ v -0.097545 -0.490394 -24.000000
785
+ v 0.000000 -0.500001 0.000000
786
+ v 0.000000 -0.500001 -24.000000
787
+ v 0.097545 -0.490393 0.000000
788
+ v 0.097545 -0.490394 -24.000000
789
+ v 0.191342 -0.461940 0.000000
790
+ v 0.191342 -0.461941 -24.000000
791
+ v 0.277785 -0.415735 0.000000
792
+ v 0.277785 -0.415736 -24.000000
793
+ v 0.353553 -0.353554 0.000000
794
+ v 0.353553 -0.353555 -24.000000
795
+ v 0.415735 -0.277786 0.000000
796
+ v 0.415735 -0.277787 -24.000000
797
+ v 0.461940 -0.191342 0.000000
798
+ v 0.461940 -0.191343 -24.000000
799
+ v 0.490393 -0.097546 0.000000
800
+ v 0.490393 -0.097547 -24.000000
801
+ v 0.500000 -0.000001 0.000000
802
+ v 0.500000 -0.000001 -24.000000
803
+ v 0.490393 0.097545 -0.000000
804
+ v 0.490393 0.097544 -24.000000
805
+ v 0.461940 0.191341 -0.000000
806
+ v 0.461940 0.191340 -24.000000
807
+ v 0.415735 0.277785 -0.000000
808
+ v 0.415735 0.277784 -24.000000
809
+ v 0.353553 0.353553 -0.000000
810
+ v 0.353553 0.353552 -24.000000
811
+ v 0.277785 0.415734 -0.000000
812
+ v 0.277785 0.415733 -24.000000
813
+ v 0.191342 0.461939 -0.000000
814
+ v 0.191342 0.461938 -24.000000
815
+ v 0.097545 0.490392 -0.000000
816
+ v 0.097545 0.490391 -24.000000
817
+ v 0.000000 0.499999 -0.000000
818
+ v 0.000000 0.499999 -24.000000
819
+ vn -0.0000 -0.0000 -1.0000
820
+ vn -0.0001 -0.0000 -1.0000
821
+ vn 0.0001 -0.0000 -1.0000
822
+ vn -0.0980 0.9952 -0.0000
823
+ vn -0.2903 0.9569 -0.0000
824
+ vn -0.0000 -0.0000 1.0000
825
+ vn -0.4714 0.8819 -0.0000
826
+ vn -0.6344 0.7730 -0.0000
827
+ vn -0.7730 0.6344 -0.0000
828
+ vn -0.8819 0.4714 -0.0000
829
+ vn -0.9569 0.2903 -0.0000
830
+ vn -0.9952 0.0980 -0.0000
831
+ vn -0.9952 -0.0980 -0.0000
832
+ vn -0.9569 -0.2903 -0.0000
833
+ vn -0.8819 -0.4714 -0.0000
834
+ vn -0.7730 -0.6344 -0.0000
835
+ vn -0.6344 -0.7730 -0.0000
836
+ vn -0.4714 -0.8819 -0.0000
837
+ vn -0.2903 -0.9569 -0.0000
838
+ vn -0.0980 -0.9952 -0.0000
839
+ vn 0.0980 -0.9952 -0.0000
840
+ vn 0.2903 -0.9569 -0.0000
841
+ vn 0.4714 -0.8819 -0.0000
842
+ vn 0.6344 -0.7730 -0.0000
843
+ vn 0.7730 -0.6344 -0.0000
844
+ vn 0.8819 -0.4714 -0.0000
845
+ vn 0.9569 -0.2903 -0.0000
846
+ vn 0.9952 -0.0980 -0.0000
847
+ vn 0.9952 0.0980 -0.0000
848
+ vn 0.9569 0.2903 -0.0000
849
+ vn 0.8819 0.4714 -0.0000
850
+ vn 0.7730 0.6344 -0.0000
851
+ vn 0.6344 0.7730 -0.0000
852
+ vn 0.4714 0.8819 -0.0000
853
+ vn 0.2903 0.9569 -0.0000
854
+ vn 0.0980 0.9952 -0.0000
855
+ vt 0.847703 0.234951
856
+ vt 0.974738 0.150069
857
+ vt 0.889856 0.023035
858
+ vt 0.762822 0.107916
859
+ vt 0.778953 0.189013
860
+ vt 0.808759 0.039165
861
+ vt 0.958607 0.068972
862
+ vt 0.928801 0.218820
863
+ vt 0.808759 0.218820
864
+ vt 0.762822 0.150069
865
+ vt 0.778953 0.068972
866
+ vt 0.847703 0.023035
867
+ vt 0.928801 0.039165
868
+ vt 0.974738 0.107916
869
+ vt 0.958607 0.189013
870
+ vt 0.889856 0.234951
871
+ vt 0.827437 0.228803
872
+ vt 0.792388 0.205385
873
+ vt 0.768969 0.170336
874
+ vt 0.760746 0.128993
875
+ vt 0.768969 0.087650
876
+ vt 0.792388 0.052601
877
+ vt 0.827437 0.029182
878
+ vt 0.868780 0.020959
879
+ vt 0.910123 0.029182
880
+ vt 0.945172 0.052601
881
+ vt 0.968590 0.087650
882
+ vt 0.976814 0.128993
883
+ vt 0.968590 0.170336
884
+ vt 0.945172 0.205385
885
+ vt 0.910123 0.228803
886
+ vt 0.868780 0.237027
887
+ vt 0.545240 0.466600
888
+ vt 0.531173 0.466600
889
+ vt 0.531173 0.241528
890
+ vt 0.559307 0.466600
891
+ vt 0.545240 0.241528
892
+ vt 0.685052 0.228803
893
+ vt 0.543898 0.170336
894
+ vt 0.602366 0.029182
895
+ vt 0.743519 0.087650
896
+ vt 0.743519 0.170336
897
+ vt 0.685052 0.029182
898
+ vt 0.543898 0.087650
899
+ vt 0.602366 0.228803
900
+ vt 0.720101 0.205385
901
+ vt 0.751743 0.128993
902
+ vt 0.720101 0.052601
903
+ vt 0.643709 0.020959
904
+ vt 0.567317 0.052601
905
+ vt 0.535675 0.128993
906
+ vt 0.567317 0.205385
907
+ vt 0.643709 0.237027
908
+ vt 0.703729 0.218820
909
+ vt 0.733536 0.189013
910
+ vt 0.749667 0.150069
911
+ vt 0.749667 0.107916
912
+ vt 0.733536 0.068972
913
+ vt 0.703729 0.039165
914
+ vt 0.664785 0.023035
915
+ vt 0.622632 0.023035
916
+ vt 0.583688 0.039165
917
+ vt 0.553881 0.068972
918
+ vt 0.537751 0.107916
919
+ vt 0.537751 0.150069
920
+ vt 0.553881 0.189013
921
+ vt 0.583688 0.218820
922
+ vt 0.622632 0.234951
923
+ vt 0.664785 0.234951
924
+ vt 0.573374 0.466600
925
+ vt 0.559307 0.241528
926
+ vt 0.587441 0.466600
927
+ vt 0.573374 0.241528
928
+ vt 0.601508 0.466600
929
+ vt 0.587441 0.241528
930
+ vt 0.615575 0.466600
931
+ vt 0.601508 0.241528
932
+ vt 0.629642 0.466600
933
+ vt 0.615575 0.241528
934
+ vt 0.643709 0.466600
935
+ vt 0.629642 0.241528
936
+ vt 0.657776 0.466600
937
+ vt 0.643709 0.241528
938
+ vt 0.671843 0.466600
939
+ vt 0.657776 0.241528
940
+ vt 0.685910 0.466600
941
+ vt 0.671843 0.241528
942
+ vt 0.699977 0.466600
943
+ vt 0.685910 0.241528
944
+ vt 0.714043 0.466600
945
+ vt 0.699977 0.241528
946
+ vt 0.728110 0.466600
947
+ vt 0.714043 0.241528
948
+ vt 0.742177 0.466600
949
+ vt 0.728110 0.241528
950
+ vt 0.756244 0.466600
951
+ vt 0.742177 0.241528
952
+ vt 0.770311 0.466600
953
+ vt 0.756244 0.241528
954
+ vt 0.784378 0.466600
955
+ vt 0.770311 0.241528
956
+ vt 0.798445 0.466600
957
+ vt 0.784378 0.241528
958
+ vt 0.812512 0.466600
959
+ vt 0.798445 0.241528
960
+ vt 0.826579 0.466600
961
+ vt 0.812512 0.241528
962
+ vt 0.840646 0.466600
963
+ vt 0.826579 0.241528
964
+ vt 0.854713 0.466600
965
+ vt 0.840646 0.241528
966
+ vt 0.868780 0.466600
967
+ vt 0.854713 0.241528
968
+ vt 0.882847 0.466600
969
+ vt 0.868780 0.241528
970
+ vt 0.896914 0.466600
971
+ vt 0.882847 0.241528
972
+ vt 0.910981 0.466600
973
+ vt 0.896914 0.241528
974
+ vt 0.925048 0.466600
975
+ vt 0.910981 0.241528
976
+ vt 0.939115 0.466600
977
+ vt 0.925048 0.241528
978
+ vt 0.953182 0.466600
979
+ vt 0.939115 0.241528
980
+ vt 0.967249 0.466600
981
+ vt 0.953182 0.241528
982
+ vt 0.981316 0.466600
983
+ vt 0.967249 0.241528
984
+ vt 0.981316 0.241528
985
+ s 0
986
+ usemtl MI_YamahaMSP3_MatteBlack.003
987
+ f 132/261/105 180/262/105 164/263/105
988
+ f 148/264/105 140/265/105 132/261/105
989
+ f 164/263/105 156/266/105 148/264/105
990
+ f 180/262/105 172/267/105 164/263/105
991
+ f 132/261/105 188/268/105 180/262/105
992
+ f 140/265/105 136/269/105 132/261/105
993
+ f 148/264/106 144/270/106 140/265/106
994
+ f 156/266/105 152/271/105 148/264/105
995
+ f 164/263/105 160/272/105 156/266/105
996
+ f 172/267/105 168/273/105 164/263/105
997
+ f 180/262/107 176/274/107 172/267/107
998
+ f 188/268/105 184/275/105 180/262/105
999
+ f 132/261/105 192/276/105 188/268/105
1000
+ f 136/269/105 134/277/105 132/261/105
1001
+ f 140/265/105 138/278/105 136/269/105
1002
+ f 144/270/107 142/279/107 140/265/107
1003
+ f 148/264/106 146/280/106 144/270/106
1004
+ f 152/271/105 150/281/105 148/264/105
1005
+ f 156/266/105 154/282/105 152/271/105
1006
+ f 160/272/105 158/283/105 156/266/105
1007
+ f 164/263/105 162/284/105 160/272/105
1008
+ f 168/273/105 166/285/105 164/263/105
1009
+ f 172/267/105 170/286/105 168/273/105
1010
+ f 176/274/105 174/287/105 172/267/105
1011
+ f 180/262/107 178/288/107 176/274/107
1012
+ f 184/275/106 182/289/106 180/262/106
1013
+ f 188/268/105 186/290/105 184/275/105
1014
+ f 192/276/105 190/291/105 188/268/105
1015
+ f 132/261/105 194/292/105 192/276/105
1016
+ f 131/293/108 193/294/108 194/295/108
1017
+ f 133/296/109 131/293/109 132/297/109
1018
+ f 189/298/110 141/299/110 157/300/110
1019
+ f 173/301/110 181/302/110 189/298/110
1020
+ f 157/300/110 165/303/110 173/301/110
1021
+ f 141/299/110 149/304/110 157/300/110
1022
+ f 189/298/110 133/305/110 141/299/110
1023
+ f 181/302/110 185/306/110 189/298/110
1024
+ f 173/301/110 177/307/110 181/302/110
1025
+ f 165/303/110 169/308/110 173/301/110
1026
+ f 157/300/110 161/309/110 165/303/110
1027
+ f 149/304/110 153/310/110 157/300/110
1028
+ f 141/299/110 145/311/110 149/304/110
1029
+ f 133/305/110 137/312/110 141/299/110
1030
+ f 189/298/110 193/313/110 133/305/110
1031
+ f 185/306/110 187/314/110 189/298/110
1032
+ f 181/302/110 183/315/110 185/306/110
1033
+ f 177/307/110 179/316/110 181/302/110
1034
+ f 173/301/110 175/317/110 177/307/110
1035
+ f 169/308/110 171/318/110 173/301/110
1036
+ f 165/303/110 167/319/110 169/308/110
1037
+ f 161/309/110 163/320/110 165/303/110
1038
+ f 157/300/110 159/321/110 161/309/110
1039
+ f 153/310/110 155/322/110 157/300/110
1040
+ f 149/304/110 151/323/110 153/310/110
1041
+ f 145/311/110 147/324/110 149/304/110
1042
+ f 141/299/110 143/325/110 145/311/110
1043
+ f 137/312/110 139/326/110 141/299/110
1044
+ f 133/305/110 135/327/110 137/312/110
1045
+ f 193/313/110 131/328/110 133/305/110
1046
+ f 189/298/110 191/329/110 193/313/110
1047
+ f 135/330/111 133/296/111 134/331/111
1048
+ f 137/332/112 135/330/112 136/333/112
1049
+ f 139/334/113 137/332/113 138/335/113
1050
+ f 141/336/114 139/334/114 140/337/114
1051
+ f 143/338/115 141/336/115 142/339/115
1052
+ f 145/340/116 143/338/116 144/341/116
1053
+ f 147/342/117 145/340/117 146/343/117
1054
+ f 149/344/118 147/342/118 148/345/118
1055
+ f 151/346/119 149/344/119 150/347/119
1056
+ f 153/348/120 151/346/120 152/349/120
1057
+ f 155/350/121 153/348/121 154/351/121
1058
+ f 157/352/122 155/350/122 156/353/122
1059
+ f 159/354/123 157/352/123 158/355/123
1060
+ f 161/356/124 159/354/124 160/357/124
1061
+ f 163/358/125 161/356/125 162/359/125
1062
+ f 165/360/126 163/358/126 164/361/126
1063
+ f 167/362/127 165/360/127 166/363/127
1064
+ f 169/364/128 167/362/128 168/365/128
1065
+ f 171/366/129 169/364/129 170/367/129
1066
+ f 173/368/130 171/366/130 172/369/130
1067
+ f 175/370/131 173/368/131 174/371/131
1068
+ f 177/372/132 175/370/132 176/373/132
1069
+ f 179/374/133 177/372/133 178/375/133
1070
+ f 181/376/134 179/374/134 180/377/134
1071
+ f 183/378/135 181/376/135 182/379/135
1072
+ f 185/380/136 183/378/136 184/381/136
1073
+ f 187/382/137 185/380/137 186/383/137
1074
+ f 189/384/138 187/382/138 188/385/138
1075
+ f 191/386/139 189/384/139 190/387/139
1076
+ f 193/388/140 191/386/140 192/389/140
1077
+ f 164/263/105 148/264/105 132/261/105
1078
+ f 131/293/108 194/295/108 132/297/108
1079
+ f 133/296/109 132/297/109 134/331/109
1080
+ f 157/300/110 173/301/110 189/298/110
1081
+ f 135/330/111 134/331/111 136/333/111
1082
+ f 137/332/112 136/333/112 138/335/112
1083
+ f 139/334/113 138/335/113 140/337/113
1084
+ f 141/336/114 140/337/114 142/339/114
1085
+ f 143/338/115 142/339/115 144/341/115
1086
+ f 145/340/116 144/341/116 146/343/116
1087
+ f 147/342/117 146/343/117 148/345/117
1088
+ f 149/344/118 148/345/118 150/347/118
1089
+ f 151/346/119 150/347/119 152/349/119
1090
+ f 153/348/120 152/349/120 154/351/120
1091
+ f 155/350/121 154/351/121 156/353/121
1092
+ f 157/352/122 156/353/122 158/355/122
1093
+ f 159/354/123 158/355/123 160/357/123
1094
+ f 161/356/124 160/357/124 162/359/124
1095
+ f 163/358/125 162/359/125 164/361/125
1096
+ f 165/360/126 164/361/126 166/363/126
1097
+ f 167/362/127 166/363/127 168/365/127
1098
+ f 169/364/128 168/365/128 170/367/128
1099
+ f 171/366/129 170/367/129 172/369/129
1100
+ f 173/368/130 172/369/130 174/371/130
1101
+ f 175/370/131 174/371/131 176/373/131
1102
+ f 177/372/132 176/373/132 178/375/132
1103
+ f 179/374/133 178/375/133 180/377/133
1104
+ f 181/376/134 180/377/134 182/379/134
1105
+ f 183/378/135 182/379/135 184/381/135
1106
+ f 185/380/136 184/381/136 186/383/136
1107
+ f 187/382/137 186/383/137 188/385/137
1108
+ f 189/384/138 188/385/138 190/387/138
1109
+ f 191/386/139 190/387/139 192/389/139
1110
+ f 193/388/140 192/389/140 194/390/140
1111
+ o Z
1112
+ v 0.000000 28.000000 -0.000002
1113
+ v -0.292636 22.000000 -1.471180
1114
+ v -0.574025 22.000000 -1.385821
1115
+ v -0.833355 22.000000 -1.247206
1116
+ v -1.060660 22.000000 -1.060662
1117
+ v -1.247204 22.000000 -0.833357
1118
+ v -1.385819 22.000000 -0.574027
1119
+ v -1.471178 22.000000 -0.292638
1120
+ v -1.500000 22.000000 -0.000002
1121
+ v -1.471178 22.000000 0.292634
1122
+ v -1.385819 22.000000 0.574023
1123
+ v -1.247204 22.000000 0.833353
1124
+ v -1.060660 22.000000 1.060658
1125
+ v -0.833355 22.000000 1.247202
1126
+ v -0.574025 22.000000 1.385817
1127
+ v -0.292636 22.000000 1.471176
1128
+ v 0.000000 22.000000 1.499998
1129
+ v 0.292636 22.000000 1.471176
1130
+ v 0.574025 22.000000 1.385817
1131
+ v 0.833355 22.000000 1.247202
1132
+ v 1.060660 22.000000 1.060658
1133
+ v 1.247204 22.000000 0.833353
1134
+ v 1.385819 22.000000 0.574023
1135
+ v 1.471178 22.000000 0.292634
1136
+ v 1.500000 22.000000 -0.000002
1137
+ v 1.471178 22.000000 -0.292638
1138
+ v 1.385819 22.000000 -0.574027
1139
+ v 1.247204 22.000000 -0.833357
1140
+ v 1.060660 22.000000 -1.060662
1141
+ v 0.833355 22.000000 -1.247206
1142
+ v 0.574025 22.000000 -1.385821
1143
+ v 0.292636 22.000000 -1.471180
1144
+ v 0.000000 22.000000 -1.500002
1145
+ vn -0.0000 -1.0000 -0.0000
1146
+ vn -0.0000 -1.0000 0.0001
1147
+ vn -0.0000 -1.0000 -0.0001
1148
+ vn -0.0951 0.2414 -0.9657
1149
+ vn -0.2817 0.2414 -0.9286
1150
+ vn -0.4575 0.2414 -0.8558
1151
+ vn -0.6156 0.2414 -0.7501
1152
+ vn -0.7501 0.2414 -0.6156
1153
+ vn -0.8558 0.2414 -0.4575
1154
+ vn -0.9286 0.2414 -0.2817
1155
+ vn -0.9657 0.2414 -0.0951
1156
+ vn -0.9657 0.2414 0.0951
1157
+ vn -0.9286 0.2414 0.2817
1158
+ vn -0.8558 0.2414 0.4575
1159
+ vn -0.7501 0.2414 0.6156
1160
+ vn -0.6156 0.2414 0.7501
1161
+ vn -0.4575 0.2414 0.8558
1162
+ vn -0.2817 0.2414 0.9286
1163
+ vn -0.0951 0.2414 0.9657
1164
+ vn 0.0951 0.2414 0.9657
1165
+ vn 0.2817 0.2414 0.9286
1166
+ vn 0.4575 0.2414 0.8558
1167
+ vn 0.6156 0.2414 0.7501
1168
+ vn 0.7501 0.2414 0.6156
1169
+ vn 0.8558 0.2414 0.4575
1170
+ vn 0.9286 0.2414 0.2817
1171
+ vn 0.9657 0.2414 0.0951
1172
+ vn 0.9657 0.2414 -0.0951
1173
+ vn 0.9286 0.2414 -0.2817
1174
+ vn 0.8558 0.2414 -0.4575
1175
+ vn 0.7501 0.2414 -0.6156
1176
+ vn 0.6156 0.2414 -0.7501
1177
+ vn 0.4575 0.2414 -0.8558
1178
+ vn 0.2817 0.2414 -0.9286
1179
+ vn 0.0951 0.2414 -0.9657
1180
+ vt 0.344619 0.232996
1181
+ vt 0.473521 0.146867
1182
+ vt 0.387392 0.017966
1183
+ vt 0.258490 0.104095
1184
+ vt 0.274858 0.186384
1185
+ vt 0.305103 0.034334
1186
+ vt 0.457153 0.064579
1187
+ vt 0.426908 0.216629
1188
+ vt 0.305103 0.216629
1189
+ vt 0.258490 0.146867
1190
+ vt 0.274858 0.064579
1191
+ vt 0.344619 0.017966
1192
+ vt 0.426908 0.034334
1193
+ vt 0.473521 0.104095
1194
+ vt 0.457153 0.186384
1195
+ vt 0.387392 0.232996
1196
+ vt 0.324055 0.226758
1197
+ vt 0.288491 0.202996
1198
+ vt 0.264728 0.167432
1199
+ vt 0.256384 0.125481
1200
+ vt 0.264728 0.083531
1201
+ vt 0.288491 0.047967
1202
+ vt 0.324055 0.024204
1203
+ vt 0.366006 0.015859
1204
+ vt 0.407956 0.024204
1205
+ vt 0.443520 0.047967
1206
+ vt 0.467283 0.083531
1207
+ vt 0.475627 0.125481
1208
+ vt 0.467283 0.167432
1209
+ vt 0.443520 0.202996
1210
+ vt 0.407956 0.226758
1211
+ vt 0.366006 0.235103
1212
+ vt 0.116241 0.232996
1213
+ vt 0.137627 0.125481
1214
+ vt 0.137627 0.235103
1215
+ vt 0.095676 0.226758
1216
+ vt 0.076724 0.216629
1217
+ vt 0.060112 0.202996
1218
+ vt 0.046480 0.186384
1219
+ vt 0.036350 0.167432
1220
+ vt 0.030112 0.146867
1221
+ vt 0.028005 0.125481
1222
+ vt 0.030112 0.104095
1223
+ vt 0.036350 0.083531
1224
+ vt 0.046480 0.064579
1225
+ vt 0.060112 0.047967
1226
+ vt 0.076724 0.034334
1227
+ vt 0.095676 0.024204
1228
+ vt 0.116241 0.017966
1229
+ vt 0.137627 0.015859
1230
+ vt 0.159013 0.017966
1231
+ vt 0.179577 0.024204
1232
+ vt 0.198530 0.034334
1233
+ vt 0.215141 0.047967
1234
+ vt 0.228774 0.064579
1235
+ vt 0.238904 0.083531
1236
+ vt 0.245142 0.104095
1237
+ vt 0.247249 0.125481
1238
+ vt 0.245142 0.146867
1239
+ vt 0.238904 0.167432
1240
+ vt 0.228774 0.186384
1241
+ vt 0.215141 0.202996
1242
+ vt 0.198530 0.216629
1243
+ vt 0.179577 0.226758
1244
+ vt 0.159013 0.232996
1245
+ s 0
1246
+ usemtl MI_YamahaMSP3_MatteBlack.010
1247
+ f 196/391/141 220/392/141 212/393/141
1248
+ f 204/394/141 200/395/141 196/391/141
1249
+ f 212/393/141 208/396/141 204/394/141
1250
+ f 220/392/141 216/397/141 212/393/141
1251
+ f 196/391/141 224/398/141 220/392/141
1252
+ f 200/395/141 198/399/141 196/391/141
1253
+ f 204/394/141 202/400/141 200/395/141
1254
+ f 208/396/141 206/401/141 204/394/141
1255
+ f 212/393/141 210/402/141 208/396/141
1256
+ f 216/397/141 214/403/141 212/393/141
1257
+ f 220/392/141 218/404/141 216/397/141
1258
+ f 224/398/141 222/405/141 220/392/141
1259
+ f 196/391/141 226/406/141 224/398/141
1260
+ f 198/399/142 197/407/142 196/391/142
1261
+ f 200/395/143 199/408/143 198/399/143
1262
+ f 202/400/141 201/409/141 200/395/141
1263
+ f 204/394/141 203/410/141 202/400/141
1264
+ f 206/401/141 205/411/141 204/394/141
1265
+ f 208/396/142 207/412/142 206/401/142
1266
+ f 210/402/143 209/413/143 208/396/143
1267
+ f 212/393/141 211/414/141 210/402/141
1268
+ f 214/403/143 213/415/143 212/393/143
1269
+ f 216/397/142 215/416/142 214/403/142
1270
+ f 218/404/141 217/417/141 216/397/141
1271
+ f 220/392/141 219/418/141 218/404/141
1272
+ f 222/405/141 221/419/141 220/392/141
1273
+ f 224/398/143 223/420/143 222/405/143
1274
+ f 226/406/142 225/421/142 224/398/142
1275
+ f 196/391/141 227/422/141 226/406/141
1276
+ f 196/423/144 195/424/144 227/425/144
1277
+ f 197/426/145 195/424/145 196/423/145
1278
+ f 212/393/141 204/394/141 196/391/141
1279
+ f 198/427/146 195/424/146 197/426/146
1280
+ f 199/428/147 195/424/147 198/427/147
1281
+ f 200/429/148 195/424/148 199/428/148
1282
+ f 201/430/149 195/424/149 200/429/149
1283
+ f 202/431/150 195/424/150 201/430/150
1284
+ f 203/432/151 195/424/151 202/431/151
1285
+ f 204/433/152 195/424/152 203/432/152
1286
+ f 205/434/153 195/424/153 204/433/153
1287
+ f 206/435/154 195/424/154 205/434/154
1288
+ f 207/436/155 195/424/155 206/435/155
1289
+ f 208/437/156 195/424/156 207/436/156
1290
+ f 209/438/157 195/424/157 208/437/157
1291
+ f 210/439/158 195/424/158 209/438/158
1292
+ f 211/440/159 195/424/159 210/439/159
1293
+ f 212/441/160 195/424/160 211/440/160
1294
+ f 213/442/161 195/424/161 212/441/161
1295
+ f 214/443/162 195/424/162 213/442/162
1296
+ f 215/444/163 195/424/163 214/443/163
1297
+ f 216/445/164 195/424/164 215/444/164
1298
+ f 217/446/165 195/424/165 216/445/165
1299
+ f 218/447/166 195/424/166 217/446/166
1300
+ f 219/448/167 195/424/167 218/447/167
1301
+ f 220/449/168 195/424/168 219/448/168
1302
+ f 221/450/169 195/424/169 220/449/169
1303
+ f 222/451/170 195/424/170 221/450/170
1304
+ f 223/452/171 195/424/171 222/451/171
1305
+ f 224/453/172 195/424/172 223/452/172
1306
+ f 225/454/173 195/424/173 224/453/173
1307
+ f 226/455/174 195/424/174 225/454/174
1308
+ f 227/425/175 195/424/175 226/455/175
1309
+ o Zzhu
1310
+ v -0.097545 24.000000 -0.490395
1311
+ v -0.097545 -0.000000 -0.490393
1312
+ v -0.191342 24.000000 -0.461942
1313
+ v -0.191342 -0.000000 -0.461940
1314
+ v -0.277785 24.000000 -0.415737
1315
+ v -0.277785 -0.000000 -0.415735
1316
+ v -0.353553 24.000000 -0.353555
1317
+ v -0.353553 -0.000000 -0.353553
1318
+ v -0.415735 24.000000 -0.277787
1319
+ v -0.415735 -0.000000 -0.277785
1320
+ v -0.461940 24.000000 -0.191344
1321
+ v -0.461940 -0.000000 -0.191342
1322
+ v -0.490393 24.000000 -0.097547
1323
+ v -0.490393 -0.000000 -0.097545
1324
+ v -0.500000 24.000000 -0.000002
1325
+ v -0.500000 0.000000 0.000000
1326
+ v -0.490393 24.000000 0.097543
1327
+ v -0.490393 0.000000 0.097545
1328
+ v -0.461940 24.000000 0.191340
1329
+ v -0.461940 0.000000 0.191342
1330
+ v -0.415735 24.000000 0.277783
1331
+ v -0.415735 0.000000 0.277785
1332
+ v -0.353553 24.000000 0.353551
1333
+ v -0.353553 0.000000 0.353553
1334
+ v -0.277785 24.000000 0.415733
1335
+ v -0.277785 0.000000 0.415735
1336
+ v -0.191342 24.000000 0.461938
1337
+ v -0.191342 0.000000 0.461940
1338
+ v -0.097545 24.000000 0.490391
1339
+ v -0.097545 0.000000 0.490393
1340
+ v 0.000000 24.000000 0.499998
1341
+ v 0.000000 0.000000 0.500000
1342
+ v 0.097545 24.000000 0.490391
1343
+ v 0.097545 0.000000 0.490393
1344
+ v 0.191342 24.000000 0.461938
1345
+ v 0.191342 0.000000 0.461940
1346
+ v 0.277785 24.000000 0.415733
1347
+ v 0.277785 0.000000 0.415735
1348
+ v 0.353553 24.000000 0.353551
1349
+ v 0.353553 0.000000 0.353553
1350
+ v 0.415735 24.000000 0.277783
1351
+ v 0.415735 0.000000 0.277785
1352
+ v 0.461940 24.000000 0.191340
1353
+ v 0.461940 0.000000 0.191342
1354
+ v 0.490393 24.000000 0.097543
1355
+ v 0.490393 0.000000 0.097545
1356
+ v 0.500000 24.000000 -0.000002
1357
+ v 0.500000 0.000000 0.000000
1358
+ v 0.490393 24.000000 -0.097547
1359
+ v 0.490393 -0.000000 -0.097545
1360
+ v 0.461940 24.000000 -0.191344
1361
+ v 0.461940 -0.000000 -0.191342
1362
+ v 0.415735 24.000000 -0.277787
1363
+ v 0.415735 -0.000000 -0.277785
1364
+ v 0.353553 24.000000 -0.353555
1365
+ v 0.353553 -0.000000 -0.353553
1366
+ v 0.277785 24.000000 -0.415737
1367
+ v 0.277785 -0.000000 -0.415735
1368
+ v 0.191342 24.000000 -0.461942
1369
+ v 0.191342 -0.000000 -0.461940
1370
+ v 0.097545 24.000000 -0.490395
1371
+ v 0.097545 -0.000000 -0.490393
1372
+ v 0.000000 24.000000 -0.500002
1373
+ v 0.000000 -0.000000 -0.500000
1374
+ vn -0.0000 -1.0000 -0.0000
1375
+ vn -0.0980 -0.0000 -0.9952
1376
+ vn -0.2903 -0.0000 -0.9569
1377
+ vn -0.0000 1.0000 -0.0000
1378
+ vn -0.4714 -0.0000 -0.8819
1379
+ vn -0.6344 -0.0000 -0.7730
1380
+ vn -0.7730 -0.0000 -0.6344
1381
+ vn -0.8819 -0.0000 -0.4714
1382
+ vn -0.9569 -0.0000 -0.2903
1383
+ vn -0.9952 -0.0000 -0.0980
1384
+ vn -0.9952 -0.0000 0.0980
1385
+ vn -0.9569 -0.0000 0.2903
1386
+ vn -0.8819 -0.0000 0.4714
1387
+ vn -0.7730 -0.0000 0.6344
1388
+ vn -0.6344 -0.0000 0.7730
1389
+ vn -0.4714 -0.0000 0.8819
1390
+ vn -0.2903 -0.0000 0.9569
1391
+ vn -0.0980 -0.0000 0.9952
1392
+ vn 0.0980 -0.0000 0.9952
1393
+ vn 0.2903 -0.0000 0.9569
1394
+ vn 0.4714 -0.0000 0.8819
1395
+ vn 0.6344 -0.0000 0.7730
1396
+ vn 0.7730 -0.0000 0.6344
1397
+ vn 0.8819 -0.0000 0.4714
1398
+ vn 0.9569 -0.0000 0.2903
1399
+ vn 0.9952 -0.0000 0.0980
1400
+ vn 0.9952 -0.0000 -0.0980
1401
+ vn 0.9569 -0.0000 -0.2903
1402
+ vn 0.8819 -0.0000 -0.4714
1403
+ vn 0.7730 -0.0000 -0.6344
1404
+ vn 0.6344 -0.0000 -0.7730
1405
+ vn 0.4714 -0.0000 -0.8819
1406
+ vn 0.2903 -0.0000 -0.9569
1407
+ vn 0.0980 -0.0000 -0.9952
1408
+ vt 0.344619 0.232996
1409
+ vt 0.473521 0.146867
1410
+ vt 0.387392 0.017966
1411
+ vt 0.258490 0.104095
1412
+ vt 0.274858 0.186384
1413
+ vt 0.305103 0.034334
1414
+ vt 0.457153 0.064579
1415
+ vt 0.426908 0.216629
1416
+ vt 0.305103 0.216629
1417
+ vt 0.258490 0.146867
1418
+ vt 0.274858 0.064579
1419
+ vt 0.344619 0.017966
1420
+ vt 0.426908 0.034334
1421
+ vt 0.473521 0.104095
1422
+ vt 0.457153 0.186384
1423
+ vt 0.387392 0.232996
1424
+ vt 0.324055 0.226758
1425
+ vt 0.288491 0.202996
1426
+ vt 0.264728 0.167432
1427
+ vt 0.256384 0.125481
1428
+ vt 0.264728 0.083531
1429
+ vt 0.288491 0.047967
1430
+ vt 0.324055 0.024204
1431
+ vt 0.366006 0.015859
1432
+ vt 0.407956 0.024204
1433
+ vt 0.443520 0.047967
1434
+ vt 0.467283 0.083531
1435
+ vt 0.475627 0.125481
1436
+ vt 0.467283 0.167432
1437
+ vt 0.443520 0.202996
1438
+ vt 0.407956 0.226758
1439
+ vt 0.366006 0.235103
1440
+ vt 0.037711 0.468049
1441
+ vt 0.023437 0.468049
1442
+ vt 0.023437 0.239671
1443
+ vt 0.051985 0.468049
1444
+ vt 0.037711 0.239671
1445
+ vt 0.179577 0.226758
1446
+ vt 0.036350 0.167432
1447
+ vt 0.095676 0.024204
1448
+ vt 0.238904 0.083531
1449
+ vt 0.238904 0.167432
1450
+ vt 0.179577 0.024204
1451
+ vt 0.036350 0.083531
1452
+ vt 0.095676 0.226758
1453
+ vt 0.215141 0.202996
1454
+ vt 0.247249 0.125481
1455
+ vt 0.215141 0.047967
1456
+ vt 0.137627 0.015859
1457
+ vt 0.060112 0.047967
1458
+ vt 0.028005 0.125481
1459
+ vt 0.060112 0.202996
1460
+ vt 0.137627 0.235103
1461
+ vt 0.198530 0.216629
1462
+ vt 0.228774 0.186384
1463
+ vt 0.245142 0.146867
1464
+ vt 0.245142 0.104095
1465
+ vt 0.228774 0.064579
1466
+ vt 0.198530 0.034334
1467
+ vt 0.159013 0.017966
1468
+ vt 0.116241 0.017966
1469
+ vt 0.076724 0.034334
1470
+ vt 0.046480 0.064579
1471
+ vt 0.030112 0.104095
1472
+ vt 0.030112 0.146867
1473
+ vt 0.046480 0.186384
1474
+ vt 0.076724 0.216629
1475
+ vt 0.116241 0.232996
1476
+ vt 0.159013 0.232996
1477
+ vt 0.066259 0.468049
1478
+ vt 0.051985 0.239671
1479
+ vt 0.080532 0.468049
1480
+ vt 0.066259 0.239671
1481
+ vt 0.094806 0.468049
1482
+ vt 0.080532 0.239671
1483
+ vt 0.109080 0.468049
1484
+ vt 0.094806 0.239671
1485
+ vt 0.123353 0.468049
1486
+ vt 0.109080 0.239671
1487
+ vt 0.137627 0.468049
1488
+ vt 0.123353 0.239671
1489
+ vt 0.151901 0.468049
1490
+ vt 0.137627 0.239671
1491
+ vt 0.166174 0.468049
1492
+ vt 0.151901 0.239671
1493
+ vt 0.180448 0.468049
1494
+ vt 0.166174 0.239671
1495
+ vt 0.194722 0.468049
1496
+ vt 0.180448 0.239671
1497
+ vt 0.208995 0.468049
1498
+ vt 0.194722 0.239671
1499
+ vt 0.223269 0.468049
1500
+ vt 0.208995 0.239671
1501
+ vt 0.237543 0.468049
1502
+ vt 0.223269 0.239671
1503
+ vt 0.251816 0.468049
1504
+ vt 0.237543 0.239671
1505
+ vt 0.266090 0.468049
1506
+ vt 0.251816 0.239671
1507
+ vt 0.280364 0.468049
1508
+ vt 0.266090 0.239671
1509
+ vt 0.294637 0.468049
1510
+ vt 0.280364 0.239671
1511
+ vt 0.308911 0.468049
1512
+ vt 0.294637 0.239671
1513
+ vt 0.323185 0.468049
1514
+ vt 0.308911 0.239671
1515
+ vt 0.337458 0.468049
1516
+ vt 0.323185 0.239671
1517
+ vt 0.351732 0.468049
1518
+ vt 0.337458 0.239671
1519
+ vt 0.366006 0.468049
1520
+ vt 0.351732 0.239671
1521
+ vt 0.380279 0.468049
1522
+ vt 0.366006 0.239671
1523
+ vt 0.394553 0.468049
1524
+ vt 0.380279 0.239671
1525
+ vt 0.408827 0.468049
1526
+ vt 0.394553 0.239671
1527
+ vt 0.423100 0.468049
1528
+ vt 0.408827 0.239671
1529
+ vt 0.437374 0.468049
1530
+ vt 0.423100 0.239671
1531
+ vt 0.451648 0.468049
1532
+ vt 0.437374 0.239671
1533
+ vt 0.465921 0.468049
1534
+ vt 0.451648 0.239671
1535
+ vt 0.480195 0.468049
1536
+ vt 0.465921 0.239671
1537
+ vt 0.480195 0.239671
1538
+ s 0
1539
+ usemtl MI_YamahaMSP3_MatteBlack.010
1540
+ f 229/456/176 277/457/176 261/458/176
1541
+ f 245/459/176 237/460/176 229/456/176
1542
+ f 261/458/176 253/461/176 245/459/176
1543
+ f 277/457/176 269/462/176 261/458/176
1544
+ f 229/456/176 285/463/176 277/457/176
1545
+ f 237/460/176 233/464/176 229/456/176
1546
+ f 245/459/176 241/465/176 237/460/176
1547
+ f 253/461/176 249/466/176 245/459/176
1548
+ f 261/458/176 257/467/176 253/461/176
1549
+ f 269/462/176 265/468/176 261/458/176
1550
+ f 277/457/176 273/469/176 269/462/176
1551
+ f 285/463/176 281/470/176 277/457/176
1552
+ f 229/456/176 289/471/176 285/463/176
1553
+ f 233/464/176 231/472/176 229/456/176
1554
+ f 237/460/176 235/473/176 233/464/176
1555
+ f 241/465/176 239/474/176 237/460/176
1556
+ f 245/459/176 243/475/176 241/465/176
1557
+ f 249/466/176 247/476/176 245/459/176
1558
+ f 253/461/176 251/477/176 249/466/176
1559
+ f 257/467/176 255/478/176 253/461/176
1560
+ f 261/458/176 259/479/176 257/467/176
1561
+ f 265/468/176 263/480/176 261/458/176
1562
+ f 269/462/176 267/481/176 265/468/176
1563
+ f 273/469/176 271/482/176 269/462/176
1564
+ f 277/457/176 275/483/176 273/469/176
1565
+ f 281/470/176 279/484/176 277/457/176
1566
+ f 285/463/176 283/485/176 281/470/176
1567
+ f 289/471/176 287/486/176 285/463/176
1568
+ f 229/456/176 291/487/176 289/471/176
1569
+ f 228/488/177 290/489/177 291/490/177
1570
+ f 230/491/178 228/488/178 229/492/178
1571
+ f 286/493/179 238/494/179 254/495/179
1572
+ f 270/496/179 278/497/179 286/493/179
1573
+ f 254/495/179 262/498/179 270/496/179
1574
+ f 238/494/179 246/499/179 254/495/179
1575
+ f 286/493/179 230/500/179 238/494/179
1576
+ f 278/497/179 282/501/179 286/493/179
1577
+ f 270/496/179 274/502/179 278/497/179
1578
+ f 262/498/179 266/503/179 270/496/179
1579
+ f 254/495/179 258/504/179 262/498/179
1580
+ f 246/499/179 250/505/179 254/495/179
1581
+ f 238/494/179 242/506/179 246/499/179
1582
+ f 230/500/179 234/507/179 238/494/179
1583
+ f 286/493/179 290/508/179 230/500/179
1584
+ f 282/501/179 284/509/179 286/493/179
1585
+ f 278/497/179 280/510/179 282/501/179
1586
+ f 274/502/179 276/511/179 278/497/179
1587
+ f 270/496/179 272/512/179 274/502/179
1588
+ f 266/503/179 268/513/179 270/496/179
1589
+ f 262/498/179 264/514/179 266/503/179
1590
+ f 258/504/179 260/515/179 262/498/179
1591
+ f 254/495/179 256/516/179 258/504/179
1592
+ f 250/505/179 252/517/179 254/495/179
1593
+ f 246/499/179 248/518/179 250/505/179
1594
+ f 242/506/179 244/519/179 246/499/179
1595
+ f 238/494/179 240/520/179 242/506/179
1596
+ f 234/507/179 236/521/179 238/494/179
1597
+ f 230/500/179 232/522/179 234/507/179
1598
+ f 290/508/179 228/523/179 230/500/179
1599
+ f 286/493/179 288/524/179 290/508/179
1600
+ f 232/525/180 230/491/180 231/526/180
1601
+ f 234/527/181 232/525/181 233/528/181
1602
+ f 236/529/182 234/527/182 235/530/182
1603
+ f 238/531/183 236/529/183 237/532/183
1604
+ f 240/533/184 238/531/184 239/534/184
1605
+ f 242/535/185 240/533/185 241/536/185
1606
+ f 244/537/186 242/535/186 243/538/186
1607
+ f 246/539/187 244/537/187 245/540/187
1608
+ f 248/541/188 246/539/188 247/542/188
1609
+ f 250/543/189 248/541/189 249/544/189
1610
+ f 252/545/190 250/543/190 251/546/190
1611
+ f 254/547/191 252/545/191 253/548/191
1612
+ f 256/549/192 254/547/192 255/550/192
1613
+ f 258/551/193 256/549/193 257/552/193
1614
+ f 260/553/194 258/551/194 259/554/194
1615
+ f 262/555/195 260/553/195 261/556/195
1616
+ f 264/557/196 262/555/196 263/558/196
1617
+ f 266/559/197 264/557/197 265/560/197
1618
+ f 268/561/198 266/559/198 267/562/198
1619
+ f 270/563/199 268/561/199 269/564/199
1620
+ f 272/565/200 270/563/200 271/566/200
1621
+ f 274/567/201 272/565/201 273/568/201
1622
+ f 276/569/202 274/567/202 275/570/202
1623
+ f 278/571/203 276/569/203 277/572/203
1624
+ f 280/573/204 278/571/204 279/574/204
1625
+ f 282/575/205 280/573/205 281/576/205
1626
+ f 284/577/206 282/575/206 283/578/206
1627
+ f 286/579/207 284/577/207 285/580/207
1628
+ f 288/581/208 286/579/208 287/582/208
1629
+ f 290/583/209 288/581/209 289/584/209
1630
+ f 261/458/176 245/459/176 229/456/176
1631
+ f 228/488/177 291/490/177 229/492/177
1632
+ f 230/491/178 229/492/178 231/526/178
1633
+ f 254/495/179 270/496/179 286/493/179
1634
+ f 232/525/180 231/526/180 233/528/180
1635
+ f 234/527/181 233/528/181 235/530/181
1636
+ f 236/529/182 235/530/182 237/532/182
1637
+ f 238/531/183 237/532/183 239/534/183
1638
+ f 240/533/184 239/534/184 241/536/184
1639
+ f 242/535/185 241/536/185 243/538/185
1640
+ f 244/537/186 243/538/186 245/540/186
1641
+ f 246/539/187 245/540/187 247/542/187
1642
+ f 248/541/188 247/542/188 249/544/188
1643
+ f 250/543/189 249/544/189 251/546/189
1644
+ f 252/545/190 251/546/190 253/548/190
1645
+ f 254/547/191 253/548/191 255/550/191
1646
+ f 256/549/192 255/550/192 257/552/192
1647
+ f 258/551/193 257/552/193 259/554/193
1648
+ f 260/553/194 259/554/194 261/556/194
1649
+ f 262/555/195 261/556/195 263/558/195
1650
+ f 264/557/196 263/558/196 265/560/196
1651
+ f 266/559/197 265/560/197 267/562/197
1652
+ f 268/561/198 267/562/198 269/564/198
1653
+ f 270/563/199 269/564/199 271/566/199
1654
+ f 272/565/200 271/566/200 273/568/200
1655
+ f 274/567/201 273/568/201 275/570/201
1656
+ f 276/569/202 275/570/202 277/572/202
1657
+ f 278/571/203 277/572/203 279/574/203
1658
+ f 280/573/204 279/574/204 281/576/204
1659
+ f 282/575/205 281/576/205 283/578/205
1660
+ f 284/577/206 283/578/206 285/580/206
1661
+ f 286/579/207 285/580/207 287/582/207
1662
+ f 288/581/208 287/582/208 289/584/208
1663
+ f 290/583/209 289/584/209 291/585/209
assets/axis.png ADDED
assets/demo.png ADDED

Git LFS Details

  • SHA256: d973be395a6e6e6b928306ea9763772b8e296e14160b432a3a50ac556bbb5831
  • Pointer size: 132 Bytes
  • Size of remote file: 2.75 MB
inference.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from PIL import Image
3
+ from utils import *
4
+ import torch.nn.functional as F
5
+ import numpy as np
6
+
7
+ def get_3angle(image, dino, val_preprocess, device):
8
+
9
+ # image = Image.open(image_path).convert('RGB')
10
+ image_inputs = val_preprocess(images = image)
11
+ image_inputs['pixel_values'] = torch.from_numpy(np.array(image_inputs['pixel_values'])).to(device)
12
+ with torch.no_grad():
13
+ dino_pred = dino(image_inputs)
14
+
15
+ gaus_ax_pred = torch.argmax(dino_pred[:, 0:360], dim=-1)
16
+ gaus_pl_pred = torch.argmax(dino_pred[:, 360:360+180], dim=-1)
17
+ gaus_ro_pred = torch.argmax(dino_pred[:, 360+180:360+180+360], dim=-1)
18
+ confidence = F.softmax(dino_pred[:, -2:], dim=-1)[0][0]
19
+ angles = torch.zeros(4)
20
+ angles[0] = gaus_ax_pred
21
+ angles[1] = gaus_pl_pred - 90
22
+ angles[2] = gaus_ro_pred - 180
23
+ angles[3] = confidence
24
+ return angles
25
+
26
+ def get_3angle_infer_aug(origin_img, rm_bkg_img, dino, val_preprocess, device):
27
+
28
+ # image = Image.open(image_path).convert('RGB')
29
+ image = get_crop_images(origin_img, num=3) + get_crop_images(rm_bkg_img, num=3)
30
+ image_inputs = val_preprocess(images = image)
31
+ image_inputs['pixel_values'] = torch.from_numpy(np.array(image_inputs['pixel_values'])).to(device)
32
+ with torch.no_grad():
33
+ dino_pred = dino(image_inputs)
34
+
35
+ gaus_ax_pred = torch.argmax(dino_pred[:, 0:360], dim=-1).to(torch.float32)
36
+ gaus_pl_pred = torch.argmax(dino_pred[:, 360:360+180], dim=-1).to(torch.float32)
37
+ gaus_ro_pred = torch.argmax(dino_pred[:, 360+180:360+180+360], dim=-1).to(torch.float32)
38
+
39
+ gaus_ax_pred = remove_outliers_and_average_circular(gaus_ax_pred)
40
+ gaus_pl_pred = remove_outliers_and_average(gaus_pl_pred)
41
+ gaus_ro_pred = remove_outliers_and_average(gaus_ro_pred)
42
+
43
+ confidence = torch.mean(F.softmax(dino_pred[:, -2:], dim=-1), dim=0)[0]
44
+ angles = torch.zeros(4)
45
+ angles[0] = gaus_ax_pred
46
+ angles[1] = gaus_pl_pred - 90
47
+ angles[2] = gaus_ro_pred - 180
48
+ angles[3] = confidence
49
+ return angles
paths.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ DINO_SMALL = "facebook/dinov2-small"
2
+ DINO_BASE = "facebook/dinov2-base"
3
+ DINO_LARGE = "facebook/dinov2-large"
4
+ DINO_GIANT = "facebook/dinov2-giant"
render/__init__.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # flake8: noqa
2
+ from .core import render
3
+ from .model import Model
render/canvas.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import typing as t
2
+
3
+ from PIL import Image, ImageColor, ImageOps, ImageChops, ImageFilter
4
+ import numpy as np
5
+
6
+ class Canvas:
7
+ def __init__(self, filename=None, height=500, width=500):
8
+ self.filename = filename
9
+ self.height, self.width = height, width
10
+ self.img = Image.new("RGBA", (self.height, self.width), (0, 0, 0, 0))
11
+
12
+ def draw(self, dots, color: t.Union[tuple, str]):
13
+ if isinstance(color, str):
14
+ color = ImageColor.getrgb(color)
15
+ if isinstance(dots, tuple):
16
+ dots = [dots]
17
+ for dot in dots:
18
+ if dot[0]>=self.height or dot[1]>=self.width or dot[0]<0 or dot[1]<0:
19
+ # print(dot)
20
+ continue
21
+ self.img.putpixel(dot, color + (255,))
22
+
23
+ def add_white_border(self, border_size=5):
24
+ # Ensure the input image is in RGBA mode
25
+ if self.img.mode != "RGBA":
26
+ self.img = self.img.convert("RGBA")
27
+
28
+ # Extract the alpha channel
29
+ alpha = self.img.getchannel("A")
30
+ # print(alpha.size)
31
+ dilated_alpha = alpha.filter(ImageFilter.MaxFilter(size=5))
32
+ # # print(dilated_alpha.size)
33
+
34
+ # Create a white area using the dilated alpha mask
35
+ white_area = Image.new("RGBA", self.img.size, (255, 255, 255, 255))
36
+ white_area.putalpha(dilated_alpha)
37
+
38
+ # Merge the dilated white area with the original image
39
+ result = Image.alpha_composite(white_area, self.img)
40
+ # expanded_alpha = ImageOps.expand(alpha, border=border_size, fill=255)
41
+ # white_border = Image.new("RGBA", image.size, (255, 255, 255, 255))
42
+ # white_border.putalpha(alpha)
43
+ return result
44
+
45
+ def __enter__(self):
46
+ return self
47
+
48
+ def __exit__(self, type, value, traceback):
49
+ # self.img = add_white_border(self.img)
50
+ self.img.save(self.filename)
51
+ pass
render/core.py ADDED
@@ -0,0 +1,378 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import typing as t
2
+ from functools import partial
3
+
4
+ import numpy as np
5
+ from copy import deepcopy
6
+ from .canvas import Canvas
7
+
8
+ from . import speedup
9
+
10
+
11
+ # 2D part
12
+
13
+
14
+ class Vec2d:
15
+ __slots__ = "x", "y", "arr"
16
+
17
+ def __init__(self, *args):
18
+ if len(args) == 1 and isinstance(args[0], Vec3d):
19
+ self.arr = Vec3d.narr
20
+ else:
21
+ assert len(args) == 2
22
+ self.arr = list(args)
23
+
24
+ self.x, self.y = [d if isinstance(d, int) else int(d + 0.5) for d in self.arr]
25
+
26
+ def __repr__(self):
27
+ return f"Vec2d({self.x}, {self.y})"
28
+
29
+ def __truediv__(self, other):
30
+ return (self.y - other.y) / (self.x - other.x)
31
+
32
+ def __eq__(self, other):
33
+ return self.x == other.x and self.y == other.y
34
+
35
+
36
+ def draw_line(
37
+ v1: Vec2d, v2: Vec2d, canvas: Canvas, color: t.Union[tuple, str] = "white"
38
+ ):
39
+ """
40
+ Draw a line with a specified color
41
+
42
+ https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
43
+ """
44
+ v1, v2 = deepcopy(v1), deepcopy(v2)
45
+ if v1 == v2:
46
+ canvas.draw((v1.x, v1.y), color=color)
47
+ return
48
+
49
+ steep = abs(v1.y - v2.y) > abs(v1.x - v2.x)
50
+ if steep:
51
+ v1.x, v1.y = v1.y, v1.x
52
+ v2.x, v2.y = v2.y, v2.x
53
+ v1, v2 = (v1, v2) if v1.x < v2.x else (v2, v1)
54
+ slope = abs((v1.y - v2.y) / (v1.x - v2.x))
55
+ y = v1.y
56
+ error: float = 0
57
+ incr = 1 if v1.y < v2.y else -1
58
+ dots = []
59
+ for x in range(int(v1.x), int(v2.x + 0.5)):
60
+ dots.append((int(y), x) if steep else (x, int(y)))
61
+ error += slope
62
+ if abs(error) >= 0.5:
63
+ y += incr
64
+ error -= 1
65
+
66
+ canvas.draw(dots, color=color)
67
+
68
+
69
+ def draw_triangle(v1, v2, v3, canvas, color, wireframe=False):
70
+ """
71
+ Draw a triangle with 3 ordered vertices
72
+
73
+ http://www.sunshine2k.de/coding/java/TriangleRasterization/TriangleRasterization.html
74
+ """
75
+ _draw_line = partial(draw_line, canvas=canvas, color=color)
76
+
77
+ if wireframe:
78
+ _draw_line(v1, v2)
79
+ _draw_line(v2, v3)
80
+ _draw_line(v1, v3)
81
+ return
82
+
83
+ def sort_vertices_asc_by_y(vertices):
84
+ return sorted(vertices, key=lambda v: v.y)
85
+
86
+ def fill_bottom_flat_triangle(v1, v2, v3):
87
+ invslope1 = (v2.x - v1.x) / (v2.y - v1.y)
88
+ invslope2 = (v3.x - v1.x) / (v3.y - v1.y)
89
+
90
+ x1 = x2 = v1.x
91
+ y = v1.y
92
+
93
+ while y <= v2.y:
94
+ _draw_line(Vec2d(x1, y), Vec2d(x2, y))
95
+ x1 += invslope1
96
+ x2 += invslope2
97
+ y += 1
98
+
99
+ def fill_top_flat_triangle(v1, v2, v3):
100
+ invslope1 = (v3.x - v1.x) / (v3.y - v1.y)
101
+ invslope2 = (v3.x - v2.x) / (v3.y - v2.y)
102
+
103
+ x1 = x2 = v3.x
104
+ y = v3.y
105
+
106
+ while y > v2.y:
107
+ _draw_line(Vec2d(x1, y), Vec2d(x2, y))
108
+ x1 -= invslope1
109
+ x2 -= invslope2
110
+ y -= 1
111
+
112
+ v1, v2, v3 = sort_vertices_asc_by_y((v1, v2, v3))
113
+
114
+ # 填充
115
+ if v1.y == v2.y == v3.y:
116
+ pass
117
+ elif v2.y == v3.y:
118
+ fill_bottom_flat_triangle(v1, v2, v3)
119
+ elif v1.y == v2.y:
120
+ fill_top_flat_triangle(v1, v2, v3)
121
+ else:
122
+ v4 = Vec2d(int(v1.x + (v2.y - v1.y) / (v3.y - v1.y) * (v3.x - v1.x)), v2.y)
123
+ fill_bottom_flat_triangle(v1, v2, v4)
124
+ fill_top_flat_triangle(v2, v4, v3)
125
+
126
+
127
+ # 3D part
128
+
129
+
130
+ class Vec3d:
131
+ __slots__ = "x", "y", "z", "arr"
132
+
133
+ def __init__(self, *args):
134
+ # for Vec4d cast
135
+ if len(args) == 1 and isinstance(args[0], Vec4d):
136
+ vec4 = args[0]
137
+ arr_value = (vec4.x, vec4.y, vec4.z)
138
+ else:
139
+ assert len(args) == 3
140
+ arr_value = args
141
+ self.arr = np.array(arr_value, dtype=np.float64)
142
+ self.x, self.y, self.z = self.arr
143
+
144
+ def __repr__(self):
145
+ return repr(f"Vec3d({','.join([repr(d) for d in self.arr])})")
146
+
147
+ def __sub__(self, other):
148
+ return self.__class__(*[ds - do for ds, do in zip(self.arr, other.arr)])
149
+
150
+ def __bool__(self):
151
+ """ False for zero vector (0, 0, 0)
152
+ """
153
+ return any(self.arr)
154
+
155
+
156
+ class Mat4d:
157
+ def __init__(self, narr=None, value=None):
158
+ self.value = np.matrix(narr) if value is None else value
159
+
160
+ def __repr__(self):
161
+ return repr(self.value)
162
+
163
+ def __mul__(self, other):
164
+ return self.__class__(value=self.value * other.value)
165
+
166
+
167
+ class Vec4d(Mat4d):
168
+ def __init__(self, *narr, value=None):
169
+ if value is not None:
170
+ self.value = value
171
+ elif len(narr) == 1 and isinstance(narr[0], Mat4d):
172
+ self.value = narr[0].value
173
+ else:
174
+ assert len(narr) == 4
175
+ self.value = np.matrix([[d] for d in narr])
176
+
177
+ self.x, self.y, self.z, self.w = (
178
+ self.value[0, 0],
179
+ self.value[1, 0],
180
+ self.value[2, 0],
181
+ self.value[3, 0],
182
+ )
183
+ self.arr = self.value.reshape((1, 4))
184
+
185
+
186
+ # Math util
187
+ def normalize(v: Vec3d):
188
+ return Vec3d(*speedup.normalize(*v.arr))
189
+
190
+
191
+ def dot_product(a: Vec3d, b: Vec3d):
192
+ return speedup.dot_product(*a.arr, *b.arr)
193
+
194
+
195
+ def cross_product(a: Vec3d, b: Vec3d):
196
+ return Vec3d(*speedup.cross_product(*a.arr, *b.arr))
197
+
198
+ BASE_LIGHT = 0.9
199
+ def get_light_intensity(face) -> float:
200
+ # lights = [Vec3d(-2, 4, -10), Vec3d(10, 4, -2), Vec3d(8, 8, -8), Vec3d(0, 0, -8)]
201
+ lights = [Vec3d(-2, 4, -10)]
202
+ # lights = []
203
+
204
+ v1, v2, v3 = face
205
+ up = normalize(cross_product(v2 - v1, v3 - v1))
206
+ intensity = BASE_LIGHT
207
+ for light in lights:
208
+ intensity += dot_product(up, normalize(light))*0.2
209
+ return intensity
210
+
211
+
212
+ def look_at(eye: Vec3d, target: Vec3d, up: Vec3d = Vec3d(0, -1, 0)) -> Mat4d:
213
+ """
214
+ http://www.songho.ca/opengl/gl_camera.html#lookat
215
+
216
+ Args:
217
+ eye: Camera position in world coordinates
218
+ target: The point the camera is looking at
219
+ up: The direction you want the camera to stand upright in.
220
+ https://stackoverflow.com/questions/10635947/what-exactly-is-the-up-vector-in-opengls-lookat-function
221
+ The default is set to (0, -1, 0) because the model data exported from Blender
222
+ seems to have flipped the Y-axis, so we flip the camera's up vector as well.
223
+ """
224
+ f = normalize(eye - target)
225
+ l = normalize(cross_product(up, f)) # noqa: E741
226
+ u = cross_product(f, l)
227
+
228
+ rotate_matrix = Mat4d(
229
+ [[l.x, l.y, l.z, 0], [u.x, u.y, u.z, 0], [f.x, f.y, f.z, 0], [0, 0, 0, 1.0]]
230
+ )
231
+ translate_matrix = Mat4d(
232
+ [[1, 0, 0, -eye.x], [0, 1, 0, -eye.y], [0, 0, 1, -eye.z], [0, 0, 0, 1.0]]
233
+ )
234
+
235
+ return Mat4d(value=(rotate_matrix * translate_matrix).value)
236
+
237
+
238
+ def perspective_project(r, t, n, f, b=None, l=None): # noqa: E741
239
+ """
240
+ Purpose:
241
+ Convert camera coordinates into Cartesian coordinates within (-1, 1)
242
+ as projected onto the image plane (the “retina”).
243
+
244
+ Principle:
245
+ For x and y coordinates, the projected point is computed using similar triangles.
246
+ For the z coordinate, we assume near = -1 and far = 1 and derive the mapping.
247
+ http://www.songho.ca/opengl/gl_projectionmatrix.html
248
+ https://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/opengl-perspective-projection-matrix
249
+
250
+ Derived projection matrix:
251
+ [
252
+ 2n/(r-l) 0 (r+l)/(r-l) 0
253
+ 0 2n/(t-b) (t+b)/(t-b) 0
254
+ 0 0 -(f+n)/(f-n) (-2*f*n)/(f-n)
255
+ 0 0 -1 0
256
+ ]
257
+
258
+ Since our near-plane (“retina”) is symmetric around the optical center,
259
+ the matrix simplifies to:
260
+ [
261
+ n/r 0 0 0
262
+ 0 n/t 0 0
263
+ 0 0 -(f+n)/(f-n) (-2*f*n)/(f-n)
264
+ 0 0 -1 0
265
+ ]
266
+
267
+ Args:
268
+ r: right
269
+ t: top
270
+ n: near
271
+ f: far
272
+ b: bottom
273
+ l: left
274
+ """
275
+ return Mat4d(
276
+ [
277
+ [n / r, 0, 0, 0],
278
+ [0, n / t, 0, 0],
279
+ [0, 0, -(f + n) / (f - n), (-2 * f * n) / (f - n)],
280
+ [0, 0, -1, 0],
281
+ ]
282
+ )
283
+
284
+
285
+ def draw(screen_vertices, world_vertices, model, canvas, wireframe=True):
286
+ """standard algorithm
287
+ """
288
+ for triangle_indices in model.indices:
289
+ vertex_group = [screen_vertices[idx - 1] for idx in triangle_indices]
290
+ face = [Vec3d(world_vertices[idx - 1]) for idx in triangle_indices]
291
+ if wireframe:
292
+ draw_triangle(*vertex_group, canvas=canvas, color="black", wireframe=True)
293
+ else:
294
+ intensity = get_light_intensity(face)
295
+ if intensity > 0:
296
+ draw_triangle(
297
+ *vertex_group, canvas=canvas, color=(int(intensity * 255),) * 3
298
+ )
299
+
300
+
301
+ def draw_with_z_buffer(screen_vertices, world_vertices, model, canvas):
302
+ """ z-buffer algorithm
303
+ """
304
+ intensities = []
305
+ triangles = []
306
+ for i, triangle_indices in enumerate(model.indices):
307
+ screen_triangle = [screen_vertices[idx - 1] for idx in triangle_indices]
308
+ uv_triangle = [model.uv_vertices[idx - 1] for idx in model.uv_indices[i]]
309
+ world_triangle = [Vec3d(world_vertices[idx - 1]) for idx in triangle_indices]
310
+ intensities.append(abs(get_light_intensity(world_triangle)))
311
+ # take off the class to let Cython work
312
+ triangles.append(
313
+ [np.append(screen_triangle[i].arr, uv_triangle[i]) for i in range(3)]
314
+ )
315
+
316
+ faces = speedup.generate_faces(
317
+ np.array(triangles, dtype=np.float64), model.texture_width, model.texture_height
318
+ )
319
+ for face_dots in faces:
320
+ for dot in face_dots:
321
+ intensity = intensities[dot[0]]
322
+ u, v = dot[3], dot[4]
323
+ color = model.texture_array[u, v]
324
+ canvas.draw((dot[1], dot[2]), tuple(int(c * intensity) for c in color[:3]))
325
+ # TODO: add object rendering mode (no texture)
326
+ # canvas.draw((dot[1], dot[2]), (int(255 * intensity),) * 3)
327
+
328
+
329
+ def render(model, height, width, filename, cam_loc, wireframe=False):
330
+ """
331
+ Args:
332
+ model: the Model object
333
+ height: cavas height
334
+ width: cavas width
335
+ picname: picture file name
336
+ """
337
+ model_matrix = Mat4d([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]])
338
+ # TODO: camera configration
339
+ view_matrix = look_at(Vec3d(cam_loc[0], cam_loc[1], cam_loc[2]), Vec3d(0, 0, 0))
340
+ projection_matrix = perspective_project(0.5, 0.5, 3, 1000)
341
+
342
+ world_vertices = []
343
+
344
+ def mvp(v):
345
+ world_vertex = model_matrix * v
346
+ world_vertices.append(Vec4d(world_vertex))
347
+ return projection_matrix * view_matrix * world_vertex
348
+
349
+ def ndc(v):
350
+ """
351
+ 各个坐标同时除以 w,得到 NDC 坐标
352
+ """
353
+ v = v.value
354
+ w = v[3, 0]
355
+ x, y, z = v[0, 0] / w, v[1, 0] / w, v[2, 0] / w
356
+ return Mat4d([[x], [y], [z], [1 / w]])
357
+
358
+ def viewport(v):
359
+ x = y = 0
360
+ w, h = width, height
361
+ n, f = 0.3, 1000
362
+ return Vec3d(
363
+ w * 0.5 * v.value[0, 0] + x + w * 0.5,
364
+ h * 0.5 * v.value[1, 0] + y + h * 0.5,
365
+ 0.5 * (f - n) * v.value[2, 0] + 0.5 * (f + n),
366
+ )
367
+
368
+ # the render pipeline
369
+ screen_vertices = [viewport(ndc(mvp(v))) for v in model.vertices]
370
+
371
+ with Canvas(filename, height, width) as canvas:
372
+ if wireframe:
373
+ draw(screen_vertices, world_vertices, model, canvas)
374
+ else:
375
+ draw_with_z_buffer(screen_vertices, world_vertices, model, canvas)
376
+
377
+ render_img = canvas.add_white_border().copy()
378
+ return render_img
render/model.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy
2
+ from PIL import Image
3
+ from .core import Vec4d
4
+
5
+
6
+ class Model:
7
+ def __init__(self, filename, texture_filename):
8
+ """
9
+ https://en.wikipedia.org/wiki/Wavefront_.obj_file#Vertex_normal_indices
10
+ """
11
+ self.vertices = []
12
+ self.uv_vertices = []
13
+ self.uv_indices = []
14
+ self.indices = []
15
+
16
+ texture = Image.open(texture_filename)
17
+ self.texture_array = numpy.array(texture)
18
+ self.texture_width, self.texture_height = texture.size
19
+
20
+ with open(filename) as f:
21
+ for line in f:
22
+ if line.startswith("v "):
23
+ x, y, z = [float(d) for d in line.strip("v").strip().split(" ")]
24
+ self.vertices.append(Vec4d(x, y, z, 1))
25
+ elif line.startswith("vt "):
26
+ u, v = [float(d) for d in line.strip("vt").strip().split(" ")]
27
+ self.uv_vertices.append([u, v])
28
+ elif line.startswith("f "):
29
+ facet = [d.split("/") for d in line.strip("f").strip().split(" ")]
30
+ self.indices.append([int(d[0]) for d in facet])
31
+ self.uv_indices.append([int(d[1]) for d in facet])
render/speedup.py ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # import cython
2
+ import numpy as np
3
+ from math import sqrt
4
+
5
+
6
+ def normalize(x, y, z):
7
+ unit = sqrt(x * x + y * y + z * z)
8
+ if unit == 0:
9
+ return 0, 0, 0
10
+ return x / unit, y / unit, z / unit
11
+
12
+
13
+ def get_min_max(a, b, c):
14
+ min = a
15
+ max = a
16
+ if min > b:
17
+ min = b
18
+ if min > c:
19
+ min = c
20
+ if max < b:
21
+ max = b
22
+ if max < c:
23
+ max = c
24
+ return int(min), int(max)
25
+
26
+ def dot_product(a0, a1, a2, b0, b1, b2):
27
+ r = a0 * b0 + a1 * b1 + a2 * b2
28
+ return r
29
+
30
+
31
+ def cross_product(a0, a1, a2, b0, b1, b2):
32
+ x = a1 * b2 - a2 * b1
33
+ y = a2 * b0 - a0 * b2
34
+ z = a0 * b1 - a1 * b0
35
+ return x,y,z
36
+
37
+
38
+ # @cython.boundscheck(False)
39
+ def generate_faces(triangles, width, height):
40
+ """ draw the triangle faces with z buffer
41
+
42
+ Args:
43
+ triangles: groups of vertices
44
+
45
+ FYI:
46
+ * zbuffer, https://github.com/ssloy/tinyrenderer/wiki/Lesson-3:-Hidden-faces-removal-(z-buffer)
47
+ * uv mapping and perspective correction
48
+ """
49
+ i, j, k, length = 0, 0, 0, 0
50
+ bcy, bcz, x, y, z = 0.,0.,0.,0.,0.
51
+ a, b, c = [0.,0.,0.],[0.,0.,0.],[0.,0.,0.]
52
+ m, bc = [0.,0.,0.],[0.,0.,0.]
53
+ uva, uvb, uvc = [0.,0.],[0.,0.],[0.,0.]
54
+ minx, maxx, miny, maxy = 0,0,0,0
55
+ length = triangles.shape[0]
56
+ zbuffer = {}
57
+ faces = []
58
+
59
+ for i in range(length):
60
+ a = triangles[i, 0, 0], triangles[i, 0, 1], triangles[i, 0, 2]
61
+ b = triangles[i, 1, 0], triangles[i, 1, 1], triangles[i, 1, 2]
62
+ c = triangles[i, 2, 0], triangles[i, 2, 1], triangles[i, 2, 2]
63
+ uva = triangles[i, 0, 3], triangles[i, 0, 4]
64
+ uvb = triangles[i, 1, 3], triangles[i, 1, 4]
65
+ uvc = triangles[i, 2, 3], triangles[i, 2, 4]
66
+ minx, maxx = get_min_max(a[0], b[0], c[0])
67
+ miny, maxy = get_min_max(a[1], b[1], c[1])
68
+ pixels = []
69
+ for j in range(minx, maxx + 2):
70
+ for k in range(miny - 1, maxy + 2):
71
+ # Must explicitly convert to double for the calculations below
72
+ x = j
73
+ y = k
74
+
75
+ m[0], m[1], m[2] = cross_product(c[0] - a[0], b[0] - a[0], a[0] - x, c[1] - a[1], b[1] - a[1], a[1] - y)
76
+ if abs(m[2]) > 0:
77
+ bcy = m[1] / m[2]
78
+ bcz = m[0] / m[2]
79
+ bc = (1 - bcy - bcz, bcy, bcz)
80
+ else:
81
+ continue
82
+
83
+ # here, -0.00001 because of the precision lose
84
+ if bc[0] < -0.00001 or bc[1] < -0.00001 or bc[2] < -0.00001:
85
+ continue
86
+
87
+ z = 1 / (bc[0] / a[2] + bc[1] / b[2] + bc[2] / c[2])
88
+
89
+
90
+ # The UV data exported from Blender has the same issue as the vertex data:
91
+ # the Y-axis is flipped. So the texture image must be flipped to work correctly.
92
+ v = (uva[0] * bc[0] / a[2] + uvb[0] * bc[1] / b[2] + uvc[0] * bc[2] / c[2]) * z * width
93
+ u = height - (uva[1] * bc[0] / a[2] + uvb[1] * bc[1] / b[2] + uvc[1] * bc[2] / c[2]) * z * height
94
+
95
+ # https://en.wikipedia.org/wiki/Pairing_function
96
+ idx = ((x + y) * (x + y + 1) + y) / 2
97
+ if zbuffer.get(idx) is None or zbuffer[idx] < z:
98
+ zbuffer[idx] = z
99
+ pixels.append((i, j, k, int(u) - 1, int(v) - 1))
100
+
101
+ faces.append(pixels)
102
+ return faces
requirements.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ torch==2.2.1
2
+ transformers==4.38
3
+ matplotlib
4
+ pillow==10.2.0
5
+ huggingface-hub==0.26.5
6
+ gradio==5.9.0
7
+ numpy==1.26.4
8
+ onnxruntime
9
+ rembg
utils.py ADDED
@@ -0,0 +1,305 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import rembg
2
+ import random
3
+ import torch
4
+ import numpy as np
5
+ from PIL import Image, ImageOps
6
+ import PIL
7
+ from typing import Any
8
+ import matplotlib.pyplot as plt
9
+ import io
10
+
11
+ def resize_foreground(
12
+ image: Image,
13
+ ratio: float,
14
+ ) -> Image:
15
+ image = np.array(image)
16
+ assert image.shape[-1] == 4
17
+ alpha = np.where(image[..., 3] > 0)
18
+ y1, y2, x1, x2 = (
19
+ alpha[0].min(),
20
+ alpha[0].max(),
21
+ alpha[1].min(),
22
+ alpha[1].max(),
23
+ )
24
+ # crop the foreground
25
+ fg = image[y1:y2, x1:x2]
26
+ # pad to square
27
+ size = max(fg.shape[0], fg.shape[1])
28
+ ph0, pw0 = (size - fg.shape[0]) // 2, (size - fg.shape[1]) // 2
29
+ ph1, pw1 = size - fg.shape[0] - ph0, size - fg.shape[1] - pw0
30
+ new_image = np.pad(
31
+ fg,
32
+ ((ph0, ph1), (pw0, pw1), (0, 0)),
33
+ mode="constant",
34
+ constant_values=((0, 0), (0, 0), (0, 0)),
35
+ )
36
+
37
+ # compute padding according to the ratio
38
+ new_size = int(new_image.shape[0] / ratio)
39
+ # pad to size, double side
40
+ ph0, pw0 = (new_size - size) // 2, (new_size - size) // 2
41
+ ph1, pw1 = new_size - size - ph0, new_size - size - pw0
42
+ new_image = np.pad(
43
+ new_image,
44
+ ((ph0, ph1), (pw0, pw1), (0, 0)),
45
+ mode="constant",
46
+ constant_values=((0, 0), (0, 0), (0, 0)),
47
+ )
48
+ new_image = Image.fromarray(new_image)
49
+ return new_image
50
+
51
+ def remove_background(image: Image,
52
+ rembg_session: Any = None,
53
+ force: bool = False,
54
+ **rembg_kwargs,
55
+ ) -> Image:
56
+ do_remove = True
57
+ if image.mode == "RGBA" and image.getextrema()[3][0] < 255:
58
+ do_remove = False
59
+ do_remove = do_remove or force
60
+ if do_remove:
61
+ image = rembg.remove(image, session=rembg_session, **rembg_kwargs)
62
+ return image
63
+
64
+ def random_crop(image, crop_scale=(0.8, 0.95)):
65
+ """
66
+ Randomly crop an image
67
+ image (numpy.ndarray): (H, W, C).
68
+ crop_scale (tuple): (min_scale, max_scale).
69
+ """
70
+ assert isinstance(image, Image.Image), "iput must be PIL.Image.Image"
71
+ assert len(crop_scale) == 2 and 0 < crop_scale[0] <= crop_scale[1] <= 1
72
+
73
+ width, height = image.size
74
+
75
+ # Calculate the crop width and height
76
+ crop_width = random.randint(int(width * crop_scale[0]), int(width * crop_scale[1]))
77
+ crop_height = random.randint(int(height * crop_scale[0]), int(height * crop_scale[1]))
78
+
79
+ # Randomly choose the top-left corner of the crop
80
+ left = random.randint(0, width - crop_width)
81
+ top = random.randint(0, height - crop_height)
82
+
83
+ # Crop the image
84
+ cropped_image = image.crop((left, top, left + crop_width, top + crop_height))
85
+
86
+ return cropped_image
87
+
88
+ def get_crop_images(img, num=3):
89
+ cropped_images = []
90
+ for i in range(num):
91
+ cropped_images.append(random_crop(img))
92
+ return cropped_images
93
+
94
+ def background_preprocess(input_image, do_remove_background):
95
+
96
+ rembg_session = rembg.new_session() if do_remove_background else None
97
+
98
+ if do_remove_background:
99
+ input_image = remove_background(input_image, rembg_session)
100
+ input_image = resize_foreground(input_image, 0.85)
101
+
102
+ return input_image
103
+
104
+ def remove_outliers_and_average(tensor, threshold=1.5):
105
+ assert tensor.dim() == 1, "dimension of input Tensor must equal to 1"
106
+
107
+ q1 = torch.quantile(tensor, 0.25)
108
+ q3 = torch.quantile(tensor, 0.75)
109
+ iqr = q3 - q1
110
+
111
+ lower_bound = q1 - threshold * iqr
112
+ upper_bound = q3 + threshold * iqr
113
+
114
+ non_outliers = tensor[(tensor >= lower_bound) & (tensor <= upper_bound)]
115
+
116
+ if len(non_outliers) == 0:
117
+ return tensor.mean().item()
118
+
119
+ return non_outliers.mean().item()
120
+
121
+
122
+ def remove_outliers_and_average_circular(tensor, threshold=1.5):
123
+ assert tensor.dim() == 1, "dimension of input Tensor must equal to 1"
124
+
125
+ # Convert angles into points on a 2D plane
126
+ radians = tensor * torch.pi / 180.0
127
+ x_coords = torch.cos(radians)
128
+ y_coords = torch.sin(radians)
129
+
130
+ # Compute the mean vector
131
+ mean_x = torch.mean(x_coords)
132
+ mean_y = torch.mean(y_coords)
133
+
134
+ differences = torch.sqrt((x_coords - mean_x) * (x_coords - mean_x) + (y_coords - mean_y) * (y_coords - mean_y))
135
+
136
+ # Compute quartiles and IQR
137
+ q1 = torch.quantile(differences, 0.25)
138
+ q3 = torch.quantile(differences, 0.75)
139
+ iqr = q3 - q1
140
+
141
+ # Compute lower and upper bounds
142
+ lower_bound = q1 - threshold * iqr
143
+ upper_bound = q3 + threshold * iqr
144
+
145
+ # Select non-outlier points
146
+ non_outliers = tensor[(differences >= lower_bound) & (differences <= upper_bound)]
147
+
148
+ if len(non_outliers) == 0:
149
+ mean_angle = torch.atan2(mean_y, mean_x) * 180.0 / torch.pi
150
+ mean_angle = (mean_angle + 360) % 360
151
+ return mean_angle # If there are no non-outliers, return None
152
+
153
+ # Recalculate the mean vector using only non-outliers
154
+ radians = non_outliers * torch.pi / 180.0
155
+ x_coords = torch.cos(radians)
156
+ y_coords = torch.sin(radians)
157
+
158
+ mean_x = torch.mean(x_coords)
159
+ mean_y = torch.mean(y_coords)
160
+
161
+ mean_angle = torch.atan2(mean_y, mean_x) * 180.0 / torch.pi
162
+ mean_angle = (mean_angle + 360) % 360
163
+
164
+ return mean_angle
165
+
166
+ def scale(x):
167
+ # print(x)
168
+ # if abs(x[0])<0.1 and abs(x[1])<0.1:
169
+
170
+ # return x*5
171
+ # else:
172
+ # return x
173
+ return x*3
174
+
175
+ def get_proj2D_XYZ(phi, theta, gamma):
176
+ x = np.array([-1*np.sin(phi)*np.cos(gamma) - np.cos(phi)*np.sin(theta)*np.sin(gamma), np.sin(phi)*np.sin(gamma) - np.cos(phi)*np.sin(theta)*np.cos(gamma)])
177
+ y = np.array([-1*np.cos(phi)*np.cos(gamma) + np.sin(phi)*np.sin(theta)*np.sin(gamma), np.cos(phi)*np.sin(gamma) + np.sin(phi)*np.sin(theta)*np.cos(gamma)])
178
+ z = np.array([np.cos(theta)*np.sin(gamma), np.cos(theta)*np.cos(gamma)])
179
+ x = scale(x)
180
+ y = scale(y)
181
+ z = scale(z)
182
+ return x, y, z
183
+
184
+ # Draw 3D coordinate axes
185
+ def draw_axis(ax, origin, vector, color, label=None):
186
+ ax.quiver(origin[0], origin[1], vector[0], vector[1], angles='xy', scale_units='xy', scale=1, color=color)
187
+ if label!=None:
188
+ ax.text(origin[0] + vector[0] * 1.1, origin[1] + vector[1] * 1.1, label, color=color, fontsize=12)
189
+
190
+ def matplotlib_2D_arrow(angles, rm_bkg_img):
191
+ fig, ax = plt.subplots(figsize=(8, 8))
192
+
193
+ # Set rotation angles
194
+ phi = np.radians(angles[0])
195
+ theta = np.radians(angles[1])
196
+ gamma = np.radians(-1*angles[2])
197
+
198
+ w, h = rm_bkg_img.size
199
+ if h>w:
200
+ extent = [-5*w/h, 5*w/h, -5, 5]
201
+ else:
202
+ extent = [-5, 5, -5*h/w, 5*h/w]
203
+ ax.imshow(rm_bkg_img, extent=extent, zorder=0, aspect ='auto') # extent sets the displayed range of the background image
204
+
205
+ origin = np.array([0, 0])
206
+
207
+ # Rotated vectors
208
+ rot_x, rot_y, rot_z = get_proj2D_XYZ(phi, theta, gamma)
209
+
210
+ # draw arrow
211
+ arrow_attr = [{'point':rot_x, 'color':'r', 'label':'front'},
212
+ {'point':rot_y, 'color':'g', 'label':'right'},
213
+ {'point':rot_z, 'color':'b', 'label':'top'}]
214
+
215
+ if phi> 45 and phi<=225:
216
+ order = [0,1,2]
217
+ elif phi > 225 and phi < 315:
218
+ order = [2,0,1]
219
+ else:
220
+ order = [2,1,0]
221
+
222
+ for i in range(3):
223
+ draw_axis(ax, origin, arrow_attr[order[i]]['point'], arrow_attr[order[i]]['color'], arrow_attr[order[i]]['label'])
224
+ # draw_axis(ax, origin, rot_y, 'g', label='right')
225
+ # draw_axis(ax, origin, rot_z, 'b', label='top')
226
+ # draw_axis(ax, origin, rot_x, 'r', label='front')
227
+
228
+ # Turn off axes and grid
229
+ ax.set_axis_off()
230
+ ax.grid(False)
231
+
232
+ # Set coordinate limits
233
+ ax.set_xlim(-5, 5)
234
+ ax.set_ylim(-5, 5)
235
+
236
+ def figure_to_img(fig):
237
+ with io.BytesIO() as buf:
238
+ fig.savefig(buf, format='JPG', bbox_inches='tight')
239
+ buf.seek(0)
240
+ image = Image.open(buf).copy()
241
+ return image
242
+
243
+ from render import render, Model
244
+ import math
245
+ axis_model = Model("./assets/axis.obj", texture_filename="./assets/axis.png")
246
+ def render_3D_axis(phi, theta, gamma):
247
+ radius = 240
248
+ # camera_location = [radius * math.cos(phi), radius * math.sin(phi), radius * math.tan(theta)]
249
+ # print(camera_location)
250
+ camera_location = [-1*radius * math.cos(phi), -1*radius * math.tan(theta), radius * math.sin(phi)]
251
+ img = render(
252
+ # Model("res/jinx.obj", texture_filename="res/jinx.tga"),
253
+ axis_model,
254
+ height=512,
255
+ width=512,
256
+ filename="tmp_render.png",
257
+ cam_loc = camera_location
258
+ )
259
+ img = img.rotate(gamma)
260
+ return img
261
+
262
+ def overlay_images_with_scaling(center_image: Image.Image, background_image, target_size=(512, 512)):
263
+ """
264
+ Resize the foreground image to 512x512, scale the background image to fit,
265
+ and center-align the overlay.
266
+ :param center_image: Foreground image
267
+ :param background_image: Background image
268
+ :param target_size: Target size for the foreground image, default (512, 512)
269
+ :return: The overlaid image
270
+ """
271
+ # Ensure the input images are in RGBA mode
272
+ if center_image.mode != "RGBA":
273
+ center_image = center_image.convert("RGBA")
274
+ if background_image.mode != "RGBA":
275
+ background_image = background_image.convert("RGBA")
276
+
277
+ # Resize the foreground image
278
+ center_image = center_image.resize(target_size)
279
+
280
+ # Scale the background image so it fits within the foreground size
281
+ bg_width, bg_height = background_image.size
282
+
283
+ # Scale the background proportionally by width or height
284
+ scale = target_size[0] / max(bg_width, bg_height)
285
+ new_width = int(bg_width * scale)
286
+ new_height = int(bg_height * scale)
287
+ resized_background = background_image.resize((new_width, new_height))
288
+ # Compute required padding
289
+ pad_width = target_size[0] - new_width
290
+ pad_height = target_size[0] - new_height
291
+
292
+ # Compute padding for each side
293
+ left = pad_width // 2
294
+ right = pad_width - left
295
+ top = pad_height // 2
296
+ bottom = pad_height - top
297
+
298
+ # Add padding
299
+ resized_background = ImageOps.expand(resized_background, border=(left, top, right, bottom), fill=(255,255,255,255))
300
+
301
+ # Overlay the foreground image onto the background image
302
+ result = resized_background.copy()
303
+ result.paste(center_image, (0, 0), mask=center_image)
304
+
305
+ return result
vision_tower.py ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from torch import nn
3
+ import torch.nn.init as init
4
+ import torch.nn.functional as F
5
+
6
+ from paths import *
7
+
8
+ from typing import Dict, List, Optional, Set, Tuple, Union
9
+ from transformers import AutoImageProcessor, AutoModel, Dinov2Model
10
+ from transformers.models.dinov2.modeling_dinov2 import Dinov2Embeddings
11
+ from transformers.models.dinov2.configuration_dinov2 import Dinov2Config
12
+ import numpy as np
13
+ from contextlib import nullcontext
14
+
15
+ def get_activation(activation):
16
+ if activation.lower() == 'gelu':
17
+ return nn.GELU()
18
+ elif activation.lower() == 'rrelu':
19
+ return nn.RReLU(inplace=True)
20
+ elif activation.lower() == 'selu':
21
+ return nn.SELU(inplace=True)
22
+ elif activation.lower() == 'silu':
23
+ return nn.SiLU(inplace=True)
24
+ elif activation.lower() == 'hardswish':
25
+ return nn.Hardswish(inplace=True)
26
+ elif activation.lower() == 'leakyrelu':
27
+ return nn.LeakyReLU(inplace=True)
28
+ elif activation.lower() == 'sigmoid':
29
+ return nn.Sigmoid()
30
+ elif activation.lower() == 'tanh':
31
+ return nn.Tanh()
32
+ else:
33
+ return nn.ReLU(inplace=True)
34
+
35
+
36
+
37
+ class MLP_dim(nn.Module):
38
+ def __init__(
39
+ self, in_dim=512, out_dim=1024, bias=True, activation='relu'):
40
+ super().__init__()
41
+ self.act = get_activation(activation)
42
+ self.net1 = nn.Sequential(
43
+ nn.Linear(in_dim, int(out_dim), bias=bias),
44
+ nn.BatchNorm1d(int(out_dim)),
45
+ self.act
46
+ )
47
+ self.net2 = nn.Sequential(
48
+ nn.Linear(int(out_dim), out_dim, bias=bias),
49
+ nn.BatchNorm1d(out_dim)
50
+ )
51
+
52
+ def forward(self, x):
53
+ return self.net2(self.net1(x))
54
+
55
+ class FLIP_Dinov2Embeddings(Dinov2Embeddings):
56
+ """
57
+ Construct the CLS token, mask token, position and patch embeddings.
58
+ """
59
+
60
+ def __init__(self, config: Dinov2Config) -> None:
61
+ super().__init__(config)
62
+
63
+ def forward(self, pixel_values: torch.Tensor, bool_masked_pos: Optional[torch.Tensor] = None) -> torch.Tensor:
64
+ batch_size, _, height, width = pixel_values.shape
65
+ target_dtype = self.patch_embeddings.projection.weight.dtype
66
+ embeddings = self.patch_embeddings(pixel_values.to(dtype=target_dtype))
67
+
68
+ # add the [CLS] token to the embedded patch tokens
69
+ cls_tokens = self.cls_token.expand(batch_size, -1, -1)
70
+ embeddings = torch.cat((cls_tokens, embeddings), dim=1)
71
+
72
+ # add positional encoding to each token
73
+ embeddings = embeddings + self.interpolate_pos_encoding(embeddings, height, width)
74
+
75
+ if bool_masked_pos is not None:
76
+ # embeddings = torch.where(
77
+ # bool_masked_pos.unsqueeze(-1), self.mask_token.to(embeddings.dtype).unsqueeze(0), embeddings
78
+ # )
79
+ B,S,D = embeddings.shape
80
+ batch_indices = torch.arange(B).unsqueeze(1)
81
+ embeddings = embeddings[batch_indices, bool_masked_pos]
82
+
83
+ embeddings = self.dropout(embeddings)
84
+
85
+ return embeddings
86
+
87
+ class FLIP_DINOv2(Dinov2Model):
88
+ def __init__(self, config):
89
+ super().__init__(config)
90
+
91
+ self.embeddings = FLIP_Dinov2Embeddings(config)
92
+
93
+ class DINOv2_MLP(nn.Module):
94
+ def __init__(self,
95
+ dino_mode,
96
+ in_dim,
97
+ out_dim,
98
+ evaluate,
99
+ mask_dino,
100
+ frozen_back
101
+ ) -> None:
102
+ super().__init__()
103
+ # self.dinov2 = AutoModel.from_pretrained(DINO_BASE)
104
+ if dino_mode == 'base':
105
+ self.dinov2 = FLIP_DINOv2.from_pretrained(DINO_BASE, cache_dir='./')
106
+ elif dino_mode == 'large':
107
+ self.dinov2 = FLIP_DINOv2.from_pretrained(DINO_LARGE, cache_dir='./')
108
+ elif dino_mode == 'small':
109
+ self.dinov2 = FLIP_DINOv2.from_pretrained(DINO_SMALL, cache_dir='./')
110
+ elif dino_mode == 'giant':
111
+ self.dinov2 = FLIP_DINOv2.from_pretrained(DINO_GIANT, cache_dir='./')
112
+
113
+ self.down_sampler = MLP_dim(in_dim=in_dim, out_dim=out_dim)
114
+ self.random_mask = False
115
+ if not evaluate:
116
+ self.init_weights(self.down_sampler)
117
+ self.random_mask = mask_dino
118
+ if frozen_back:
119
+ self.forward_mode = torch.no_grad()
120
+ else:
121
+ self.forward_mode = nullcontext()
122
+
123
+ def forward(self, img_inputs):
124
+ device = self.get_device()
125
+ # print(img_inputs['pixel_values'].shape)
126
+
127
+ with self.forward_mode:
128
+ if self.random_mask:
129
+ B = len(img_inputs['pixel_values'])
130
+ S = 256
131
+ indices = []
132
+ for i in range(B):
133
+ tmp = torch.randperm(S)[:S//2]
134
+ tmp = tmp.sort().values + 1
135
+ indices.append(tmp)
136
+ indices = torch.stack(indices, dim=0)
137
+ indices = torch.cat([torch.zeros(B, 1, dtype=torch.long, device='cpu'), indices], dim=1)
138
+ # print(indices.shape)
139
+ img_inputs['bool_masked_pos'] = indices.to(device)
140
+
141
+ dino_outputs = self.dinov2(**img_inputs)
142
+ dino_seq = dino_outputs.last_hidden_state
143
+ # B,S,_ = dino_seq.shape
144
+ # dino_seq = dino_seq.view(B*S,-1)
145
+ dino_seq = dino_seq[:,0,:]
146
+
147
+ down_sample_out = self.down_sampler(dino_seq)
148
+ # down_sample_out = down_sample_out.view(B,S,-1)
149
+ # down_sample_out = down_sample_out[:,0,:]
150
+
151
+ return down_sample_out
152
+
153
+ def get_device(self):
154
+ return next(self.parameters()).device
155
+
156
+ def init_weights(self, m):
157
+ if isinstance(m, nn.Linear):
158
+ init.xavier_uniform_(m.weight)
159
+ if m.bias is not None:
160
+ init.constant_(m.bias, 0)
161
+