diff --git a/arguments/__init__.py b/arguments/__init__.py index 0b2f448..6788582 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -89,8 +89,10 @@ class OptimizationParams(ParamGroup): self.percent_dense = 0.01 self.lambda_dssim = 0.2 self.densification_interval = 100 + # self.densification_interval = 10 self.opacity_reset_interval = 3000 self.densify_from_iter = 500 + # self.densify_from_iter = 10 self.densify_until_iter = 15_000 self.densify_grad_threshold = 0.0002 self.depth_l1_weight_init = 1.0 diff --git a/cameras.json b/cameras.json new file mode 100644 index 0000000..ec3e059 --- /dev/null +++ b/cameras.json @@ -0,0 +1 @@ +[{"id": 0, "img_name": "r_0", "width": 800, "height": 800, "position": [-0.053798321634531, 3.8454704284667964, 1.2080823183059688], "rotation": [[-0.9999021887779235, -0.004192245192825794, 0.013345719315111635], [-0.013988681137561795, 0.2996590733528137, -0.95394366979599], [-4.6566128694606617e-10, -0.9540371894836427, -0.299688309431076]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 1, "img_name": "r_1", "width": 800, "height": 800, "position": [-1.3986591100692751, 3.5542497634887695, 1.2888214588165285], "rotation": [[-0.9305422306060791, -0.11707554012536998, 0.34696459770202637], [-0.36618456244468683, 0.29751041531562805, -0.8817007541656495], [7.4505805908262365e-09, -0.9475130438804626, -0.31971722841262823]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 2, "img_name": "r_2", "width": 800, "height": 800, "position": [-3.3854935169219966, -1.6727094650268555, 1.4108426570892334], "rotation": [[0.44296362996101385, -0.31377720832824696, 0.8398374915122985], [-0.8965396881103517, -0.15503148734569552, 0.4149481058120728], [-2.3310177756236562e-17, -0.9367545843124389, -0.3499869406223297]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 3, "img_name": "r_3", "width": 800, "height": 800, "position": [-1.246434569358826, -1.6370664834976196, 3.4664700031280518], "rotation": [[0.7956318259239196, -0.5209260582923889, 0.3092023432254792], [-0.6057805418968201, -0.6841840147972106, 0.40610620379447937], [-1.490116118281567e-08, -0.5104197859764099, -0.8599253892898561]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 4, "img_name": "r_4", "width": 800, "height": 800, "position": [2.886523008346558, 2.513216972351074, 1.2655931711196897], "rotation": [[-0.6566542387008668, 0.2367822825908661, -0.7160581946372988], [0.754191815853119, 0.20615987479686734, -0.623452365398407], [-1.490116294955169e-08, -0.9494377970695496, -0.31395500898361206]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 5, "img_name": "r_5", "width": 800, "height": 800, "position": [-2.8906705379486075, 0.3545424342155457, 2.787171363830566], "rotation": [[-0.12173833698034288, -0.6862695217132568, 0.7170870900154114], [-0.992562174797058, 0.084171362221241, -0.0879511535167694], [9.95158249822546e-18, -0.7224606275558471, -0.691412091255188]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 6, "img_name": "r_6", "width": 800, "height": 800, "position": [2.232801914215088, -1.9462224245071407, 2.734376192092895], "rotation": [[0.6570732593536379, 0.5113321542739868, -0.5538899898529052], [0.7538267374038695, -0.44570285081863403, 0.48279836773872364], [-1.4901161230765127e-08, -0.734770953655243, -0.6783152222633363]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 7, "img_name": "r_7", "width": 800, "height": 800, "position": [-0.12979382276535034, -0.27528816461563116, 4.019623279571533], "rotation": [[0.9045065641403198, -0.4252426624298096, 0.03219788148999214], [-0.42645993828773504, -0.9019248485565189, 0.06829058378934862], [-6.919088304910565e-18, -0.07550014555454256, -0.9971457123756409]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 8, "img_name": "r_8", "width": 800, "height": 800, "position": [-3.749589920043946, -0.6077235937118531, 1.3495359420776367], "rotation": [[0.15998959541320804, -0.33046624064445496, 0.9301587939262391], [-0.9871187806129457, -0.05356109514832498, 0.15075767040252688], [-0.0, -0.9422966837882997, -0.33477866649627686]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 9, "img_name": "r_9", "width": 800, "height": 800, "position": [-3.4902923107147212, 0.8376882672309872, 1.834703803062439], "rotation": [[-0.23337772488594052, -0.44256603717803966, 0.8658348917961121], [-0.9723862409591674, 0.10621813684701917, -0.20780485868453974], [7.45058148321291e-09, -0.8904228806495668, -0.4551339745521546]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 10, "img_name": "r_10", "width": 800, "height": 800, "position": [-3.3551595211029057, -2.0526268482208256, 0.882965087890625], "rotation": [[0.5218667387962342, -0.18684424459934237, 0.8323126435279845], [-0.8530270457267763, -0.11430796235799791, 0.5091940164566041], [-7.45058060166295e-09, -0.9757166504859924, -0.21903668344020844]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 11, "img_name": "r_11", "width": 800, "height": 800, "position": [0.5290739536285399, 2.3579144477844243, 3.2265028953552233], "rotation": [[-0.975738763809204, 0.1752375513315201, -0.13124708831310272], [0.21893838047981265, 0.7809780836105348, -0.5849266052246094], [-7.450581518129667e-09, -0.5994703769683839, -0.8003968596458433]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 12, "img_name": "r_12", "width": 800, "height": 800, "position": [-0.48754292726516724, 1.9911646842956547, 3.470960140228272], "rotation": [[-0.9713073372840884, -0.20477895438671115, 0.12094451487064363], [-0.23782765865325933, 0.8363337516784668, -0.49394714832305914], [7.450580600414709e-09, -0.5085384249687194, -0.8610392212867737]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 13, "img_name": "r_13", "width": 800, "height": 800, "position": [2.1348819732666016, -3.3444597721099845, 0.7119466662406919], "rotation": [[0.842908501625061, 0.09502744674682617, -0.5295989513397217], [0.5380570292472838, -0.14886793494224546, 0.8296582698822023], [7.450582365433303e-09, -0.9842804074287413, -0.1766122132539749]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 14, "img_name": "r_14", "width": 800, "height": 800, "position": [-1.958509802818298, 0.12458765506744379, 3.5211811065673824], "rotation": [[-0.06348517537117003, -0.8717355132102965, 0.4858465492725373], [-0.9979828596115112, 0.05545414239168165, -0.03090639598667621], [9.07332165676391e-18, -0.48682850599288935, -0.8734976053237915]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 15, "img_name": "r_15", "width": 800, "height": 800, "position": [2.653816938400268, 2.505865573883057, 1.7111091613769536], "rotation": [[-0.6865485906600951, 0.30862814188003523, -0.6583309769630431], [0.7270838618278503, 0.2914219796657563, -0.6216287612915039], [-0.0, -0.9054401516914367, -0.4244739413261414]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 16, "img_name": "r_16", "width": 800, "height": 800, "position": [-3.189949989318847, -0.4194121360778809, 2.4286444187164307], "rotation": [[0.1303573101758957, -0.5973315834999084, 0.7913291454315186], [-0.9914670586585999, -0.07853669673204423, 0.10404333472251891], [7.450579722682346e-09, -0.7981396317481996, -0.602472484111786]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 17, "img_name": "r_17", "width": 800, "height": 800, "position": [3.7242627143859854, -1.1142032146453857, 1.066967248916626], "rotation": [[0.2866219282150269, 0.25357696413993835, -0.923875868320465], [0.9580436348915101, -0.07586367428302764, 0.2763997912406922], [1.2821351957044133e-17, -0.9643357992172242, -0.26468199491500854]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 18, "img_name": "r_18", "width": 800, "height": 800, "position": [0.9608983993530271, 0.09413626790046688, 3.913797616958617], "rotation": [[-0.09750017523765565, 0.9662679433822633, -0.23836953938007355], [0.9952355623245239, 0.09466230124235152, -0.02335233241319656], [-1.8626453726666316e-09, -0.23951061069965363, -0.9708936214447021]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 19, "img_name": "r_19", "width": 800, "height": 800, "position": [3.1680095195770277, -2.172286987304687, 1.2226545810699463], "rotation": [[0.5655173063278197, 0.2501452565193176, -0.7858863472938539], [0.8247364163398743, -0.1715232580900192, 0.53887802362442], [2.181273101760883e-17, -0.9528940916061401, -0.30330324172973633]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 20, "img_name": "r_20", "width": 800, "height": 800, "position": [1.9119539260864253, -2.987448692321777, 1.915615439414979], "rotation": [[0.8422731161117554, 0.25616011023521423, -0.4742973446846007], [0.5390509963035583, -0.40025293827056896, 0.7410947680473328], [1.4901161202071807e-08, -0.8798747658729555, -0.4752056598663332]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 21, "img_name": "r_21", "width": 800, "height": 800, "position": [-0.7987216114997864, -1.6971794366836552, 3.5681405067443857], "rotation": [[0.9048085808753968, -0.3769117295742035, 0.19813843071460727], [-0.4258183538913727, -0.8008883595466614, 0.4210183620452881], [2.4567753883747556e-17, -0.46531215310096735, -0.8851466178894044]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 22, "img_name": "r_22", "width": 800, "height": 800, "position": [2.8507351875305176, 1.4779094457626343, 2.437025308609009], "rotation": [[-0.46025592088699335, 0.5367125868797303, -0.7071803212165831], [0.8877863287925718, 0.27824842929840077, -0.3666241765022277], [-0.0, -0.7965658903121948, -0.6045514941215515]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 23, "img_name": "r_23", "width": 800, "height": 800, "position": [-2.8561718463897705, 1.5105533599853516, 2.410500049591064], "rotation": [[-0.4675160050392151, -0.5285975337028503, 0.7085289359092711], [-0.8839846849441528, 0.27956119179725647, -0.3747221231460571], [-3.933126184607805e-17, -0.8015173077583313, -0.5979713797569275]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 24, "img_name": "r_24", "width": 800, "height": 800, "position": [-2.1008365154266357, -2.5676472187042236, 2.289906740188598], "rotation": [[0.7739522457122804, -0.35971799492836004, 0.5211533904075623], [-0.633243978023529, -0.43964815139770497, 0.6369548439979552], [-4.5685119056854714e-17, -0.8229899406433105, -0.5680559277534485]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 25, "img_name": "r_25", "width": 800, "height": 800, "position": [3.6374092102050777, 0.5946717858314514, 1.6326723098754883], "rotation": [[-0.16134572029113772, 0.39970958232879633, -0.9023301005363463], [0.986897945404053, 0.06534761935472486, -0.14751990139484406], [3.725290305890268e-09, -0.9143095612525939, -0.4050161242485046]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 26, "img_name": "r_26", "width": 800, "height": 800, "position": [0.8770476579666139, 3.8690884113311768, 0.7148017883300781], "rotation": [[-0.9752575159072877, 0.03920060396194459, -0.21756872534751892], [0.22107206284999853, 0.17293314635753634, -0.9598026275634766], [3.7252907468340046e-09, -0.9841530919075012, -0.17732048034667972]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 27, "img_name": "r_27", "width": 800, "height": 800, "position": [-0.4207355976104735, 2.998076677322387, 2.6616756916046143], "rotation": [[-0.9902960658073426, -0.09176140278577807, 0.10437164455652237], [-0.13897335529327393, 0.6538731455802917, -0.743731200695038], [-0.0, -0.751019060611725, -0.6602804064750671]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 28, "img_name": "r_28", "width": 800, "height": 800, "position": [2.1117768287658687, -2.6780374050140368, 2.1490728855133057], "rotation": [[0.7852338552474977, 0.33010709285736084, -0.52386736869812], [0.6191992759704591, -0.41862338781356817, 0.6643393039703368], [-1.4901161185471473e-08, -0.8460399508476257, -0.5331193804740906]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 29, "img_name": "r_29", "width": 800, "height": 800, "position": [-1.6116830110549927, -3.2011020183563232, 1.845379233360291], "rotation": [[0.8931812047958373, -0.20586314797401423, 0.39980930089950556], [-0.4496966898441314, -0.40888249874114985, 0.7940956354141235], [4.93529867854251e-17, -0.889064371585846, -0.45778220891952526]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 30, "img_name": "r_30", "width": 800, "height": 800, "position": [1.7322875261306765, 0.5184860825538635, 3.602825641632081], "rotation": [[-0.28673890233039856, 0.8562213182449341, -0.42972761392593384], [0.9580087661743164, 0.25627318024635315, -0.12862055003643036], [-2.3764913920559936e-17, -0.44856342673301697, -0.8937509655952456]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 31, "img_name": "r_31", "width": 800, "height": 800, "position": [-1.2971957921981812, 0.2035394608974456, 3.811280012130737], "rotation": [[-0.15501070022583008, -0.9340341687202453, 0.32179465889930725], [-0.9879127740859985, 0.1465567648410797, -0.05049192532896995], [-0.0, -0.3257317543029785, -0.945462167263031]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 32, "img_name": "r_32", "width": 800, "height": 800, "position": [-3.939867734909058, -0.0002467483573127538, 0.8529018759727477], "rotation": [[6.262858369154856e-05, -0.21157889068126684, 0.9773608446121217], [-1.0, -1.3250886695459485e-05, 6.121072510723025e-05], [-0.0, -0.9773607850074767, -0.21157889068126676]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 33, "img_name": "r_33", "width": 800, "height": 800, "position": [1.6561487913131714, -1.8396297693252563, 3.181655883789064], "rotation": [[0.7431973218917847, 0.5280798077583313, -0.4108399152755736], [0.6690723896026611, -0.5865845680236816, 0.45635592937469477], [-8.762674953353946e-17, -0.6140441298484802, -0.7892715930938722]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 34, "img_name": "r_34", "width": 800, "height": 800, "position": [-2.2475540637969975, 2.600733995437622, 2.1058690547943115], "rotation": [[-0.7566120028495789, -0.34157976508140553, 0.5575495362281798], [-0.6538640856742859, 0.3952555060386656, -0.6451627016067505], [-4.733433190982824e-17, -0.8526995182037354, -0.5224018096923828]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 35, "img_name": "r_35", "width": 800, "height": 800, "position": [-3.3836936950683594, 1.4670655727386475, 1.6273707151412962], "rotation": [[-0.39778962731361384, -0.3703862130641937, 0.8393910527229308], [-0.9174765944480895, 0.16058807075023654, -0.36393412947654724], [-0.0, -0.914891004562378, -0.40370094776153564]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 36, "img_name": "r_36", "width": 800, "height": 800, "position": [1.7566769123077395, -2.0910537242889404, 2.9650602340698233], "rotation": [[0.7656702995300292, 0.47312441468238825, -0.43577790260314947], [0.6432332396507264, -0.5631818175315858, 0.5187265872955322], [2.980232066107691e-08, -0.6774803400039674, -0.7355409264564514]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 37, "img_name": "r_37", "width": 800, "height": 800, "position": [0.8783321380615234, 0.45939537882804865, 3.9073634147644043], "rotation": [[-0.4634659588336944, 0.8589088916778566, -0.21788737177848813], [0.886114776134491, 0.44923639297485346, -0.11396195739507675], [-1.1919754203828917e-17, -0.24589067697525024, -0.969297468662262]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 38, "img_name": "r_38", "width": 800, "height": 800, "position": [-2.10075044631958, 3.0812499523162846, 1.5306031703948977], "rotation": [[-0.8262399435043333, -0.21388964354991918, 0.5211319923400879], [-0.5633181929588319, 0.31371998786926275, -0.7643639445304871], [1.4901159368104058e-08, -0.9251114130020142, -0.3796958923339845]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 39, "img_name": "r_39", "width": 800, "height": 800, "position": [-0.13960279524326324, 1.6944570541381838, 3.655041217803955], "rotation": [[-0.9966232776641845, -0.07444921880960466, 0.034631188958883286], [-0.0821097195148468, 0.9036424160003662, -0.4203430414199829], [-0.0, -0.4217672646045685, -0.9067041277885436]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 40, "img_name": "r_40", "width": 800, "height": 800, "position": [-3.3427348136901847, 1.6285674571990971, 1.5568854808807375], "rotation": [[-0.4379815459251405, -0.3472017645835877, 0.8292304277420043], [-0.8989839553833009, 0.16915537416934967, -0.4039978682994843], [-1.4901161224816527e-08, -0.922408401966095, -0.3862157464027405]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 41, "img_name": "r_41", "width": 800, "height": 800, "position": [-0.4171065986156464, 3.9297399520874032, 0.7957176566123962], "rotation": [[-0.994414210319519, -0.020834492519497875, 0.10347140580415726], [-0.10554812848567965, 0.19629065692424774, -0.9748484492301941], [3.7252898507289058e-09, -0.9803244471549987, -0.1973932385444641]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 42, "img_name": "r_42", "width": 800, "height": 800, "position": [0.47436219453811646, 3.950008630752563, 0.6499325037002562], "rotation": [[-0.9928660988807677, 0.019224023446440693, -0.11767476797103882], [0.11923471093177795, 0.16007822751998904, -0.9798764586448669], [-0.0, -0.9869171380996705, -0.16122838854789734]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 43, "img_name": "r_43", "width": 800, "height": 800, "position": [1.9496005773544318, -1.4704318046569826, 3.20731806755066], "rotation": [[0.6021551489830016, 0.6352204680442808, -0.48363634943962097], [0.7983791828155516, -0.4790973067283631, 0.3647691905498505], [-1.4901162969526803e-08, -0.6057727932929992, -0.7956376075744629]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 44, "img_name": "r_44", "width": 800, "height": 800, "position": [-1.8393374681472783, -1.0502654314041135, 3.429836750030517], "rotation": [[0.4958596825599671, -0.7388697266578674, 0.45628345012664806], [-0.8684027194976807, -0.421896129846573, 0.260538786649704], [-0.0, -0.5254284143447876, -0.850837767124176]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 45, "img_name": "r_45", "width": 800, "height": 800, "position": [-2.589273452758788, 1.7476580142974856, 2.5478134155273438], "rotation": [[-0.5594504475593568, -0.5238707065582277, 0.6423196196556089], [-0.8288636207580569, 0.35359215736389166, -0.4335405528545381], [-3.565589966500098e-17, -0.7749400138854982, -0.6320346593856812]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 46, "img_name": "r_46", "width": 800, "height": 800, "position": [0.007521961349993945, -2.8307116031646724, 2.870020151138307], "rotation": [[0.9999964833259584, 0.0018918740097433329, -0.0018659689230844378], [0.0026572593487799163, -0.7119618654251099, 0.7022131085395812], [-4.631479892442729e-19, -0.7022156119346619, -0.7119643688201905]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 47, "img_name": "r_47", "width": 800, "height": 800, "position": [0.42152610421180736, 0.9678280353546146, 3.8904531002044687], "rotation": [[-0.9168165326118468, 0.3853738605976105, -0.1045677587389946], [0.39930868148803716, 0.8848220705986023, -0.24008858203887945], [-7.450580627322342e-09, -0.2618719637393952, -0.9651026129722595]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 48, "img_name": "r_48", "width": 800, "height": 800, "position": [0.014908524230122568, -1.1474518775939941, 3.864341020584107], "rotation": [[0.9999156594276428, 0.012454097159206867, -0.003698349464684725], [0.012991628609597683, -0.9585440158843994, 0.28464773297309875], [-0.0, -0.2846718430519104, -0.9586249589920044]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 49, "img_name": "r_49", "width": 800, "height": 800, "position": [1.4343017339706416, -0.5783282518386841, 3.722675800323486], "rotation": [[0.3739576041698456, 0.8564795851707458, -0.3558064699172974], [0.9274457693099974, -0.3453431725502014, 0.1434655785560608], [-0.0, -0.38364121317863464, -0.9234821796417235]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 50, "img_name": "r_50", "width": 800, "height": 800, "position": [1.1368069648742676, 2.938887357711792, 2.514082431793213], "rotation": [[-0.9326563477516177, 0.22499778866767886, -0.28200709819793707], [0.3607658743858338, 0.5816670060157775, -0.7290481925010682], [2.169625594427382e-17, -0.7816900014877318, -0.6236670613288879]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 51, "img_name": "r_51", "width": 800, "height": 800, "position": [-2.0656259059906006, 3.293685197830199, 1.0652819871902464], "rotation": [[-0.8471797108650208, -0.14040516316890717, 0.5124186873435974], [-0.5313065052032472, 0.2238790690898895, -0.8170626759529115], [7.450580628483262e-09, -0.9644504189491272, -0.2642639279365539]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 52, "img_name": "r_52", "width": 800, "height": 800, "position": [-3.002284049987793, -2.0935845375061035, 1.689140319824219], "rotation": [[0.5719918608665467, -0.34370848536491383, 0.7447749376296996], [-0.8202592730522157, -0.23967842757701877, 0.5193543434143068], [-1.4901160362096148e-08, -0.907975137233734, -0.41902410984039307]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 53, "img_name": "r_53", "width": 800, "height": 800, "position": [-3.886370897293091, -0.8260704278945922, 0.6809762716293335], "rotation": [[0.20791091024875644, -0.16523794829845426, 0.964089870452881], [-0.9781477451324463, -0.03512227535247803, 0.20492283999919889], [-0.0, -0.9856281876564026, -0.16892939805984497]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 54, "img_name": "r_54", "width": 800, "height": 800, "position": [-3.3270153999328618, 1.0489547252655027, 2.020064830780029], "rotation": [[-0.3006929755210876, -0.47792530059814453, 0.8253308534622193], [-0.9537209868431091, 0.15068219602108, -0.2602136135101318], [7.4505805871594705e-09, -0.8653798699378967, -0.5011163353919982]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 55, "img_name": "r_55", "width": 800, "height": 800, "position": [1.4137231111526487, -3.671127080917358, 0.8798936009407042], "rotation": [[0.9331964850425719, 0.07844070345163347, -0.3507015109062194], [0.3593668341636657, -0.20369319617748263, 0.9106944799423217], [1.3543157681270419e-17, -0.9758873581886293, -0.21827472746372223]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 56, "img_name": "r_56", "width": 800, "height": 800, "position": [-0.6229158639907835, 0.43254923820495605, 3.959151029586791], "rotation": [[-0.5703680515289307, -0.8067229390144351, 0.1545263975858688], [-0.8213893175125122, 0.560183823108673, -0.10730224847793578], [-7.450581506949822e-09, -0.18812799453735352, -0.9821444153785703]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 57, "img_name": "r_57", "width": 800, "height": 800, "position": [0.3399789631366731, 1.7784502506256104, 3.6016008853912362], "rotation": [[-0.9822137951850892, 0.16775877773761752, -0.08433839678764347], [0.18776571750640877, 0.8775562047958375, -0.4411792159080506], [-2.479814188231705e-17, -0.4491681754589081, -0.8934472203254701]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 58, "img_name": "r_58", "width": 800, "height": 800, "position": [-2.3152351379394527, 0.8177154660224911, 3.197034120559692], "rotation": [[-0.33302783966064453, -0.7478148937225342, 0.5743390917778015], [-0.9429169893264772, 0.26411992311477667, -0.2028502225875854], [1.490116119809974e-08, -0.6091088652610778, -0.7930864691734313]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 59, "img_name": "r_59", "width": 800, "height": 800, "position": [3.168043851852418, 0.9299916028976443, 2.31270694732666], "rotation": [[-0.28166845440864563, 0.5504832863807677, -0.7858948707580566], [0.9595118761062621, 0.16159653663635254, -0.2307025045156479], [2.980232594381855e-08, -0.8190570473670958, -0.5737119317054747]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 60, "img_name": "r_60", "width": 800, "height": 800, "position": [-2.7338404655456543, 2.835769176483153, 0.8570468425750732], "rotation": [[-0.7199268341064454, -0.1475599855184555, 0.6781823635101318], [-0.6940498948097229, 0.15306161344051356, -0.7034677267074586], [-0.0, -0.9771378040313722, -0.21260714530944824]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 61, "img_name": "r_61", "width": 800, "height": 800, "position": [-0.02086849138140678, 2.721303939819336, 2.9738979339599605], "rotation": [[-0.999970555305481, -0.005657187663018704, 0.00517683569341898], [-0.007668337319046259, 0.7377116084098816, -0.675072431564331], [-4.65661259458564e-10, -0.6750923395156859, -0.7377332448959351]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 62, "img_name": "r_62", "width": 800, "height": 800, "position": [-1.1724741458892822, 0.31767338514328003, 3.8437466621398926], "rotation": [[-0.2615139186382293, -0.9203336238861083, 0.2908549904823303], [-0.9651997685432434, 0.24935775995254514, -0.0788050591945648], [-0.0, -0.30134189128875727, -0.9535161256790161]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 63, "img_name": "r_63", "width": 800, "height": 800, "position": [2.318311452865601, -3.021360397338867, 1.321670532226563], "rotation": [[0.7933609485626218, 0.19958899915218353, -0.575102210044861], [0.6087514758110046, -0.2601161599159241, 0.7495071887969972], [-5.244272474899237e-17, -0.9447241425514221, -0.32786607742309576]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 64, "img_name": "r_64", "width": 800, "height": 800, "position": [-0.8277195692062379, 3.8852376937866206, 0.6854256391525269], "rotation": [[-0.9780508875846862, -0.035429153591394424, 0.2053319364786148], [-0.20836611092090607, 0.16630110144615173, -0.9638087749481199], [6.837852551312958e-18, -0.9854384064674379, -0.17003315687179563]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 65, "img_name": "r_65", "width": 800, "height": 800, "position": [0.7858693599700924, -3.8738713264465323, 0.7909042835235597], "rotation": [[0.9800372123718263, 0.03900722041726112, -0.19495017826557157], [0.19881436228752136, -0.19228252768516543, 0.9609891176223756], [-0.0, -0.9805640578269958, -0.19619919359683993]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 66, "img_name": "r_66", "width": 800, "height": 800, "position": [-1.683483362197876, 1.7009721994400029, 3.2438523769378658], "rotation": [[-0.710751175880432, -0.5660614967346191, 0.41762080788612366], [-0.7034434676170349, 0.5719420313835143, -0.4219592511653901], [-1.4901160324783412e-08, -0.5936806797981262, -0.8047007322311404]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 67, "img_name": "r_67", "width": 800, "height": 800, "position": [-0.019819926470518116, 3.5051126480102544, 1.990927815437317], "rotation": [[-0.9999840259552003, -0.00279268459416926, 0.004916718695312738], [-0.005654485896229745, 0.4938804805278778, -0.8695114254951478], [-2.3283064349540654e-10, -0.8695253133773804, -0.493888407945633]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 68, "img_name": "r_68", "width": 800, "height": 800, "position": [2.9369475841522217, -1.7953004837036128, 2.0979118347167973], "rotation": [[0.5215556025505066, 0.4440380930900575, -0.7285671234130857], [0.8532173037528992, -0.2714320719242096, 0.4453592896461487], [-0.0, -0.8539056777954104, -0.5204279422760011]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 69, "img_name": "r_69", "width": 800, "height": 800, "position": [-3.8721756935119633, -0.925791323184967, 0.6317951679229736], "rotation": [[0.23253430426120758, -0.1524328589439392, 0.9605684876441954], [-0.9725881814956666, -0.03644489124417306, 0.22966054081916806], [-6.6652834597304256e-18, -0.9876416325569153, -0.1567290723323822]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 70, "img_name": "r_70", "width": 800, "height": 800, "position": [1.0423099994659424, -3.6946234703063965, 1.2301819324493408], "rotation": [[0.9624335765838623, 0.0828590914607048, -0.2585652470588684], [0.271517276763916, -0.29370641708374023, 0.9165232181549073], [7.450580608777629e-09, -0.9522977471351622, -0.30517053604125977]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 71, "img_name": "r_71", "width": 800, "height": 800, "position": [-0.9127683639526366, -2.819886684417724, 2.7322323322296147], "rotation": [[0.9513999223709108, -0.20872908830642703, 0.22642995417118075], [-0.3079583644866944, -0.6448431015014648, 0.6995278000831604], [-0.0, -0.7352616190910339, -0.6777834296226501]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 72, "img_name": "r_72", "width": 800, "height": 800, "position": [3.5749754905700684, -1.238826036453247, 1.3909926414489746], "rotation": [[0.327425479888916, 0.32604190707206726, -0.8868421912193298], [0.9448769688606262, -0.11298236250877383, 0.3073148727416993], [7.450580592097164e-09, -0.938579559326172, -0.3450627624988556]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 73, "img_name": "r_73", "width": 800, "height": 800, "position": [2.5896217823028556, -2.195318460464477, 2.1735765933990487], "rotation": [[0.6466457843780518, 0.4112951159477234, -0.6424060463905332], [0.7627904415130615, -0.3486701548099519, 0.5445914268493652], [-1.4901161181862769e-08, -0.842179000377655, -0.5391979217529298]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 74, "img_name": "r_74", "width": 800, "height": 800, "position": [2.5460810661315922, 2.666229724884034, 1.6305487155914309], "rotation": [[-0.7232142090797424, 0.2793499827384948, -0.6316049695014953], [0.6906238794326782, 0.29253241419792186, -0.6614102125167844], [-1.4901161235474406e-08, -0.9145427346229554, -0.4044893682003022]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 75, "img_name": "r_75", "width": 800, "height": 800, "position": [-0.7928509712219239, 3.892266273498535, 0.6867690086364748], "rotation": [[-0.9798775315284729, -0.034005157649517066, 0.19668211042881015], [-0.19960013031959534, 0.16693821549415594, -0.9655523896217347], [3.7252907333520475e-09, -0.9853807687759399, -0.17036642134189608]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 76, "img_name": "r_76", "width": 800, "height": 800, "position": [-0.246016725897789, -3.7019326686859126, 1.576442003250122], "rotation": [[0.9977991580963136, -0.025931671261787425, 0.06102923676371576], [-0.06631003320217134, -0.39020639657974254, 0.9183364510536195], [3.1931475342552832e-18, -0.9203621149063111, -0.39106711745262146]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 77, "img_name": "r_77", "width": 800, "height": 800, "position": [1.6490324735641486, 0.5256894826889038, 3.640651226043702], "rotation": [[-0.30372685194015503, 0.8604696989059449, -0.4090746641159058], [0.952759087085724, 0.2743062078952789, -0.13040752708911896], [-7.450579264133741e-09, -0.42935785651206976, -0.9031345248222351]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 78, "img_name": "r_78", "width": 800, "height": 800, "position": [-2.9048230648040785, 2.6168203353881827, 0.9819653034210206], "rotation": [[-0.6693150401115416, -0.18098634481430062, 0.7205979228019715], [-0.7429786920547484, 0.16304218769073486, -0.6491532325744628], [7.450580161815487e-09, -0.9698768854141236, -0.24359561502933508]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 79, "img_name": "r_79", "width": 800, "height": 800, "position": [0.07294226437807083, 1.9539530277252193, 3.525159120559691], "rotation": [[-0.9993038773536682, 0.032622314989566796, -0.0180947482585907], [0.03730462864041329, 0.8738756775856018, -0.4847160875797272], [-3.033977098089613e-18, -0.4850537478923798, -0.874484360218048]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 80, "img_name": "r_80", "width": 800, "height": 800, "position": [2.52870512008667, -1.0778245925903318, 2.9485495090484615], "rotation": [[0.3921033442020416, 0.6728718876838684, -0.6272944808006288], [0.9199212193489074, -0.2868020832538604, 0.2673753499984741], [-7.470377534392672e-17, -0.6819003224372864, -0.7314450144767763]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 81, "img_name": "r_81", "width": 800, "height": 800, "position": [-1.7133750915527342, 3.422126293182373, 1.2662529945373537], "rotation": [[-0.8941853642463685, -0.14062994718551636, 0.4250360429286957], [-0.44769677519798284, 0.2808804214000702, -0.848925054073334], [-1.4901160312980137e-08, -0.9493837356567383, -0.31411871314048767]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 82, "img_name": "r_82", "width": 800, "height": 800, "position": [-0.4118720591068268, 1.2020422220230105, 3.825631380081177], "rotation": [[-0.9460079073905945, -0.30761945247650146, 0.10217288136482239], [-0.32414352893829346, 0.8977826833724976, -0.2981899678707123], [-7.450580586973633e-09, -0.31520867347717285, -0.9490223526954651]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 83, "img_name": "r_83", "width": 800, "height": 800, "position": [-3.5302004814147954, 0.17131963372230533, 1.9386422634124754], "rotation": [[-0.04847268015146256, -0.48035264015197765, 0.8757349252700807], [-0.9988245964050294, 0.02331137843430043, -0.04249916970729828], [-3.038316318464897e-18, -0.8767656087875367, -0.48091796040534973]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 84, "img_name": "r_84", "width": 800, "height": 800, "position": [0.692101001739502, -2.587653875350952, 3.0124814510345455], "rotation": [[0.9660431146621703, 0.19308900833129886, -0.17168912291526794], [0.25838056206703186, -0.721928596496582, 0.6419178843498229], [-2.0741871497122386e-17, -0.6644815802574155, -0.7473046779632567]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 85, "img_name": "r_85", "width": 800, "height": 800, "position": [-3.9339594841003427, 0.5637863874435425, 0.6753571033477782], "rotation": [[-0.14186327159404755, -0.16584104299545285, 0.9758952260017396], [-0.989886224269867, 0.02376713044941425, -0.1398581862449646], [-1.8626450404758832e-09, -0.9858660101890563, -0.16753546893596646]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 86, "img_name": "r_86", "width": 800, "height": 800, "position": [1.164450883865357, -1.5312353372573855, 3.5425093173980713], "rotation": [[0.7959837317466736, 0.5319463610649108, -0.28886470198631287], [0.6053178310394287, -0.6995013952255248, 0.37985274195671087], [1.4901159441092465e-08, -0.4772116243839265, -0.8787884116172789]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 87, "img_name": "r_87", "width": 800, "height": 800, "position": [-2.040683746337891, -1.0129939317703247, 3.325575590133667], "rotation": [[0.44463157653808594, -0.7389402389526367, 0.5062312483787537], [-0.8957135677337645, -0.3668093979358673, 0.2512928247451783], [-0.0, -0.5651710033416748, -0.8249737024307251]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 88, "img_name": "r_88", "width": 800, "height": 800, "position": [-0.00454852357506752, 0.06945148110389711, 4.030528068542481], "rotation": [[-0.9978623390197754, -0.06534235179424287, 0.0011283498024567962], [-0.06535211205482482, 0.9977134466171266, -0.017228791490197185], [1.1641533571734336e-10, -0.01726444624364376, -0.9998509287834166]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 89, "img_name": "r_89", "width": 800, "height": 800, "position": [-0.3596622645854949, -3.92711853981018, 0.8356927633285522], "rotation": [[0.9958323836326598, -0.018907191231846802, 0.0892212241888046], [-0.09120257198810575, -0.20644587278366083, 0.9741982221603391], [1.8626451475887518e-09, -0.9782753586769103, -0.20730985701084134]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 90, "img_name": "r_90", "width": 800, "height": 800, "position": [-3.436625480651855, -0.2910483777523041, 2.0868387222290035], "rotation": [[0.0843880698084831, -0.5158343911170961, 0.85252183675766], [-0.9964329600334167, -0.043686099350452416, 0.0722002163529396], [5.915558655062159e-18, -0.8555737137794495, -0.5176809430122374]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 91, "img_name": "r_91", "width": 800, "height": 800, "position": [0.21033930778503412, -1.1386629343032837, 3.861243963241577], "rotation": [[0.9833629727363585, 0.173996165394783, -0.05217875912785529], [0.1816515475511551, -0.9419208168983458, 0.2824675142765045], [7.45058014834894e-09, -0.2872464954853058, -0.9578567147254944]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 92, "img_name": "r_92", "width": 800, "height": 800, "position": [-1.3956377506256104, -2.229129076004028, 3.0550253391265874], "rotation": [[0.8475823402404785, -0.4021680355072022, 0.3462150990962983], [-0.5306636691093446, -0.6423475742340089, 0.5529788732528688], [-4.2069598626169136e-17, -0.6524189114570619, -0.7578585147857666]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 93, "img_name": "r_93", "width": 800, "height": 800, "position": [-1.8584816455841064, -1.0084656476974485, 3.432060956954955], "rotation": [[0.47693684697151184, -0.7483182549476624, 0.46103248000144953], [-0.8789376616477967, -0.4060590267181397, 0.2501695156097412], [-1.490116301770169e-08, -0.5245338678359985, -0.8513894081115723]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 94, "img_name": "r_94", "width": 800, "height": 800, "position": [-2.9617588520050053, 1.6074209213256834, 2.2122800350189213], "rotation": [[-0.47700220346450806, -0.482340693473816, 0.7347218990325927], [-0.8789020776748657, 0.2617783844470978, -0.39875200390815735], [1.4901161219156283e-08, -0.835954248905182, -0.5487990379333496]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 95, "img_name": "r_95", "width": 800, "height": 800, "position": [3.5639960765838623, -1.8133324384689333, 0.5096641182899475], "rotation": [[0.4534713923931122, 0.11268524080514908, -0.8841186165809631], [0.8912708163261414, -0.0573333390057087, 0.4498324096202851], [6.134804718474412e-18, -0.9919751882553101, -0.12643210589885712]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 96, "img_name": "r_96", "width": 800, "height": 800, "position": [-3.008035659790038, 1.8056513071060178, 1.9852819442749026], "rotation": [[-0.5146697163581848, -0.4222534596920014, 0.7462017536163332], [-0.8573886156082152, 0.25346857309341436, -0.44792693853378285], [4.142252744931621e-17, -0.8703193664550782, -0.4924877882003785]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 97, "img_name": "r_97", "width": 800, "height": 800, "position": [-3.496957063674926, 0.29924672842025757, 1.982862114906311], "rotation": [[-0.08526185154914855, -0.49009639024734497, 0.8674882650375365], [-0.9963586330413818, 0.04193924367427826, -0.07423397898674011], [-6.019409743420185e-18, -0.8706587553024292, -0.4918875396251678]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 98, "img_name": "r_98", "width": 800, "height": 800, "position": [-0.31046348810195923, -3.731215476989746, 1.4938690662384033], "rotation": [[0.9965562224388123, -0.03072895109653472, 0.07701651006937026], [-0.08292051404714584, -0.3693070113658904, 0.9256006479263307], [-3.22241918138685e-18, -0.9287990927696228, -0.3705832958221435]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 99, "img_name": "r_99", "width": 800, "height": 800, "position": [2.1031012535095215, -1.032314419746399, 3.2804408073425293], "rotation": [[0.4406329095363617, 0.730517566204071, -0.5217151641845702], [0.8976874351501466, -0.3585770428180695, 0.25608566403388977], [-1.490116113425883e-08, -0.5811769366264342, -0.8137771487236023]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 100, "img_name": "r_0", "width": 800, "height": 800, "position": [-0.0, 2.7372601032257085, 2.9592916965484624], "rotation": [[-0.9999999403953552, -0.0, -0.0], [0.0, 0.7341099977493287, -0.6790305972099303], [-0.0, -0.6790306568145751, -0.7341098785400391]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 101, "img_name": "r_1", "width": 800, "height": 800, "position": [-0.1718739867210388, 2.7318587303161626, 2.959291696548462], "rotation": [[-0.9980266690254211, -0.04609514772891997, 0.042636688798666], [-0.06279051303863525, 0.7326614260673523, -0.6776907444000246], [-3.7252896354927256e-09, -0.6790306568145753, -0.7341099381446838]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 102, "img_name": "r_2", "width": 800, "height": 800, "position": [-0.34313371777534485, 2.716182947158814, 2.958819150924682], "rotation": [[-0.9921147227287292, -0.09199368208646774, 0.0851209983229637], [-0.125333234667778, 0.7282049655914308, -0.673802077770233], [-1.0186194884914827e-17, -0.6791574358940125, -0.7339926958084106]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 103, "img_name": "r_3", "width": 800, "height": 800, "position": [-0.5132942199707032, 2.690782308578491, 2.9574005603790288], "rotation": [[-0.9822872281074525, -0.137470617890358, 0.12733264267444616], [-0.18738132715225223, 0.72064608335495, -0.6675010323524476], [1.4901158543073357e-08, -0.6795374751091003, -0.7336408495903013]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 104, "img_name": "r_4", "width": 800, "height": 800, "position": [-0.6818711757659911, 2.6557128429412837, 2.9550364017486563], "rotation": [[-0.9685831665992736, -0.18230323493480682, 0.16915144026279444], [-0.24868991971015933, 0.710024118423462, -0.6588013172149657], [7.450580193956625e-09, -0.6801700592041016, -0.7330543994903564]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 105, "img_name": "r_5", "width": 800, "height": 800, "position": [-0.8483804464340209, 2.611046314239502, 2.9517261981964116], "rotation": [[-0.9510564804077148, -0.22627252340316767, 0.21045726537704465], [-0.30901700258255, 0.6963951587677003, -0.6477208137512207], [1.4901159456952214e-08, -0.6810540556907655, -0.7322331070899961]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 106, "img_name": "r_6", "width": 800, "height": 800, "position": [-1.0123374462127683, 2.5568726062774654, 2.947469234466553], "rotation": [[-0.9297765493392945, -0.2691642343997956, 0.25112998485565186], [-0.36812457442283636, 0.6798312664031985, -0.6342819333076477], [4.0588478799833724e-17, -0.6821876764297486, -0.7311770319938657]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 107, "img_name": "r_7", "width": 800, "height": 800, "position": [-1.1732574701309202, 2.4932990074157715, 2.942265510559082], "rotation": [[-0.9048271179199218, -0.31077042222023016, 0.29104933142662043], [-0.42577934265136713, 0.6604207754135134, -0.6185113191604613], [-4.051682179772949e-17, -0.6835686564445493, -0.7298861742019653]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 108, "img_name": "r_8", "width": 800, "height": 800, "position": [-1.330655097961426, 2.420452356338501, 2.936114311218262], "rotation": [[-0.8763065934181214, -0.3508902788162231, 0.33009487390518194], [-0.48175367712974554, 0.6382669210433959, -0.6004402637481691], [1.4901160230739483e-08, -0.6851942539215087, -0.7283602356910708]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 109, "img_name": "r_9", "width": 800, "height": 800, "position": [-1.4840440750122073, 2.3384790420532235, 2.929014921188354], "rotation": [[-0.844327986240387, -0.3893313109874725, 0.36814600229263306], [-0.5358268618583679, 0.6134878993034362, -0.5801051855087281], [4.033435237204521e-17, -0.6870615482330323, -0.7265990972518923]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 110, "img_name": "r_10", "width": 800, "height": 800, "position": [-1.6329382658004763, 2.2475464344024667, 2.9209671020507812], "rotation": [[-0.8090169429779052, -0.4259108901023865, 0.4050821363925934], [-0.5877853631973268, 0.5862159132957458, -0.5575476288795471], [1.490116124599323e-08, -0.6891667246818542, -0.72460275888443]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 111, "img_name": "r_11", "width": 800, "height": 800, "position": [-1.7768508195877077, 2.147843360900879, 2.9119701385498042], "rotation": [[-0.7705132961273196, -0.46045649051666254, 0.4407824277877807], [-0.6374240517616272, 0.5565962195396424, -0.5328143835067749], [1.490116302369267e-08, -0.6915058493614197, -0.7223708629608155]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 112, "img_name": "r_12", "width": 800, "height": 800, "position": [-1.9152961969375608, 2.0395827293396, 2.902023792266846], "rotation": [[-0.7289685606956481, -0.492807924747467, 0.4751265048980711], [-0.6845472455024719, 0.5247870087623597, -0.5059581995010376], [-1.490116294781503e-08, -0.6940741539001463, -0.7199034690856932]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 113, "img_name": "r_13", "width": 800, "height": 800, "position": [-2.0477898120880136, 1.9230021238327026, 2.891127824783325], "rotation": [[-0.6845470070838929, -0.522816777229309, 0.507994055747986], [-0.7289686799049377, 0.4909575283527374, -0.4770380854606628], [-7.96252461798568e-17, -0.6968668103218078, -0.7172004580497742]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 114, "img_name": "r_14", "width": 800, "height": 800, "position": [-2.173849344253541, 1.79836392402649, 2.8792822360992436], "rotation": [[-0.6374238729476929, -0.5503484010696412, 0.5392656326293945], [-0.7705133557319641, 0.4552876353263856, -0.44611918926239025], [-7.92990127637108e-17, -0.6998783946037292, -0.7142620086669923]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 115, "img_name": "r_15", "width": 800, "height": 800, "position": [-2.292996406555176, 1.6659585237503047, 2.866487503051758], "rotation": [[-0.5877850651741027, -0.5752823352813721, 0.5688223242759705], [-0.8090171813964844, 0.41796687245368963, -0.413273423910141], [-0.0, -0.703102946281433, -0.711087942123413]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 116, "img_name": "r_16", "width": 800, "height": 800, "position": [-2.404757022857666, 1.5261046886444092, 2.8527438640594482], "rotation": [[-0.5358266234397889, -0.5975128412246703, 0.5965467095375061], [-0.8443279862403872, 0.3791930973529817, -0.3785799443721771], [-2.980232229362744e-08, -0.7065344452857971, -0.7076785564422607]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 117, "img_name": "r_17", "width": 800, "height": 800, "position": [-2.5086653232574476, 1.3791497945785518, 2.838052749633789], "rotation": [[-0.48175343871116644, -0.61694997549057, 0.6223232150077822], [-0.876306712627411, 0.33917093276977534, -0.34212490916252136], [1.4901160333140111e-08, -0.710166037082672, -0.7040341496467589]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 118, "img_name": "r_18", "width": 800, "height": 800, "position": [-2.6042633056640634, 1.2254726886749272, 2.8224155902862544], "rotation": [[-0.425779014825821, -0.6335193514823912, 0.6460382342338564], [-0.9048270583152771, 0.29811137914657587, -0.30400234460830694], [1.4901158536106702e-08, -0.7139906883239744, -0.700155138969421]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 119, "img_name": "r_19", "width": 800, "height": 800, "position": [-2.691104412078858, 1.06548273563385, 2.8058338165283203], "rotation": [[-0.36812430620193487, -0.6471632122993468, 0.667580842971802], [-0.929776668548584, 0.25622981786727905, -0.26431372761726385], [-0.0, -0.7180013060569762, -0.6960417032241819]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 120, "img_name": "r_20", "width": 800, "height": 800, "position": [-2.768754482269287, 0.8996220827102663, 2.7883110046386728], "rotation": [[-0.30901676416397095, -0.6578409075737, 0.6868434548377992], [-0.9510566592216492, 0.2137452811002731, -0.2231687754392624], [1.9063737164353565e-17, -0.7221899032592773, -0.6916947960853579]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 121, "img_name": "r_21", "width": 800, "height": 800, "position": [-2.836796998977661, 0.7283647656440735, 2.76984977722168], "rotation": [[-0.24868962168693545, -0.6655282974243164, 0.7037227153778076], [-0.9685832262039183, 0.17087841033935544, -0.18068505823612213], [-0.0, -0.7265485525131227, -0.6871151328086853]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 122, "img_name": "r_22", "width": 800, "height": 800, "position": [-2.894832611083985, 0.5522178411483766, 2.7504544258117676], "rotation": [[-0.18738098442554468, -0.6702184677124022, 0.7181195020675659], [-0.9822872281074524, 0.12785077095031738, -0.1369883716106415], [7.450580149524853e-09, -0.731068730354309, -0.6823037266731262]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 123, "img_name": "r_23", "width": 800, "height": 800, "position": [-2.9424843788146973, 0.37172117829322826, 2.7301297187805176], "rotation": [[-0.12533289194107056, -0.6719214320182801, 0.7299404740333558], [-0.992114782333374, 0.08488318324089052, -0.09221266955137254], [-3.7252902933037766e-09, -0.7357420921325684, -0.6772617697715759]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 124, "img_name": "r_24", "width": 800, "height": 800, "position": [-2.979399681091308, 0.18744681775569913, 2.7088818550109868], "rotation": [[-0.062790147960186, -0.6706648468971252, 0.7390980124473572], [-0.9980267882347107, 0.0421944074332714, -0.046499829739332185], [-1.8626451475209325e-09, -0.7405593395233154, -0.6719908118247987]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 125, "img_name": "r_25", "width": 800, "height": 800, "position": [-3.0052540302276607, -1.2061262850693313e-06, 2.686717033386231], "rotation": [[4.0133917877938085e-07, -0.6664924621582031, 0.7455117106437683], [-0.9999999403953554, -2.6748955406219466e-07, 2.9920306587882806e-07], [-0.0, -0.7455117702484132, -0.6664924025535585]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 126, "img_name": "r_26", "width": 800, "height": 800, "position": [-3.0197529792785645, -0.18998804688453674, 2.6636435985565186], "rotation": [[0.06279095262289047, -0.6594647169113159, 0.7491084337234494], [-0.9980267882347108, -0.04149028658866882, 0.04713023081421852], [-0.0, -0.7505896687507629, -0.6607685685157776]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 127, "img_name": "r_27", "width": 800, "height": 800, "position": [-3.022636651992799, -0.38184922933578486, 2.6396698951721187], "rotation": [[0.12533369660377502, -0.6496580839157103, 0.7498238086700442], [-0.9921146631240845, -0.08207120746374127, 0.09472512453794478], [-0.0, -0.7557835578918456, -0.6548214554786681]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 128, "img_name": "r_28", "width": 800, "height": 800, "position": [-3.0136830806732178, -0.5748922824859618, 2.6148066520690922], "rotation": [[0.18738177418708798, -0.6371641755104066, 0.7476027011871335], [-0.9822871685028075, -0.12154587358236314, 0.1426132023334503], [-0.0, -0.7610836625099183, -0.6486536264419557]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 129, "img_name": "r_29", "width": 800, "height": 800, "position": [-2.992709159851075, -0.7683987617492674, 2.589064359664917], "rotation": [[0.24869039654731745, -0.6220898032188417, 0.7423997521400449], [-0.9685831069946288, -0.1597258448600769, 0.1906162649393081], [-7.450581477460907e-09, -0.7664802670478822, -0.6422678232192993]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 130, "img_name": "r_30", "width": 800, "height": 800, "position": [-2.9595763683319087, -0.9616263508796692, 2.5624563694000244], "rotation": [[0.3090174794197082, -0.6045553088188172, 0.7341805100440979], [-0.9510563015937805, -0.19643229246139524, 0.23855014145374293], [-0.0, -0.7719632387161255, -0.6356672048568726]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 131, "img_name": "r_31", "width": 800, "height": 800, "position": [-2.9141917228698735, -1.1538120508193972, 2.5349960327148438], "rotation": [[0.3681250810623169, -0.5846946239471436, 0.7229219079017639], [-0.9297763109207153, -0.2314973771572113, 0.2862254977226257], [1.4901161180158054e-08, -0.7775225043296814, -0.628855049610138]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 132, "img_name": "r_32", "width": 800, "height": 800, "position": [-2.8565111160278325, -1.3441742658615117, 2.5066988468170166], "rotation": [[0.4257798790931703, -0.5626534223556519, 0.7086130976676941], [-0.9048268795013429, -0.2647650241851807, 0.3334485590457916], [-1.490116298200202e-08, -0.7831478714942932, -0.6218354105949402]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 133, "img_name": "r_33", "width": 800, "height": 800, "position": [-2.7865428924560556, -1.5319170951843262, 2.4775812625885], "rotation": [[0.481754183769226, -0.5385887622833252, 0.6912561655044557], [-0.8763064742088317, -0.2960920631885527, 0.38002181053161616], [-1.4901161174113696e-08, -0.7888293862342833, -0.6146122217178343]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 134, "img_name": "r_34", "width": 800, "height": 800, "position": [-2.704347133636474, -1.7162333726882937, 2.447661876678467], "rotation": [[0.5358273386955261, -0.5126674771308899, 0.6708658933639525], [-0.8443275690078735, -0.3253491222858429, 0.4257450699806214], [-1.4901161214150182e-08, -0.7945564985275269, -0.6071901321411133]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 135, "img_name": "r_35", "width": 800, "height": 800, "position": [-2.6100413799285884, -1.8963086605072021, 2.4169602394103995], "rotation": [[0.5877857804298401, -0.48506537079811085, 0.6474714875221254], [-0.8090166449546814, -0.35242113471031183, 0.47041624784469604], [1.4901161192805996e-08, -0.8003192543983458, -0.5995739698410033]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 136, "img_name": "r_36", "width": 800, "height": 800, "position": [-2.503799200057983, -2.0713260173797607, 2.385497331619262], "rotation": [[0.637424647808075, -0.455965608358383, 0.6211160421371461], [-0.770512819290161, -0.37720817327499384, 0.513832688331604], [-0.0, -0.8061075210571287, -0.591768980026245]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 137, "img_name": "r_37", "width": 800, "height": 800, "position": [-2.38585352897644, -2.240468740463257, 2.3532960414886475], "rotation": [[0.6845475435256959, -0.4255577623844146, 0.5918573737144468], [-0.7289681434631347, -0.3996258378028869, 0.5557917952537536], [-1.4901161315820285e-08, -0.8119112253189088, -0.583780825138092]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 138, "img_name": "r_38", "width": 800, "height": 800, "position": [-2.256495714187622, -2.4029273986816393, 2.3203806877136235], "rotation": [[0.728969156742096, -0.39403566718101507, 0.5597676038742064], [-0.6845465302467347, -0.4196060299873352, 0.5960928797721863], [1.4901162940860495e-08, -0.817720353603363, -0.5756155252456665]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 139, "img_name": "r_39", "width": 800, "height": 800, "position": [-2.1160778999328618, -2.557902812957762, 2.2867767810821538], "rotation": [[0.7705137133598328, -0.3615972399711609, 0.5249342918395997], [-0.6374233961105348, -0.4370966851711273, 0.6345375776290895], [-0.0, -0.823525309562683, -0.5672795176506042]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 140, "img_name": "r_40", "width": 800, "height": 800, "position": [-1.9650115966796875, -2.70461082458496, 2.252511978149414], "rotation": [[0.8090173602104188, -0.3284419775009155, 0.48745933175086975], [-0.5877845883369446, -0.4520623385906219, 0.6709312796592714], [4.603630354899778e-17, -0.8293163180351257, -0.5587793588638306]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 141, "img_name": "r_41", "width": 800, "height": 800, "position": [-1.8037680387496946, -2.842288732528687, 2.2176146507263184], "rotation": [[0.8443283438682556, -0.2947700619697571, 0.4474597871303558], [-0.5358261466026305, -0.4644840955734252, 0.7050850391387938], [-4.6356472076892546e-17, -0.8350839614868163, -0.5501224994659424]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 142, "img_name": "r_42", "width": 800, "height": 800, "position": [-1.6328773498535152, -2.970198869705199, 2.182116031646728], "rotation": [[0.8763071894645691, -0.2607807517051697, 0.405066967010498], [-0.4817529916763306, -0.474359393119812, 0.736815571784973], [-0.0, -0.8408190011978149, -0.5413162708282471]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 143, "img_name": "r_43", "width": 800, "height": 800, "position": [-1.452926993370057, -3.0876340866088876, 2.1460473537445064], "rotation": [[0.9048275351524353, -0.22667117416858673, 0.36042678356170665], [-0.4257785081863404, -0.4817019104957579, 0.7659476995468139], [1.490116298604725e-08, -0.8465124368667601, -0.532368779182434]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 144, "img_name": "r_44", "width": 800, "height": 800, "position": [-1.2645601034164426, -3.1939225196838374, 2.1094422340393075], "rotation": [[0.9297769069671633, -0.192634791135788, 0.3136987090110779], [-0.3681237399578095, -0.48654127120971674, 0.7923145890235901], [1.4901162989478916e-08, -0.8521557450294495, -0.5232881307601929]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 145, "img_name": "r_45", "width": 800, "height": 800, "position": [-1.0684733390808105, -3.2884328365325928, 2.072335720062256], "rotation": [[0.9510567784309386, -0.15885999798774716, 0.26505559682846064], [-0.30901610851287836, -0.48892232775688166, 0.815759778022766], [-0.0, -0.8577403426170349, -0.514083206653595]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 146, "img_name": "r_46", "width": 800, "height": 800, "position": [-0.8654139637947081, -3.3705780506134038, 2.0347635746002197], "rotation": [[0.9685832858085631, -0.12552893161773682, 0.21468277275562284], [-0.2486889362335205, -0.4889048337936402, 0.8361374735832213], [-0.0, -0.8632582426071166, -0.5047627091407776]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 147, "img_name": "r_47", "width": 800, "height": 800, "position": [-0.6561774611473083, -3.4398207664489746, 1.9967634677886963], "rotation": [[0.9822872877120972, -0.0928162485361099, 0.1627775877714157], [-0.1873803436756134, -0.48656237125396734, 0.8533145189285277], [1.2055653674967335e-17, -0.8687013983726503, -0.49533605575561523]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 148, "img_name": "r_48", "width": 800, "height": 800, "position": [-0.44160315394401534, -3.4956769943237305, 1.9583741426467896], "rotation": [[0.9921147823333739, -0.06088800355792044, 0.10954824835062024], [-0.12533222138881683, -0.4819820523262024, 0.8671706914901733], [-1.2130058571066478e-17, -0.8740628361701965, -0.4858127832412719]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 149, "img_name": "r_49", "width": 800, "height": 800, "position": [-0.22257083654403684, -3.5377197265625, 1.9196357727050783], "rotation": [[0.9980268478393554, -0.02990054897964001, 0.05521302297711371], [-0.06278950721025466, -0.47526335716247564, 0.8776001930236815], [-3.050807328422924e-18, -0.8793353438377381, -0.47620299458503723]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 150, "img_name": "r_50", "width": 800, "height": 800, "position": [3.7121180866961367e-06, -3.5655829906463627, 1.880589723587036], "rotation": [[0.9999999403953553, 4.856893838223185e-07, -9.208631013279956e-07], [1.041096993503743e-06, -0.46651685237884516, 0.8845121860504153], [2.842170941794621e-14, -0.8845122456550596, -0.4665168523788452]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 151, "img_name": "r_51", "width": 800, "height": 800, "position": [0.22517324984073647, -3.5789654254913335, 1.8412775993347172], "rotation": [[0.9980266690254214, 0.02868098206818104, -0.05585860833525659], [0.06279158592224122, -0.45586341619491577, 0.8878320455551147], [-3.0863769219433163e-18, -0.8895875811576843, -0.4567647576332093]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 152, "img_name": "r_52", "width": 800, "height": 800, "position": [0.4519639909267426, -3.577631950378417, 1.801743030548096], "rotation": [[0.9921146035194397, 0.05601910874247552, -0.1121184602379799], [0.12533432245254517, -0.4434330165386201, 0.8875011801719666], [-3.7252902942362416e-09, -0.8945552706718446, -0.44695740938186657]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 153, "img_name": "r_53", "width": 800, "height": 800, "position": [0.679380774497986, -3.561417102813721, 1.7620300054550173], "rotation": [[0.9822869896888733, 0.08190595358610153, -0.16853362321853638], [0.18738240003585818, -0.4293634593486786, 0.8834788203239442], [-0.0, -0.8994100093841553, -0.43710583448410034]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 154, "img_name": "r_54", "width": 800, "height": 800, "position": [0.9064124822616576, -3.5302267074584965, 1.7221834659576418], "rotation": [[0.968582808971405, 0.10624606162309645, -0.2248532325029373], [0.2486909776926041, -0.41379907727241516, 0.8757413029670715], [7.450580159960389e-09, -0.9041471481323242, -0.4272210597991943]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 155, "img_name": "r_55", "width": 800, "height": 800, "position": [1.1320374011993408, -3.4840393066406254, 1.682249188423157], "rotation": [[0.9510562419891357, 0.12895777821540833, -0.2808238863945008], [0.3090181052684784, -0.39688965678215027, 0.8642836809158326], [-0.0, -0.9087620377540587, -0.4173146188259125]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 156, "img_name": "r_56", "width": 800, "height": 800, "position": [1.3552293777465818, -3.4229068756103507, 1.642273187637329], "rotation": [[0.9297760725021363, 0.149973601102829, -0.3361909985542298], [0.3681256771087647, -0.37878876924514776, 0.8491185903549195], [-0.0, -0.913250744342804, -0.4073978066444397]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 157, "img_name": "r_57", "width": 800, "height": 800, "position": [1.5749630928039549, -3.3469564914703365, 1.6023026704788208], "rotation": [[0.9048265218734741, 0.16924017667770389, -0.3907002210617066], [0.42578038573265076, -0.35965254902839655, 0.8302776217460632], [-0.0, -0.9176097512245179, -0.3974823355674744]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 158, "img_name": "r_58", "width": 800, "height": 800, "position": [1.7902200222015385, -3.256388664245607, 1.5623846054077148], "rotation": [[0.8763061761856079, 0.18671846389770505, -0.4440989196300507], [0.4817547500133515, -0.3396386504173279, 0.807810604572296], [-0.0, -0.9218361377716063, -0.38757991790771484]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 159, "img_name": "r_59", "width": 800, "height": 800, "position": [1.9999942779541013, -3.1514778137207027, 1.522566556930542], "rotation": [[0.8443272113800048, 0.20238345861434937, -0.49613752961158747], [0.535827875137329, -0.3189043998718262, 0.7817854285240176], [2.5699639709824293e-17, -0.9259271025657655, -0.3777022957801819]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 160, "img_name": "r_60", "width": 800, "height": 800, "position": [2.203298568725586, -3.0325720310211177, 1.4828966856002803], "rotation": [[0.8090162873268126, 0.21622391045093536, -0.5465710759162903], [0.5877863168716431, -0.29760587215423573, 0.7522885203361513], [5.1618746979771136e-17, -0.9298806786537168, -0.36786139011383046]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 161, "img_name": "r_61", "width": 800, "height": 800, "position": [2.3991692066192623, -2.9000895023345956, 1.4434226751327515], "rotation": [[0.7705124020576476, 0.22824217379093173, -0.5951606035232545], [0.6374250054359436, -0.2758966386318207, 0.7194236516952515], [-0.0, -0.9336950182914734, -0.3580690920352936]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 162, "img_name": "r_62", "width": 800, "height": 800, "position": [2.5866718292236324, -2.7545182704925537, 1.4041924476623535], "rotation": [[0.7289677858352663, 0.23845365643501282, -0.6416743397712708], [0.6845481395721436, -0.2539266645908355, 0.6833118796348572], [-0.0, -0.9373692870140077, -0.3483372926712036]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 163, "img_name": "r_63", "width": 800, "height": 800, "position": [2.764907598495482, -2.5964140892028813, 1.3652542829513552], "rotation": [[0.6845461130142214, 0.246885895729065, -0.6858891248703002], [0.7289695143699648, -0.23184068500995636, 0.6440910696983339], [-1.490115940684182e-08, -0.9409024119377137, -0.33867791295051575]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 164, "img_name": "r_64", "width": 800, "height": 800, "position": [2.9330163002014147, -2.4263963699340825, 1.326655626296997], "rotation": [[0.637423038482666, 0.2535783052444458, -0.7275918126106262], [0.7705140113830569, -0.2097777128219605, 0.6019148230552674], [-1.4901161192900836e-08, -0.9442941546440126, -0.32910275459289556]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 165, "img_name": "r_65", "width": 800, "height": 800, "position": [3.090183973312378, -2.245144605636597, 1.2884440422058105], "rotation": [[0.5877842903137208, 0.25858119130134577, -0.7665802836418154], [0.8090175986289978, -0.18786977231502536, 0.5569518208503723], [2.1276877056589462e-17, -0.9475446343421936, -0.3196236193180084]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 166, "img_name": "r_66", "width": 800, "height": 800, "position": [3.2356443405151367, -2.053396701812744, 1.250666618347168], "rotation": [[0.5358257293701172, 0.2619548439979553, -0.8026644587516785], [0.8443285822868347, -0.16624113917350772, 0.5093849897384644], [-0.0, -0.9506543278694153, -0.3102521598339081]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 167, "img_name": "r_67", "width": 800, "height": 800, "position": [3.3686842918396005, -1.8519444465637203, 1.2133702039718628], "rotation": [[0.4817525744438172, 0.26376858353614807, -0.8356676697731018], [0.8763073086738588, -0.1450075656175613, 0.4594108462333679], [1.4901161196615052e-08, -0.9536240696907042, -0.3010000586509704]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 168, "img_name": "r_68", "width": 800, "height": 800, "position": [3.4886484146118164, -1.64162802696228, 1.1766008138656614], "rotation": [[0.4257781803607941, 0.26409995555877686, -0.8654270768165587], [0.9048275351524353, -0.12427560240030287, 0.40723776817321783], [7.450580588229844e-09, -0.9564552903175352, -0.2918787002563476]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 169, "img_name": "r_69", "width": 800, "height": 800, "position": [3.5949413776397714, -1.4233325719833374, 1.1404037475585938], "rotation": [[0.36812338232994085, 0.26303327083587646, -0.8917952775955201], [0.9297770261764525, -0.10414184629917145, 0.3530853986740113], [-1.2376144643382823e-17, -0.9591495394706725, -0.28289937973022455]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 170, "img_name": "r_70", "width": 800, "height": 800, "position": [3.6870310306549072, -1.1979837417602541, 1.1048241853713987], "rotation": [[0.30901572108268743, 0.2606591582298278, -0.9146397709846494], [0.9510568976402283, -0.08469292521476744, 0.29718315601348877], [1.2693178258715109e-17, -0.9617089033126828, -0.2740731239318847]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 171, "img_name": "r_71", "width": 800, "height": 800, "position": [3.76445198059082, -0.9665415883064272, 1.0699057579040527], "rotation": [[0.24868857860565188, 0.25707265734672546, -0.933845579624176], [0.9685834646224977, -0.066004678606987, 0.23976945877075198], [-3.725290083765143e-09, -0.9641353487968445, -0.26541095972061163]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 172, "img_name": "r_72", "width": 800, "height": 800, "position": [3.8268063068389884, -0.7299969792366028, 1.035691976547241], "rotation": [[0.18737998604774475, 0.2523728013038635, -0.9493138194084167], [0.9822874665260315, -0.04814233630895614, 0.18108996748924253], [-3.725290084037724e-09, -0.9664317369461058, -0.25692355632781977]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 173, "img_name": "r_73", "width": 800, "height": 800, "position": [3.8737666606903076, -0.48936504125595087, 1.0022244453430176], "rotation": [[0.12533186376094818, 0.24666087329387665, -0.9609631896018981], [0.9921149611473082, -0.031160164624452587, 0.1213965192437172], [6.6680223524908285e-18, -0.9686007499694824, -0.2486212700605393]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 174, "img_name": "r_74", "width": 800, "height": 800, "position": [3.9050767421722408, -0.245681032538414, 0.9695447683334351], "rotation": [[0.06278909742832184, 0.24003985524177548, -0.9687302708625793], [0.9980267882347108, -0.015101686120033266, 0.060945961624383926], [-9.313225734782985e-10, -0.9706454873085023, -0.2405144572257996]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 175, "img_name": "r_75", "width": 800, "height": 800, "position": [3.9205524921417236, 5.6551471061538905e-06, 0.937692880630493], "rotation": [[-1.4424363143916707e-06, 0.23261296749114987, -0.972569227218628], [1.0, 3.355293642925971e-07, -1.4028692021383904e-06], [-2.842171278218074e-14, -0.9725692868232726, -0.23261293768882746]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 176, "img_name": "r_76", "width": 800, "height": 800, "position": [3.920083045959472, 0.24663649499416354, 0.9067077636718749], "rotation": [[-0.06279198080301285, 0.22448267042636869, -0.9724528193473817], [0.9980266690254211, 0.014123584143817425, -0.061182979494333274], [9.313225756310847e-10, -0.9743757247924804, -0.22492650151252747]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 177, "img_name": "r_77", "width": 800, "height": 800, "position": [3.9036302566528316, 0.49314910173416154, 0.8766271471977235], "rotation": [[-0.1253347247838974, 0.21574962139129641, -0.9683714509010316], [0.9921145439147949, 0.0272558443248272, -0.12233523279428485], [1.8626453723869536e-09, -0.9760681986808778, -0.21746443212032318]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 178, "img_name": "r_78", "width": 800, "height": 800, "position": [3.8712282180786137, 0.7384824156761168, 0.8474875688552856], "rotation": [[-0.18738281726837158, 0.20651188492774963, -0.9603334665298461], [0.9822869896888733, 0.03939457610249519, -0.18319492042064664], [-0.0, -0.9776507616043091, -0.2102357745170593]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 179, "img_name": "r_79", "width": 800, "height": 800, "position": [3.8229837417602535, 0.9815817475318909, 0.8193241357803345], "rotation": [[-0.24869139492511752, 0.1968637853860855, -0.9483655095100403], [0.9685827493667603, 0.05054635927081108, -0.2435004562139511], [3.7252903066065346e-09, -0.9791269898414613, -0.20324930548667908]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 180, "img_name": "r_80", "width": 800, "height": 800, "position": [3.759073972702027, 1.2214037179946902, 0.7921710014343262], "rotation": [[-0.30901849269866943, 0.18689529597759247, -0.9325113892555237], [0.9510560035705566, 0.06072628870606424, -0.3029929399490357], [-0.0, -0.9805011153221131, -0.1965134143829346]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 181, "img_name": "r_81", "width": 800, "height": 800, "position": [3.6797461509704594, 1.4569213390350342, 0.7660605311393737], "rotation": [[-0.3681260645389557, 0.17669110000133514, -0.9128325581550597], [0.9297759532928467, 0.06995727866888046, -0.361417680978775], [-0.0, -0.9817770719528198, -0.19003619253635406]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 182, "img_name": "r_82", "width": 800, "height": 800, "position": [3.5853147506713863, 1.687128186225891, 0.7410240173339844], "rotation": [[-0.4257807731628418, 0.16633009910583496, -0.8894070982933044], [0.9048263430595398, 0.07826934009790416, -0.4185249805450439], [7.450580595008004e-09, -0.9829588532447814, -0.18382543325424192]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 183, "img_name": "r_83", "width": 800, "height": 800, "position": [3.476160764694212, 1.9110430479049683, 0.7170910835266113], "rotation": [[-0.4817551076412201, 0.15588465332984922, -0.862329363822937], [0.876305878162384, 0.08569864183664323, -0.47407144308090204], [-7.450580158993071e-09, -0.9840505719184874, -0.1778884083032608]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 184, "img_name": "r_84", "width": 800, "height": 800, "position": [3.352729082107543, 2.1277146339416504, 0.6942901611328125], "rotation": [[-0.5358282327651978, 0.14542031288146973, -0.8317096233367919], [0.8443269729614258, 0.09228687733411789, -0.5278209447860718], [-7.450580591110241e-09, -0.9850564002990722, -0.17223218083381653]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 185, "img_name": "r_85", "width": 800, "height": 800, "position": [3.2155249118804927, 2.3362240791320805, 0.6726480722427368], "rotation": [[-0.5877866744995117, 0.13499520719051364, -0.797673523426056], [0.8090160489082338, 0.098080113530159, -0.5795458555221558], [-2.213989056216863e-17, -0.9859799742698668, -0.16686345636844635]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 186, "img_name": "r_86", "width": 800, "height": 800, "position": [3.065113306045532, 2.535691022872925, 0.652190089225769], "rotation": [[-0.6374253630638121, 0.12465994805097581, -0.7603609561920167], [0.7705122232437133, 0.10312803834676741, -0.6290274858474731], [-7.450581491819916e-09, -0.986825406551361, -0.16178843379020694]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 187, "img_name": "r_87", "width": 800, "height": 800, "position": [2.9021131992340097, 2.7252752780914307, 0.6329401135444641], "rotation": [[-0.6845484375953675, 0.11445745825767516, -0.719925582408905], [0.7289674282073975, 0.10748308897018433, -0.6760575175285339], [-0.0, -0.9875965118408203, -0.15701310336589813]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 188, "img_name": "r_88", "width": 800, "height": 800, "position": [2.727197647094726, 2.9041807651519784, 0.6149204969406128], "rotation": [[-0.7289697527885436, 0.10442268103361131, -0.6765344738960265], [0.6845457553863525, 0.11119923740625387, -0.7204385399818422], [-7.450580169906875e-09, -0.9882968068122864, -0.15254299342632296]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 189, "img_name": "r_89", "width": 800, "height": 800, "position": [2.5410878658294687, 3.0716586112976074, 0.5981520414352417], "rotation": [[-0.77051442861557, 0.09458284825086595, -0.6303663253784181], [0.6374226808547974, 0.11433143168687819, -0.7619847059249875], [7.450581487251543e-09, -0.9889299273490905, -0.1483832597732544]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 190, "img_name": "r_90", "width": 800, "height": 800, "position": [2.3445510864257812, 3.227010011672974, 0.5826539993286134], "rotation": [[-0.8090180158615112, 0.08495748788118364, -0.5816115736961365], [0.5877837538719177, 0.11693438887596126, -0.8005226850509642], [-7.450580150521424e-09, -0.9894990921020508, -0.14453867077827454]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 191, "img_name": "r_91", "width": 800, "height": 800, "position": [2.138397455215455, 3.369588613510132, 0.5684441328048708], "rotation": [[-0.8443289399147035, 0.0755586698651314, -0.5304710865020753], [0.5358252525329591, 0.11906188726425174, -0.8358920216560366], [1.3739115941203617e-17, -0.9900076389312744, -0.14101363718509677]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 192, "img_name": "r_92", "width": 800, "height": 800, "position": [1.9234746694564815, 3.4988029003143306, 0.555538773536682], "rotation": [[-0.8763076066970825, 0.06639131903648375, -0.4771552979946136], [0.48175206780433655, 0.12076588720083233, -0.8679460883140562], [-3.72529074479381e-09, -0.9904583692550657, -0.13781219720840449]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 193, "img_name": "r_93", "width": 800, "height": 800, "position": [1.7006664276123051, 3.6141180992126474, 0.5439524650573732], "rotation": [[-0.9048278331756592, 0.057453576475381865, -0.42188337445259105], [0.42577755451202404, 0.12209566682577135, -0.8965522646903993], [1.3750861905901872e-17, -0.9908540248870851, -0.13493798673152926]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 194, "img_name": "r_94", "width": 800, "height": 800, "position": [1.4708871841430662, 3.7150580883026123, 0.5336983799934387], "rotation": [[-0.9297772049903871, 0.04873733967542648, -0.3648822009563446], [0.3681227266788483, 0.12309717386960986, -0.9215924739837645], [1.3755622330327111e-17, -0.9911970496177672, -0.1323942691087723]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 195, "img_name": "r_95", "width": 800, "height": 800, "position": [1.2350789308547978, 3.8012073040008554, 0.5247880816459657], "rotation": [[-0.9510571956634523, 0.04022879898548127, -0.3063853383064271], [0.3090151250362397, 0.12381233274936676, -0.9429634213447572], [-0.0, -0.9914898276329042, -0.1301838904619217]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 196, "img_name": "r_96", "width": 800, "height": 800, "position": [0.9942068457603457, 3.8722116947174077, 0.5172316431999207], "rotation": [[-0.9685837030410768, 0.031908996403217316, -0.24663235247135165], [0.24868799746036532, 0.12427836656570433, -0.9605774283409118], [3.7252907415791e-09, -0.9917340874671937, -0.12830936908721924]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 197, "img_name": "r_97", "width": 800, "height": 800, "position": [0.7492559552192688, 3.9277801513671875, 0.5110374689102173], "rotation": [[-0.9822877049446105, 0.023754600435495373, -0.18586750328540802], [0.18737934529781342, 0.12452734261751171, -0.9743622541427611], [-3.441454746434513e-18, -0.9919317960739135, -0.12677277624607083]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 198, "img_name": "r_98", "width": 800, "height": 800, "position": [0.5012269616127014, 3.9676845073699956, 0.5062126517295837], "rotation": [[-0.9921149015426635, 0.015738580375909802, -0.12433910369873045], [0.12533120810985562, 0.12458572536706923, -0.9842613935470581], [-0.0, -0.9920840263366699, -0.12557590007781982]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 199, "img_name": "r_99", "width": 800, "height": 800, "position": [0.2511321008205413, 3.9917616844177246, 0.5027624368667603], "rotation": [[-0.9980268478393555, 0.00783097557723522, -0.06229820847511291], [0.0627884566783905, 0.12447390705347061, -0.9902342557907103], [4.6566125926260866e-10, -0.9921919107437134, -0.12472001463174819]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 200, "img_name": "r_100", "width": 800, "height": 800, "position": [-8.328596777573694e-06, 3.9999136924743657, 0.5006908178329469], "rotation": [[-1.0, -2.5862118491204466e-07, 2.0660704649344557e-06], [-2.0821942143811616e-06, 0.1242061033844948, -0.9922564625740051], [-2.8421709441938435e-14, -0.9922564029693602, -0.1242061033844948]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 201, "img_name": "r_101", "width": 800, "height": 800, "position": [-0.2511704862117768, 3.9921064376831064, 0.5], "rotation": [[-0.9980265498161316, -0.007788465823978187, 0.062307722866535194], [-0.06279261410236359, 0.12378996610641481, -0.9903196692466736], [-0.0, -0.9922778606414795, -0.12403472512960435]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 202, "img_name": "r_102", "width": 800, "height": 800, "position": [-0.501330554485321, 3.968372106552124, 0.5006908178329468], "rotation": [[-0.9921144247055055, -0.015567413531243803, 0.12436479330062863], [-0.12533533573150635, 0.12322666496038437, -0.9844318628311156], [-0.0, -0.9922564029693602, -0.12420609593391418]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 203, "img_name": "r_103", "width": 800, "height": 800, "position": [-0.7494688034057616, 3.928807258605956, 0.5027624368667603], "rotation": [[-0.9822869300842285, -0.02337046340107917, 0.18592032790184018], [-0.1873834431171417, 0.1225108355283737, -0.9746171236038209], [-1.8626453692572983e-09, -0.9921919703483582, -0.12472000718116759]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 204, "img_name": "r_104", "width": 800, "height": 800, "position": [-0.994573712348938, 3.8735735416412362, 0.5062126517295837], "rotation": [[-0.9685826301574706, -0.031229723244905465, 0.24672336876392362], [-0.24869202077388763, 0.1216306313872337, -0.9609153270721437], [-0.0, -0.9920840263366699, -0.1255759000778198]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 205, "img_name": "r_105", "width": 800, "height": 800, "position": [-1.235645294189453, 3.8028962612152104, 0.5110374689102174], "rotation": [[-0.9510557651519774, -0.039175219833850854, 0.3065258860588074], [-0.3090191185474396, 0.12056800723075867, -0.9433825016021731], [-6.882909492869026e-18, -0.9919317960739135, -0.12677279114723208]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 206, "img_name": "r_106", "width": 800, "height": 800, "position": [-1.4716997146606443, 3.71706485748291, 0.517231643199921], "rotation": [[-0.9297757148742676, -0.047234099358320236, 0.36508372426033014], [-0.368126630783081, 0.11929893493652344, -0.922090232372284], [3.7252907415791e-09, -0.9917340874671937, -0.12830936908721927]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 207, "img_name": "r_107", "width": 800, "height": 800, "position": [-1.701772809028625, 3.6164300441741934, 0.5247880816459655], "rotation": [[-0.9048261046409607, -0.05542988330125809, 0.42215785384178156], [-0.42578136920928955, 0.11779380589723588, -0.8971257805824279], [-3.725290741859092e-09, -0.9914898276329042, -0.1301838904619217]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 208, "img_name": "r_108", "width": 800, "height": 800, "position": [-1.9249238967895508, 3.5014047622680673, 0.5336983799934387], "rotation": [[-0.87630558013916, -0.06378167867660522, 0.47751480340957636], [-0.48175567388534535, 0.11601783335208897, -0.8685915470123291], [-7.450580136009026e-09, -0.991197168827057, -0.1323942542076111]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 209, "img_name": "r_109", "width": 800, "height": 800, "position": [-2.140239477157593, 3.372460603713989, 0.543952465057373], "rotation": [[-0.8443266749382017, -0.0723036676645279, 0.5309280157089235], [-0.5358287096023561, 0.11393176764249802, -0.8366043567657472], [-0.0, -0.9908540248870851, -0.13493798673152924]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 210, "img_name": "r_110", "width": 800, "height": 800, "position": [-2.346837520599365, 3.2301285266876216, 0.555538773536682], "rotation": [[-0.8090156316757202, -0.08100425451993941, 0.5821786522865295], [-0.5877871513366699, 0.11149223148822783, -0.8012961745262145], [7.45058058239313e-09, -0.9904583692550659, -0.13781219720840457]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 211, "img_name": "r_111", "width": 800, "height": 800, "position": [-2.543869733810425, 3.074995517730714, 0.5684441328048707], "rotation": [[-0.7705116868019104, -0.0898857340216637, 0.6310563683509828], [-0.6374257802963256, 0.10865266621112826, -0.7628124356269838], [1.3739115941203617e-17, -0.9900076389312744, -0.14101362228393557]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 212, "img_name": "r_112", "width": 800, "height": 800, "position": [-2.730527400970459, 2.9077026844024663, 0.5826539993286132], "rotation": [[-0.7289670109748841, -0.09894376993179323, 0.677360475063324], [-0.6845487952232361, 0.10536391288042068, -0.7213122248649599], [-2.746411687243463e-17, -0.9894990921020508, -0.14453867077827454]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 213, "img_name": "r_113", "width": 800, "height": 800, "position": [-2.9060430526733394, 2.728942632675171, 0.5981520414352416], "rotation": [[-0.6845452785491944, -0.10816699266433716, 0.7209004759788513], [-0.7289702892303468, 0.1015750616788864, -0.6769672632217407], [7.450580592447619e-09, -0.9889299273490905, -0.14838324487209317]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 214, "img_name": "r_114", "width": 800, "height": 800, "position": [-3.0696940422058105, 2.5394589900970455, 0.6149204969406127], "rotation": [[-0.6374220252037047, -0.11753664165735246, 0.7614973783493042], [-0.770514726638794, 0.09723426401615143, -0.6299622058868407], [-1.0567897167620435e-17, -0.9882968068122864, -0.15254299342632294]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 215, "img_name": "r_115", "width": 800, "height": 800, "position": [-3.220806837081909, 2.3400409221649174, 0.6329401135444641], "rotation": [[-0.5877832174301149, -0.1270265132188797, 0.7989838123321534], [-0.8090184926986695, 0.09228967875242232, -0.5804926753044128], [7.45058059354234e-09, -0.9875965118408203, -0.1570131182670593]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 216, "img_name": "r_116", "width": 800, "height": 800, "position": [-3.3587591648101807, 2.1315217018127437, 0.6521900892257689], "rotation": [[-0.5358246564865112, -0.1366027295589447, 0.8332055807113647], [-0.844329237937927, 0.08669024705886841, -0.5287654399871826], [-1.1563049732866923e-17, -0.9868254065513612, -0.16178844869136808]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 217, "img_name": "r_117", "width": 800, "height": 800, "position": [-3.4829843044281, 1.9147754907608037, 0.6726480722427368], "rotation": [[-0.48175153136253357, -0.14622373878955844, 0.8640220165252686], [-0.8763079643249513, 0.0803867131471634, -0.47499731183052074], [-7.450581480258336e-09, -0.985979974269867, -0.16686342656612396]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 218, "img_name": "r_118", "width": 800, "height": 800, "position": [-3.5929722785949716, 1.6907132863998413, 0.6942901611328125], "rotation": [[-0.425777018070221, -0.15584054589271545, 0.8913066387176514], [-0.904828131198883, 0.07333251088857651, -0.41941431164741516], [1.2369365834487392e-17, -0.9850564002990722, -0.17223218083381656]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 219, "img_name": "r_119", "width": 800, "height": 800, "position": [-3.688273906707765, 1.4602799415588381, 0.7170910835266116], "rotation": [[-0.3681221008300782, -0.16539661586284635, 0.9149481058120726], [-0.9297773838043213, 0.0654846578836441, -0.3622508645057678], [3.7252900901299466e-09, -0.9840505719184877, -0.17788840830326083]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 220, "img_name": "r_120", "width": 800, "height": 800, "position": [-3.7685017585754395, 1.2244497537612915, 0.7410240173339843], "rotation": [[-0.3090145885944366, -0.17482852935791013, 0.9348501563072205], [-0.9510573744773866, 0.05680473521351812, -0.3037485778331756], [3.7252907475922546e-09, -0.9829588532447814, -0.18382541835308075]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 221, "img_name": "r_121", "width": 800, "height": 800, "position": [-3.8333351612091064, 0.9842224717140198, 0.7660605311393741], "rotation": [[-0.24868732690811157, -0.18406599760055545, 0.9509333372116089], [-0.9685837626457213, 0.04725960269570352, -0.24415552616119385], [-3.725290076870344e-09, -0.98177707195282, -0.19003620743751531]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 222, "img_name": "r_122", "width": 800, "height": 800, "position": [-3.8825182914733882, 0.7406193017959595, 0.7921710014343263], "rotation": [[-0.18737870454788205, -0.19303272664546967, 0.9631341695785524], [-0.9822877645492554, 0.03682243078947068, -0.1837250143289566], [-0.0, -0.9805011153221131, -0.1965134143829346]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 223, "img_name": "r_123", "width": 800, "height": 800, "position": [-3.9158654212951665, 0.49467819929122936, 0.8193241357803345], "rotation": [[-0.1253305822610855, -0.2016466856002808, 0.9714065790176393], [-0.9921150803565978, 0.025473354384303103, -0.12271454930305484], [-1.8626451512816912e-09, -0.9791269898414613, -0.2032492905855179]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 224, "img_name": "r_124", "width": 800, "height": 800, "position": [-3.933259963989258, 0.24744908511638647, 0.8474875688552858], "rotation": [[-0.06278783082962036, -0.2098209857940674, 0.9757217168807985], [-0.998026967048645, 0.01320024859160185, -0.06138456240296365], [-0.0, -0.9776507616043091, -0.21023578941822052]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 225, "img_name": "r_125", "width": 800, "height": 800, "position": [-3.934656858444214, -1.0709947673603892e-05, 0.8766271471977234], "rotation": [[2.721952114370652e-06, -0.2174644321203232, 0.9760681986808777], [-1.0, -5.919277441535087e-07, 2.6568109205982182e-06], [-0.0, -0.9760681986808777, -0.21746443212032318]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 226, "img_name": "r_126", "width": 800, "height": 800, "position": [-3.9200828075408936, -0.24664151668548587, 0.9067077636718751], "rotation": [[0.06279325485229492, -0.2244826406240463, 0.9724528193473816], [-0.9980266094207763, -0.014123870059847832, 0.06118422746658325], [-0.0, -0.9743757247924806, -0.2249265164136887]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 227, "img_name": "r_127", "width": 800, "height": 800, "position": [-3.8896365165710445, -0.49138632416725153, 0.9376928806304933], "rotation": [[0.12533597648143768, -0.23077864944934845, 0.964900016784668], [-0.9921143054962158, -0.029154771938920018, 0.12189793586730956], [-0.0, -0.9725692868232726, -0.2326129525899887]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 228, "img_name": "r_128", "width": 800, "height": 800, "position": [-3.843489170074463, -0.7331939935684202, 0.9695447683334352], "rotation": [[0.1873835623264313, -0.23625418543815616, 0.953452169895172], [-0.9822867512702942, -0.04506846144795418, 0.18188302218914032], [-0.0, -0.9706454873085023, -0.2405144274234772]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 229, "img_name": "r_129", "width": 800, "height": 800, "position": [-3.7818837165832515, -0.9710320830345154, 1.0022244453430176], "rotation": [[0.24869212508201602, -0.2408102303743363, 0.938169836997986], [-0.9685825705528259, -0.06183015182614326, 0.24088339507579803], [-1.3019721471008665e-17, -0.9686007499694824, -0.2486212700605393]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 230, "img_name": "r_130", "width": 800, "height": 800, "position": [-3.7051334381103516, -1.2038805484771724, 1.0356919765472408], "rotation": [[0.3090192675590514, -0.24434864521026603, 0.9191303849220276], [-0.9510558247566221, -0.07939433306455608, 0.29864597320556635], [7.450580610037548e-09, -0.9664317369461058, -0.2569235265254974]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 231, "img_name": "r_131", "width": 800, "height": 800, "position": [-3.6136231422424308, -1.4307446479797363, 1.0699057579040525], "rotation": [[0.3681268095970155, -0.24677261710166926, 0.8964295387268065], [-0.9297755956649781, -0.09770487248897551, 0.3549240529537201], [-7.4505805958637465e-09, -0.9641353487968445, -0.2654109597206116]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 232, "img_name": "r_132", "width": 800, "height": 800, "position": [-3.507804393768311, -1.650657892227173, 1.104824185371399], "rotation": [[0.4257814884185791, -0.24798853695392606, 0.8701791763305663], [-0.904825985431671, -0.11669528484344482, 0.40947782993316656], [-7.450580152925984e-09, -0.961708903312683, -0.27407315373420715]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 233, "img_name": "r_133", "width": 800, "height": 800, "position": [-3.3881962299346924, -1.8626874685287478, 1.1404037475585938], "rotation": [[0.4817558228969574, -0.24790626764297485, 0.8405080437660216], [-0.8763054609298706, -0.1362884193658829, 0.46207591891288763], [7.450579710791808e-09, -0.9591495394706725, -0.2828993499279022]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 234, "img_name": "r_134", "width": 800, "height": 800, "position": [-3.255381107330322, -2.0659391880035396, 1.1766008138656616], "rotation": [[0.5358288884162902, -0.24644097685813904, 0.807560622692108], [-0.8443265557289122, -0.15639705955982205, 0.5124964118003844], [-0.0, -0.9564552903175354, -0.29187873005867004]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 235, "img_name": "r_135", "width": 800, "height": 800, "position": [-3.110002756118776, -2.2595610618591304, 1.2133702039718626], "rotation": [[0.5877872705459594, -0.2435137331485749, 0.7714966535568235], [-0.8090156316757201, -0.17692402005195618, 0.560528039932251], [1.4901162942213792e-08, -0.9536240696907042, -0.30100005865097046]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 236, "img_name": "r_136", "width": 800, "height": 800, "position": [-2.952762365341188, -2.4427499771118164, 1.250666618347168], "rotation": [[0.6374258995056152, -0.2390529364347458, 0.7324901819229127], [-0.7705116271972656, -0.19776280224323273, 0.6059716939926147], [-2.0330687496538825e-17, -0.9506543278694153, -0.31025218963623047]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 237, "img_name": "r_137", "width": 800, "height": 800, "position": [-2.784415960311888, -2.61475419998169, 1.2884440422058108], "rotation": [[0.6845489740371703, -0.23299503326416016, 0.6907286047935486], [-0.7289668321609497, -0.218798041343689, 0.6486406922340393], [-0.0, -0.9475446343421936, -0.3196236193180084]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 238, "img_name": "r_138", "width": 800, "height": 800, "position": [-2.605770111083984, -2.774877786636353, 1.3266556262969968], "rotation": [[0.7289704084396363, -0.22528575360775, 0.6464120149612427], [-0.6845452189445496, -0.23990619182586675, 0.688362419605255], [-0.0, -0.9442941546440126, -0.3291027545928955]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 239, "img_name": "r_139", "width": 800, "height": 800, "position": [-2.417677164077759, -2.922484874725341, 1.3652542829513552], "rotation": [[0.7705147862434387, -0.2158807516098022, 0.5997518301010131], [-0.6374219655990601, -0.26095634698867787, 0.7249792218208313], [-1.4901160328085884e-08, -0.9409023523330688, -0.33867788314819336]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 240, "img_name": "r_140", "width": 800, "height": 800, "position": [-2.2210304737091064, -3.057003021240235, 1.4041924476623535], "rotation": [[0.8090184926986694, -0.20474675297737124, 0.5509697794914244], [-0.5877830982208252, -0.2818112969398498, 0.758349061012268], [-0.0, -0.9373692274093628, -0.3483372330665588]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 241, "img_name": "r_141", "width": 800, "height": 800, "position": [-2.01676082611084, -3.177924871444702, 1.4434226751327515], "rotation": [[0.8443292975425719, -0.1918622106313706, 0.5002967119216919], [-0.5358245968818663, -0.3023282289505006, 0.7883460521698], [1.4901161192234065e-08, -0.9336950182914734, -0.35806906223297125]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 242, "img_name": "r_142", "width": 800, "height": 800, "position": [-1.805829763412476, -3.2848129272460938, 1.4828966856002808], "rotation": [[0.8763079643249513, -0.17721770703792572, 0.44797122478485113], [-0.4817513525485993, -0.32235985994338984, 0.8148617744445801], [1.4901161178340852e-08, -0.9298806190490723, -0.3678613901138306]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 243, "img_name": "r_143", "width": 800, "height": 800, "position": [-1.5892254114150999, -3.3772995471954346, 1.5225665569305418], "rotation": [[0.9048281908035276, -0.16081689298152924, 0.39423835277557373], [-0.42577686905860895, -0.3417556881904602, 0.8378049731254579], [-2.5699639709824293e-17, -0.9259271025657655, -0.3777023255825042]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 244, "img_name": "r_144", "width": 800, "height": 800, "position": [-1.3679561614990237, -3.4550905227661137, 1.562384605407715], "rotation": [[0.9297774434089661, -0.1426766961812973, 0.3393481671810151], [-0.368122011423111, -0.36036309599876404, 0.8571024537086489], [7.450580186735146e-09, -0.9218361377716063, -0.38757991790771484]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 245, "img_name": "r_145", "width": 800, "height": 800, "position": [-1.1430453062057493, -3.5179643630981445, 1.6023026704788208], "rotation": [[0.9510573148727418, -0.12282776832580566, 0.28355464339256287], [-0.30901435017585754, -0.37802848219871527, 0.8726995587348939], [-7.450580144439234e-09, -0.9176097512245179, -0.3974823653697968]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 246, "img_name": "r_146", "width": 800, "height": 800, "position": [-0.9155248403549193, -3.5657751560211177, 1.642273187637329], "rotation": [[0.9685837626457214, -0.10131461173295973, 0.2271137684583664], [-0.24868714809417722, -0.3945989310741424, 0.8845599889755248], [-1.2673900872498653e-17, -0.9132508039474486, -0.40739783644676203]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 247, "img_name": "r_147", "width": 800, "height": 800, "position": [-0.6864308118820189, -3.5984511375427246, 1.6822491884231565], "rotation": [[0.9822878241539001, -0.07819582521915436, 0.17028252780437467], [-0.18737855553627017, -0.4099230766296386, 0.8926658630371094], [-7.450580598515196e-09, -0.9087620377540587, -0.4173146486282348]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 248, "img_name": "r_148", "width": 800, "height": 800, "position": [-0.456796020269394, -3.615995168685913, 1.7221834659576414], "rotation": [[0.9921150803565979, -0.05354380607604981, 0.1133171394467354], [-0.1253304183483124, -0.42385250329971313, 0.8970179557800291], [-0.0, -0.9041471481323242, -0.4272210896015167]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 249, "img_name": "r_149", "width": 800, "height": 800, "position": [-0.22764535248279566, -3.618484258651732, 1.762030005455017], "rotation": [[0.9980269074440004, -0.027444856241345406, 0.05647185817360877], [-0.06278766691684722, -0.4362433850765228, 0.8976354002952575], [-0.0, -0.8994100689888002, -0.43710580468177795]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 250, "img_name": "r_150", "width": 800, "height": 800, "position": [1.0403045962448228e-05, -3.606067419052124, 1.8017430305480961], "rotation": [[1.0, 1.2894154224341035e-06, -2.580677801233832e-06], [2.884872856157016e-06, -0.4469574689865113, 0.8945551514625549], [-1.1368683778208816e-13, -0.8945552706718445, -0.4469574093818665]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 251, "img_name": "r_151", "width": 800, "height": 800, "position": [0.22517985105514524, -3.578964948654174, 1.8412775993347166], "rotation": [[0.9980266094207763, 0.02868182212114334, -0.055860243737697594], [0.06279342621564864, -0.45586335659027094, 0.8878319263458252], [-1.862645151173677e-09, -0.8895875811576842, -0.45676475763320923]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 252, "img_name": "r_152", "width": 800, "height": 800, "position": [0.44689643383026123, -3.537466049194335, 1.8805897235870361], "rotation": [[0.9921143054962157, 0.0584714263677597, -0.11086136102676393], [0.1253361403942108, -0.4628380537033081, 0.8775373101234436], [3.7252902906915093e-09, -0.8845122456550597, -0.4665168821811676]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 253, "img_name": "r_153", "width": 800, "height": 800, "position": [0.664223551750183, -3.481925487518311, 1.9196357727050781], "rotation": [[0.9822866320610045, 0.08923294395208356, -0.16477358341217038], [0.18738421797752378, -0.4677678942680359, 0.8637593984603883], [1.2203229313691697e-17, -0.8793353438377383, -0.4762030243873596]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 254, "img_name": "r_154", "width": 800, "height": 800, "position": [0.8762590289115905, -3.4127614498138428, 1.95837414264679], "rotation": [[0.9685823917388917, 0.12081814557313919, -0.21737308800220492], [0.24869275093078616, -0.47054979205131525, 0.8466018438339236], [-1.2130058571066478e-17, -0.8740628361701965, -0.485812783241272]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 255, "img_name": "r_155", "width": 800, "height": 800, "position": [1.0821403264999387, -3.330451726913453, 1.9967634677886963], "rotation": [[0.9510555863380431, 0.15306866168975827, -0.2684459686279297], [0.3090198040008545, -0.4710921347141267, 0.8261833786964418], [-2.411130734993467e-17, -0.8687013983726503, -0.49533605575561523]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 256, "img_name": "r_156", "width": 800, "height": 800, "position": [1.2810482978820803, -3.2355296611785884, 2.0347635746002197], "rotation": [[0.9297752976417543, 0.18581700325012213, -0.3177889287471773], [0.36812737584114075, -0.4693159759044646, 0.8026360273361207], [-1.4901160340998408e-08, -0.8632581233978269, -0.5047626495361327]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 257, "img_name": "r_157", "width": 800, "height": 800, "position": [1.4722104072570803, -3.1285812854766855, 2.072335720062256], "rotation": [[0.9048256874084473, 0.2188874483108521, -0.36521041393280035], [0.42578205466270447, -0.4651557505130768, 0.7761054039001467], [1.4901160256935303e-08, -0.8577403426170349, -0.5140831470489502]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 258, "img_name": "r_158", "width": 800, "height": 800, "position": [1.654905200004578, -3.0102396011352544, 2.109442234039306], "rotation": [[0.8763052225112916, 0.2520973980426789, -0.4105314314365388], [0.48175635933876043, -0.4585601389408112, 0.7467484474182128], [-0.0, -0.8521556854248047, -0.5232881307601929]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 259, "img_name": "r_159", "width": 800, "height": 800, "position": [1.8284648656845093, -2.881179809570314, 2.146047353744506], "rotation": [[0.8443263173103331, 0.28525891900062555, -0.453586310148239], [0.5358294844627378, -0.4494929909706116, 0.7147327065467837], [1.4901163033038134e-08, -0.8465124368667603, -0.5323688387870787]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 260, "img_name": "r_160", "width": 800, "height": 800, "position": [1.9922771453857429, -2.7421162128448486, 2.182116031646729], "rotation": [[0.8090152144432069, 0.31817907094955455, -0.4942231178283693], [0.5877877473831178, -0.4379331171512603, 0.6802353262901306], [-2.980232236755177e-08, -0.8408190011978149, -0.5413163304328918]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 261, "img_name": "r_161", "width": 800, "height": 800, "position": [2.1457884311676017, -2.5937960147857675, 2.2176146507263184], "rotation": [[0.7705112099647523, 0.35066258907318126, -0.5323045253753662], [0.6374263763427735, -0.4238755702972413, 0.6434415578842161], [4.635646876817011e-17, -0.8350839018821717, -0.5501224398612976]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 262, "img_name": "r_162", "width": 800, "height": 800, "position": [2.288504123687744, -2.4369938373565674, 2.252511978149414], "rotation": [[0.7289664149284362, 0.38251215219497686, -0.5677080154418944], [0.6845493912696837, -0.4073314666748047, 0.6045437455177309], [-1.4901160337075628e-08, -0.8293163776397704, -0.5587794184684753]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 263, "img_name": "r_163", "width": 800, "height": 800, "position": [2.4199912548065186, -2.272508382797241, 2.2867767810821538], "rotation": [[0.6845448017120359, 0.4135302305221558, -0.6003259420394899], [0.7289708256721498, -0.3883282542228699, 0.5637399554252625], [-1.4901161234527975e-08, -0.8235253095626831, -0.5672795176506042]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 264, "img_name": "r_164", "width": 800, "height": 800, "position": [2.539877653121948, -2.1011555194854736, 2.320380687713623], "rotation": [[0.6374214291572573, 0.4435206055641174, -0.6300660371780397], [0.7705152630805969, -0.3669097125530243, 0.5212324857711792], [-0.0, -0.8177204728126526, -0.5756155252456666]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 265, "img_name": "r_165", "width": 800, "height": 800, "position": [2.6478531360626234, -1.9237647056579585, 2.3532960414886475], "rotation": [[0.5877826809883117, 0.4722898304462432, -0.6568514704704286], [0.8090189695358275, -0.3431362807750701, 0.4772272408008575], [3.64625875527477e-17, -0.8119112253189086, -0.583780825138092]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 266, "img_name": "r_166", "width": 800, "height": 800, "position": [2.743669033050536, -1.741172671318054, 2.385497331619263], "rotation": [[0.5358240008354187, 0.4996481835842135, -0.6806204319000243], [0.8443296551704406, -0.31708410382270813, 0.4319317042827605], [-1.490116123086423e-08, -0.806107521057129, -0.5917689800262452]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 267, "img_name": "r_167", "width": 800, "height": 800, "position": [2.827136993408203, -1.554219484329224, 2.4169602394104004], "rotation": [[0.48175072669982916, 0.5254117250442505, -0.7013263702392576], [0.8763081431388855, -0.2888453006744385, 0.38555440306663513], [-2.9802318827877214e-08, -0.8003192543983458, -0.5995740294456482]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 268, "img_name": "r_168", "width": 800, "height": 800, "position": [2.8981289863586412, -1.3637442588806155, 2.447661876678467], "rotation": [[0.42577633261680614, 0.5494029521942139, -0.7189372777938843], [0.9048285484313965, -0.2585271894931793, 0.33830326795578003], [-1.490116297614298e-08, -0.7945565581321716, -0.6071901321411133]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 269, "img_name": "r_169", "width": 800, "height": 800, "position": [2.9565749168396005, -1.1705791950225828, 2.477581262588501], "rotation": [[0.3681214153766631, 0.5714529156684877, -0.7334358692169187], [0.9297778010368346, -0.2262519598007203, 0.2903849184513092], [1.4901161187083595e-08, -0.7888293862342836, -0.6146122217178346]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 270, "img_name": "r_170", "width": 800, "height": 800, "position": [3.0024604797363277, -0.9755473136901854, 2.5066988468170166], "rotation": [[0.30901381373405457, 0.5914012789726256, -0.7448187470436096], [0.9510576128959656, -0.1921557188034058, 0.2420035004615784], [-0.0, -0.7831478714942932, -0.621835470199585]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 271, "img_name": "r_171", "width": 800, "height": 800, "position": [3.0358264446258554, -0.7794567346572875, 2.5349960327148438], "rotation": [[0.24868656694889069, 0.6090989708900452, -0.7530958056449889], [0.9685839414596557, -0.1563878357410431, 0.1933594048023224], [-7.450580115800685e-09, -0.7775225043296814, -0.628855049610138]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 272, "img_name": "r_172", "width": 800, "height": 800, "position": [3.0567650794982906, -0.5830982327461244, 2.562456369400025], "rotation": [[0.18737794458866125, 0.6244082450866699, -0.7582900524139402], [0.9822879433631898, -0.1191100180149079, 0.14464886486530304], [7.45058059423073e-09, -0.7719632387161256, -0.6356672048568728]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 273, "img_name": "r_173", "width": 800, "height": 800, "position": [3.0654182434082036, -0.387241542339325, 2.589064359664917], "rotation": [[0.12532976269721982, 0.6372037529945372, -0.7604367733001709], [0.9921150803565979, -0.08049529790878295, 0.0960628166794777], [-0.0, -0.766480267047882, -0.6422678828239441]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 274, "img_name": "r_174", "width": 800, "height": 800, "position": [3.061973094940186, -0.19263225793838507, 2.6148066520690914], "rotation": [[0.06278701126575469, 0.647373855113983, -0.759582042694092], [0.9980269074440004, -0.04072703048586845, 0.0477861799299717], [3.7252900724621847e-09, -0.7610836625099182, -0.6486536860466002]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 275, "img_name": "r_175", "width": 800, "height": 800, "position": [3.0466606616973877, 1.0738353921624373e-05, 2.639669895172119], "rotation": [[-3.5246305287728327e-06, 0.6548215746879577, -0.7557834982872009], [0.9999999403953554, 2.3080044684320464e-06, -2.6638579129212316e-06], [-3.200867176979815e-22, -0.7557834386825562, -0.654821515083313]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 276, "img_name": "r_176", "width": 800, "height": 800, "position": [3.0197522640228254, 0.18999747931957245, 2.663643598556519], "rotation": [[-0.06279406696557999, 0.6594646573066711, -0.7491083145141603], [0.9980265498161316, 0.04149235412478448, -0.047132574021816254], [5.19798383107726e-18, -0.750589668750763, -0.6607686281204225]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 277, "img_name": "r_177", "width": 800, "height": 800, "position": [2.9815549850463867, 0.3766688406467437, 2.68671703338623], "rotation": [[-0.12533678114414215, 0.6612366437911986, -0.739632785320282], [0.9921142458915712, 0.08353602141141891, -0.09344004094600677], [-1.0264467716670979e-17, -0.745511770248413, -0.666492462158203]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 278, "img_name": "r_178", "width": 800, "height": 800, "position": [2.932410955429076, 0.5593982338905331, 2.7088818550109863], "rotation": [[-0.1873848587274551, 0.660087525844574, -0.7274416089057925], [0.9822865724563599, 0.12592089176177979, -0.13876962661743164], [2.0190559054382312e-17, -0.7405593991279602, -0.6719908714294432]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 279, "img_name": "r_179", "width": 800, "height": 800, "position": [2.872690200805664, 0.7375925779342651, 2.7301297187805176], "rotation": [[-0.24869336187839505, 0.6559838056564331, -0.7126266956329347], [0.9685822129249573, 0.16843053698539728, -0.18297418951988217], [-1.4901160312444297e-08, -0.7357420921325684, -0.6772618293762208]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 280, "img_name": "r_180", "width": 800, "height": 800, "position": [2.8027911186218257, 0.9106933474540708, 2.750454425811768], "rotation": [[-0.3090204298496247, 0.648908793926239, -0.6952868700027466], [0.951055347919464, 0.21084585785865786, -0.22591520845890048], [-1.4901160318358985e-08, -0.7310687303543091, -0.682303786277771]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 281, "img_name": "r_181", "width": 800, "height": 800, "position": [2.7231354713439946, 1.078177213668823, 2.76984977722168], "rotation": [[-0.36812800168991083, 0.638862669467926, -0.6755266785621642], [0.9297751188278198, 0.25294637680053705, -0.26746281981468195], [1.4901160196847994e-08, -0.7265485525131224, -0.6871150732040405]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 282, "img_name": "r_182", "width": 800, "height": 800, "position": [2.634164571762085, 1.2395557165145876, 2.788311004638672], "rotation": [[-0.42578268051147466, 0.6258630752563475, -0.6534557342529296], [0.9048255681991577, 0.2945116460323334, -0.3074958920478822], [-3.627408870855832e-17, -0.7221899032592772, -0.6916947364807129]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 283, "img_name": "r_183", "width": 800, "height": 800, "position": [2.536338090896607, 1.3943759202957153, 2.805833816528321], "rotation": [[-0.4817569553852082, 0.6099447011947632, -0.6291880011558533], [0.8763049840927125, 0.33532285690307617, -0.34590205550193787], [-3.492695705336087e-17, -0.7180013060569762, -0.6960416436195374]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 284, "img_name": "r_184", "width": 800, "height": 800, "position": [2.430129528045655, 1.5422198772430415, 2.8224155902862553], "rotation": [[-0.5358299612998964, 0.5911591053009033, -0.6028409600257875], [0.8443259000778198, 0.37516409158706676, -0.3825776576995849], [1.4901159423056564e-08, -0.7139906883239746, -0.7001551389694215]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 285, "img_name": "r_185", "width": 800, "height": 800, "position": [2.316023826599122, 1.6827032566070559, 2.8380527496337886], "rotation": [[-0.5877883434295657, 0.5695741176605225, -0.5745347142219543], [0.8090147376060484, 0.41382312774658203, -0.417427271604538], [-1.4901161184358611e-08, -0.7101660370826721, -0.7040341496467588]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 286, "img_name": "r_186", "width": 800, "height": 800, "position": [2.1945159435272217, 1.815475463867188, 2.8527438640594482], "rotation": [[-0.6374269127845766, 0.5452740192413331, -0.5443923473358155], [0.7705109119415283, 0.4510933756828308, -0.4503639936447144], [-0.0, -0.7065344452857971, -0.7076785564422606]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 287, "img_name": "r_187", "width": 800, "height": 800, "position": [2.0661075115203857, 1.940219044685364, 2.866487503051758], "rotation": [[-0.6845499277114869, 0.5183589458465577, -0.5125381946563722], [0.7289659976959229, 0.4867751896381379, -0.48130908608436584], [-1.4901161200931164e-08, -0.7031029462814331, -0.7110880017280578]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 288, "img_name": "r_188", "width": 800, "height": 800, "position": [1.9313046932220466, 2.0566465854644784, 2.879282236099244], "rotation": [[-0.728971242904663, 0.48894402384757996, -0.4790976941585541], [0.6845442652702333, 0.5206765532493591, -0.5101911425590516], [-0.0, -0.6998783946037294, -0.7142619490623475]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 289, "img_name": "r_189", "width": 800, "height": 800, "position": [1.7906174659729004, 2.1645021438598633, 2.8911278247833248], "rotation": [[-0.7705156803131104, 0.45715865492820734, -0.4441975057125092], [0.6374209523200989, 0.5526143312454225, -0.5369468927383423], [-0.0, -0.6968669295310975, -0.7172005176544191]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 290, "img_name": "r_190", "width": 800, "height": 800, "position": [1.6445568799972532, 2.263557195663452, 2.9020237922668457], "rotation": [[-0.8090192675590517, 0.4231463074684144, -0.40796434879302956], [0.5877819657325744, 0.5824158191680909, -0.5615194439887999], [7.992534068864615e-17, -0.6940741539001463, -0.7199034690856935]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 291, "img_name": "r_191", "width": 800, "height": 800, "position": [1.4936342239379883, 2.353611469268799, 2.911970138549806], "rotation": [[-0.8443300127983093, 0.387063205242157, -0.3705250024795533], [0.535823404788971, 0.6099193692207338, -0.5838590860366821], [-0.0, -0.6915056705474854, -0.7223708033561704]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 292, "img_name": "r_192", "width": 800, "height": 800, "position": [1.3383599519729616, 2.434490442276001, 2.9209671020507817], "rotation": [[-0.8763084411621093, 0.34907752275466913, -0.3320062458515168], [0.48175019025802607, 0.6349755525588988, -0.6039227247238159], [-8.044706666204048e-17, -0.6891667246818545, -0.7246027588844299]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 293, "img_name": "r_193", "width": 800, "height": 800, "position": [1.1792427301406865, 2.506044149398804, 2.9290149211883554], "rotation": [[-0.9048287272453308, 0.3093682229518891, -0.2925340831279755], [0.42577567696571345, 0.6574477553367615, -0.6216729879379272], [1.4901161256291372e-08, -0.6870615482330323, -0.7265990972518922]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 294, "img_name": "r_194", "width": 800, "height": 800, "position": [1.016788959503174, 2.5681457519531254, 2.936114311218262], "rotation": [[-0.9297779798507692, 0.2681245803833008, -0.2522342801094056], [0.36812081933021545, 0.6772133111953735, -0.6370785236358644], [-0.0, -0.6851943135261535, -0.7283602952957151]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 295, "img_name": "r_195", "width": 800, "height": 800, "position": [0.8515021800994875, 2.62069034576416, 2.9422655105590825], "rotation": [[-0.9510578513145448, 0.22554448246955872, -0.2112316936254501], [0.3090132176876068, 0.6941640377044678, -0.6501132249832153], [-4.051682510645194e-17, -0.6835685968399048, -0.7298862338066101]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 296, "img_name": "r_196", "width": 800, "height": 800, "position": [0.6838829517364502, 2.6635932922363277, 2.947469234466552], "rotation": [[-0.9685841798782349, 0.18183347582817078, -0.16965048015117648], [0.24868592619895938, 0.7082066535949707, -0.6607561707496643], [7.450580578282824e-09, -0.6821876764297485, -0.7311770915985109]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 297, "img_name": "r_197", "width": 800, "height": 800, "position": [0.5144287347793581, 2.696789741516113, 2.9517261981964116], "rotation": [[-0.982287883758545, 0.13720388710498813, -0.12761406600475314], [0.1873772889375687, 0.7192639112472534, -0.6689912080764769], [-2.0323553026464525e-17, -0.6810540556907654, -0.7322331666946412]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 298, "img_name": "r_198", "width": 800, "height": 800, "position": [0.343634158372879, 2.720234394073486, 2.955036401748658], "rotation": [[-0.9921152591705322, 0.09187307208776474, -0.08524513244628908], [0.1253291517496109, 0.7272742986679077, -0.6748070120811464], [2.0346341852340358e-17, -0.680170178413391, -0.7330542206764221]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}, {"id": 299, "img_name": "r_199", "width": 800, "height": 800, "position": [0.1719909459352494, 2.7338984012603773, 2.9574005603790288], "rotation": [[-0.9980270266532898, 0.04606265202164651, -0.04266570135951042], [0.06278638541698457, 0.7321932911872864, -0.6781967282295228], [-1.0181311210578313e-17, -0.6795374751091003, -0.7336407899856567]], "fy": 1111.1110311937682, "fx": 1111.1110311937682}] \ No newline at end of file diff --git a/environment.yml b/environment.yml index d91d37f..398ed3c 100644 --- a/environment.yml +++ b/environment.yml @@ -1,4 +1,4 @@ -name: gaussian_splatting +name: 3dgs_v2 channels: - pytorch - conda-forge @@ -6,7 +6,7 @@ channels: dependencies: - cudatoolkit=11.6 - plyfile - - python=3.7.13 + - python=3.8 - pip=22.3.1 - pytorch=1.12.1 - torchaudio=0.12.1 diff --git a/input.ply b/input.ply new file mode 100644 index 0000000..94a6dc0 Binary files /dev/null and b/input.ply differ diff --git a/projection_tensor.py b/projection_tensor.py new file mode 100644 index 0000000..582e5b0 --- /dev/null +++ b/projection_tensor.py @@ -0,0 +1,861 @@ +# +# Copyright (C) 2023, Inria +# GRAPHDECO research group, https://team.inria.fr/graphdeco +# All rights reserved. +# +# This software is free for non-commercial, research and evaluation use +# under the terms of the LICENSE.md file. +# +# For inquiries contact george.drettakis@inria.fr +# + +import os +import torch +from random import randint +from utils.loss_utils import l1_loss, ssim +from gaussian_renderer import render, network_gui +import sys +from scene import Scene, GaussianModel +from utils.general_utils import safe_state +import uuid +from tqdm import tqdm +from utils.image_utils import psnr +from argparse import ArgumentParser, Namespace +from arguments import ModelParams, PipelineParams, OptimizationParams + +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +# import open3d as o3d +import numpy as np +import cv2 +from collections import Counter +import pandas as pd +import ffmpeg + + +def save_ply(xyz_tensor, output_file_path): + """ + xyz_tensor: torch.Tensor of shape [N, 3] + output_file_path: string, path to save the PLY file + """ + # 출력 디렉토리가 존재하지 않으면 생성합니다. + output_dir = os.path.dirname(output_file_path) + os.makedirs(output_dir, exist_ok=True) + + # 텐서를 CPU로 이동하고 NumPy 배열로 변환합니다. + xyz_np = xyz_tensor.detach().cpu().numpy() + + # PLY 파일의 헤더를 작성합니다. + num_vertices = xyz_np.shape[0] + ply_header = f'''ply +format ascii 1.0 +element vertex {num_vertices} +property float x +property float y +property float z +end_header +''' + + # PLY 파일에 데이터를 저장합니다. + with open(output_file_path, 'w') as f: + f.write(ply_header) + np.savetxt(f, xyz_np, fmt='%f %f %f') + + print(f"PLY 파일이 {output_file_path} 경로에 저장되었습니다.") + +def pad_image_to_even_dimensions(image): + # image는 (height, width, channels)의 NumPy 배열입니다. + height, width = image.shape[:2] + new_height = height if height % 2 == 0 else height + 1 + new_width = width if width % 2 == 0 else width + 1 + + # 새로운 크기의 배열을 생성하고, 패딩된 영역은 0으로 채웁니다. + padded_image = np.zeros((new_height, new_width, *image.shape[2:]), dtype=image.dtype) + padded_image[:height, :width, ...] = image + + return padded_image + +def compression_h265(projected_data, output_directory): + # 출력 디렉토리가 존재하지 않으면 생성합니다. + os.makedirs(output_directory, exist_ok=True) + + # 압축할 텐서 목록 + tensors_to_process = { + 'feature_dc_tensor': projected_data.get('feature_dc_tensor'), + 'scaling_tensor': projected_data.get('scaling_tensor'), + 'opacity_tensor': projected_data.get('opacity_tensor'), + 'rotation_tensor': projected_data.get('rotation_tensor'), + } + + # 지정된 텐서들을 처리합니다. + for tensor_name, tensor in tensors_to_process.items(): + if tensor is None: + print(f"{tensor_name}가 projected_data에 없습니다.") + continue + + # 텐서를 CPU로 이동하고 NumPy 배열로 변환합니다. + tensor_np = tensor.detach().cpu().numpy() + + # 데이터 타입이 uint8인지 확인하고 변환합니다. + if tensor_np.dtype != np.uint8: + tensor_np = tensor_np.astype(np.uint8) + + # 텐서의 차원을 확인합니다. + if tensor_np.ndim != 4: + print(f"{tensor_name} 텐서의 차원이 4가 아닙니다. 건너뜁니다.") + continue + + num_frames, height, width, channels = tensor_np.shape + print(f"{tensor_name} 크기: {tensor_np.shape}") + + # 채널 수에 따른 픽셀 포맷 설정 + if channels == 1: + pix_fmt = 'gray' + tensor_np = tensor_np.squeeze(-1) # 채널 차원 제거 + elif channels == 3: + pix_fmt = 'rgb24' + elif channels == 4: + pix_fmt = 'rgba' + else: + print(f"{tensor_name}의 채널 수 {channels}는 지원되지 않습니다. 건너뜁니다.") + continue + + # 모든 프레임에 대해 패딩을 적용합니다. + padded_frames = [] + for frame in tensor_np: + padded_frame = pad_image_to_even_dimensions(frame) + padded_frames.append(padded_frame) + + # 패딩된 프레임의 크기를 가져옵니다. + padded_height, padded_width = padded_frames[0].shape[:2] + print(f"{tensor_name} 패딩 후 크기: {(padded_height, padded_width)}") + + # 출력 파일 경로 설정 + output_video_path = os.path.join(output_directory, f"{tensor_name}.mp4") + + # ffmpeg 프로세스 설정 + process = ( + ffmpeg + .input('pipe:', format='rawvideo', pix_fmt=pix_fmt, s=f'{padded_width}x{padded_height}') + .output(output_video_path, vcodec='libx265', pix_fmt='yuv420p', crf=23) + .overwrite_output() + .run_async(pipe_stdin=True) + ) + + # 패딩된 프레임 데이터를 ffmpeg 프로세스에 전달 + for frame in padded_frames: + process.stdin.write( + frame.tobytes() + ) + + # 프로세스 종료 + process.stdin.close() + process.wait() + + print(f"{tensor_name}가 {output_video_path}에 저장되었습니다.") + + # feature_rest_tensors 처리 (15개의 텐서) + feature_rest_tensors = projected_data.get('feature_rest_tensors') + if feature_rest_tensors is None: + print("feature_rest_tensors가 projected_data에 없습니다.") + else: + for idx, tensor in enumerate(feature_rest_tensors): + tensor_name = f'feature_rest_tensor_{idx}' + + # 텐서를 CPU로 이동하고 NumPy 배열로 변환합니다. + tensor_np = tensor.detach().cpu().numpy() + + # 데이터 타입이 uint8인지 확인하고 변환합니다. + if tensor_np.dtype != np.uint8: + tensor_np = tensor_np.astype(np.uint8) + + # 텐서의 차원을 확인합니다. + if tensor_np.ndim != 4: + print(f"{tensor_name} 텐서의 차원이 4가 아닙니다. 건너뜁니다.") + continue + + num_frames, height, width, channels = tensor_np.shape + print(f"{tensor_name} 크기: {tensor_np.shape}") + + # 채널 수에 따른 픽셀 포맷 설정 + if channels == 1: + pix_fmt = 'gray' + tensor_np = tensor_np.squeeze(-1) # 채널 차원 제거 + elif channels == 3: + pix_fmt = 'rgb24' + elif channels == 4: + pix_fmt = 'rgba' + else: + print(f"{tensor_name}의 채널 수 {channels}는 지원되지 않습니다. 건너뜁니다.") + continue + + # 모든 프레임에 대해 패딩을 적용합니다. + padded_frames = [] + for frame in tensor_np: + padded_frame = pad_image_to_even_dimensions(frame) + padded_frames.append(padded_frame) + + # 패딩된 프레임의 크기를 가져옵니다. + padded_height, padded_width = padded_frames[0].shape[:2] + print(f"{tensor_name} 패딩 후 크기: {(padded_height, padded_width)}") + + # 출력 파일 경로 설정 + output_video_path = os.path.join(output_directory, f"{tensor_name}.mp4") + + # ffmpeg 프로세스 설정 + process = ( + ffmpeg + .input('pipe:', format='rawvideo', pix_fmt=pix_fmt, s=f'{padded_width}x{padded_height}') + .output(output_video_path, vcodec='libx265', pix_fmt='yuv420p', crf=23) + .overwrite_output() + .run_async(pipe_stdin=True) + ) + + # 패딩된 프레임 데이터를 ffmpeg 프로세스에 전달 + for frame in padded_frames: + process.stdin.write( + frame.tobytes() + ) + + # 프로세스 종료 + process.stdin.close() + process.wait() + + print(f"{tensor_name}가 {output_video_path}에 저장되었습니다.") + +def compression_ffv1(projected_data, output_directory): + # 출력 디렉토리가 존재하지 않으면 생성합니다. + os.makedirs(output_directory, exist_ok=True) + + # 압축할 텐서 목록 + tensors_to_process = { + 'feature_dc_tensor': projected_data.get('feature_dc_tensor'), + 'scaling_tensor': projected_data.get('scaling_tensor'), + 'xyz_tensor': projected_data.get('xyz_tensor'), + 'opacity_tensor': projected_data.get('opacity_tensor'), + 'rotation_tensor': projected_data.get('rotation_tensor'), + } + + # 지정된 텐서들을 처리합니다. + for tensor_name, tensor in tensors_to_process.items(): + # 텐서를 CPU로 이동하고 NumPy 배열로 변환합니다. + tensor_np = tensor.detach().cpu().numpy() + + # 데이터 타입이 uint16인지 확인하고 변환합니다. + if tensor_np.dtype != np.uint16: + tensor_np = tensor_np.astype(np.uint16) + + # 텐서의 차원을 확인합니다. + if tensor_np.ndim != 4: + print(f"{tensor_name} 텐서의 차원이 4가 아닙니다. 건너뜁니다.") + continue + + num_frames, height, width, channels = tensor_np.shape + print(f"{tensor_name} 크기: {tensor_np.shape}") + + # 채널 수에 따른 픽셀 포맷 설정 + if channels == 1: + pix_fmt = 'gray16le' + tensor_np = tensor_np.squeeze(-1) # 채널 차원 제거 + elif channels == 3: + pix_fmt = 'rgb48le' + elif channels == 4: + pix_fmt = 'rgba64le' + else: + print(f"{tensor_name}의 채널 수 {channels}는 지원되지 않습니다. 건너뜁니다.") + continue + + # 출력 파일 경로 설정 + output_video_path = os.path.join(output_directory, f"{tensor_name}.mkv") + + # ffmpeg 프로세스 설정 + process = ( + ffmpeg + .input('pipe:', format='rawvideo', pix_fmt=pix_fmt, s=f'{width}x{height}') + .output(output_video_path, format='matroska', vcodec='ffv1', pix_fmt=pix_fmt) + .overwrite_output() + .run_async(pipe_stdin=True) + ) + + # 프레임 데이터를 ffmpeg 프로세스에 전달 + for frame in tensor_np: + process.stdin.write( + frame.tobytes() + ) + + # 프로세스 종료 + process.stdin.close() + process.wait() + + print(f"{tensor_name}가 {output_video_path}에 저장되었습니다.") + + # feature_rest_tensors 처리 (15개의 텐서) + feature_rest_tensors = projected_data.get('feature_rest_tensors') + if feature_rest_tensors is None: + print("feature_rest_tensors가 projected_data에 없습니다.") + else: + for idx, tensor in enumerate(feature_rest_tensors): + print(tensor.shape) + tensor_name = f'feature_rest_tensor_{idx}' + + # 텐서를 CPU로 이동하고 NumPy 배열로 변환합니다. + tensor_np = tensor.detach().cpu().numpy() + + # 데이터 타입이 uint16인지 확인하고 변환합니다. + if tensor_np.dtype != np.uint16: + tensor_np = tensor_np.astype(np.uint16) + + # 텐서의 차원을 확인합니다. + if tensor_np.ndim != 4: + print(f"{tensor_name} 텐서의 차원이 4가 아닙니다. 건너뜁니다.") + continue + + num_frames, height, width, channels = tensor_np.shape + print(f"{tensor_name} 크기: {tensor_np.shape}") + + # 채널 수에 따른 픽셀 포맷 설정 + if channels == 1: + pix_fmt = 'gray16le' + tensor_np = tensor_np.squeeze(-1) # 채널 차원 제거 + elif channels == 3: + pix_fmt = 'rgb48le' + elif channels == 4: + pix_fmt = 'rgba64le' + else: + print(f"{tensor_name}의 채널 수 {channels}는 지원되지 않습니다. 건너뜁니다.") + continue + + # 출력 파일 경로 설정 + output_video_path = os.path.join(output_directory, f"{tensor_name}.mkv") + + # ffmpeg 프로세스 설정 + process = ( + ffmpeg + .input('pipe:', format='rawvideo', pix_fmt=pix_fmt, s=f'{width}x{height}') + .output(output_video_path, format='matroska', vcodec='ffv1', pix_fmt=pix_fmt) + .overwrite_output() + .run_async(pipe_stdin=True) + ) + + # 프레임 데이터를 ffmpeg 프로세스에 전달 + for frame in tensor_np: + process.stdin.write( + frame.tobytes() + ) + + # 프로세스 종료 + process.stdin.close() + process.wait() + + print(f"{tensor_name}가 {output_video_path}에 저장되었습니다.") + + +def quantization(tensor, tensor_min=None, tensor_max=None): + # 텐서를 CPU로 이동하고 NumPy 배열로 변환합니다. + tensor_np = tensor.detach().cpu().numpy() + + # 최소값과 최대값을 계산합니다. + if tensor_min is None: + tensor_min = tensor_np.min() + if tensor_max is None: + tensor_max = tensor_np.max() + + # 데이터 범위를 계산합니다. + data_range = tensor_max - tensor_min + if data_range == 0: + data_range = 1e-6 # 0으로 나누는 것을 방지 + + # [0, 65535] 범위로 스케일링하여 uint16으로 변환합니다. + # quantized_tensor = ((tensor_np - tensor_min) / data_range * 65535).astype(np.uint16) + quantized_tensor = ((tensor_np - tensor_min) / data_range * 255).astype(np.uint8) + + return quantized_tensor, tensor_min, tensor_max + +def dequantization(quantized_tensor, tensor_min, tensor_max, device): + # 데이터 범위를 계산합니다. + data_range = tensor_max - tensor_min + if data_range == 0: + data_range = 1e-6 # 0으로 나누는 것을 방지 + + # uint16 데이터를 float32로 복원합니다. + # tensor_np = quantized_tensor.astype(np.float32) / 65535 * data_range + tensor_min + tensor_np = quantized_tensor.astype(np.float32) / 255 * data_range + tensor_min + + # 텐서를 생성합니다. + tensor = torch.from_numpy(tensor_np) + + return tensor.to(device) + +def slice(data_values, num_voxels_x, num_voxels_z, linear_indices, num_pixels, device): + # 데이터 채널 수 확인 + num_channels = data_values.shape[1] + + # 이미지 합계 및 카운트 배열 생성 + image_sums = torch.zeros((num_pixels, num_channels), dtype=torch.float32, device=device) + counts = torch.zeros((num_pixels), dtype=torch.float32, device=device) + + # 각 픽셀 위치에 데이터 값을 누적합니다. + image_sums.index_add_(0, linear_indices, data_values) + counts.index_add_(0, linear_indices, torch.ones_like(linear_indices, dtype=torch.float32)) + + # 평균 데이터 값을 계산합니다. + counts_mask = counts > 0 + image_means = torch.zeros_like(image_sums) + image_means[counts_mask] = image_sums[counts_mask] / counts[counts_mask].unsqueeze(1) + + # 이미지를 (num_voxels_z, num_voxels_x, 채널 수) 형태로 변환합니다. + image_means = image_means.view(num_voxels_z, num_voxels_x, num_channels) + + return image_means + +def projection(gaussians, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, debug_from, fix_xyz, quantize): + # xyz 좌표와 feature_dc, scaling 값을 가져옵니다. + # print("===================") + xyz = gaussians._xyz # [N, 3] + feature_dc = gaussians._features_dc.squeeze(1) # [N, 3] + feature_rest = gaussians._features_rest # [N, 15, 3] + scaling = gaussians._scaling # [N, 3] + rotation = gaussians._rotation # [N, 4] + opacity = gaussians._opacity # [N, 1] + + # 각 데이터의 최소값과 최대값을 계산합니다. + feature_dc_min = feature_dc.min(dim=0).values + feature_dc_max = feature_dc.max(dim=0).values + + scaling_min = scaling.min(dim=0).values + scaling_max = scaling.max(dim=0).values + + opacity_min = opacity.min() + opacity_max = opacity.max() + + rotation_min = rotation.min(dim=0).values + rotation_max = rotation.max(dim=0).values + + min_vals = xyz.min(dim=0).values + max_vals = xyz.max(dim=0).values + x_min, y_min, z_min = min_vals + x_max, y_max, z_max = max_vals + + # 복셀 크기를 설정합니다. + voxel_size_x = 0.0035 + voxel_size_y = 0.0035 + voxel_size_z = 0.0035 + + # 각 축에 대한 복셀 수를 계산합니다. + num_voxels_x = torch.ceil((x_max - x_min) / voxel_size_x).long() + num_voxels_y = torch.ceil((y_max - y_min) / voxel_size_y).long() + num_voxels_z = torch.ceil((z_max - z_min) / voxel_size_z).long() + + print("===============================") + print(f"Number of voxels (x, y, z): {num_voxels_x}, {num_voxels_y}, {num_voxels_z}") + + # 각 점의 복셀 인덱스를 계산합니다. + voxel_indices_x = torch.floor((xyz[:, 0] - x_min) / voxel_size_x).long() + voxel_indices_y = torch.floor((xyz[:, 1] - y_min) / voxel_size_y).long() + voxel_indices_z = torch.floor((xyz[:, 2] - z_min) / voxel_size_z).long() + + # 인덱스가 범위를 벗어나지 않도록 클램핑합니다. + voxel_indices_x = voxel_indices_x.clamp(0, num_voxels_x - 1) + voxel_indices_y = voxel_indices_y.clamp(0, num_voxels_y - 1) + voxel_indices_z = voxel_indices_z.clamp(0, num_voxels_z - 1) + + + # with open("./voxel_indices.txt", "w") as f: + # for x, y, z in zip(voxel_indices_x, voxel_indices_y, voxel_indices_z): + # f.write(f"{x.item()}, {y.item()}, {z.item()}\n") + # 복셀 인덱스를 결합하여 [N, 3] 형태로 만듭니다. + voxel_indices = torch.stack((voxel_indices_x, voxel_indices_y, voxel_indices_z), dim=1) + + # 각 복셀에 포함된 포인트 수를 계산합니다. + unique_voxels, counts = torch.unique(voxel_indices, dim=0, return_counts=True) + total_voxels = num_voxels_x * num_voxels_y * num_voxels_z + empty_voxels = total_voxels.item() - unique_voxels.size(0) + + + save = True + + if save == True: + device = xyz.device + + # 각 데이터를 저장할 리스트를 초기화합니다. + feature_dc_images = [] + scaling_images = [] + xyz_images = [] + opacity_images = [] + rotation_images = [] + feature_rest_images = [[] for _ in range(15)] # 15개의 SH 계수에 대한 리스트 + + # y축 기준으로 슬라이싱 + for y in range(num_voxels_y): + slice_mask = (voxel_indices[:, 1] == y) # y축 기준으로 슬라이싱 + + # 슬라이스된 점들의 인덱스와 값을 가져옵니다. + x_indices = voxel_indices_x[slice_mask] # [M] + z_indices = voxel_indices_z[slice_mask] # [M] + linear_indices = z_indices * num_voxels_x + x_indices # [M] + num_pixels = num_voxels_z * num_voxels_x + + # feature_dc 처리 + feature_dc_values = feature_dc[slice_mask] # [M, 3] + image_means_dc = slice( + data_values=feature_dc_values, + num_voxels_x=num_voxels_x, + num_voxels_z=num_voxels_z, + linear_indices=linear_indices, + num_pixels=num_pixels, + device=device + ) + feature_dc_images.append(image_means_dc.unsqueeze(0)) # [1, Z, X, 3] + + # scaling 처리 + scaling_values = scaling[slice_mask] # [M, 3] + image_means_scaling = slice( + data_values=scaling_values, + num_voxels_x=num_voxels_x, + num_voxels_z=num_voxels_z, + linear_indices=linear_indices, + num_pixels=num_pixels, + device=device + ) + scaling_images.append(image_means_scaling.unsqueeze(0)) + + # xyz 처리 (x와 z 좌표만 사용) + if fix_xyz == False: + xyz_values = xyz[slice_mask][:, [0, 2]] # [M, 2] + image_means_xyz = slice( + data_values=xyz_values, + num_voxels_x=num_voxels_x, + num_voxels_z=num_voxels_z, + linear_indices=linear_indices, + num_pixels=num_pixels, + device=device + ) + xyz_images.append(image_means_xyz.unsqueeze(0)) + + # opacity 처리 + opacity_values = opacity[slice_mask] # [M, 1] + image_means_opacity = slice( + data_values=opacity_values, + num_voxels_x=num_voxels_x, + num_voxels_z=num_voxels_z, + linear_indices=linear_indices, + num_pixels=num_pixels, + device=device + ) + opacity_images.append(image_means_opacity.unsqueeze(0)) + + # rotation 처리 + rotation_values = rotation[slice_mask] if slice_mask.sum() > 0 else torch.zeros((0, 4), dtype=rotation.dtype, device=device) + image_means_rotation = slice( + data_values=rotation_values, + num_voxels_x=num_voxels_x, + num_voxels_z=num_voxels_z, + linear_indices=linear_indices, + num_pixels=num_pixels, + device=device + ) + rotation_images.append(image_means_rotation.unsqueeze(0)) + + # feature_rest 처리 (15개의 SH 계수) + feature_rest_values = feature_rest[slice_mask] # [M, 15, 3] + for i in range(15): + coeff_values = feature_rest_values[:, i, :] # [M, 3] + image_means_coeff = slice( + data_values=coeff_values, + num_voxels_x=num_voxels_x, + num_voxels_z=num_voxels_z, + linear_indices=linear_indices, + num_pixels=num_pixels, + device=device + ) + feature_rest_images[i].append(image_means_coeff.unsqueeze(0)) + + # y축 방향으로 이미지를 쌓습니다. + feature_dc_tensor = torch.cat(feature_dc_images, dim=0) # [Y, Z, X, 3] + scaling_tensor = torch.cat(scaling_images, dim=0) # [Y, Z, X, 3] + opacity_tensor = torch.cat(opacity_images, dim=0) # [Y, Z, X, 1] + rotation_tensor = torch.cat(rotation_images, dim=0) # [Y, Z, X, 4] + + + feature_rest_tensors = [] + for i in range(15): + coeff_tensor = torch.cat(feature_rest_images[i], dim=0) # [Y, Z, X, 3] + feature_rest_tensors.append(coeff_tensor) + + # 필요한 값들을 딕셔너리에 저장합니다. + + if fix_xyz == False: + xyz_tensor = torch.cat(xyz_images, dim=0) + else: + xyz_tensor = gaussians._xyz + print(xyz_tensor.shape) + + + # 양자화 단계 + if quantize == True: + xyz_tensor, xyz_min, xyz_max = quantization(xyz_tensor) + feature_dc_tensor, feature_dc_min, feature_dc_max = quantization(feature_dc_tensor) + scaling_tensor, scaling_min, scaling_max = quantization(scaling_tensor) + opacity_tensor, opacity_min, opacity_max = quantization(opacity_tensor) + rotation_tensor, rotation_min, rotation_max = quantization(rotation_tensor) + + quantized_feature_rest = [] + feature_rest_mins = [] + feature_rest_maxs = [] + for tensor in feature_rest_tensors: + quantized_tensor, tensor_min, tensor_max = quantization(tensor) + quantized_feature_rest.append(quantized_tensor) + feature_rest_mins.append(tensor_min) + feature_rest_maxs.append(tensor_max) + + + # 복원 단계 + xyz_tensor = dequantization(xyz_tensor, xyz_min, xyz_max, device) + feature_dc_tensor = dequantization(feature_dc_tensor, feature_dc_min, feature_dc_max, device) + scaling_tensor = dequantization(scaling_tensor, scaling_min, scaling_max, device) + opacity_tensor = dequantization(opacity_tensor, opacity_min, opacity_max, device) + rotation_tensor = dequantization(rotation_tensor, rotation_min, rotation_max, device) + + feature_rest_tensors = [] + for idx, quantized_tensor in enumerate(quantized_feature_rest): + tensor_min = feature_rest_mins[idx] + tensor_max = feature_rest_maxs[idx] + restored_tensor = dequantization(quantized_tensor, tensor_min, tensor_max, device) + feature_rest_tensors.append(restored_tensor) + + torch.cuda.empty_cache() + print("feature dc :",feature_dc_tensor.shape) + print("scaling :",scaling_tensor.shape) + print("opacity :",opacity_tensor.shape) + print("rotation_tensor :",rotation_tensor.shape) + + projected_data = { + 'feature_dc_tensor': feature_dc_tensor, + 'scaling_tensor': scaling_tensor, + 'xyz_tensor': xyz_tensor, + 'opacity_tensor': opacity_tensor, + 'rotation_tensor': rotation_tensor, + 'feature_rest_tensors': feature_rest_tensors, + 'x_min': x_min, + 'y_min': y_min, + 'z_min': z_min, + 'voxel_size_x': voxel_size_x, + 'voxel_size_y': voxel_size_y, + 'voxel_size_z': voxel_size_z, + 'num_voxels_x': num_voxels_x, + 'num_voxels_y': num_voxels_y, + 'num_voxels_z': num_voxels_z, + 'voxel_indices_x': voxel_indices_x, + 'voxel_indices_y': voxel_indices_y, + 'voxel_indices_z': voxel_indices_z, + } + + + return projected_data + +def unprojection(projected_data, gaussians, device): + print("=========unprojection=========") + # 필요한 텐서들을 가져옵니다. + xyz_tensor = projected_data['xyz_tensor'] # [Y, Z, X, 2] + # n,3 + feature_dc_tensor = projected_data['feature_dc_tensor'] # [Y, Z, X, 3] + scaling_tensor = projected_data['scaling_tensor'] # [Y, Z, X, 3] + opacity_tensor = projected_data['opacity_tensor'] # [Y, Z, X, 1] + rotation_tensor = projected_data['rotation_tensor'] # [Y, Z, X, 4] + feature_rest_tensors = projected_data['feature_rest_tensors'] # 리스트 형태 + + y_min = projected_data['y_min'] + voxel_size_y = projected_data['voxel_size_y'] + + num_voxels_x = projected_data['num_voxels_x'] + num_voxels_z = projected_data['num_voxels_z'] + + # xyz_tensor에서 유효한 복셀 위치를 찾습니다. + xyz_mask = torch.any(xyz_tensor != 0, dim=-1) # [Y, Z, X] + print("xyz mask, ", xyz_mask.shape) + valid_indices = torch.nonzero(xyz_mask, as_tuple=False) # [N, 3] + del xyz_mask + + # 유효한 복셀의 인덱스를 사용하여 데이터를 추출합니다. + linear_indices = valid_indices[:, 0] * (num_voxels_z * num_voxels_x) + valid_indices[:, 1] * num_voxels_x + valid_indices[:, 2] # [N] + + del num_voxels_x + del num_voxels_z + # 각 텐서를 평탄화합니다. + xyz_tensor = xyz_tensor.reshape(-1, 2) # [total_voxels, 2] + feature_dc_tensor = feature_dc_tensor.reshape(-1, 3) # [total_voxels, 3] + scaling_tensor = scaling_tensor.reshape(-1, 3) # [total_voxels, 3] + opacity_tensor = opacity_tensor.reshape(-1, 1) # [total_voxels, 1] + rotation_tensor = rotation_tensor.reshape(-1, 4) # [total_voxels, 4] + feature_rest_tensors = [tensor.reshape(-1, 3) for tensor in feature_rest_tensors] # 리스트 형태 + + # 유효한 복셀에서 데이터 추출 + linear_indices = linear_indices.to(device) + xyz_tensor = xyz_tensor[linear_indices] # [N, 2] + feature_dc_tensor = feature_dc_tensor[linear_indices] # [N, 3] + scaling_tensor = scaling_tensor[linear_indices] # [N, 3] + opacity_tensor = opacity_tensor[linear_indices] # [N, 1] + rotation_tensor = rotation_tensor[linear_indices] # [N, 4] + feature_rest_tensors = [tensor[linear_indices] for tensor in feature_rest_tensors] # 리스트 형태 + del linear_indices + # x, y, z 좌표를 복원합니다. + voxel_indices_y = valid_indices[:, 0].to(device) + del valid_indices + + # x와 z 좌표는 원래 데이터에서 가져옵니다. + x_coords = xyz_tensor[:, 0] + z_coords = xyz_tensor[:, 1] + # y 좌표는 복셀 인덱스로부터 복원합니다. + y_coords = y_min + (voxel_indices_y.float() + 0.5) * voxel_size_y + del voxel_indices_y + + # 최종 xyz 좌표를 생성합니다. + xyz_tensor = torch.stack((x_coords, y_coords, z_coords), dim=1) # [N, 3] + del x_coords + del z_coords + del y_coords + + # 가우시안 모델에 데이터 할당 + gaussians._xyz = xyz_tensor # [N, 3] + gaussians._features_dc = feature_dc_tensor.unsqueeze(1) # [N, 1, 3] + gaussians._scaling = scaling_tensor # [N, 3] + gaussians._opacity = opacity_tensor # [N, 1] + gaussians._rotation = rotation_tensor # [N, 4] + + # feature_rest를 [N, 15, 3] 형태로 결합합니다. + feature_rest_tensors = torch.stack(feature_rest_tensors, dim=1) # [N, 15, 3] + gaussians._features_rest = feature_rest_tensors # [N, 15, 3] + + return gaussians + +def fix_xyz_unprojection(projected_data, gaussians, device): + print("=========fix_xyz_unprojection=========") + # 필요한 텐서들을 가져옵니다. + xyz_tensor = projected_data['xyz_tensor'] + print("fix xyz unpro :",xyz_tensor.shape) + feature_dc_tensor = projected_data['feature_dc_tensor'] # [Y, Z, X, 3] + scaling_tensor = projected_data['scaling_tensor'] # [Y, Z, X, 3] + opacity_tensor = projected_data['opacity_tensor'] # [Y, Z, X, 1] + rotation_tensor = projected_data['rotation_tensor'] # [Y, Z, X, 4] + feature_rest_tensors = projected_data['feature_rest_tensors'] # 리스트 형태 + + voxel_indices_x = projected_data['voxel_indices_x'] # [N] + voxel_indices_y = projected_data['voxel_indices_y'] # [N] + voxel_indices_z = projected_data['voxel_indices_z'] # [N] + + # 각 포인트의 복셀 인덱스를 사용하여 속성 값을 가져옵니다. + # 복셀 인덱스를 텐서 인덱스로 사용하기 위해 차원을 확장합니다. + voxel_indices_y = voxel_indices_y.to(device).unsqueeze(-1) # [N, 1] + voxel_indices_z = voxel_indices_z.to(device).unsqueeze(-1) # [N, 1] + voxel_indices_x = voxel_indices_x.to(device).unsqueeze(-1) # [N, 1] + + # 속성 텐서에서 해당 복셀의 속성 값을 가져옵니다. + reconstructed_feature_dc = feature_dc_tensor[voxel_indices_y, voxel_indices_z, voxel_indices_x].squeeze(1) # [N, 3] + reconstructed_scaling = scaling_tensor[voxel_indices_y, voxel_indices_z, voxel_indices_x].squeeze(1) # [N, 3] + reconstructed_opacity = opacity_tensor[voxel_indices_y, voxel_indices_z, voxel_indices_x].squeeze(1) # [N, 1] + reconstructed_rotation = rotation_tensor[voxel_indices_y, voxel_indices_z, voxel_indices_x].squeeze(1) # [N, 4] + reconstructed_feature_rest = [] + + for tensor in feature_rest_tensors: + value = tensor[voxel_indices_y, voxel_indices_z, voxel_indices_x].squeeze(1) # [N, 3] + reconstructed_feature_rest.append(value) + + gaussians._xyz = xyz_tensor + gaussians._features_dc = reconstructed_feature_dc.unsqueeze(1) # [N, 1, 3] + gaussians._scaling = reconstructed_scaling # [N, 3] + gaussians._opacity = reconstructed_opacity # [N, 1] + gaussians._rotation = reconstructed_rotation # [N, 4] + + # feature_rest를 [N, 15, 3] 형태로 결합합니다. + reconstructed_feature_rest = torch.stack(reconstructed_feature_rest, dim=1) # [N, 15, 3] + gaussians._features_rest = reconstructed_feature_rest # [N, 15, 3] + + return gaussians + + +def training_report(reconstructed_gaussians, scene, renderFunc, renderArgs): + + # 테스트 및 훈련 데이터셋 검증 + torch.cuda.empty_cache() + validation_configs = ({ + 'name': 'test', + 'cameras' : scene.getTestCameras() + }, { + 'name': 'train', + 'cameras' : [scene.getTrainCameras()[idx % len(scene.getTrainCameras())] for idx in range(5, 30, 5)] + }) + + + for config in validation_configs: + if config['cameras'] and len(config['cameras']) > 0: + psnr_test = 0.0 + for idx, viewpoint in enumerate(config['cameras']): + # 재구성된 Gaussian 모델로 렌더링 + image = torch.clamp(renderFunc(viewpoint, reconstructed_gaussians, *renderArgs)["render"], 0.0, 1.0) + gt_image = torch.clamp(viewpoint.original_image.to("cuda"), 0.0, 1.0) + psnr_test += psnr(image, gt_image).mean().double() + psnr_test /= len(config['cameras']) + + # PSNR과 L1 Test 값 출력 + print(f"\nEvaluating {config['name']}: PSNR {psnr_test:.4f}") + + torch.cuda.empty_cache() +# python .\projection.py -s .\data\gaussian_splatting\tandt_db\tandt\truck --start_checkpoint .\output\lego\point_cloud\iteration_30000\point_cloud.ply +# python .\projection.py -s ..\data\nerf_synthetic\nerf_synthetic\lego --start_checkpoint .\output\lego\point_cloud\iteration_30000\point_cloud.ply + +if __name__ == "__main__": + # Set up command line argument parser + parser = ArgumentParser(description="Training script parameters") + lp = ModelParams(parser) + op = OptimizationParams(parser) + pp = PipelineParams(parser) + parser.add_argument('--ip', type=str, default="127.0.0.1") + parser.add_argument('--port', type=int, default=6009) + parser.add_argument('--debug_from', type=int, default=-1) + parser.add_argument('--detect_anomaly', action='store_true', default=False) + parser.add_argument("--test_iterations", nargs="+", type=int, default=[7_000, 30_000]) + parser.add_argument("--save_iterations", nargs="+", type=int, default=[7_000, 30_000]) + parser.add_argument("--quiet", action="store_true") + parser.add_argument("--checkpoint_iterations", nargs="+", type=int, default=[]) + parser.add_argument("--start_checkpoint", type=str, default = None) + args = parser.parse_args(sys.argv[1:]) + args.save_iterations.append(args.iterations) + + print("Optimizing " + args.model_path) + + # Initialize system state (RNG) + safe_state(args.quiet) + + # Start GUI server, configure and run training + network_gui.init(args.ip, args.port) + torch.autograd.set_detect_anomaly(args.detect_anomaly) + gaussians = GaussianModel(lp.extract(args).sh_degree) + scene = Scene(lp.extract(args), gaussians) + + fix_xyz = True + quantize = False + gaussians.load_ply(args.start_checkpoint) + projected_data = projection(gaussians, op.extract(args), pp.extract(args), args.test_iterations, args.save_iterations, args.checkpoint_iterations, args.debug_from, fix_xyz, quantize) + + output_video_path = './output/lego/point_cloud/iteration_30000/compression_uint8/' + # compression_ffv1(projected_data, output_video_path) + # compression_h265(projected_data, output_video_path) + output_ply_path = './output/lego/point_cloud/iteration_30000/compression_uint8/xyz.ply' + xyz_tensor = projected_data['xyz_tensor'] + # save_ply(xyz_tensor, output_ply_path) + + device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + if fix_xyz == False: + reconstructed_gaussians = unprojection(projected_data, gaussians, device) + else: + reconstructed_gaussians = fix_xyz_unprojection(projected_data, gaussians, device) + + bg_color = [1, 1, 1] if lp.extract(args).white_background else [0, 0, 0] + background = torch.tensor(bg_color, dtype=torch.float32, device="cuda") + training_report(gaussians, scene, render, (pp.extract(args), background)) + # 재구성된 가우시안을 저장하려면 다음과 같이 저장합니다. + if reconstructed_gaussians is not None: + reconstructed_gaussians.save_ply('./output/lego/point_cloud/iteration_30000/uint8_fix.ply') + + # All done + print("\nTraining complete.") diff --git a/projection_tensor_test.py b/projection_tensor_test.py new file mode 100644 index 0000000..372ce0f --- /dev/null +++ b/projection_tensor_test.py @@ -0,0 +1,223 @@ +# +# Copyright (C) 2023, Inria +# GRAPHDECO research group, https://team.inria.fr/graphdeco +# All rights reserved. +# +# This software is free for non-commercial, research and evaluation use +# under the terms of the LICENSE.md file. +# +# For inquiries contact george.drettakis@inria.fr +# + +import os +import torch +from random import randint +from utils.loss_utils import l1_loss, ssim +from gaussian_renderer import render, network_gui +import sys +from scene import Scene, GaussianModel +from utils.general_utils import safe_state +import uuid +from tqdm import tqdm +from utils.image_utils import psnr +from argparse import ArgumentParser, Namespace +from arguments import ModelParams, PipelineParams, OptimizationParams +from utils.system_utils import mkdir_p +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +# import open3d as o3d +import numpy as np +import cv2 +from collections import Counter +import pandas as pd +from PIL import Image + + +def save_ply(gaussians, path): + mkdir_p(os.path.dirname(path)) + + xyz = gaussians._xyz.detach().cpu().numpy() + normals = np.zeros_like(xyz) + f_dc = gaussians._features_dc.detach().transpose(1, 2).flatten(start_dim=1).contiguous().cpu().numpy() + f_rest = gaussians._features_rest.detach().transpose(1, 2).flatten(start_dim=1).contiguous().cpu().numpy() + opacities = gaussians._opacity.detach().cpu().numpy() + scale = gaussians._scaling.detach().cpu().numpy() + rotation = gaussians._rotation.detach().cpu().numpy() + + dtype_full = [(attribute, 'f4') for attribute in self.construct_list_of_attributes()] + + elements = np.empty(xyz.shape[0], dtype=dtype_full) + attributes = np.concatenate((xyz, normals, f_dc, f_rest, opacities, scale, rotation), axis=1) + elements[:] = list(map(tuple, attributes)) + el = PlyElement.describe(elements, 'vertex') + PlyData([el]).write(path) + +def training_report(reconstructed_gaussians, scene, renderFunc, renderArgs): + + # 테스트 및 훈련 데이터셋 검증 + torch.cuda.empty_cache() + validation_configs = ({ + 'name': 'test', + 'cameras' : scene.getTestCameras() + }, { + 'name': 'train', + 'cameras' : [scene.getTrainCameras()[idx % len(scene.getTrainCameras())] for idx in range(5, 30, 5)] + }) + + + for config in validation_configs: + if config['cameras'] and len(config['cameras']) > 0: + psnr_test = 0.0 + for idx, viewpoint in enumerate(config['cameras']): + # 재구성된 Gaussian 모델로 렌더링 + image = torch.clamp(renderFunc(viewpoint, reconstructed_gaussians, *renderArgs)["render"], 0.0, 1.0) + gt_image = torch.clamp(viewpoint.original_image.to("cuda"), 0.0, 1.0) + psnr_test += psnr(image, gt_image).mean().double() + psnr_test /= len(config['cameras']) + + # PSNR과 L1 Test 값 출력 + print(f"\nEvaluating {config['name']}: PSNR {psnr_test:.4f}") + + torch.cuda.empty_cache() + +def projection(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint, debug_from): + gaussians = GaussianModel(dataset.sh_degree) + scene = Scene(dataset, gaussians) + bg_color = [1, 1, 1] if lp.extract(args).white_background else [0, 0, 0] + background = torch.tensor(bg_color, dtype=torch.float32, device="cuda") + + gaussians.load_ply(checkpoint) + print("load ply :", gaussians._xyz.shape) + print("load ply :", gaussians._xyz) + + csp_data = gaussians.csp() + print("csp :", gaussians._xyz.shape) + print("csp :", gaussians._xyz) + + gaussians.unprojection(csp_data) + print("unprojection :", gaussians._xyz.shape) + print("unprojection :", gaussians._xyz) + + gaussians.save_ply('./test/lego/point_cloud/iteration_30000/test.ply') + training_report(gaussians, scene, render, (pp.extract(args), background)) + + +def save_features_dc_tensor(features_dc_tensor, output_dir, slice_axis='z', normalize=True): + """ + Save features_dc_tensor as images along a specified axis. + + Args: + features_dc_tensor (torch.Tensor): Tensor of shape [num_voxels_y, num_voxels_z, num_voxels_x, 3] + output_dir (str): Directory to save images + slice_axis (str): Axis along which to slice ('y', 'z', or 'x') + normalize (bool): Whether to normalize tensor values to [0, 1] + """ + os.makedirs(output_dir, exist_ok=True) + + # Ensure tensor is on CPU + features_dc_tensor = features_dc_tensor.detach().cpu() + + if slice_axis == 'y': + num_slices = features_dc_tensor.shape[0] + for y in range(num_slices): + # Slice along y-axis: [z, x, 3] + image = features_dc_tensor[y] # [z, x, 3] + image = image.numpy() + + if normalize: + min_val = image.min() + max_val = image.max() + if max_val > min_val: + image = (image - min_val) / (max_val - min_val) + else: + image = image * 0.0 + + # Convert to uint8 + image_uint8 = (image * 255).astype(np.uint8) + pil_image = Image.fromarray(image_uint8) + + image_path = os.path.join(output_dir, f"feature_dc_y_{y:04d}.png") + pil_image.save(image_path) + + elif slice_axis == 'z': + num_slices = features_dc_tensor.shape[1] + for z in range(num_slices): + # Slice along z-axis: [y, x, 3] + image = features_dc_tensor[:, z, :, :] # [y, x, 3] + image = image.numpy() + + if normalize: + min_val = image.min() + max_val = image.max() + if max_val > min_val: + image = (image - min_val) / (max_val - min_val) + else: + image = image * 0.0 + + # Convert to uint8 + image_uint8 = (image * 255).astype(np.uint8) + pil_image = Image.fromarray(image_uint8) + + image_path = os.path.join(output_dir, f"feature_dc_z_{z:04d}.png") + pil_image.save(image_path) + + elif slice_axis == 'x': + num_slices = features_dc_tensor.shape[2] + for x in range(num_slices): + # Slice along x-axis: [y, z, 3] + image = features_dc_tensor[:, :, x, :] # [y, z, 3] + image = image.numpy() + + if normalize: + min_val = image.min() + max_val = image.max() + if max_val > min_val: + image = (image - min_val) / (max_val - min_val) + else: + image = image * 0.0 + + # Convert to uint8 + image_uint8 = (image * 255).astype(np.uint8) + pil_image = Image.fromarray(image_uint8) + + image_path = os.path.join(output_dir, f"feature_dc_x_{x:04d}.png") + pil_image.save(image_path) + + else: + raise ValueError("slice_axis must be 'y', 'z', or 'x'.") + + print(f"Saved features_dc_tensor slices along {slice_axis}-axis to {output_dir}") + +# python .\projection.py -s .\data\gaussian_splatting\tandt_db\tandt\truck --start_checkpoint .\output\lego\point_cloud\iteration_30000\point_cloud.ply +# python .\projection_tensor_test.py -s ..\..\data\nerf_synthetic\nerf_synthetic\lego --start_checkpoint ..\output\lego\point_cloud\iteration_30000\point_cloud.ply + +if __name__ == "__main__": + # Set up command line argument parser + parser = ArgumentParser(description="Training script parameters") + lp = ModelParams(parser) + op = OptimizationParams(parser) + pp = PipelineParams(parser) + parser.add_argument('--ip', type=str, default="127.0.0.1") + parser.add_argument('--port', type=int, default=6009) + parser.add_argument('--debug_from', type=int, default=-1) + parser.add_argument('--detect_anomaly', action='store_true', default=False) + parser.add_argument("--test_iterations", nargs="+", type=int, default=[7_000, 30_000]) + parser.add_argument("--save_iterations", nargs="+", type=int, default=[7_000, 30_000]) + parser.add_argument("--quiet", action="store_true") + parser.add_argument("--checkpoint_iterations", nargs="+", type=int, default=[]) + parser.add_argument("--start_checkpoint", type=str, default = None) + args = parser.parse_args(sys.argv[1:]) + args.save_iterations.append(args.iterations) + + print("Optimizing " + args.model_path) + + # Initialize system state (RNG) + safe_state(args.quiet) + + # Start GUI server, configure and run training + network_gui.init(args.ip, args.port) + torch.autograd.set_detect_anomaly(args.detect_anomaly) + projection(lp.extract(args), op.extract(args), pp.extract(args), args.test_iterations, args.save_iterations, args.checkpoint_iterations, args.start_checkpoint, args.debug_from) + + # All done + print("\nTraining complete.") diff --git a/scene/__init__.py b/scene/__init__.py index 8091614..9b6f930 100644 --- a/scene/__init__.py +++ b/scene/__init__.py @@ -47,6 +47,7 @@ class Scene: scene_info = sceneLoadTypeCallbacks["Blender"](args.source_path, args.white_background, args.depths, args.eval) else: assert False, "Could not recognize scene type!" + if not self.loaded_iter: with open(scene_info.ply_path, 'rb') as src_file, open(os.path.join(self.model_path, "input.ply") , 'wb') as dest_file: diff --git a/scene/gaussian_model.py b/scene/gaussian_model.py index 473887d..4b1fc11 100644 --- a/scene/gaussian_model.py +++ b/scene/gaussian_model.py @@ -113,7 +113,7 @@ class GaussianModel: @property def get_features(self): - features_dc = self._features_dc + features_dc = self._features_dc#.unsqueeze(1) features_rest = self._features_rest return torch.cat((features_dc, features_rest), dim=1) @@ -145,31 +145,199 @@ class GaussianModel: def oneupSHdegree(self): if self.active_sh_degree < self.max_sh_degree: self.active_sh_degree += 1 + + def csp(self): + self._features_dc = self._features_dc.squeeze(1) # [N, 3] + + min_vals = self._xyz.min(dim=0).values + max_vals = self._xyz.max(dim=0).values + x_min, y_min, z_min = min_vals + x_max, y_max, z_max = max_vals + + num_voxels_x = torch.ceil((x_max - x_min) / self.voxel_size).long() + num_voxels_y = torch.ceil((y_max - y_min) / self.voxel_size).long() + num_voxels_z = torch.ceil((z_max - z_min) / self.voxel_size).long() + + voxel_indices_x = torch.floor((self._xyz[:, 0] - x_min) / self.voxel_size).long().clamp(0, num_voxels_x - 1) + voxel_indices_y = torch.floor((self._xyz[:, 1] - y_min) / self.voxel_size).long().clamp(0, num_voxels_y - 1) + voxel_indices_z = torch.floor((self._xyz[:, 2] - z_min) / self.voxel_size).long().clamp(0, num_voxels_z - 1) + + # 전체 포인트에 대한 선형 인덱스 계산 + linear_indices_all = voxel_indices_y * (num_voxels_z * num_voxels_x) + voxel_indices_z * num_voxels_x + voxel_indices_x + + num_voxels_total = num_voxels_y * num_voxels_z * num_voxels_x + + # 공통 로직을 수행하는 헬퍼 함수 + def accumulate_and_average(data_values, channels): + """ + data_values: [N, channels] + channels: int, number of channels per voxel + """ + image_sums = torch.zeros((num_voxels_total, channels), dtype=torch.float32, device='cuda') + counts = torch.zeros((num_voxels_total), dtype=torch.float32, device='cuda') + + image_sums.index_add_(0, linear_indices_all, data_values) + counts.index_add_(0, linear_indices_all, torch.ones_like(linear_indices_all, dtype=torch.float32)) + + counts_mask = counts > 0 + image_means = torch.zeros_like(image_sums) + image_means[counts_mask] = image_sums[counts_mask] / counts[counts_mask].unsqueeze(1) + return image_means + + # features_dc 처리: [N, 3] -> [Y, Z, X, 3] + data_values_dc = self._features_dc # [N, 3] + image_means_dc = accumulate_and_average(data_values_dc, 3) + features_dc_tensor = image_means_dc.view(num_voxels_y, num_voxels_z, num_voxels_x, 3) + + # scaling 처리: [N, 3] -> [Y, Z, X, 3] + data_values_scaling = self._scaling # [N, 3] + image_means_scaling = accumulate_and_average(data_values_scaling, 3) + scaling_tensor = image_means_scaling.view(num_voxels_y, num_voxels_z, num_voxels_x, 3) + + # opacity 처리: [N, 1] -> [Y, Z, X, 1] + data_values_opacity = self._opacity # [N, 1] + image_means_opacity = accumulate_and_average(data_values_opacity, 1) + opacity_tensor = image_means_opacity.view(num_voxels_y, num_voxels_z, num_voxels_x, 1) + + # rotation 처리: [N, 4] -> [Y, Z, X, 4] + data_values_rotation = self._rotation # [N, 4] + image_means_rotation = accumulate_and_average(data_values_rotation, 4) + rotation_tensor = image_means_rotation.view(num_voxels_y, num_voxels_z, num_voxels_x, 4) + + # features_rest 처리: [N, 15, 3] -> 리스트로 [Y, Z, X, 3] 형태의 15개 텐서 + # 각각의 SH 계수를 별도로 처리한 뒤 스택 + data_values_rest = self._features_rest # [N, 15, 3] + features_rest_tensors = [] + for i in range(15): + coeff_values = data_values_rest[:, i, :] # [N, 3] + image_means_coeff = accumulate_and_average(coeff_values, 3) + coeff_tensor = image_means_coeff.view(num_voxels_y, num_voxels_z, num_voxels_x, 3) + features_rest_tensors.append(coeff_tensor) + + csp_data = { + 'features_dc_tensor': features_dc_tensor, + 'scaling_tensor': scaling_tensor, + 'opacity_tensor': opacity_tensor, + 'rotation_tensor': rotation_tensor, + 'features_rest_tensors': features_rest_tensors, + 'voxel_indices_x': voxel_indices_x, + 'voxel_indices_y': voxel_indices_y, + 'voxel_indices_z': voxel_indices_z + } + + return csp_data + + + def unprojection(self, csp_data): + features_dc_tensor = csp_data['features_dc_tensor'] # [Y, Z, X, 3] + scaling_tensor = csp_data['scaling_tensor'] # [Y, Z, X, 3] + opacity_tensor = csp_data['opacity_tensor'] # [Y, Z, X, 1] + rotation_tensor = csp_data['rotation_tensor'] # [Y, Z, X, 4] + features_rest_tensors = csp_data['features_rest_tensors'] # 리스트 형태 + + voxel_indices_x = csp_data['voxel_indices_x'] # [N] + voxel_indices_y = csp_data['voxel_indices_y'] # [N] + voxel_indices_z = csp_data['voxel_indices_z'] # [N] + + # 각 포인트의 복셀 인덱스를 사용하여 속성 값을 가져옵니다. + # 복셀 인덱스를 텐서 인덱스로 사용하기 위해 차원을 확장합니다. + voxel_indices_y = voxel_indices_y # [N ] + voxel_indices_z = voxel_indices_z # [N ] + voxel_indices_x = voxel_indices_x# [N] + + + # print("feature_dc:", features_dc_tensor.shape) + # print("scaling:", scaling_tensor.shape) + # print("opacity:", opacity_tensor.shape) + # print("rotation:", rotation_tensor.shape) + + # 속성 텐서에서 해당 복셀의 속성 값을 가져옵니다. + reconstructed_feature_dc = features_dc_tensor[voxel_indices_y, voxel_indices_z, voxel_indices_x].unsqueeze(1) # [N, 3] + reconstructed_scaling = scaling_tensor[voxel_indices_y, voxel_indices_z, voxel_indices_x].squeeze(1) # [N, 3] + reconstructed_opacity = opacity_tensor[voxel_indices_y, voxel_indices_z, voxel_indices_x] # [N, 1] + reconstructed_rotation = rotation_tensor[voxel_indices_y, voxel_indices_z, voxel_indices_x].squeeze(1) # [N, 4] + reconstructed_feature_rest = [] + + for tensor in features_rest_tensors: + value = tensor[voxel_indices_y, voxel_indices_z, voxel_indices_x].squeeze(1) # [N, 3] + reconstructed_feature_rest.append(value) + + reconstructed_feature_rest = torch.stack(reconstructed_feature_rest, dim=1) # [N, 15, 3] + + + # 모든 텐서 shape 출력 및 확인 + # print("reconstructed_feature_dc:", reconstructed_feature_dc.shape) + # print("self._features_dc:", self._features_dc.shape) + # print("reconstructed_scaling:", reconstructed_scaling.shape) + # print("reconstructed_opacity:", reconstructed_opacity.shape) + # print("reconstructed_rotation:", reconstructed_rotation.shape) + # print("reconstructed_feature_rest:", reconstructed_feature_rest.shape) + # self._features_dc = reconstructed_feature_dc + # self._scaling = reconstructed_scaling + # self._opacity = reconstructed_opacity + # self._rotation = reconstructed_rotation + # self._features_rest = reconstructed_feature_rest + def create_from_pcd(self, pcd : BasicPointCloud, cam_infos : int, spatial_lr_scale : float): self.spatial_lr_scale = spatial_lr_scale fused_point_cloud = torch.tensor(np.asarray(pcd.points)).float().cuda() fused_color = RGB2SH(torch.tensor(np.asarray(pcd.colors)).float().cuda()) features = torch.zeros((fused_color.shape[0], 3, (self.max_sh_degree + 1) ** 2)).float().cuda() - features[:, :3, 0 ] = fused_color + features[:, :3, 0] = fused_color features[:, 3:, 1:] = 0.0 - print("Number of points at initialisation : ", fused_point_cloud.shape[0]) + # print("초기 포인트 개수:", fused_point_cloud.shape[0]) - dist2 = torch.clamp_min(distCUDA2(torch.from_numpy(np.asarray(pcd.points)).float().cuda()), 0.0000001) - scales = torch.log(torch.sqrt(dist2))[...,None].repeat(1, 3) + # 복셀 크기 설정 + self.voxel_size = 0.01 + + # 포인트를 복셀로 양자화 + voxel_indices = torch.floor(fused_point_cloud / self.voxel_size).long() + unique_voxels, self.inverse_indices = torch.unique(voxel_indices, return_inverse=True, dim=0) + # print(unique_voxels.shape) 99740, 3 + # print(inverse_indices.shape) 100000 + # 고유 복셀 개수 + num_voxels = unique_voxels.shape[0] + + # 복셀 단위 속성을 초기화 + voxel_features = torch.zeros((num_voxels, features.shape[1], features.shape[2]), device='cuda') + voxel_counts = torch.zeros(num_voxels, device='cuda') # 각 복셀에 몇개의 포인트가 포함되는지 + + + # 복셀별 속성 합산 및 개수 계산 + voxel_feature_sum = torch.zeros_like(voxel_features) + + # 합산 + voxel_feature_sum.index_add_(0, self.inverse_indices, features) + voxel_counts.index_add_(0, self.inverse_indices, torch.ones(features.shape[0], device='cuda')) + # print(voxel_counts) + + # 0으로 나누는 것을 방지 + voxel_counts = voxel_counts.unsqueeze(1).unsqueeze(2).clamp_min(1) + + # 복셀별 속성 평균 계산 + voxel_features = voxel_feature_sum / voxel_counts + + # 평균 속성을 포인트에 재할당 + features = voxel_features[self.inverse_indices] + + # 기존 초기화 과정 유지 + dist2 = torch.clamp_min(distCUDA2(fused_point_cloud), 1e-7) + scales = torch.log(torch.sqrt(dist2))[..., None].repeat(1, 3) rots = torch.zeros((fused_point_cloud.shape[0], 4), device="cuda") rots[:, 0] = 1 opacities = self.inverse_opacity_activation(0.1 * torch.ones((fused_point_cloud.shape[0], 1), dtype=torch.float, device="cuda")) self._xyz = nn.Parameter(fused_point_cloud.requires_grad_(True)) - self._features_dc = nn.Parameter(features[:,:,0:1].transpose(1, 2).contiguous().requires_grad_(True)) - self._features_rest = nn.Parameter(features[:,:,1:].transpose(1, 2).contiguous().requires_grad_(True)) + self._features_dc = nn.Parameter(features[:, :, 0:1].transpose(1, 2).contiguous().requires_grad_(True)) + self._features_rest = nn.Parameter(features[:, :, 1:].transpose(1, 2).contiguous().requires_grad_(True)) self._scaling = nn.Parameter(scales.requires_grad_(True)) self._rotation = nn.Parameter(rots.requires_grad_(True)) self._opacity = nn.Parameter(opacities.requires_grad_(True)) - self.max_radii2D = torch.zeros((self.get_xyz.shape[0]), device="cuda") + self.max_radii2D = torch.zeros((self._xyz.shape[0]), device="cuda") + self.exposure_mapping = {cam_info.image_name: idx for idx, cam_info in enumerate(cam_infos)} self.pretrained_exposures = None exposure = torch.eye(3, 4, device="cuda")[None].repeat(len(cam_infos), 1, 1) @@ -370,7 +538,6 @@ class GaussianModel: extension_tensor = tensors_dict[group["name"]] stored_state = self.optimizer.state.get(group['params'][0], None) if stored_state is not None: - stored_state["exp_avg"] = torch.cat((stored_state["exp_avg"], torch.zeros_like(extension_tensor)), dim=0) stored_state["exp_avg_sq"] = torch.cat((stored_state["exp_avg_sq"], torch.zeros_like(extension_tensor)), dim=0) diff --git a/train.py b/train.py index 8206903..4342575 100644 --- a/train.py +++ b/train.py @@ -108,6 +108,10 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi bg = torch.rand((3), device="cuda") if opt.random_background else background + # slice 하기 + csp_data = gaussians.csp() + gaussians.unprojection(csp_data) + render_pkg = render(viewpoint_cam, gaussians, pipe, bg, use_trained_exp=dataset.train_test_exp, separate_sh=SPARSE_ADAM_AVAILABLE) image, viewspace_point_tensor, visibility_filter, radii = render_pkg["render"], render_pkg["viewspace_points"], render_pkg["visibility_filter"], render_pkg["radii"] @@ -261,7 +265,7 @@ if __name__ == "__main__": parser.add_argument('--port', type=int, default=6009) parser.add_argument('--debug_from', type=int, default=-1) parser.add_argument('--detect_anomaly', action='store_true', default=False) - parser.add_argument("--test_iterations", nargs="+", type=int, default=[7_000, 30_000]) + parser.add_argument("--test_iterations", nargs="+", type=int, default=[100, 200, 500, 700, 1_000, 7_000, 30_000]) parser.add_argument("--save_iterations", nargs="+", type=int, default=[7_000, 30_000]) parser.add_argument("--quiet", action="store_true") parser.add_argument('--disable_viewer', action='store_true', default=False) @@ -283,3 +287,4 @@ if __name__ == "__main__": # All done print("\nTraining complete.") + # python train.py -s ../../data/nerf_synthetic/nerf_synthetic/lego \ No newline at end of file