quantumiracle-git quantumiracle-git commited on
Commit
ade00a2
·
0 Parent(s):

Duplicate from quantumiracle-git/robotinder

Browse files

Co-authored-by: Zihan Ding <[email protected]>

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +82 -0
  2. Bidexhands_Video.csv +241 -0
  3. README.md +13 -0
  4. app.py +351 -0
  5. hfserver.py +551 -0
  6. processed-data/processed.zip +3 -0
  7. requirements.txt +4 -0
  8. robotinder-data/.gitignore +1 -0
  9. robotinder-data/ShadowHandBlockStack/rl-video-episode-0.gif +3 -0
  10. robotinder-data/ShadowHandBlockStack/rl-video-episode-0.mp4 +0 -0
  11. robotinder-data/ShadowHandBlockStack/rl-video-episode-1.gif +3 -0
  12. robotinder-data/ShadowHandBlockStack/rl-video-episode-1.mp4 +0 -0
  13. robotinder-data/ShadowHandBlockStack/rl-video-episode-2.gif +3 -0
  14. robotinder-data/ShadowHandBlockStack/rl-video-episode-2.mp4 +0 -0
  15. robotinder-data/ShadowHandBlockStack/rl-video-episode-3.gif +3 -0
  16. robotinder-data/ShadowHandBlockStack/rl-video-episode-3.mp4 +0 -0
  17. robotinder-data/ShadowHandBlockStack/rl-video-episode-4.gif +3 -0
  18. robotinder-data/ShadowHandBlockStack/rl-video-episode-4.mp4 +0 -0
  19. robotinder-data/ShadowHandBlockStack/rl-video-episode-5.gif +3 -0
  20. robotinder-data/ShadowHandBlockStack/rl-video-episode-5.mp4 +0 -0
  21. robotinder-data/ShadowHandBlockStack/rl-video-episode-6.gif +3 -0
  22. robotinder-data/ShadowHandBlockStack/rl-video-episode-6.mp4 +0 -0
  23. robotinder-data/ShadowHandBlockStack/rl-video-episode-7.gif +3 -0
  24. robotinder-data/ShadowHandBlockStack/rl-video-episode-7.mp4 +0 -0
  25. robotinder-data/ShadowHandBlockStack/rl-video-episode-8.gif +3 -0
  26. robotinder-data/ShadowHandBlockStack/rl-video-episode-8.mp4 +0 -0
  27. robotinder-data/ShadowHandBlockStack/rl-video-episode-9.gif +3 -0
  28. robotinder-data/ShadowHandBlockStack/rl-video-episode-9.mp4 +0 -0
  29. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-0.gif +3 -0
  30. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-0.mp4 +0 -0
  31. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-1.gif +3 -0
  32. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-1.mp4 +0 -0
  33. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-2.gif +3 -0
  34. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-2.mp4 +0 -0
  35. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-3.gif +3 -0
  36. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-3.mp4 +0 -0
  37. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-4.gif +3 -0
  38. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-4.mp4 +0 -0
  39. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-5.gif +3 -0
  40. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-5.mp4 +0 -0
  41. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-6.gif +3 -0
  42. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-6.mp4 +0 -0
  43. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-7.gif +3 -0
  44. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-7.mp4 +0 -0
  45. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-8.gif +3 -0
  46. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-8.mp4 +0 -0
  47. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-9.gif +3 -0
  48. robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-9.mp4 +0 -0
  49. robotinder-data/data_info.json +1 -0
  50. robotinder-data/data_parser.py +27 -0
.gitattributes ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tflite filter=lfs diff=lfs merge=lfs -text
29
+ *.tgz filter=lfs diff=lfs merge=lfs -text
30
+ *.wasm filter=lfs diff=lfs merge=lfs -text
31
+ *.xz filter=lfs diff=lfs merge=lfs -text
32
+ *.zip filter=lfs diff=lfs merge=lfs -text
33
+ *.zst filter=lfs diff=lfs merge=lfs -text
34
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
35
+ videos/rl-video-episode-0.gif filter=lfs diff=lfs merge=lfs -text
36
+ videos/rl-video-episode-1.gif filter=lfs diff=lfs merge=lfs -text
37
+ videos/rl-video-episode-2.gif filter=lfs diff=lfs merge=lfs -text
38
+ videos/rl-video-episode-3.gif filter=lfs diff=lfs merge=lfs -text
39
+ videos/ShadowHandBlockStack/rl-video-episode-0.gif filter=lfs diff=lfs merge=lfs -text
40
+ videos/ShadowHandBlockStack/rl-video-episode-1.gif filter=lfs diff=lfs merge=lfs -text
41
+ videos/ShadowHandBlockStack/rl-video-episode-2.gif filter=lfs diff=lfs merge=lfs -text
42
+ videos/ShadowHandBlockStack/rl-video-episode-3.gif filter=lfs diff=lfs merge=lfs -text
43
+ videos/ShadowHandBlockStack/rl-video-episode-4.gif filter=lfs diff=lfs merge=lfs -text
44
+ videos/ShadowHandBlockStack/rl-video-episode-5.gif filter=lfs diff=lfs merge=lfs -text
45
+ videos/ShadowHandBlockStack/rl-video-episode-6.gif filter=lfs diff=lfs merge=lfs -text
46
+ videos/ShadowHandBlockStack/rl-video-episode-7.gif filter=lfs diff=lfs merge=lfs -text
47
+ videos/ShadowHandBlockStack/rl-video-episode-8.gif filter=lfs diff=lfs merge=lfs -text
48
+ videos/ShadowHandBlockStack/rl-video-episode-9.gif filter=lfs diff=lfs merge=lfs -text
49
+ videos/ShadowHandDoorOpenInward/rl-video-episode-0.gif filter=lfs diff=lfs merge=lfs -text
50
+ videos/ShadowHandDoorOpenInward/rl-video-episode-1.gif filter=lfs diff=lfs merge=lfs -text
51
+ videos/ShadowHandDoorOpenInward/rl-video-episode-2.gif filter=lfs diff=lfs merge=lfs -text
52
+ videos/ShadowHandDoorOpenInward/rl-video-episode-3.gif filter=lfs diff=lfs merge=lfs -text
53
+ videos/ShadowHandDoorOpenInward/rl-video-episode-4.gif filter=lfs diff=lfs merge=lfs -text
54
+ videos/ShadowHandDoorOpenInward/rl-video-episode-5.gif filter=lfs diff=lfs merge=lfs -text
55
+ videos/ShadowHandDoorOpenInward/rl-video-episode-6.gif filter=lfs diff=lfs merge=lfs -text
56
+ videos/ShadowHandDoorOpenInward/rl-video-episode-7.gif filter=lfs diff=lfs merge=lfs -text
57
+ videos/ShadowHandDoorOpenInward/rl-video-episode-8.gif filter=lfs diff=lfs merge=lfs -text
58
+ videos/ShadowHandDoorOpenInward/rl-video-episode-9.gif filter=lfs diff=lfs merge=lfs -text
59
+ robotinder-data/rl-video-episode-0.gif filter=lfs diff=lfs merge=lfs -text
60
+ robotinder-data/rl-video-episode-1.gif filter=lfs diff=lfs merge=lfs -text
61
+ robotinder-data/rl-video-episode-2.gif filter=lfs diff=lfs merge=lfs -text
62
+ robotinder-data/rl-video-episode-3.gif filter=lfs diff=lfs merge=lfs -text
63
+ robotinder-data/ShadowHandBlockStack/rl-video-episode-0.gif filter=lfs diff=lfs merge=lfs -text
64
+ robotinder-data/ShadowHandBlockStack/rl-video-episode-1.gif filter=lfs diff=lfs merge=lfs -text
65
+ robotinder-data/ShadowHandBlockStack/rl-video-episode-2.gif filter=lfs diff=lfs merge=lfs -text
66
+ robotinder-data/ShadowHandBlockStack/rl-video-episode-3.gif filter=lfs diff=lfs merge=lfs -text
67
+ robotinder-data/ShadowHandBlockStack/rl-video-episode-4.gif filter=lfs diff=lfs merge=lfs -text
68
+ robotinder-data/ShadowHandBlockStack/rl-video-episode-5.gif filter=lfs diff=lfs merge=lfs -text
69
+ robotinder-data/ShadowHandBlockStack/rl-video-episode-6.gif filter=lfs diff=lfs merge=lfs -text
70
+ robotinder-data/ShadowHandBlockStack/rl-video-episode-7.gif filter=lfs diff=lfs merge=lfs -text
71
+ robotinder-data/ShadowHandBlockStack/rl-video-episode-8.gif filter=lfs diff=lfs merge=lfs -text
72
+ robotinder-data/ShadowHandBlockStack/rl-video-episode-9.gif filter=lfs diff=lfs merge=lfs -text
73
+ robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-0.gif filter=lfs diff=lfs merge=lfs -text
74
+ robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-1.gif filter=lfs diff=lfs merge=lfs -text
75
+ robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-2.gif filter=lfs diff=lfs merge=lfs -text
76
+ robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-3.gif filter=lfs diff=lfs merge=lfs -text
77
+ robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-4.gif filter=lfs diff=lfs merge=lfs -text
78
+ robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-5.gif filter=lfs diff=lfs merge=lfs -text
79
+ robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-6.gif filter=lfs diff=lfs merge=lfs -text
80
+ robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-7.gif filter=lfs diff=lfs merge=lfs -text
81
+ robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-8.gif filter=lfs diff=lfs merge=lfs -text
82
+ robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-9.gif filter=lfs diff=lfs merge=lfs -text
Bidexhands_Video.csv ADDED
@@ -0,0 +1,241 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ env_name,seed,succeed_iteration,comment
2
+ ShadowHand,3,10000,
3
+ ShadowHand,4,10000,
4
+ ShadowHand,5,19000,
5
+ ShadowHand,6,16000,
6
+ ShadowHand,7,17000,
7
+ ShadowHand,8,10000,
8
+ ShadowHand,9,19000,
9
+ ShadowHand,10,12000-18000,
10
+ ShadowHand,11,12000,
11
+ ShadowHand,12,14000-18000,
12
+ ShadowHand,13,11000-18000,
13
+ ShadowHand,14,15000,
14
+ ShadowHandBlockStack,3,18000,
15
+ ShadowHandBlockStack,4,17000,
16
+ ShadowHandBlockStack,5,18000,
17
+ ShadowHandBlockStack,6,unsolved (must >20000),
18
+ ShadowHandBlockStack,7,unsolved (must >20000),
19
+ ShadowHandBlockStack,8,10000,
20
+ ShadowHandBlockStack,9,unsolved (must >20000),
21
+ ShadowHandBlockStack,10,11000,
22
+ ShadowHandBlockStack,11,unsolved (must >20000),
23
+ ShadowHandBlockStack,12,14000,
24
+ ShadowHandBlockStack,13,unsolved (must >20000),
25
+ ShadowHandBlockStack,14,14000,
26
+ ShadowHandBottleCap,3,unsolved (must >20000),
27
+ ShadowHandBottleCap,4,17000,
28
+ ShadowHandBottleCap,5,12000,
29
+ ShadowHandBottleCap,6,18000,
30
+ ShadowHandBottleCap,7,14000,
31
+ ShadowHandBottleCap,8,17000,
32
+ ShadowHandBottleCap,9,11000,
33
+ ShadowHandBottleCap,10,18000,
34
+ ShadowHandBottleCap,11,15000,
35
+ ShadowHandBottleCap,12,19000,
36
+ ShadowHandBottleCap,13,11000,
37
+ ShadowHandBottleCap,14,10000,
38
+ ShadowHandCatchAbreast,3,10000,
39
+ ShadowHandCatchAbreast,4,10000,
40
+ ShadowHandCatchAbreast,5,10000,
41
+ ShadowHandCatchAbreast,6,10000,
42
+ ShadowHandCatchAbreast,7,10000,
43
+ ShadowHandCatchAbreast,8,10000,
44
+ ShadowHandCatchAbreast,9,10000,
45
+ ShadowHandCatchAbreast,10,10000,
46
+ ShadowHandCatchAbreast,11,10000-17000,
47
+ ShadowHandCatchAbreast,12,12000,
48
+ ShadowHandCatchAbreast,13,12000,
49
+ ShadowHandCatchAbreast,14,10000,
50
+ ShadowHandCatchOver2Underarm,3,10000,
51
+ ShadowHandCatchOver2Underarm,4,10000,
52
+ ShadowHandCatchOver2Underarm,5,10000,
53
+ ShadowHandCatchOver2Underarm,6,10000,
54
+ ShadowHandCatchOver2Underarm,7,10000,
55
+ ShadowHandCatchOver2Underarm,8,10000,
56
+ ShadowHandCatchOver2Underarm,9,10000,
57
+ ShadowHandCatchOver2Underarm,10,13000,
58
+ ShadowHandCatchOver2Underarm,11,18000,(actually unsolved)
59
+ ShadowHandCatchOver2Underarm,12,15000,
60
+ ShadowHandCatchOver2Underarm,13,10000,
61
+ ShadowHandCatchOver2Underarm,14,10000,
62
+ ShadowHandCatchUnderarm,3,10000,
63
+ ShadowHandCatchUnderarm,4,10000,
64
+ ShadowHandCatchUnderarm,5,10000,
65
+ ShadowHandCatchUnderarm,6,10000,
66
+ ShadowHandCatchUnderarm,7,10000,
67
+ ShadowHandCatchUnderarm,8,10000,
68
+ ShadowHandCatchUnderarm,9,10000,
69
+ ShadowHandCatchUnderarm,10,10000,
70
+ ShadowHandCatchUnderarm,11,20000,
71
+ ShadowHandCatchUnderarm,12,10000,
72
+ ShadowHandCatchUnderarm,13,10000,
73
+ ShadowHandCatchUnderarm,14,10000,
74
+ ShadowHandDoorCloseInward,3,10000,
75
+ ShadowHandDoorCloseInward,4,unsolved (must >20000),
76
+ ShadowHandDoorCloseInward,5,unsolved (must >20000),
77
+ ShadowHandDoorCloseInward,6,10000,
78
+ ShadowHandDoorCloseInward,7,unsolved (must >20000),
79
+ ShadowHandDoorCloseInward,8,unsolved (must >20000),
80
+ ShadowHandDoorCloseInward,9,10000,
81
+ ShadowHandDoorCloseInward,10,10000,
82
+ ShadowHandDoorCloseInward,11,10000,
83
+ ShadowHandDoorCloseInward,12,10000,
84
+ ShadowHandDoorCloseInward,13,10000,
85
+ ShadowHandDoorCloseInward,14,unsolved (must >20000),
86
+ ShadowHandDoorCloseOutward,3,20000,
87
+ ShadowHandDoorCloseOutward,4,unsolved task,
88
+ ShadowHandDoorCloseOutward,5,unsolved task,
89
+ ShadowHandDoorCloseOutward,6,unsolved task,
90
+ ShadowHandDoorCloseOutward,7,unsolved task,
91
+ ShadowHandDoorCloseOutward,8,unsolved task,
92
+ ShadowHandDoorCloseOutward,9,unsolved task,
93
+ ShadowHandDoorCloseOutward,10,unsolved task,
94
+ ShadowHandDoorCloseOutward,11,unsolved task,
95
+ ShadowHandDoorCloseOutward,12,unsolved task,
96
+ ShadowHandDoorCloseOutward,13,unsolved task,
97
+ ShadowHandDoorCloseOutward,14,unsolved task,
98
+ ShadowHandDoorOpenOutward,3,10000,
99
+ ShadowHandDoorOpenOutward,4,10000,
100
+ ShadowHandDoorOpenOutward,5,10000,
101
+ ShadowHandDoorOpenOutward,6,10000,
102
+ ShadowHandDoorOpenOutward,7,10000,
103
+ ShadowHandDoorOpenOutward,8,10000,
104
+ ShadowHandDoorOpenOutward,9,10000,
105
+ ShadowHandDoorOpenOutward,10,10000-10000,
106
+ ShadowHandDoorOpenOutward,11,unsolved,
107
+ ShadowHandDoorOpenOutward,12,unsolved,10000 (solve one hand)
108
+ ShadowHandDoorOpenOutward,13,unsolved,11000 (solve one hand)
109
+ ShadowHandDoorOpenOutward,14,10000,
110
+ ShadowHandDoorOpenInward,3,unsolved (must >20000),(but one hand solved in 10000)
111
+ ShadowHandDoorOpenInward,4,unsolved (must >20000),(but one hand solved in 10000)
112
+ ShadowHandDoorOpenInward,5,unsolved (must >20000),(but one hand solved in 10000)
113
+ ShadowHandDoorOpenInward,6,unsolved (must >20000),(but one hand solved in 10000)
114
+ ShadowHandDoorOpenInward,7,14000,
115
+ ShadowHandDoorOpenInward,8,unsolved (must >20000),(but one hand solved in 10000)
116
+ ShadowHandDoorOpenInward,9,unsolved (must >20000),(but one hand solved in 10000)
117
+ ShadowHandDoorOpenInward,10,10000,
118
+ ShadowHandDoorOpenInward,11,unsolved (must >20000),
119
+ ShadowHandDoorOpenInward,12,10000,
120
+ ShadowHandDoorOpenInward,13,10000,
121
+ ShadowHandDoorOpenInward,14,unsolved (must >20000),(but one hand solved in 10000)
122
+ ShadowHandGraspAndPlace,3,unsolved task (can solve),
123
+ ShadowHandGraspAndPlace,4,unsolved task (can solve),
124
+ ShadowHandGraspAndPlace,5,10000,
125
+ ShadowHandGraspAndPlace,6,10000,
126
+ ShadowHandGraspAndPlace,7,10000,
127
+ ShadowHandGraspAndPlace,8,18000,
128
+ ShadowHandGraspAndPlace,9,13000,
129
+ ShadowHandGraspAndPlace,10,unsolved ,
130
+ ShadowHandGraspAndPlace,11,unsolved ,
131
+ ShadowHandGraspAndPlace,12,unsolved ,
132
+ ShadowHandGraspAndPlace,13,unsolved ,
133
+ ShadowHandGraspAndPlace,14,unsolved (must >20000),
134
+ ShadowHandKettle,3,20000,
135
+ ShadowHandKettle,4,unsolved task (hard to solve),
136
+ ShadowHandKettle,5,unsolved task (hard to solve),
137
+ ShadowHandKettle,6,unsolved task (hard to solve),
138
+ ShadowHandKettle,7,unsolved task (hard to solve),
139
+ ShadowHandKettle,8,unsolved task (hard to solve),
140
+ ShadowHandKettle,9,unsolved task (hard to solve),
141
+ ShadowHandKettle,10,unsolved task (hard to solve),
142
+ ShadowHandKettle,11,unsolved task (hard to solve),
143
+ ShadowHandKettle,12,unsolved task (hard to solve),
144
+ ShadowHandKettle,13,unsolved task (hard to solve),
145
+ ShadowHandKettle,14,unsolved task (hard to solve),
146
+ ShadowHandLiftUnderarm,3,unsolved (must >20000),
147
+ ShadowHandLiftUnderarm,4,16000,
148
+ ShadowHandLiftUnderarm,5,,
149
+ ShadowHandLiftUnderarm,6,,
150
+ ShadowHandLiftUnderarm,7,,
151
+ ShadowHandLiftUnderarm,8,,
152
+ ShadowHandLiftUnderarm,9,,
153
+ ShadowHandLiftUnderarm,10,10000,
154
+ ShadowHandLiftUnderarm,11,10000,
155
+ ShadowHandLiftUnderarm,12,18000,
156
+ ShadowHandLiftUnderarm,13,10000,
157
+ ShadowHandLiftUnderarm,14,,
158
+ ShadowHandOver,3,10000,
159
+ ShadowHandOver,4,10000,
160
+ ShadowHandOver,5,10000,
161
+ ShadowHandOver,6,10000,
162
+ ShadowHandOver,7,10000,
163
+ ShadowHandOver,8,10000,
164
+ ShadowHandOver,9,10000,
165
+ ShadowHandOver,10,10000,
166
+ ShadowHandOver,11,12000,
167
+ ShadowHandOver,12,10000,
168
+ ShadowHandOver,13,10000,
169
+ ShadowHandOver,14,10000,
170
+ ShadowHandPen,3,10000,
171
+ ShadowHandPen,4,10000,
172
+ ShadowHandPen,5,10000,
173
+ ShadowHandPen,6,10000,
174
+ ShadowHandPen,7,10000,
175
+ ShadowHandPen,8,10000,
176
+ ShadowHandPen,9,10000,
177
+ ShadowHandPen,10,12000,
178
+ ShadowHandPen,11,17000,
179
+ ShadowHandPen,12,10000,
180
+ ShadowHandPen,13,10000,
181
+ ShadowHandPen,14,10000,
182
+ ShadowHandPushBlock,3,unsolved task (can solve),
183
+ ShadowHandPushBlock,4,unsolved task (can solve),
184
+ ShadowHandPushBlock,5,10000,
185
+ ShadowHandPushBlock,6,10000,
186
+ ShadowHandPushBlock,7,10000,
187
+ ShadowHandPushBlock,8,10000,
188
+ ShadowHandPushBlock,9,10000,
189
+ ShadowHandPushBlock,10,unsolved task (can solve),
190
+ ShadowHandPushBlock,11,unsolved task (can solve),
191
+ ShadowHandPushBlock,12,10000,
192
+ ShadowHandPushBlock,13,10000,
193
+ ShadowHandPushBlock,14,10000,
194
+ ShadowHandScissors,3,10000,
195
+ ShadowHandScissors,4,10000,
196
+ ShadowHandScissors,5,10000,
197
+ ShadowHandScissors,6,10000,
198
+ ShadowHandScissors,7,10000,
199
+ ShadowHandScissors,8,10000,
200
+ ShadowHandScissors,9,10000,
201
+ ShadowHandScissors,10,10000,
202
+ ShadowHandScissors,11,10000,
203
+ ShadowHandScissors,12,10000,
204
+ ShadowHandScissors,13,10000,
205
+ ShadowHandScissors,14,10000,
206
+ ShadowHandSwingCup,3,15000,
207
+ ShadowHandSwingCup,4,13000,
208
+ ShadowHandSwingCup,5,10000,
209
+ ShadowHandSwingCup,6,14000,
210
+ ShadowHandSwingCup,7,12000,
211
+ ShadowHandSwingCup,8,12000,
212
+ ShadowHandSwingCup,9,12000,
213
+ ShadowHandSwingCup,10,10000,
214
+ ShadowHandSwingCup,11,10000,
215
+ ShadowHandSwingCup,12,10000,
216
+ ShadowHandSwingCup,13,10000,
217
+ ShadowHandSwingCup,14,10000,
218
+ ShadowHandSwitch,3,10000,
219
+ ShadowHandSwitch,4,10000,
220
+ ShadowHandSwitch,5,10000,
221
+ ShadowHandSwitch,6,10000,
222
+ ShadowHandSwitch,7,10000,
223
+ ShadowHandSwitch,8,10000,
224
+ ShadowHandSwitch,9,10000,
225
+ ShadowHandSwitch,10,10000,
226
+ ShadowHandSwitch,11,10000,
227
+ ShadowHandSwitch,12,12000,
228
+ ShadowHandSwitch,13,10000,
229
+ ShadowHandSwitch,14,10000,
230
+ ShadowHandTwoCatchUnderarm,3,unsolved task (hard to solve),(but one hand solved in 11000)
231
+ ShadowHandTwoCatchUnderarm,4,unsolved task (hard to solve),(but one hand solved in 10000)
232
+ ShadowHandTwoCatchUnderarm,5,unsolved (must >20000),(but one hand solved in 10000)
233
+ ShadowHandTwoCatchUnderarm,6,10000,
234
+ ShadowHandTwoCatchUnderarm,7,10000,
235
+ ShadowHandTwoCatchUnderarm,8,unsolved (must >20000),(but one hand solved in 10000)
236
+ ShadowHandTwoCatchUnderarm,9,unsolved (must >20000),(but one hand solved in 10000)
237
+ ShadowHandTwoCatchUnderarm,10,unsolved task (hard to solve),(but one hand solved in 10000)
238
+ ShadowHandTwoCatchUnderarm,11,unsolved (must >20000),almost sovled in some cases from 10000
239
+ ShadowHandTwoCatchUnderarm,12,unsolved task (hard to solve),(but one hand solved in 10000)
240
+ ShadowHandTwoCatchUnderarm,13,unsolved task (hard to solve),(but one hand solved in 10000)
241
+ ShadowHandTwoCatchUnderarm,14,unsolved (must >20000),(but one hand solved in 10000)
README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Robotinder
3
+ emoji: 🚀
4
+ colorFrom: indigo
5
+ colorTo: purple
6
+ sdk: gradio
7
+ sdk_version: 3.12.0
8
+ app_file: app.py
9
+ pinned: false
10
+ duplicated_from: quantumiracle-git/robotinder
11
+ ---
12
+
13
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,351 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import os
3
+ import random
4
+ import numpy as np
5
+ import pandas as pd
6
+ import gdown
7
+ import base64
8
+ from time import gmtime, strftime
9
+ from csv import writer
10
+ import json
11
+ import zipfile
12
+ from os import listdir
13
+ from os.path import isfile, join, isdir
14
+ from datasets import load_dataset
15
+ from hfserver import HuggingFaceDatasetSaver, HuggingFaceDatasetJSONSaver
16
+
17
+ ENVS = ['ShadowHand', 'ShadowHandCatchAbreast', 'ShadowHandOver', 'ShadowHandBlockStack', 'ShadowHandCatchUnderarm',
18
+ 'ShadowHandCatchOver2Underarm', 'ShadowHandBottleCap', 'ShadowHandLiftUnderarm', 'ShadowHandTwoCatchUnderarm',
19
+ 'ShadowHandDoorOpenInward', 'ShadowHandDoorOpenOutward', 'ShadowHandDoorCloseInward', 'ShadowHandDoorCloseOutward',
20
+ 'ShadowHandPushBlock', 'ShadowHandKettle',
21
+ 'ShadowHandScissors', 'ShadowHandPen', 'ShadowHandSwingCup', 'ShadowHandGraspAndPlace', 'ShadowHandSwitch']
22
+
23
+ # download data from huggingface dataset
24
+ # dataset = load_dataset("quantumiracle-git/robotinder-data")
25
+ # os.remove('.git/hooks/pre-push') # https://github.com/git-lfs/git-lfs/issues/853
26
+ LOAD_DATA_GOOGLE_DRIVE = False
27
+
28
+ if LOAD_DATA_GOOGLE_DRIVE: # download data from google drive
29
+ # url = 'https://drive.google.com/drive/folders/1JuNQS4R7axTezWj1x4KRAuRt_L26ApxA?usp=sharing' # './processed/' folder in google drive
30
+ # url = 'https://drive.google.com/drive/folders/1o8Q9eX-J7F326zv4g2MZWlzR46uVkUF2?usp=sharing' # './processed_zip/' folder in google drive
31
+ # url = 'https://drive.google.com/drive/folders/1ZWgpPiZwnWfwlwta8Tu-Jtu2HsS7HAEa?usp=share_link' # './filter_processed_zip/' folder in google drive
32
+ # url = 'https://drive.google.com/drive/folders/1ROkuX6rQpyK7vLqF5fL2mggKiMCdKSuY?usp=share_link' # './split_processed_zip/' folder in google drive
33
+
34
+ # output = './'
35
+ # id = url.split('/')[-1]
36
+ # os.system(f"gdown --id {id} -O {output} --folder --no-cookies --remaining-ok")
37
+ # # VIDEO_PATH = 'processed_zip'
38
+ # # VIDEO_PATH = 'filter_processed_zip'
39
+ # VIDEO_PATH = 'split_processed_zip'
40
+
41
+ # # unzip the zip files to the same location and delete zip files
42
+ # path_to_zip_file = VIDEO_PATH
43
+ # zip_files = [join(path_to_zip_file, f) for f in listdir(path_to_zip_file)]
44
+ # for f in zip_files:
45
+ # if f.endswith(".zip"):
46
+ # directory_to_extract_to = path_to_zip_file # extracted file itself contains a folder
47
+ # print(f'extract data {f} to {directory_to_extract_to}')
48
+ # with zipfile.ZipFile(f, 'r') as zip_ref:
49
+ # zip_ref.extractall(directory_to_extract_to)
50
+ # os.remove(f)
51
+
52
+ ### multiple urls to handle the retrieve error
53
+ # urls = [
54
+ # 'https://drive.google.com/drive/folders/1BbQe4XtcsalsvwGVLW9jWCkr-ln5pvyf?usp=share_link', # './filter_processed_zip/1' folder in google drive
55
+ # 'https://drive.google.com/drive/folders/1saUTUuObPhMJFguc2J_O0K5woCJjYHci?usp=share_link', # './filter_processed_zip/2' folder in google drive
56
+ # 'https://drive.google.com/drive/folders/1Kh9_E28-RH8g8EP1V3DhGI7KRs9LB7YJ?usp=share_link', # './filter_processed_zip/3' folder in google drive
57
+ # 'https://drive.google.com/drive/folders/1oE75Dz6hxtaSpNhjD22PmQfgQ-PjnEc0?usp=share_link', # './filter_processed_zip/4' folder in google drive
58
+ # 'https://drive.google.com/drive/folders/1XSPEKFqNHpXdLho-bnkT6FZZXssW8JkC?usp=share_link', # './filter_processed_zip/5' folder in google drive
59
+ # 'https://drive.google.com/drive/folders/1XwjAHqR7kF1uSyZZIydQMoETfdvi0aPD?usp=share_link',
60
+ # 'https://drive.google.com/drive/folders/1TceozOWhLsbqP-w-RkforjAVo1M2zsRP?usp=share_link',
61
+ # 'https://drive.google.com/drive/folders/1zAP9eDSW5Eh_isACuZJadXcFaJNqEM9u?usp=share_link',
62
+ # 'https://drive.google.com/drive/folders/1oK8fyF9A3Pv5JubvrQMjTE9n66vYlyZN?usp=share_link',
63
+ # 'https://drive.google.com/drive/folders/1cezGNjlM0ONMM6C0N_PbZVCGsTyVSR0w?usp=share_link',
64
+ # ]
65
+
66
+ urls = [
67
+ 'https://drive.google.com/drive/folders/1SF5jQ7HakO3lFXBon57VP83-AwfnrM3F?usp=share_link', # './split_processed_zip/1' folder in google drive
68
+ 'https://drive.google.com/drive/folders/13WuS6ow6sm7ws7A5xzCEhR-2XX_YiIu5?usp=share_link', # './split_processed_zip/2' folder in google drive
69
+ 'https://drive.google.com/drive/folders/1GWLffJDOyLkubF2C03UFcB7iFpzy1aDy?usp=share_link', # './split_processed_zip/3' folder in google drive
70
+ 'https://drive.google.com/drive/folders/1UKAntA7WliD84AUhRN224PkW4vt9agZW?usp=share_link', # './split_processed_zip/4' folder in google drive
71
+ 'https://drive.google.com/drive/folders/11cCQw3qb1vJbviVPfBnOVWVzD_VzHdWs?usp=share_link', # './split_processed_zip/5' folder in google drive
72
+ 'https://drive.google.com/drive/folders/1Wvy604wCxEdXAwE7r3sE0L0ieXvM__u8?usp=share_link',
73
+ 'https://drive.google.com/drive/folders/1BTv_pMTNGm7m3hD65IgBrX880v-rLIaf?usp=share_link',
74
+ 'https://drive.google.com/drive/folders/12x7F11ln2VQkqi8-Mu3kng74eLgifM0N?usp=share_link',
75
+ 'https://drive.google.com/drive/folders/1OWkOul2CCrqynqpt44Fu1CBxzNNfOFE2?usp=share_link',
76
+ 'https://drive.google.com/drive/folders/1ukwsfrbSEqCBNmRSuAYvYBHijWCQh2OU?usp=share_link',
77
+ 'https://drive.google.com/drive/folders/1EO7zumR6sVfsWQWCS6zfNs5WuO2Se6WX?usp=share_link',
78
+ 'https://drive.google.com/drive/folders/1aw0iBWvvZiSKng0ejRK8xbNoHLVUFCFu?usp=share_link',
79
+ 'https://drive.google.com/drive/folders/1szIcxlVyT5WJtzpqYWYlue0n82A6-xtk?usp=share_link',
80
+ ]
81
+
82
+ output = './'
83
+ # VIDEO_PATH = 'processed_zip'
84
+ # VIDEO_PATH = 'filter_processed_zip'
85
+ VIDEO_PATH = 'split_processed_zip'
86
+ for i, url in enumerate(urls):
87
+ id = url.split('/')[-1]
88
+ os.system(f"gdown --id {id} -O {output} --folder --no-cookies --remaining-ok")
89
+
90
+ # unzip the zip files to the same location and delete zip files
91
+ path_to_zip_file = str(i+1)
92
+ zip_files = [join(path_to_zip_file, f) for f in listdir(path_to_zip_file)]
93
+ for f in zip_files:
94
+ if f.endswith(".zip"):
95
+ directory_to_extract_to = VIDEO_PATH # extracted file itself contains a folder
96
+ print(f'extract data {f} to {directory_to_extract_to}')
97
+ with zipfile.ZipFile(f, 'r') as zip_ref:
98
+ zip_ref.extractall(directory_to_extract_to)
99
+ os.remove(f)
100
+
101
+ else:
102
+ VIDEO_PATH = 'processed-data'
103
+ path_to_zip_file = VIDEO_PATH
104
+ zip_files = [join(path_to_zip_file, f) for f in listdir(path_to_zip_file)]
105
+ for f in zip_files:
106
+ if f.endswith(".zip"):
107
+ directory_to_extract_to = path_to_zip_file # extracted file itself contains a folder
108
+ print(f'extract data {f} to {directory_to_extract_to}')
109
+ with zipfile.ZipFile(f, 'r') as zip_ref:
110
+ zip_ref.extractall(directory_to_extract_to)
111
+ os.remove(f)
112
+
113
+ # for test only
114
+ # else: # local data
115
+ # VIDEO_PATH = 'robotinder-data'
116
+
117
+ VIDEO_INFO = os.path.join(VIDEO_PATH, 'video_info.json')
118
+
119
+ def inference(video_path):
120
+ # for displaying mp4 with autoplay on Gradio
121
+ with open(video_path, "rb") as f:
122
+ data = f.read()
123
+ b64 = base64.b64encode(data).decode()
124
+ html = (
125
+ f"""
126
+ <video controls autoplay muted loop>
127
+ <source src="data:video/mp4;base64,{b64}" type="video/mp4">
128
+ </video>
129
+ """
130
+ )
131
+ return html
132
+
133
+ def video_identity(video):
134
+ return video
135
+
136
+ def nan():
137
+ return None
138
+
139
+ FORMAT = ['mp4', 'gif'][0]
140
+
141
+ def get_huggingface_dataset():
142
+ try:
143
+ import huggingface_hub
144
+ except (ImportError, ModuleNotFoundError):
145
+ raise ImportError(
146
+ "Package `huggingface_hub` not found is needed "
147
+ "for HuggingFaceDatasetSaver. Try 'pip install huggingface_hub'."
148
+ )
149
+ HF_TOKEN = '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' # my HF token
150
+ DATASET_NAME = 'crowdsourced-robotinder-demo'
151
+ FLAGGING_DIR = 'flag/'
152
+ path_to_dataset_repo = huggingface_hub.create_repo(
153
+ repo_id=DATASET_NAME,
154
+ token=HF_TOKEN,
155
+ private=False,
156
+ repo_type="dataset",
157
+ exist_ok=True,
158
+ )
159
+ dataset_dir = os.path.join(DATASET_NAME, FLAGGING_DIR)
160
+ repo = huggingface_hub.Repository(
161
+ local_dir=dataset_dir,
162
+ clone_from=path_to_dataset_repo,
163
+ use_auth_token=HF_TOKEN,
164
+ )
165
+ repo.git_pull(lfs=True)
166
+ log_file = os.path.join(dataset_dir, "flag_data.csv")
167
+ return repo, log_file
168
+
169
+ def update(user_choice, left, right, choose_env, data_folder=VIDEO_PATH, flag_to_huggingface=False):
170
+ global last_left_video_path
171
+ global last_right_video_path
172
+ global last_infer_left_video_path
173
+ global last_infer_right_video_path
174
+
175
+ if flag_to_huggingface: # log
176
+ env_name = str(last_left_video_path).split('/')[1] # 'robotinder-data/ENV_NAME/'
177
+ current_time = strftime("%Y-%m-%d-%H-%M-%S", gmtime())
178
+ info = [env_name, user_choice, last_left_video_path, last_right_video_path, current_time]
179
+ print(info)
180
+ repo, log_file = get_huggingface_dataset()
181
+ with open(log_file, 'a') as file: # incremental change of the file
182
+ writer_object = writer(file)
183
+ writer_object.writerow(info)
184
+ file.close()
185
+ if int(current_time.split('-')[-2]) % 5 == 0: # push only on certain minutes
186
+ try:
187
+ repo.push_to_hub(commit_message=f"Flagged sample at {current_time}")
188
+ except:
189
+ repo.git_pull(lfs=True) # sync with remote first
190
+ repo.push_to_hub(commit_message=f"Flagged sample at {current_time}")
191
+ if choose_env == 'Random' or choose_env == '': # random or no selection
192
+ envs = get_env_names()
193
+ env_name = envs[random.randint(0, len(envs)-1)]
194
+ else:
195
+ env_name = choose_env
196
+ # choose video
197
+ left, right = randomly_select_videos(env_name)
198
+
199
+ last_left_video_path = left
200
+ last_right_video_path = right
201
+ last_infer_left_video_path = inference(left)
202
+ last_infer_right_video_path = inference(right)
203
+
204
+ return last_infer_left_video_path, last_infer_right_video_path, env_name
205
+
206
+ def replay(left, right):
207
+ return left, right
208
+
209
+ def parse_envs(folder=VIDEO_PATH, filter=True, MAX_ITER=20000, DEFAULT_ITER=20000):
210
+ """
211
+ return a dict of env_name: video_paths
212
+ """
213
+ files = {}
214
+ if filter:
215
+ df = pd.read_csv('Bidexhands_Video.csv')
216
+ # print(df)
217
+ for env_name in os.listdir(folder):
218
+ env_path = os.path.join(folder, env_name)
219
+ if os.path.isdir(env_path):
220
+ videos = os.listdir(env_path)
221
+ video_files = []
222
+ for video in videos: # video name rule: EnvName_Alg_Seed_Timestamp_Checkpoint_video-episode-EpisodeID
223
+ if video.endswith(f'.{FORMAT}'):
224
+ if filter:
225
+ if len(video.split('_')) < 6:
226
+ print(f'{video} is wrongly named.')
227
+ seed = video.split('_')[2]
228
+ checkpoint = video.split('_')[4]
229
+ try:
230
+ succeed_iteration = df.loc[(df['seed'] == int(seed)) & (df['env_name'] == str(env_name))]['succeed_iteration'].iloc[0]
231
+ except:
232
+ print(f'Env {env_name} with seed {seed} not found in Bidexhands_Video.csv')
233
+
234
+ if 'unsolved' in succeed_iteration:
235
+ continue
236
+ elif pd.isnull(succeed_iteration):
237
+ min_iter = DEFAULT_ITER
238
+ max_iter = MAX_ITER
239
+ elif '-' in succeed_iteration:
240
+ [min_iter, max_iter] = succeed_iteration.split('-')
241
+ else:
242
+ min_iter = succeed_iteration
243
+ max_iter = MAX_ITER
244
+
245
+ # check if the checkpoint is in the valid range
246
+ valid_checkpoints = np.arange(int(min_iter), int(max_iter)+1000, 1000)
247
+ if int(checkpoint) not in valid_checkpoints:
248
+ continue
249
+
250
+ video_path = os.path.join(folder, env_name, video)
251
+ video_files.append(video_path)
252
+ # print(video_path)
253
+
254
+ files[env_name] = video_files
255
+
256
+ with open(VIDEO_INFO, 'w') as fp:
257
+ json.dump(files, fp)
258
+
259
+ return files
260
+
261
+ def get_env_names():
262
+ with open(VIDEO_INFO, 'r') as fp:
263
+ files = json.load(fp)
264
+ return list(files.keys())
265
+
266
+ def randomly_select_videos(env_name):
267
+ # load the parsed video info
268
+ with open(VIDEO_INFO, 'r') as fp:
269
+ files = json.load(fp)
270
+ env_files = files[env_name]
271
+ # randomly choose two videos
272
+ selected_video_ids = np.random.choice(len(env_files), 2, replace=False)
273
+ left_video_path = env_files[selected_video_ids[0]]
274
+ right_video_path = env_files[selected_video_ids[1]]
275
+ return left_video_path, right_video_path
276
+
277
+ def build_interface(iter=3, data_folder=VIDEO_PATH):
278
+ import sys
279
+ import csv
280
+ csv.field_size_limit(sys.maxsize)
281
+
282
+ HF_TOKEN = os.getenv('HF_TOKEN')
283
+ print(HF_TOKEN)
284
+ HF_TOKEN = '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' # my HF token
285
+ ## hf_writer = gr.HuggingFaceDatasetSaver(HF_TOKEN, "crowdsourced-robotinder-demo") # HuggingFace logger instead of local one: https://github.com/gradio-app/gradio/blob/master/gradio/flagging.py
286
+ ## callback = gr.CSVLogger()
287
+ # hf_writer = HuggingFaceDatasetSaver(HF_TOKEN, "crowdsourced-robotinder-demo")
288
+ # callback = hf_writer
289
+
290
+ # parse the video folder
291
+ files = parse_envs()
292
+
293
+ # build gradio interface
294
+ with gr.Blocks() as demo:
295
+ gr.Markdown("## Here is <span style=color:cyan>RoboTinder</span>!")
296
+ gr.Markdown("### Select the best robot behaviour in your choice!")
297
+ # some initial values
298
+ env_name = list(files.keys())[random.randint(0, len(files)-1)] # random pick an env
299
+ with gr.Row():
300
+ str_env_name = gr.Markdown(f"{env_name}")
301
+
302
+ # choose video
303
+ left_video_path, right_video_path = randomly_select_videos(env_name)
304
+
305
+ with gr.Row():
306
+ if FORMAT == 'mp4':
307
+ # left = gr.PlayableVideo(left_video_path, label="left_video")
308
+ # right = gr.PlayableVideo(right_video_path, label="right_video")
309
+
310
+ infer_left_video_path = inference(left_video_path)
311
+ infer_right_video_path = inference(right_video_path)
312
+ right = gr.HTML(infer_right_video_path, label="right_video")
313
+ left = gr.HTML(infer_left_video_path, label="left_video")
314
+ else:
315
+ left = gr.Image(left_video_path, shape=(1024, 768), label="left_video")
316
+ # right = gr.Image(right_video_path).style(height=768, width=1024)
317
+ right = gr.Image(right_video_path, label="right_video")
318
+
319
+ global last_left_video_path
320
+ last_left_video_path = left_video_path
321
+ global last_right_video_path
322
+ last_right_video_path = right_video_path
323
+
324
+ global last_infer_left_video_path
325
+ last_infer_left_video_path = infer_left_video_path
326
+ global last_infer_right_video_path
327
+ last_infer_right_video_path = infer_right_video_path
328
+
329
+ # btn1 = gr.Button("Replay")
330
+ user_choice = gr.Radio(["Left", "Right", "Not Sure", "Both Good", "Both Bad"], label="Which one is your favorite?")
331
+ choose_env = gr.Radio(["Random"]+ENVS, label="Choose the next task:")
332
+ btn2 = gr.Button("Next")
333
+
334
+ # This needs to be called at some point prior to the first call to callback.flag()
335
+ # callback.setup([user_choice, left, right], "flagged_data_points")
336
+
337
+ # btn1.click(fn=replay, inputs=[left, right], outputs=[left, right])
338
+ btn2.click(fn=update, inputs=[user_choice, left, right, choose_env], outputs=[left, right, str_env_name])
339
+
340
+ # We can choose which components to flag -- in this case, we'll flag all of them
341
+ # btn2.click(lambda *args: callback.flag(args), [user_choice, left, right], None, preprocess=False) # not using the gradio flagging anymore
342
+
343
+ return demo
344
+
345
+ if __name__ == "__main__":
346
+ last_left_video_path = None
347
+ last_right_video_path = None
348
+
349
+ demo = build_interface()
350
+ # demo.launch(share=True)
351
+ demo.launch(share=False)
hfserver.py ADDED
@@ -0,0 +1,551 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import csv
4
+ import datetime
5
+ import io
6
+ import json
7
+ import os
8
+ import uuid
9
+ from abc import ABC, abstractmethod
10
+ from typing import TYPE_CHECKING, Any, List, Optional
11
+
12
+ import gradio as gr
13
+ from gradio import encryptor, utils
14
+ from gradio.documentation import document, set_documentation_group
15
+
16
+ if TYPE_CHECKING:
17
+ from gradio.components import IOComponent
18
+
19
+ set_documentation_group("flagging")
20
+
21
+
22
+ def _get_dataset_features_info(is_new, components):
23
+ """
24
+ Takes in a list of components and returns a dataset features info
25
+ Parameters:
26
+ is_new: boolean, whether the dataset is new or not
27
+ components: list of components
28
+ Returns:
29
+ infos: a dictionary of the dataset features
30
+ file_preview_types: dictionary mapping of gradio components to appropriate string.
31
+ header: list of header strings
32
+ """
33
+ infos = {"flagged": {"features": {}}}
34
+ # File previews for certain input and output types
35
+ file_preview_types = {gr.Audio: "Audio", gr.Image: "Image"}
36
+ headers = []
37
+
38
+ # Generate the headers and dataset_infos
39
+ if is_new:
40
+
41
+ for component in components:
42
+ headers.append(component.label)
43
+ infos["flagged"]["features"][component.label] = {
44
+ "dtype": "string",
45
+ "_type": "Value",
46
+ }
47
+ if isinstance(component, tuple(file_preview_types)):
48
+ headers.append(component.label + " file")
49
+ for _component, _type in file_preview_types.items():
50
+ if isinstance(component, _component):
51
+ infos["flagged"]["features"][component.label + " file"] = {
52
+ "_type": _type
53
+ }
54
+ break
55
+
56
+ headers.append("flag")
57
+ infos["flagged"]["features"]["flag"] = {
58
+ "dtype": "string",
59
+ "_type": "Value",
60
+ }
61
+
62
+ return infos, file_preview_types, headers
63
+
64
+
65
+ class FlaggingCallback(ABC):
66
+ """
67
+ An abstract class for defining the methods that any FlaggingCallback should have.
68
+ """
69
+
70
+ @abstractmethod
71
+ def setup(self, components: List[IOComponent], flagging_dir: str):
72
+ """
73
+ This method should be overridden and ensure that everything is set up correctly for flag().
74
+ This method gets called once at the beginning of the Interface.launch() method.
75
+ Parameters:
76
+ components: Set of components that will provide flagged data.
77
+ flagging_dir: A string, typically containing the path to the directory where the flagging file should be storied (provided as an argument to Interface.__init__()).
78
+ """
79
+ pass
80
+
81
+ @abstractmethod
82
+ def flag(
83
+ self,
84
+ flag_data: List[Any],
85
+ flag_option: Optional[str] = None,
86
+ flag_index: Optional[int] = None,
87
+ username: Optional[str] = None,
88
+ ) -> int:
89
+ """
90
+ This method should be overridden by the FlaggingCallback subclass and may contain optional additional arguments.
91
+ This gets called every time the <flag> button is pressed.
92
+ Parameters:
93
+ interface: The Interface object that is being used to launch the flagging interface.
94
+ flag_data: The data to be flagged.
95
+ flag_option (optional): In the case that flagging_options are provided, the flag option that is being used.
96
+ flag_index (optional): The index of the sample that is being flagged.
97
+ username (optional): The username of the user that is flagging the data, if logged in.
98
+ Returns:
99
+ (int) The total number of samples that have been flagged.
100
+ """
101
+ pass
102
+
103
+
104
+ @document()
105
+ class SimpleCSVLogger(FlaggingCallback):
106
+ """
107
+ A simplified implementation of the FlaggingCallback abstract class
108
+ provided for illustrative purposes. Each flagged sample (both the input and output data)
109
+ is logged to a CSV file on the machine running the gradio app.
110
+ Example:
111
+ import gradio as gr
112
+ def image_classifier(inp):
113
+ return {'cat': 0.3, 'dog': 0.7}
114
+ demo = gr.Interface(fn=image_classifier, inputs="image", outputs="label",
115
+ flagging_callback=SimpleCSVLogger())
116
+ """
117
+
118
+ def __init__(self):
119
+ pass
120
+
121
+ def setup(self, components: List[IOComponent], flagging_dir: str):
122
+ self.components = components
123
+ self.flagging_dir = flagging_dir
124
+ os.makedirs(flagging_dir, exist_ok=True)
125
+
126
+ def flag(
127
+ self,
128
+ flag_data: List[Any],
129
+ flag_option: Optional[str] = None,
130
+ flag_index: Optional[int] = None,
131
+ username: Optional[str] = None,
132
+ ) -> int:
133
+ flagging_dir = self.flagging_dir
134
+ log_filepath = os.path.join(flagging_dir, "log.csv")
135
+
136
+ csv_data = []
137
+ for component, sample in zip(self.components, flag_data):
138
+ save_dir = os.path.join(
139
+ flagging_dir, utils.strip_invalid_filename_characters(component.label)
140
+ )
141
+ csv_data.append(
142
+ component.deserialize(
143
+ sample,
144
+ save_dir,
145
+ None,
146
+ )
147
+ )
148
+
149
+ with open(log_filepath, "a", newline="") as csvfile:
150
+ writer = csv.writer(csvfile)
151
+ writer.writerow(utils.sanitize_list_for_csv(csv_data))
152
+
153
+ with open(log_filepath, "r") as csvfile:
154
+ line_count = len([None for row in csv.reader(csvfile)]) - 1
155
+ return line_count
156
+
157
+
158
+ @document()
159
+ class CSVLogger(FlaggingCallback):
160
+ """
161
+ The default implementation of the FlaggingCallback abstract class. Each flagged
162
+ sample (both the input and output data) is logged to a CSV file with headers on the machine running the gradio app.
163
+ Example:
164
+ import gradio as gr
165
+ def image_classifier(inp):
166
+ return {'cat': 0.3, 'dog': 0.7}
167
+ demo = gr.Interface(fn=image_classifier, inputs="image", outputs="label",
168
+ flagging_callback=CSVLogger())
169
+ Guides: using_flagging
170
+ """
171
+
172
+ def __init__(self):
173
+ pass
174
+
175
+ def setup(
176
+ self,
177
+ components: List[IOComponent],
178
+ flagging_dir: str,
179
+ encryption_key: Optional[str] = None,
180
+ ):
181
+ self.components = components
182
+ self.flagging_dir = flagging_dir
183
+ self.encryption_key = encryption_key
184
+ os.makedirs(flagging_dir, exist_ok=True)
185
+
186
+ def flag(
187
+ self,
188
+ flag_data: List[Any],
189
+ flag_option: Optional[str] = None,
190
+ flag_index: Optional[int] = None,
191
+ username: Optional[str] = None,
192
+ ) -> int:
193
+ flagging_dir = self.flagging_dir
194
+ log_filepath = os.path.join(flagging_dir, "log.csv")
195
+ is_new = not os.path.exists(log_filepath)
196
+
197
+ if flag_index is None:
198
+ csv_data = []
199
+ for idx, (component, sample) in enumerate(zip(self.components, flag_data)):
200
+ save_dir = os.path.join(
201
+ flagging_dir,
202
+ utils.strip_invalid_filename_characters(
203
+ component.label or f"component {idx}"
204
+ ),
205
+ )
206
+ if utils.is_update(sample):
207
+ csv_data.append(str(sample))
208
+ else:
209
+ csv_data.append(
210
+ component.deserialize(
211
+ sample,
212
+ save_dir=save_dir,
213
+ encryption_key=self.encryption_key,
214
+ )
215
+ if sample is not None
216
+ else ""
217
+ )
218
+ csv_data.append(flag_option if flag_option is not None else "")
219
+ csv_data.append(username if username is not None else "")
220
+ csv_data.append(str(datetime.datetime.now()))
221
+ if is_new:
222
+ headers = [
223
+ component.label or f"component {idx}"
224
+ for idx, component in enumerate(self.components)
225
+ ] + [
226
+ "flag",
227
+ "username",
228
+ "timestamp",
229
+ ]
230
+
231
+ def replace_flag_at_index(file_content):
232
+ file_content = io.StringIO(file_content)
233
+ content = list(csv.reader(file_content))
234
+ header = content[0]
235
+ flag_col_index = header.index("flag")
236
+ content[flag_index][flag_col_index] = flag_option
237
+ output = io.StringIO()
238
+ writer = csv.writer(output)
239
+ writer.writerows(utils.sanitize_list_for_csv(content))
240
+ return output.getvalue()
241
+
242
+ if self.encryption_key:
243
+ output = io.StringIO()
244
+ if not is_new:
245
+ with open(log_filepath, "rb", encoding="utf-8") as csvfile:
246
+ encrypted_csv = csvfile.read()
247
+ decrypted_csv = encryptor.decrypt(
248
+ self.encryption_key, encrypted_csv
249
+ )
250
+ file_content = decrypted_csv.decode()
251
+ if flag_index is not None:
252
+ file_content = replace_flag_at_index(file_content)
253
+ output.write(file_content)
254
+ writer = csv.writer(output)
255
+ if flag_index is None:
256
+ if is_new:
257
+ writer.writerow(utils.sanitize_list_for_csv(headers))
258
+ writer.writerow(utils.sanitize_list_for_csv(csv_data))
259
+ with open(log_filepath, "wb", encoding="utf-8") as csvfile:
260
+ csvfile.write(
261
+ encryptor.encrypt(self.encryption_key, output.getvalue().encode())
262
+ )
263
+ else:
264
+ if flag_index is None:
265
+ with open(log_filepath, "a", newline="", encoding="utf-8") as csvfile:
266
+ writer = csv.writer(csvfile)
267
+ if is_new:
268
+ writer.writerow(utils.sanitize_list_for_csv(headers))
269
+ writer.writerow(utils.sanitize_list_for_csv(csv_data))
270
+ else:
271
+ with open(log_filepath, encoding="utf-8") as csvfile:
272
+ file_content = csvfile.read()
273
+ file_content = replace_flag_at_index(file_content)
274
+ with open(
275
+ log_filepath, "w", newline="", encoding="utf-8"
276
+ ) as csvfile: # newline parameter needed for Windows
277
+ csvfile.write(utils.sanitize_list_for_csv(file_content))
278
+ with open(log_filepath, "r", encoding="utf-8") as csvfile:
279
+ line_count = len([None for row in csv.reader(csvfile)]) - 1
280
+ return line_count
281
+
282
+
283
+ @document()
284
+ class HuggingFaceDatasetSaver(FlaggingCallback):
285
+ """
286
+ A callback that saves each flagged sample (both the input and output data)
287
+ to a HuggingFace dataset.
288
+ Example:
289
+ import gradio as gr
290
+ hf_writer = gr.HuggingFaceDatasetSaver(HF_API_TOKEN, "image-classification-mistakes")
291
+ def image_classifier(inp):
292
+ return {'cat': 0.3, 'dog': 0.7}
293
+ demo = gr.Interface(fn=image_classifier, inputs="image", outputs="label",
294
+ allow_flagging="manual", flagging_callback=hf_writer)
295
+ Guides: using_flagging
296
+ """
297
+
298
+ def __init__(
299
+ self,
300
+ hf_token: str,
301
+ dataset_name: str,
302
+ organization: Optional[str] = None,
303
+ private: bool = False,
304
+ ):
305
+ """
306
+ Parameters:
307
+ hf_token: The HuggingFace token to use to create (and write the flagged sample to) the HuggingFace dataset.
308
+ dataset_name: The name of the dataset to save the data to, e.g. "image-classifier-1"
309
+ organization: The organization to save the dataset under. The hf_token must provide write access to this organization. If not provided, saved under the name of the user corresponding to the hf_token.
310
+ private: Whether the dataset should be private (defaults to False).
311
+ """
312
+ self.hf_token = hf_token
313
+ self.dataset_name = dataset_name
314
+ self.organization_name = organization
315
+ self.dataset_private = private
316
+
317
+ def setup(self, components: List[IOComponent], flagging_dir: str):
318
+ """
319
+ Params:
320
+ flagging_dir (str): local directory where the dataset is cloned,
321
+ updated, and pushed from.
322
+ """
323
+ try:
324
+ import huggingface_hub
325
+ except (ImportError, ModuleNotFoundError):
326
+ raise ImportError(
327
+ "Package `huggingface_hub` not found is needed "
328
+ "for HuggingFaceDatasetSaver. Try 'pip install huggingface_hub'."
329
+ )
330
+ path_to_dataset_repo = huggingface_hub.create_repo(
331
+ # name=self.dataset_name,
332
+ repo_id=self.dataset_name,
333
+ token=self.hf_token,
334
+ private=self.dataset_private,
335
+ repo_type="dataset",
336
+ exist_ok=True,
337
+ )
338
+ self.path_to_dataset_repo = path_to_dataset_repo # e.g. "https://huggingface.co/datasets/abidlabs/test-audio-10"
339
+ self.components = components
340
+ self.flagging_dir = flagging_dir
341
+ self.dataset_dir = os.path.join(flagging_dir, self.dataset_name)
342
+ self.repo = huggingface_hub.Repository(
343
+ local_dir=self.dataset_dir,
344
+ clone_from=path_to_dataset_repo,
345
+ use_auth_token=self.hf_token,
346
+ )
347
+ self.repo.git_pull(lfs=True)
348
+
349
+ # Should filename be user-specified?
350
+ self.log_file = os.path.join(self.dataset_dir, "data.csv")
351
+ self.infos_file = os.path.join(self.dataset_dir, "dataset_infos.json")
352
+
353
+ def flag(
354
+ self,
355
+ flag_data: List[Any],
356
+ flag_option: Optional[str] = None,
357
+ flag_index: Optional[int] = None,
358
+ username: Optional[str] = None,
359
+ ) -> int:
360
+ self.repo.git_pull(lfs=True)
361
+
362
+ is_new = not os.path.exists(self.log_file)
363
+
364
+ with open(self.log_file, "a", newline="", encoding="utf-8") as csvfile:
365
+ writer = csv.writer(csvfile)
366
+
367
+ # File previews for certain input and output types
368
+ infos, file_preview_types, headers = _get_dataset_features_info(
369
+ is_new, self.components
370
+ )
371
+
372
+ # Generate the headers and dataset_infos
373
+ if is_new:
374
+ writer.writerow(utils.sanitize_list_for_csv(headers))
375
+
376
+ # Generate the row corresponding to the flagged sample
377
+ csv_data = []
378
+ for component, sample in zip(self.components, flag_data):
379
+ save_dir = os.path.join(
380
+ self.dataset_dir,
381
+ utils.strip_invalid_filename_characters(component.label),
382
+ )
383
+ # filepath = component.deserialize(sample, save_dir, None)
384
+ if sample is not None and str(component)!='image':
385
+ filepath = component.deserialize(sample, save_dir, None)
386
+ else:
387
+ filepath = component.deserialize(sample, None, None) # not saving image
388
+ csv_data.append(filepath)
389
+ if isinstance(component, tuple(file_preview_types)):
390
+ csv_data.append(
391
+ "{}/resolve/main/{}".format(self.path_to_dataset_repo, filepath)
392
+ )
393
+ csv_data.append(flag_option if flag_option is not None else "")
394
+ writer.writerow(utils.sanitize_list_for_csv(csv_data))
395
+
396
+ if is_new:
397
+ json.dump(infos, open(self.infos_file, "w"))
398
+
399
+ with open(self.log_file, "r", encoding="utf-8") as csvfile:
400
+ line_count = len([None for row in csv.reader(csvfile)]) - 1
401
+
402
+ self.repo.push_to_hub(commit_message="Flagged sample #{}".format(line_count))
403
+
404
+ return line_count
405
+
406
+
407
+ class HuggingFaceDatasetJSONSaver(FlaggingCallback):
408
+ """
409
+ A FlaggingCallback that saves flagged data to a Hugging Face dataset in JSONL format.
410
+ Each data sample is saved in a different JSONL file,
411
+ allowing multiple users to use flagging simultaneously.
412
+ Saving to a single CSV would cause errors as only one user can edit at the same time.
413
+ """
414
+
415
+ def __init__(
416
+ self,
417
+ hf_foken: str,
418
+ dataset_name: str,
419
+ organization: Optional[str] = None,
420
+ private: bool = False,
421
+ verbose: bool = True,
422
+ ):
423
+ """
424
+ Params:
425
+ hf_token (str): The token to use to access the huggingface API.
426
+ dataset_name (str): The name of the dataset to save the data to, e.g.
427
+ "image-classifier-1"
428
+ organization (str): The name of the organization to which to attach
429
+ the datasets. If None, the dataset attaches to the user only.
430
+ private (bool): If the dataset does not already exist, whether it
431
+ should be created as a private dataset or public. Private datasets
432
+ may require paid huggingface.co accounts
433
+ verbose (bool): Whether to print out the status of the dataset
434
+ creation.
435
+ """
436
+ self.hf_foken = hf_foken
437
+ self.dataset_name = dataset_name
438
+ self.organization_name = organization
439
+ self.dataset_private = private
440
+ self.verbose = verbose
441
+
442
+ def setup(self, components: List[IOComponent], flagging_dir: str):
443
+ """
444
+ Params:
445
+ components List[Component]: list of components for flagging
446
+ flagging_dir (str): local directory where the dataset is cloned,
447
+ updated, and pushed from.
448
+ """
449
+ try:
450
+ import huggingface_hub
451
+ except (ImportError, ModuleNotFoundError):
452
+ raise ImportError(
453
+ "Package `huggingface_hub` not found is needed "
454
+ "for HuggingFaceDatasetJSONSaver. Try 'pip install huggingface_hub'."
455
+ )
456
+ path_to_dataset_repo = huggingface_hub.create_repo(
457
+ # name=self.dataset_name, https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/hf_api.py
458
+ repo_id=self.dataset_name,
459
+ token=self.hf_foken,
460
+ private=self.dataset_private,
461
+ repo_type="dataset",
462
+ exist_ok=True,
463
+ )
464
+ self.path_to_dataset_repo = path_to_dataset_repo # e.g. "https://huggingface.co/datasets/abidlabs/test-audio-10"
465
+ self.components = components
466
+ self.flagging_dir = flagging_dir
467
+ self.dataset_dir = os.path.join(flagging_dir, self.dataset_name)
468
+ self.repo = huggingface_hub.Repository(
469
+ local_dir=self.dataset_dir,
470
+ clone_from=path_to_dataset_repo,
471
+ use_auth_token=self.hf_foken,
472
+ )
473
+ self.repo.git_pull(lfs=True)
474
+
475
+ self.infos_file = os.path.join(self.dataset_dir, "dataset_infos.json")
476
+
477
+ def flag(
478
+ self,
479
+ flag_data: List[Any],
480
+ flag_option: Optional[str] = None,
481
+ flag_index: Optional[int] = None,
482
+ username: Optional[str] = None,
483
+ ) -> int:
484
+ self.repo.git_pull(lfs=True)
485
+
486
+ # Generate unique folder for the flagged sample
487
+ unique_name = self.get_unique_name() # unique name for folder
488
+ folder_name = os.path.join(
489
+ self.dataset_dir, unique_name
490
+ ) # unique folder for specific example
491
+ os.makedirs(folder_name)
492
+
493
+ # Now uses the existence of `dataset_infos.json` to determine if new
494
+ is_new = not os.path.exists(self.infos_file)
495
+
496
+ # File previews for certain input and output types
497
+ infos, file_preview_types, _ = _get_dataset_features_info(
498
+ is_new, self.components
499
+ )
500
+
501
+ # Generate the row and header corresponding to the flagged sample
502
+ csv_data = []
503
+ headers = []
504
+
505
+ for component, sample in zip(self.components, flag_data):
506
+ headers.append(component.label)
507
+
508
+ try:
509
+ filepath = component.save_flagged(
510
+ folder_name, component.label, sample, None
511
+ )
512
+ except Exception:
513
+ # Could not parse 'sample' (mostly) because it was None and `component.save_flagged`
514
+ # does not handle None cases.
515
+ # for example: Label (line 3109 of components.py raises an error if data is None)
516
+ filepath = None
517
+
518
+ if isinstance(component, tuple(file_preview_types)):
519
+ headers.append(str(component.label) + " file")
520
+
521
+ csv_data.append(
522
+ "{}/resolve/main/{}/{}".format(
523
+ self.path_to_dataset_repo, unique_name, filepath
524
+ )
525
+ if filepath is not None
526
+ else None
527
+ )
528
+
529
+ csv_data.append(filepath)
530
+ headers.append("flag")
531
+ csv_data.append(flag_option if flag_option is not None else "")
532
+
533
+ # Creates metadata dict from row data and dumps it
534
+ metadata_dict = {
535
+ header: _csv_data for header, _csv_data in zip(headers, csv_data)
536
+ }
537
+ self.dump_json(metadata_dict, os.path.join(folder_name, "metadata.jsonl"))
538
+
539
+ if is_new:
540
+ json.dump(infos, open(self.infos_file, "w"))
541
+
542
+ self.repo.push_to_hub(commit_message="Flagged sample {}".format(unique_name))
543
+ return unique_name
544
+
545
+ def get_unique_name(self):
546
+ id = uuid.uuid4()
547
+ return str(id)
548
+
549
+ def dump_json(self, thing: dict, file_path: str) -> None:
550
+ with open(file_path, "w+", encoding="utf8") as f:
551
+ json.dump(thing, f)
processed-data/processed.zip ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:37a3acffa7d1146031eb7dc266f97225fec3bc3ab36f83b06e39e632dd02a831
3
+ size 3158508471
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ gradio==3.12.0
2
+ gdown==4.6.0
3
+ git-lfs
4
+ pandas
robotinder-data/.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ rl*.mp4
robotinder-data/ShadowHandBlockStack/rl-video-episode-0.gif ADDED

Git LFS Details

  • SHA256: 61cdb32bfab65c18a76719b51b574b5e019c7ad735a9f4560c89983b691ee538
  • Pointer size: 133 Bytes
  • Size of remote file: 11.6 MB
robotinder-data/ShadowHandBlockStack/rl-video-episode-0.mp4 ADDED
Binary file (271 kB). View file
 
robotinder-data/ShadowHandBlockStack/rl-video-episode-1.gif ADDED

Git LFS Details

  • SHA256: cc3b8f3f4f7efe4fa25b8a36b162d653fe77a43027db69bd0b1205862a657989
  • Pointer size: 133 Bytes
  • Size of remote file: 11.8 MB
robotinder-data/ShadowHandBlockStack/rl-video-episode-1.mp4 ADDED
Binary file (329 kB). View file
 
robotinder-data/ShadowHandBlockStack/rl-video-episode-2.gif ADDED

Git LFS Details

  • SHA256: fbaf8807afab8d83fb5788975bd998c35865603a8b54d670bf71ed4afb8d145a
  • Pointer size: 133 Bytes
  • Size of remote file: 11.7 MB
robotinder-data/ShadowHandBlockStack/rl-video-episode-2.mp4 ADDED
Binary file (309 kB). View file
 
robotinder-data/ShadowHandBlockStack/rl-video-episode-3.gif ADDED

Git LFS Details

  • SHA256: d534cf1e1587731514b2fcb6f1170ce3c857d28217bafad89a91ab9073bc8247
  • Pointer size: 133 Bytes
  • Size of remote file: 11.8 MB
robotinder-data/ShadowHandBlockStack/rl-video-episode-3.mp4 ADDED
Binary file (315 kB). View file
 
robotinder-data/ShadowHandBlockStack/rl-video-episode-4.gif ADDED

Git LFS Details

  • SHA256: 68df3934d5497fbd261878d16b317f2cc2164aae229135dedf3fc18f92d6987f
  • Pointer size: 133 Bytes
  • Size of remote file: 11.7 MB
robotinder-data/ShadowHandBlockStack/rl-video-episode-4.mp4 ADDED
Binary file (329 kB). View file
 
robotinder-data/ShadowHandBlockStack/rl-video-episode-5.gif ADDED

Git LFS Details

  • SHA256: ed9274d434676b7ad3f1e274bd902f10a53175ddf5cbdb0e8b3e515f2e44de9b
  • Pointer size: 133 Bytes
  • Size of remote file: 11.7 MB
robotinder-data/ShadowHandBlockStack/rl-video-episode-5.mp4 ADDED
Binary file (283 kB). View file
 
robotinder-data/ShadowHandBlockStack/rl-video-episode-6.gif ADDED

Git LFS Details

  • SHA256: 8197587a37c6d2e71a668713b9d179df863cabac171b77914fb8fc24aaf9cc27
  • Pointer size: 133 Bytes
  • Size of remote file: 11.8 MB
robotinder-data/ShadowHandBlockStack/rl-video-episode-6.mp4 ADDED
Binary file (308 kB). View file
 
robotinder-data/ShadowHandBlockStack/rl-video-episode-7.gif ADDED

Git LFS Details

  • SHA256: 842fd6f37373212212f45ac83a426aa71ba7e02ce83d62bff41bf984cc11eb3b
  • Pointer size: 133 Bytes
  • Size of remote file: 11.8 MB
robotinder-data/ShadowHandBlockStack/rl-video-episode-7.mp4 ADDED
Binary file (332 kB). View file
 
robotinder-data/ShadowHandBlockStack/rl-video-episode-8.gif ADDED

Git LFS Details

  • SHA256: 35e0a65b634bf6e1bdd212e99571df474d1856d0e7ca89d8065f3480ab1c7f8e
  • Pointer size: 133 Bytes
  • Size of remote file: 11.7 MB
robotinder-data/ShadowHandBlockStack/rl-video-episode-8.mp4 ADDED
Binary file (309 kB). View file
 
robotinder-data/ShadowHandBlockStack/rl-video-episode-9.gif ADDED

Git LFS Details

  • SHA256: 8d05e8dfcb434aaeba7266b777db61572fc75f2096114b9d1c9976dc5252126f
  • Pointer size: 133 Bytes
  • Size of remote file: 11.6 MB
robotinder-data/ShadowHandBlockStack/rl-video-episode-9.mp4 ADDED
Binary file (315 kB). View file
 
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-0.gif ADDED

Git LFS Details

  • SHA256: 94b19c62c87debef76f76e993d05cb9b8289af45caa30928d1a0c7c8e060a1e9
  • Pointer size: 133 Bytes
  • Size of remote file: 15.7 MB
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-0.mp4 ADDED
Binary file (248 kB). View file
 
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-1.gif ADDED

Git LFS Details

  • SHA256: 0a91a2747b898bf80e3a101ac90e3d75352822071a6d3231b8878cf142d881a8
  • Pointer size: 133 Bytes
  • Size of remote file: 15.7 MB
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-1.mp4 ADDED
Binary file (237 kB). View file
 
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-2.gif ADDED

Git LFS Details

  • SHA256: 45ac6dd0ef3f4e49b8112f4debf9a51f57749f8880e16d5b8bdba1c456a80b5a
  • Pointer size: 133 Bytes
  • Size of remote file: 15.7 MB
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-2.mp4 ADDED
Binary file (214 kB). View file
 
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-3.gif ADDED

Git LFS Details

  • SHA256: f0b35c1c3cc2c55e491c38ec910793387c962157a67f792f71d9be203439048a
  • Pointer size: 133 Bytes
  • Size of remote file: 15.7 MB
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-3.mp4 ADDED
Binary file (201 kB). View file
 
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-4.gif ADDED

Git LFS Details

  • SHA256: 3cadf5bb9efd227ace243ae89a197adbb0c92467807f9f15b7eff16dfd1d6b49
  • Pointer size: 133 Bytes
  • Size of remote file: 15.7 MB
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-4.mp4 ADDED
Binary file (247 kB). View file
 
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-5.gif ADDED

Git LFS Details

  • SHA256: c708157cbc62107c3e00f1d402a619cf08f4e749c205a759f220fc934db0a287
  • Pointer size: 133 Bytes
  • Size of remote file: 15.6 MB
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-5.mp4 ADDED
Binary file (199 kB). View file
 
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-6.gif ADDED

Git LFS Details

  • SHA256: 15d403040747bae6ad4e9c3b53ef54ba07deaaa38b160710d11886fe9849daa4
  • Pointer size: 133 Bytes
  • Size of remote file: 15.7 MB
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-6.mp4 ADDED
Binary file (233 kB). View file
 
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-7.gif ADDED

Git LFS Details

  • SHA256: 9dfb054b5b8afb94a8c2e3fb31ab4b66f2aac5d4a113087529797daeb1b3638f
  • Pointer size: 133 Bytes
  • Size of remote file: 15.7 MB
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-7.mp4 ADDED
Binary file (238 kB). View file
 
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-8.gif ADDED

Git LFS Details

  • SHA256: fe31ca59dad2a7ad5fec9577ead4d26e349f4a0e4fdc890bb813c996155ffd96
  • Pointer size: 133 Bytes
  • Size of remote file: 15.7 MB
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-8.mp4 ADDED
Binary file (204 kB). View file
 
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-9.gif ADDED

Git LFS Details

  • SHA256: cf3df3c2d756792aa6416cf08cecb3defa891824abb313bab495f904f738c5cc
  • Pointer size: 133 Bytes
  • Size of remote file: 15.7 MB
robotinder-data/ShadowHandDoorOpenInward/rl-video-episode-9.mp4 ADDED
Binary file (215 kB). View file
 
robotinder-data/data_info.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"idx": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "env": ["ShadowHandBlockStack", "ShadowHandBlockStack", "ShadowHandBlockStack", "ShadowHandBlockStack", "ShadowHandBlockStack", "ShadowHandBlockStack", "ShadowHandBlockStack", "ShadowHandBlockStack", "ShadowHandBlockStack", "ShadowHandBlockStack", "ShadowHandDoorOpenInward", "ShadowHandDoorOpenInward", "ShadowHandDoorOpenInward", "ShadowHandDoorOpenInward", "ShadowHandDoorOpenInward", "ShadowHandDoorOpenInward", "ShadowHandDoorOpenInward", "ShadowHandDoorOpenInward", "ShadowHandDoorOpenInward", "ShadowHandDoorOpenInward"], "name": ["rl-video-episode-1.gif", "rl-video-episode-9.gif", "rl-video-episode-7.gif", "rl-video-episode-2.gif", "rl-video-episode-3.gif", "rl-video-episode-6.gif", "rl-video-episode-0.gif", "rl-video-episode-4.gif", "rl-video-episode-5.gif", "rl-video-episode-8.gif", "rl-video-episode-1.gif", "rl-video-episode-9.gif", "rl-video-episode-7.gif", "rl-video-episode-2.gif", "rl-video-episode-3.gif", "rl-video-episode-6.gif", "rl-video-episode-0.gif", "rl-video-episode-4.gif", "rl-video-episode-5.gif", "rl-video-episode-8.gif"]}
robotinder-data/data_parser.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+
3
+ from os import listdir
4
+ from os.path import isfile, join, isdir
5
+ mypath = './'
6
+ onlyfolders = [f for f in listdir(mypath) if isdir(join(mypath, f))]
7
+
8
+ idx = 0
9
+ data_info = {'idx': [], 'env': [], 'name': []}
10
+ for folder in onlyfolders:
11
+ print(folder)
12
+ fs = [join(mypath, folder, f) for f in listdir(join(mypath, folder)) if isfile(join(mypath, folder, f))]
13
+ # print(fs)
14
+ for f in fs:
15
+ if f.endswith(".gif"):
16
+ idx += 1
17
+ data_info['idx'].append(idx)
18
+ data_info['env'].append(folder)
19
+ data_info['name'].append(f.split('/')[-1])
20
+
21
+ with open('data_info.json', 'w') as f:
22
+ json.dump(data_info, f)
23
+
24
+ with open('data_info.json', 'r') as f:
25
+ data_info = json.load(f)
26
+ print(data_info)
27
+