diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..bef72cb11208934784c0e07e9a7dbc6efa2b6cad --- /dev/null +++ b/.gitattributes @@ -0,0 +1,29 @@ +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zstandard filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..1558a54768f3a03255311b340e65817a6df0a27a --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +--- +title: Mars DTM Estimation +emoji: ⚡ +colorFrom: yellow +colorTo: purple +python_version: 3.11 +sdk: gradio +sdk_version: 4.36.1 +app_file: app.py +pinned: false +--- + +Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference + +``` +pip install -r requirements.txt +python3.11 app.py +``` \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000000000000000000000000000000000000..8c2955f53672188ead4b020943e006865e3691b0 --- /dev/null +++ b/app.py @@ -0,0 +1,108 @@ +import os +from pathlib import Path +import gradio as gr +import matplotlib.pyplot as plt +import numpy as np +from PIL import Image +import torch +from torchvision import transforms +from model.model import GLPDepth +import open3d as o3d + +device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') +W, H = 512, 512 + + +def load_model(path): + model = GLPDepth(max_depth=700.0).to(device) + weights = torch.load(path, map_location=torch.device('cpu')) + model.load_state_dict(weights) + model.eval() + return model + + +def generate_mesh(dtm, image, image_path): + # prepare points + points = np.zeros(shape=(W * H, 3), dtype='float32') + colors = np.zeros(shape=(W * H, 3), dtype='float32') + for i in range(H): + for j in range(W): + points[i * H + j, 0] = j + points[i * H + j, 1] = i + points[i * H + j, 2] = dtm[i, j] + colors[i * H + j, :3] = image[i, j] + # point cloud + pcd = o3d.geometry.PointCloud() + pcd.points = o3d.utility.Vector3dVector(points) + pcd.colors = o3d.utility.Vector3dVector(colors) + # normals + pcd.estimate_normals() + pcd.orient_normals_to_align_with_direction() + # surface reconstruction + mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=7, n_threads=1)[0] + # mesh transformations + rotation = mesh.get_rotation_matrix_from_xyz((np.pi, 0, 0)) + mesh.rotate(rotation, center=(0, 0, 0)) + mesh.compute_vertex_normals() + # remove weird artifacts + mesh.remove_degenerate_triangles() + mesh.remove_duplicated_triangles() + mesh.remove_duplicated_vertices() + mesh.remove_non_manifold_edges() + # save mesh + out_path = f'./{image_path.stem}.obj' + o3d.io.write_triangle_mesh(out_path, mesh) + return out_path + + +def predict(image_path): + image_path = Path(image_path) + pil_image = Image.open(image_path).convert('L') + # transform image to torch + to_tensor = transforms.ToTensor() + torch_image = to_tensor(pil_image).to(device).unsqueeze(0) + # model predict + with torch.no_grad(): + pred_dtm = model(torch_image) + # transform torch to numpy + pred_dtm = pred_dtm.squeeze().cpu().detach().numpy() + pred_dtm = pred_dtm.max() - pred_dtm + # create 3d model + image_scaled = np.asarray(pil_image) / 255.0 + obj_path = generate_mesh(pred_dtm, image_scaled, image_path) + + # return correct image + fig, ax = plt.subplots() + im = ax.imshow(pred_dtm, cmap='jet', vmin=0, vmax=np.max(pred_dtm)) + plt.colorbar(im, ax=ax) + + fig.canvas.draw() + data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) + data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) + + return [data, obj_path] + + +model = load_model('best_model.pth') + +title = 'Mars DTM Estimation' +description = 'This demo predicts a DTM from an image of the martian surface. Then, by using a surface reconstruction ' \ + 'algorithm, the 3D model is generated and it can also be downloaded. Uploaded images must have a ' \ + '1m/px resolution to get predictions in the correct range. You can download the mesh by clicking ' \ + 'the top-right button on the 3D viewer. ' +examples = [f'examples/{name}' for name in sorted(os.listdir('examples'))] + +iface = gr.Interface( + fn=predict, + inputs=gr.Image(type='filepath', label='Input Image', sources=['upload', 'clipboard']), + outputs=[ + gr.Image(label='DTM'), + gr.Model3D(label='3D Model', clear_color=[0.0, 0.0, 0.0, 0.0]) + ], + examples=examples, + allow_flagging='never', + cache_examples=False, + title=title, + description=description +) +iface.launch() diff --git a/best_model.pth b/best_model.pth new file mode 100644 index 0000000000000000000000000000000000000000..333c9922009d6ad22eb6a2945157c8b2041cb688 --- /dev/null +++ b/best_model.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48dac038a70efe5a8e5887e41aac49117ff216cba67bd3ab5f4da5813972dec1 +size 245133901 diff --git a/examples/example_1.jpg b/examples/example_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5cadb30b4504a37f8fc8d90ec89097e11d386ea8 --- /dev/null +++ b/examples/example_1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c15354984cd8481872ee30423cf9d299383c8525cd4cf6c8d0a6455c7bce52e +size 15183 diff --git a/examples/example_10.jpg b/examples/example_10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5038160129b541909f1055fda45ade1a1c1e3993 --- /dev/null +++ b/examples/example_10.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f07f9dc14d4e06b764038e2c5ca4b45d88e20b582a5983e7b21239541f1adc64 +size 39762 diff --git a/examples/example_100.jpg b/examples/example_100.jpg new file mode 100644 index 0000000000000000000000000000000000000000..219a3a7d966f06c638afe4f08dec2594428ac7bb --- /dev/null +++ b/examples/example_100.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a84b34d0f622db24cc33b17b7da038a060e6aaa56ad265ca055dff9806d4046c +size 37298 diff --git a/examples/example_11.jpg b/examples/example_11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c8e81365f90415a01d7490b4473de4f8c790048 --- /dev/null +++ b/examples/example_11.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f3c99c7182507503439da83e49021c2562539b6e43a2edc81154a520d8f4fff +size 36840 diff --git a/examples/example_12.jpg b/examples/example_12.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d18c273eda861fc10ec527596d23fd4e4409d86 --- /dev/null +++ b/examples/example_12.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:feff575d50024098001ca1c771d27b7a263cd5fd40e2ba1c2f67b53033698fb8 +size 37150 diff --git a/examples/example_13.jpg b/examples/example_13.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a9535b1729d270293954f8279ea1eb91fcff897 --- /dev/null +++ b/examples/example_13.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:120063c1cb2a9dc8b6f639bb69d5ce9665774897cc4cbd06e718e8117cd112c9 +size 41982 diff --git a/examples/example_14.jpg b/examples/example_14.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7f763461675e362b53ae90ff60fe2179e6b6105b --- /dev/null +++ b/examples/example_14.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abd1246d8f668ac7de50b047388853f386e2e33c45c9ebf4201226583c3eff30 +size 35705 diff --git a/examples/example_15.jpg b/examples/example_15.jpg new file mode 100644 index 0000000000000000000000000000000000000000..84a688f483f8043b8025983f846eb5300c89db0b --- /dev/null +++ b/examples/example_15.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f201b77b25abea22e50c93c87581296f205ba64f9d455d00033ec68c899ab5f5 +size 25614 diff --git a/examples/example_16.jpg b/examples/example_16.jpg new file mode 100644 index 0000000000000000000000000000000000000000..885ed3f47e690d7307e83b33322db738c63652c3 --- /dev/null +++ b/examples/example_16.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25d4f76fb566043792e2dd4bb21ba1774be3940285747de23c56a42271a03fa2 +size 36673 diff --git a/examples/example_17.jpg b/examples/example_17.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d8c6b3e3606e5a1b0c5c660c34e573cfa3a5d05 --- /dev/null +++ b/examples/example_17.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5f8f0f33ba1754ecfc85f841cf7382559738b8493d4b509c6cddc261b6846c7 +size 30347 diff --git a/examples/example_18.jpg b/examples/example_18.jpg new file mode 100644 index 0000000000000000000000000000000000000000..322a2cfa407e5edf9808d4d319fce202793324b8 --- /dev/null +++ b/examples/example_18.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9741a1edb448b1cc3d04a7ff9cea8d297940ed6501c0ecde70351ec0dd341487 +size 20393 diff --git a/examples/example_19.jpg b/examples/example_19.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f83348b3a1323a82a767db1cfea3187c4852dcef --- /dev/null +++ b/examples/example_19.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10440a2fcabaa66e4f24fceeb338710a9da91e42eb753c65fd68c82a394a317c +size 47762 diff --git a/examples/example_2.jpg b/examples/example_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d821e2f0c0ea1d934afca174ba0dbc39a135e88d --- /dev/null +++ b/examples/example_2.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06428dff5f08982296a711ea236acd9303a5c33df4645a9fd9ece74f009ea7ca +size 22027 diff --git a/examples/example_20.jpg b/examples/example_20.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dd21960c43b8302bc44157877848058264abc046 --- /dev/null +++ b/examples/example_20.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca8d56c8a4e2e752fc33df9849b7d81016efc54ae9b760e1666af2a01378d1b2 +size 25211 diff --git a/examples/example_21.jpg b/examples/example_21.jpg new file mode 100644 index 0000000000000000000000000000000000000000..322fbaf6d88f4de242ec5764ffa550203c424b9a --- /dev/null +++ b/examples/example_21.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa0a0574067c1078feac3884bd257301ea3f86bf8be590d87ab673af1add1439 +size 25249 diff --git a/examples/example_22.jpg b/examples/example_22.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0485dc88c16ea5fa7569baa6c89e829a89b32248 --- /dev/null +++ b/examples/example_22.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:179aa0716e48ac70bdaacad8ec4dcf6d0e8eaa08aba657297f3ef471ba28e88c +size 27828 diff --git a/examples/example_23.jpg b/examples/example_23.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08390ffbdbcc451bbbdf461b9036fe67dd86ea8c --- /dev/null +++ b/examples/example_23.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc432b3446ca2b4718c32104ebb4da88705096c9d56912b5141e3ef3c4323597 +size 24822 diff --git a/examples/example_24.jpg b/examples/example_24.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67b02cfd01a891691f15ee682d03e72c301fef55 --- /dev/null +++ b/examples/example_24.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1690c259b1c24e309f513cb71b712f96f467f6f2a3d5eb07f9c9f3105600e8d3 +size 26963 diff --git a/examples/example_25.jpg b/examples/example_25.jpg new file mode 100644 index 0000000000000000000000000000000000000000..592225671b9d4361454253d3a8c96d8bddb6cb32 --- /dev/null +++ b/examples/example_25.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d01f877d4f25a5b4cea6643f3791d2b755801c3f1df1b517daa5c2ec93414d82 +size 36692 diff --git a/examples/example_26.jpg b/examples/example_26.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e41733582fe508d6b21e4a0ec11dd18405443cfb --- /dev/null +++ b/examples/example_26.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07ae22dd08c3c833ec53e5d6a2127bb6d40a9da0e5fe2063c6b04d4428f78ace +size 24619 diff --git a/examples/example_27.jpg b/examples/example_27.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91ab2e03050a9e5ab364051ec68bb97a0fb6a834 --- /dev/null +++ b/examples/example_27.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5acc4406c33e61f90a4fd091980376f0d2d6a430da27cfdfe9a53115a50042d1 +size 35449 diff --git a/examples/example_28.jpg b/examples/example_28.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a64994c95b90b88d17a29dbe7277a2b7908e84db --- /dev/null +++ b/examples/example_28.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9471ca447354096ed7588ce5a5302aeeede317f08dfe05f9719c8ff1d90982b8 +size 23471 diff --git a/examples/example_29.jpg b/examples/example_29.jpg new file mode 100644 index 0000000000000000000000000000000000000000..79560638c4f3eea1f4b8d3ae551a1bef96d14e3a --- /dev/null +++ b/examples/example_29.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e376d09e84d6d116cb11de8419fa4cb9d16b8c14be5f5246d4b47e2d0b87d90 +size 37675 diff --git a/examples/example_3.jpg b/examples/example_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b80e3abb615d4dab5c4d924d41ba911dda030995 --- /dev/null +++ b/examples/example_3.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd34cbe3e3a0812d1cf2805753c49d2ff7066f966bd1a5f4236b810242e1cfee +size 42431 diff --git a/examples/example_30.jpg b/examples/example_30.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b18339a29e1e978674175595ae84495ecd06999 --- /dev/null +++ b/examples/example_30.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2def7f3173adbcf609125f1b990954eab9fd5689c3c43d937c82b64a0abe53d +size 37471 diff --git a/examples/example_31.jpg b/examples/example_31.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f76c3c9f75c3620b907c78df34f4317a9b08785 --- /dev/null +++ b/examples/example_31.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab666475b9a6295c5be866d70da3496af8f0061e0d7f1159e69184a5a4881f96 +size 32912 diff --git a/examples/example_32.jpg b/examples/example_32.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a277e58571ea1e895a0d1ba6d866fd35fc8223c --- /dev/null +++ b/examples/example_32.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8462c6acc8d955ceb047490a82ed691c109a704a216d4342823845f06eabadc +size 28153 diff --git a/examples/example_33.jpg b/examples/example_33.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52bdfe2e6c0b0e20d46a3def551b64c6a13e369c --- /dev/null +++ b/examples/example_33.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1f5e6ebbae1119fe373ffd8fa58fc6796d2e12603963711920e0d5b4ce7d732 +size 30830 diff --git a/examples/example_34.jpg b/examples/example_34.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6bfdc108ff8aed34c45bc162e882f2e6ff75f9be --- /dev/null +++ b/examples/example_34.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c67feab8c7f27ce4f89349613d33e5ce6f9b530cb5a922e61450d60271cc556f +size 36737 diff --git a/examples/example_35.jpg b/examples/example_35.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8ac490d5158ce4a6944f950b5d334c3eb96e10d0 --- /dev/null +++ b/examples/example_35.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccbbc8b9e5a3caf566fa82c0b78907c789b67acef46488420813f775685f91eb +size 42133 diff --git a/examples/example_36.jpg b/examples/example_36.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3d9b945ddeef0c062fc1382508441f1e7a49d5c --- /dev/null +++ b/examples/example_36.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdb7a30d51453d0252940d614aa74eee7533d2d1fc42fd0ce04589d1ae7a906b +size 29689 diff --git a/examples/example_37.jpg b/examples/example_37.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a78ba928f148c1ad1801752e3eea550374f342dd --- /dev/null +++ b/examples/example_37.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c312bb00ef74f0fcdcca8ff024df821ff292c86580885d2adca401940ff1f5a9 +size 49839 diff --git a/examples/example_38.jpg b/examples/example_38.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f625905e0929e4e82652b38310fdfdbeace46ebc --- /dev/null +++ b/examples/example_38.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8090785b4167b2e1a77c244c13387a05d3e850559cf3e695c50ca32fea324aa +size 38462 diff --git a/examples/example_39.jpg b/examples/example_39.jpg new file mode 100644 index 0000000000000000000000000000000000000000..403ecd7693ca28e5f09b7ffcabf4aa694b3f7dfd --- /dev/null +++ b/examples/example_39.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:884bf3b94a8be218581ff59d07d839d8ac1d873ed0b94a7890348b3f8f4b4db9 +size 27948 diff --git a/examples/example_4.jpg b/examples/example_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe0b78347f06185084f4cade02e4d64ada409b61 --- /dev/null +++ b/examples/example_4.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89c1942305d0232ecdca336cbb4ba3b866f21bcd963080d4d2faf33c088f7fcc +size 37676 diff --git a/examples/example_40.jpg b/examples/example_40.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f1d78962e888c574ff98fd678a39d589d5226647 --- /dev/null +++ b/examples/example_40.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb03f5cf942bef6fea14e6f4bfdc3fe4f95c52455bf0a47241b7919809ff7857 +size 38377 diff --git a/examples/example_41.jpg b/examples/example_41.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df5093e84e4d7144bb494d5945a41922a9c7ecfb --- /dev/null +++ b/examples/example_41.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24f077b54ae43928546d45542f3515b13862d5e8540a1cfb0c99030fb710daba +size 35458 diff --git a/examples/example_42.jpg b/examples/example_42.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b3700fd792620491b23d43dedc30530e0ef9dbf0 --- /dev/null +++ b/examples/example_42.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d79a94b3da8a51583d5f9fdfbe34a0bf835c6f0b3f223d9ab422cba13cfbec4 +size 33052 diff --git a/examples/example_43.jpg b/examples/example_43.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b30908955da020e6c4e4bc1ea1ea18769009a32 --- /dev/null +++ b/examples/example_43.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:502846d7aee6026ec258d783e342e9b8f5e11fe66217c2c43c8d91b2b39069f6 +size 38188 diff --git a/examples/example_44.jpg b/examples/example_44.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54e437111bd3ee02e4ca2607ea8ae407309e27f7 --- /dev/null +++ b/examples/example_44.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6bca0dfff4b2d5c24de861f5340f52fdfcda82759b673b96429be6cc4873c3c +size 32315 diff --git a/examples/example_45.jpg b/examples/example_45.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9631f1b0f99503e9346e169e5606ebed68e525e8 --- /dev/null +++ b/examples/example_45.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:716ba7bf5ebcb920a84329ba62520f49e12b939c78e30063fb6f49fa2cf4ed11 +size 36540 diff --git a/examples/example_46.jpg b/examples/example_46.jpg new file mode 100644 index 0000000000000000000000000000000000000000..437c21948fed5c6d3ac201a4f85f2a784cafbbc7 --- /dev/null +++ b/examples/example_46.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acef3ce41bd418559e39df5cbad1a0ed61c31c9969b3d82eadc1ae742fb11828 +size 25733 diff --git a/examples/example_47.jpg b/examples/example_47.jpg new file mode 100644 index 0000000000000000000000000000000000000000..759f25c690fc728be28f2c252c40ef734ae6b3cb --- /dev/null +++ b/examples/example_47.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:428305c03b08215aef12c27539a6aba475a9b9d2e54029ae52cdf0833df21665 +size 25690 diff --git a/examples/example_48.jpg b/examples/example_48.jpg new file mode 100644 index 0000000000000000000000000000000000000000..71af2afc55a7716cd15640a22aae0e65993eb226 --- /dev/null +++ b/examples/example_48.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2786dbfe16c78ee7767c775f54eb2f611d75b9875752aad7a9c8ebad10b6caa4 +size 21881 diff --git a/examples/example_49.jpg b/examples/example_49.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc46c02e044be5dcc790eebbfaebfc4206c14c99 --- /dev/null +++ b/examples/example_49.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d23a2d30fdca9d9ba4a5c133c6a8fe1420f836f6fc4542a312c61662ecaac4e7 +size 34183 diff --git a/examples/example_5.jpg b/examples/example_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40bd49001cc0fa79cb66bec0a98434f219cd5a2c --- /dev/null +++ b/examples/example_5.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ded0010ca0c18488a58e9f55aa240ff9d1c4f8175d53296cd5569c6ef8c05a7 +size 39365 diff --git a/examples/example_50.jpg b/examples/example_50.jpg new file mode 100644 index 0000000000000000000000000000000000000000..06bed9674380e0c29f252cba201f771b15c669d2 --- /dev/null +++ b/examples/example_50.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7007d658dd180587ab6e4b5cb23ee154ed9aa2874b5a650b8e35ef4a8f1c30a6 +size 27050 diff --git a/examples/example_51.jpg b/examples/example_51.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4d4922b5e323efb09a1d42234cea392e4a2c5a0 --- /dev/null +++ b/examples/example_51.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bef3075fc8f2008d517b901b3e8d59b0f27dc565039922f419317982596c6fd +size 26182 diff --git a/examples/example_52.jpg b/examples/example_52.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c9c1dfd625b04a4617c4b1a764b44d596ae07ba --- /dev/null +++ b/examples/example_52.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f6b9757370c65d97be750ae1f81b74f1a7a2ac94949f8a467e8f19609c83aaa +size 28331 diff --git a/examples/example_53.jpg b/examples/example_53.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f381ccb7fefd76463bab96afac8cbb322912c2aa --- /dev/null +++ b/examples/example_53.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f66006bab5d60b5125bebbbc07bccee518837d9cb9fa53d50445e952f3857e5 +size 28811 diff --git a/examples/example_54.jpg b/examples/example_54.jpg new file mode 100644 index 0000000000000000000000000000000000000000..30c365d66723214941173a618db3e9f72cf28288 --- /dev/null +++ b/examples/example_54.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3619133142e78a8805b91ffa3b6f01d001c10026f48b89a3383f7bf8320bfad9 +size 20332 diff --git a/examples/example_55.jpg b/examples/example_55.jpg new file mode 100644 index 0000000000000000000000000000000000000000..86d07a30b8b0737d75e78bd7f6440735d8d63a33 --- /dev/null +++ b/examples/example_55.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a37d42c02b1b4925838b0adba4af9d755f3c9cf6bd086d80ce53b702291adbd +size 45201 diff --git a/examples/example_56.jpg b/examples/example_56.jpg new file mode 100644 index 0000000000000000000000000000000000000000..adf30410fdcc80969e6aa6aa0d51f59977a24d3f --- /dev/null +++ b/examples/example_56.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df5f5d1d703b5a808d2d48bf26e95a5e6e787fa92a10ea139e7776090f94cc8d +size 39243 diff --git a/examples/example_57.jpg b/examples/example_57.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a78831a99ff8d03657edd48a571e396531badf04 --- /dev/null +++ b/examples/example_57.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c10883813137c7a843146bc4b7c0779826d90ae4a4eaeae05cf144ec667d5f3 +size 39890 diff --git a/examples/example_58.jpg b/examples/example_58.jpg new file mode 100644 index 0000000000000000000000000000000000000000..64ad2d9c875dea82de38cfe88783dd316b2523a1 --- /dev/null +++ b/examples/example_58.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c176a3a6604ebc51dc169a59fe63926246f57587a6c24f766bad8df58adaa1be +size 43262 diff --git a/examples/example_59.jpg b/examples/example_59.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7715a5885e96af572ea31d3a406136ab1e0289b1 --- /dev/null +++ b/examples/example_59.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c7063c56669a8f01292608ced9ee88d04fcc8c4b7ecb8514b5a821c0f76f700 +size 23380 diff --git a/examples/example_6.jpg b/examples/example_6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54104d361240e520bd540d66bf109ea60289b20a --- /dev/null +++ b/examples/example_6.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22be8f8592037beda04c466c5f6efa3906c3b969b3d83ebdd404025e30a12176 +size 39734 diff --git a/examples/example_60.jpg b/examples/example_60.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2760b11f78e9b229754d2d10006b73492a094c0d --- /dev/null +++ b/examples/example_60.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f7c6ed9e132d4e07c0942cd90ac1e703e12207bf419cd6cd7e28d8e87bfd944 +size 34693 diff --git a/examples/example_61.jpg b/examples/example_61.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8daff6bb2159dd96d238adccbcac51052536b718 --- /dev/null +++ b/examples/example_61.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d82d0f66c5a762899caf1fe47b9912e14c2ddad8ba9adfcce9baf69ee5c7b8c +size 25005 diff --git a/examples/example_62.jpg b/examples/example_62.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8822db996db7b4b1e041e05ffdedacb502d93d82 --- /dev/null +++ b/examples/example_62.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:263f6d345b7112c0567fe5743dd4ed7f6953c83aec9161b24e56fc7063fa7726 +size 47830 diff --git a/examples/example_63.jpg b/examples/example_63.jpg new file mode 100644 index 0000000000000000000000000000000000000000..770b27c3c20c946ed83b261b21bff34518815efd --- /dev/null +++ b/examples/example_63.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff6b2a2e6b17f15556bfdb329e3c23c616cabebbaf6eb54454a99348e5ce7edd +size 28815 diff --git a/examples/example_64.jpg b/examples/example_64.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c921ce98abecce9dc24bff10bd0541d4b90db95 --- /dev/null +++ b/examples/example_64.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2165b50e9a2269bc501edfc3a85cfbd598f0491d3ec97eb529bfc69dfad4c623 +size 28247 diff --git a/examples/example_65.jpg b/examples/example_65.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c830578dc5076af59138b6a0a260eff557d29180 --- /dev/null +++ b/examples/example_65.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ae600bc7dea09a3e66bd3ba36fffce9a5b1a61dc4b9cfbf92e79381a5941257 +size 24844 diff --git a/examples/example_66.jpg b/examples/example_66.jpg new file mode 100644 index 0000000000000000000000000000000000000000..138eb2b76a86ecd671ae32b2c63ea2b2b7d30d23 --- /dev/null +++ b/examples/example_66.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8ab5bbc36764c72b4ee4b9a02c71b482c496c7119c7974165b5905b74e71301 +size 41184 diff --git a/examples/example_67.jpg b/examples/example_67.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3523927d5a6d2979940629c48abde0e3122e84ad --- /dev/null +++ b/examples/example_67.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c64714c45539b1c6a84b77f0b517a83e4bd5828e8961d41ddede91fb2330d8a8 +size 28515 diff --git a/examples/example_68.jpg b/examples/example_68.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d565903949cb5c2469d4bcedafb9ad859bd35b01 --- /dev/null +++ b/examples/example_68.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d65fce83f9f5413cceba7021b60b3814be5a0055400a1c5654c31b5d379cb89d +size 39467 diff --git a/examples/example_69.jpg b/examples/example_69.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7821479dc76234a641c32d9425d1e20c1a2026be --- /dev/null +++ b/examples/example_69.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61cf80ee48d62e94a6f6a13088ba26fb4785f9e1dd9037d57d197b7e9740acd5 +size 30840 diff --git a/examples/example_7.jpg b/examples/example_7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..99fc213d48bf268a5a268653ade2bf9eb6fb889e --- /dev/null +++ b/examples/example_7.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f382b7a2865889161609a5e0d4725c3811a417cb28c78cd5b12a4fbf48a61899 +size 40649 diff --git a/examples/example_70.jpg b/examples/example_70.jpg new file mode 100644 index 0000000000000000000000000000000000000000..70d4e9da3c8387fa8b07bdb9572fd92dead765f7 --- /dev/null +++ b/examples/example_70.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f46fc6e6c476a81d8f1da824858b8da54690d11f81f05f6549f6fad57ff11654 +size 35337 diff --git a/examples/example_71.jpg b/examples/example_71.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89a1642e8c472e211cde80f4dedf17efa87eff01 --- /dev/null +++ b/examples/example_71.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4124c2a9e76931e5b8fe97f4cbeb76c576db34abf5981613737cbde1303c54c +size 26810 diff --git a/examples/example_72.jpg b/examples/example_72.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b8e98b8cf68337126d3861d386e6fbdff9938611 --- /dev/null +++ b/examples/example_72.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:268bafa5a9f74a221d55ac90114c198ae398442540ded0252697cf2cd2748f23 +size 36653 diff --git a/examples/example_73.jpg b/examples/example_73.jpg new file mode 100644 index 0000000000000000000000000000000000000000..acb948d80aaccf951eeb0b4ffd58bfec7d9eb9a6 --- /dev/null +++ b/examples/example_73.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:873e96979c312d4883528d7fc3ba4d2bd9a5016818e4a66b67aabbce2cb21515 +size 31592 diff --git a/examples/example_74.jpg b/examples/example_74.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e87e75a68d9a57110c32089f880b527a5c49372f --- /dev/null +++ b/examples/example_74.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:643d4e3221d62dc90ba741397be5cc8a6b8f67f8d22a558ecda2b7a3c8de08f8 +size 38201 diff --git a/examples/example_75.jpg b/examples/example_75.jpg new file mode 100644 index 0000000000000000000000000000000000000000..06eeba72cef4ef64d64029a4e1e2d7c0484a4b5c --- /dev/null +++ b/examples/example_75.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0191775cf7ab88f00a02976eabd23404178c30227abbfc7fc499b9b6110226f2 +size 35507 diff --git a/examples/example_76.jpg b/examples/example_76.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36a5c20e69eeb685ab1c11e247ca0fcad2e469e6 --- /dev/null +++ b/examples/example_76.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cab85a6ccd24c1a4a40f29fb6630b853203e35fd8b6f74cda6488c0f9eeb6fe0 +size 28813 diff --git a/examples/example_77.jpg b/examples/example_77.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a42ed58a014450f93bf7bcf4c7790fbe821eef7d --- /dev/null +++ b/examples/example_77.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbe2adda4d7320d2969902b7180a689b21731e8ebd41a9f22a91cc5cc209a348 +size 22802 diff --git a/examples/example_78.jpg b/examples/example_78.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fa1ec0a1f95452cf63c45dddbed038113b6cca0e --- /dev/null +++ b/examples/example_78.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30244ab810f9fe6062dedcd29f5a62a4c151ceb0a91f2dcdb09746ea2c800e46 +size 42307 diff --git a/examples/example_79.jpg b/examples/example_79.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db5a663120e0fdd61ea286fb9431a1853840cd62 --- /dev/null +++ b/examples/example_79.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bf0bca6a2d3ecfb09a12c7e9f67100f614cb38803b368c6831db8e3f944d0bc +size 39536 diff --git a/examples/example_8.jpg b/examples/example_8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..497629ed64a54956f0f1a01f430eb64e6828d2c7 --- /dev/null +++ b/examples/example_8.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b659d3ff3ebab4364afe0707a946d002221aa27d45f00ce9fcf76760df011cba +size 24475 diff --git a/examples/example_80.jpg b/examples/example_80.jpg new file mode 100644 index 0000000000000000000000000000000000000000..655b28b69f50a4863607adf77402078a0db68a52 --- /dev/null +++ b/examples/example_80.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcf8bd5ea6e2557fcba910b2a70778e402701d6da682e332baba20f6df8b78b0 +size 27462 diff --git a/examples/example_81.jpg b/examples/example_81.jpg new file mode 100644 index 0000000000000000000000000000000000000000..05ec4fddf6c40be8a43ecc27a4a7f1f26fa64887 --- /dev/null +++ b/examples/example_81.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f50e7aa5d2364b327f1763591611225210714b2fea2b7b1a64f83c5b20d2ed8 +size 33979 diff --git a/examples/example_82.jpg b/examples/example_82.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe55386b45a0099b69d7798c1e65b6abbee3d30b --- /dev/null +++ b/examples/example_82.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:510e167ce3d610e376f5171597348bdba51d0c556fa91c83b86e9b88499b6b25 +size 39274 diff --git a/examples/example_83.jpg b/examples/example_83.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4d4922b5e323efb09a1d42234cea392e4a2c5a0 --- /dev/null +++ b/examples/example_83.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bef3075fc8f2008d517b901b3e8d59b0f27dc565039922f419317982596c6fd +size 26182 diff --git a/examples/example_84.jpg b/examples/example_84.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95532d323f075b9a0e23ee3ef71dc562a1f05d0b --- /dev/null +++ b/examples/example_84.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2fcf66ac610c4d3890f8fc7ae0568a15202ef1c338998af0832358e35b80041 +size 36109 diff --git a/examples/example_85.jpg b/examples/example_85.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3329c5b0073bddecbae15e3f8720c614a7956d9e --- /dev/null +++ b/examples/example_85.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:860fb9e48458e7c1cfada9f0bbb80a0c8c3289d8a3f04cbbcf50b5380c85c98f +size 26237 diff --git a/examples/example_86.jpg b/examples/example_86.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b1bcf700491dae69f49c13fe8172f1acfb1d0b4e --- /dev/null +++ b/examples/example_86.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd062403db3eb592687af220d32a4e00fba8cc83a442d9f96a3dfe15c8660ed1 +size 43899 diff --git a/examples/example_87.jpg b/examples/example_87.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32a6f1753eabe55932801aa528a387bd227f0d6d --- /dev/null +++ b/examples/example_87.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3001332a165a5f4d57395a969e6542208bcc87e9cc69218aa28ec4eec1c5ea41 +size 34403 diff --git a/examples/example_88.jpg b/examples/example_88.jpg new file mode 100644 index 0000000000000000000000000000000000000000..742016002965ce3b121363b684cfb468cc5cfb92 --- /dev/null +++ b/examples/example_88.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e92b1fcda840de497bf86c513e1502f232282ab53eac50b99f3b92f55855245f +size 20143 diff --git a/examples/example_89.jpg b/examples/example_89.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c7a9f1cd3585f6efc3223c0e23df779a8f2e3371 --- /dev/null +++ b/examples/example_89.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49888104b447b173b2b4cbb3fbc478b5fffb7ef2770b837a22615a0c76c4fc4b +size 30537 diff --git a/examples/example_9.jpg b/examples/example_9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd85e91d8311168124e41e1cf29d45e8ce378551 --- /dev/null +++ b/examples/example_9.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6445b3d7b5798502118868e6088e634270ba3cba41c661e2492a09da95759c23 +size 42080 diff --git a/examples/example_90.jpg b/examples/example_90.jpg new file mode 100644 index 0000000000000000000000000000000000000000..790c8750d582b1ff5271dae105bce4710656d95a --- /dev/null +++ b/examples/example_90.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cc20fe7f948c738e8455a2946a70a695c4d887da618bdbf3a447097c0126abb +size 21701 diff --git a/examples/example_91.jpg b/examples/example_91.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e812a95c34b7bfffff510f3e3f041eaa84b80eb6 --- /dev/null +++ b/examples/example_91.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46c02711d83aeeae333b3aeb89d3c5049c50619fb0ec8a6d361b5a9b31b8017f +size 36841 diff --git a/examples/example_92.jpg b/examples/example_92.jpg new file mode 100644 index 0000000000000000000000000000000000000000..05b1169345328f106428525354a66cf109ed752f --- /dev/null +++ b/examples/example_92.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5ae1bdbec64cba84ba0e0a7ae83151dd6e5a407be6138f9ae4209f0535089e7 +size 29536 diff --git a/examples/example_93.jpg b/examples/example_93.jpg new file mode 100644 index 0000000000000000000000000000000000000000..17a19c7792f5807ca7c8dda6df37f942c7ab3d68 --- /dev/null +++ b/examples/example_93.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0b27781f9d605ff5fbf2c78573b8bd8ea8fed671d01b5ea93b73dbd736694dc +size 33497 diff --git a/examples/example_94.jpg b/examples/example_94.jpg new file mode 100644 index 0000000000000000000000000000000000000000..53204bc779c41806de567178dfce8ff86fdfe226 --- /dev/null +++ b/examples/example_94.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8f29b98b089ba0f21dec96d3b43fc9b06af403f26a0bb987900e475f2baf8ee +size 23301 diff --git a/examples/example_95.jpg b/examples/example_95.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0984e322f8916dabcb9901f8fc885871bf183c3 --- /dev/null +++ b/examples/example_95.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a634dc9c75dfa7cf014e0939aaac7dba5e6dfe51198d339656df8c8ca760c07c +size 27926 diff --git a/examples/example_96.jpg b/examples/example_96.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5164d509bd206139b2ce828a54ab11929bb07d4 --- /dev/null +++ b/examples/example_96.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3278aaf848d45f7a24e0ded407db5ee48494d3c7ddbf6223f8d35852d231d330 +size 31515 diff --git a/examples/example_97.jpg b/examples/example_97.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0f8a244602d1b919049e256d4d26b91313ecfb1 --- /dev/null +++ b/examples/example_97.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b6f37d2404a163cbf0c984a4c105e603445697f8da98959cc0cf47bb30c758f +size 30182 diff --git a/examples/example_98.jpg b/examples/example_98.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2a6131bdf44c2a67a71a6ecc8b4248511d530b66 --- /dev/null +++ b/examples/example_98.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ce38f481ce2bff0610392925291d25326c4a37f3bb83563611c52e1278953d0 +size 19237 diff --git a/examples/example_99.jpg b/examples/example_99.jpg new file mode 100644 index 0000000000000000000000000000000000000000..356671d5eeabae741b3b193c24c401d0083c8eb1 --- /dev/null +++ b/examples/example_99.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e0f992240d7beefb8179c07e36bbc3fbd7876fa7a44d8d17966588b2cb88200 +size 35345 diff --git a/model/mit.py b/model/mit.py new file mode 100644 index 0000000000000000000000000000000000000000..efc001e499aba0a5ef18fcb3973e24955c80e3e4 --- /dev/null +++ b/model/mit.py @@ -0,0 +1,427 @@ +# --------------------------------------------------------------- +# Copyright (c) 2021, NVIDIA Corporation. All rights reserved. +# +# This work is licensed under the NVIDIA Source Code License +# --------------------------------------------------------------- +import torch +import torch.nn as nn +from functools import partial + +from timm.models.layers import DropPath, to_2tuple, trunc_normal_ +import math + + +class Mlp(nn.Module): + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.dwconv = DWConv(hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + elif isinstance(m, nn.Conv2d): + fan_out = m.kernel_size[0] * m.kernel_size[1] * m.out_channels + fan_out //= m.groups + m.weight.data.normal_(0, math.sqrt(2.0 / fan_out)) + if m.bias is not None: + m.bias.data.zero_() + + def forward(self, x, H, W): + x = self.fc1(x) + x = self.dwconv(x, H, W) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +class Attention(nn.Module): + def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0., sr_ratio=1): + super().__init__() + assert dim % num_heads == 0, f"dim {dim} should be divided by num_heads {num_heads}." + + self.dim = dim + self.num_heads = num_heads + head_dim = dim // num_heads + self.scale = qk_scale or head_dim ** -0.5 + + self.q = nn.Linear(dim, dim, bias=qkv_bias) + self.kv = nn.Linear(dim, dim * 2, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + self.sr_ratio = sr_ratio + if sr_ratio > 1: + self.sr = nn.Conv2d( + dim, dim, kernel_size=sr_ratio, stride=sr_ratio) + self.norm = nn.LayerNorm(dim) + + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + elif isinstance(m, nn.Conv2d): + fan_out = m.kernel_size[0] * m.kernel_size[1] * m.out_channels + fan_out //= m.groups + m.weight.data.normal_(0, math.sqrt(2.0 / fan_out)) + if m.bias is not None: + m.bias.data.zero_() + + def forward(self, x, H, W): + B, N, C = x.shape + q = self.q(x).reshape(B, N, self.num_heads, C // + self.num_heads).permute(0, 2, 1, 3) + + if self.sr_ratio > 1: + x_ = x.permute(0, 2, 1).reshape(B, C, H, W) + x_ = self.sr(x_).reshape(B, C, -1).permute(0, 2, 1) + x_ = self.norm(x_) + kv = self.kv(x_).reshape(B, -1, 2, self.num_heads, + C // self.num_heads).permute(2, 0, 3, 1, 4) + else: + kv = self.kv(x).reshape(B, -1, 2, self.num_heads, C // + self.num_heads).permute(2, 0, 3, 1, 4) + k, v = kv[0], kv[1] + + attn = (q @ k.transpose(-2, -1)) * self.scale + attn = attn.softmax(dim=-1) + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B, N, C) + x = self.proj(x) + x = self.proj_drop(x) + + return x + + +class Block(nn.Module): + + def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0., + drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm, sr_ratio=1): + super().__init__() + self.norm1 = norm_layer(dim) + self.attn = Attention( + dim, + num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, + attn_drop=attn_drop, proj_drop=drop, sr_ratio=sr_ratio) + # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here + self.drop_path = DropPath( + drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, + act_layer=act_layer, drop=drop) + + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + elif isinstance(m, nn.Conv2d): + fan_out = m.kernel_size[0] * m.kernel_size[1] * m.out_channels + fan_out //= m.groups + m.weight.data.normal_(0, math.sqrt(2.0 / fan_out)) + if m.bias is not None: + m.bias.data.zero_() + + def forward(self, x, H, W): + x = x + self.drop_path(self.attn(self.norm1(x), H, W)) + x = x + self.drop_path(self.mlp(self.norm2(x), H, W)) + + return x + + +class OverlapPatchEmbed(nn.Module): + """ Image to Patch Embedding + """ + + def __init__(self, img_size=224, patch_size=7, stride=4, in_chans=3, embed_dim=768): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + + self.img_size = img_size + self.patch_size = patch_size + self.H, self.W = img_size[0] // patch_size[0], img_size[1] // patch_size[1] + self.num_patches = self.H * self.W + self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=stride, + padding=(patch_size[0] // 2, patch_size[1] // 2)) + self.norm = nn.LayerNorm(embed_dim) + + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + elif isinstance(m, nn.Conv2d): + fan_out = m.kernel_size[0] * m.kernel_size[1] * m.out_channels + fan_out //= m.groups + m.weight.data.normal_(0, math.sqrt(2.0 / fan_out)) + if m.bias is not None: + m.bias.data.zero_() + + def forward(self, x): + x = self.proj(x) + _, _, H, W = x.shape + x = x.flatten(2).transpose(1, 2) + x = self.norm(x) + + return x, H, W + + +class MixVisionTransformer(nn.Module): + def __init__(self, img_size=224, patch_size=16, in_chans=1, num_classes=1000, embed_dims=[64, 128, 256, 512], + num_heads=[1, 2, 4, 8], mlp_ratios=[4, 4, 4, 4], qkv_bias=False, qk_scale=None, drop_rate=0., + attn_drop_rate=0., drop_path_rate=0., norm_layer=nn.LayerNorm, + depths=[3, 4, 6, 3], sr_ratios=[8, 4, 2, 1]): + super().__init__() + self.num_classes = num_classes + self.depths = depths + + # patch_embed + self.patch_embed1 = OverlapPatchEmbed(img_size=img_size, patch_size=7, stride=4, in_chans=in_chans, + embed_dim=embed_dims[0]) + self.patch_embed2 = OverlapPatchEmbed(img_size=img_size // 4, patch_size=3, stride=2, in_chans=embed_dims[0], + embed_dim=embed_dims[1]) + self.patch_embed3 = OverlapPatchEmbed(img_size=img_size // 8, patch_size=3, stride=2, in_chans=embed_dims[1], + embed_dim=embed_dims[2]) + self.patch_embed4 = OverlapPatchEmbed(img_size=img_size // 16, patch_size=3, stride=2, in_chans=embed_dims[2], + embed_dim=embed_dims[3]) + + # transformer encoder + dpr = [x.item() for x in torch.linspace(0, drop_path_rate, + sum(depths))] # stochastic depth decay rule + cur = 0 + self.block1 = nn.ModuleList([Block( + dim=embed_dims[0], num_heads=num_heads[0], mlp_ratio=mlp_ratios[0], qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, drop_path=dpr[cur + + i], norm_layer=norm_layer, + sr_ratio=sr_ratios[0]) + for i in range(depths[0])]) + self.norm1 = norm_layer(embed_dims[0]) + + cur += depths[0] + self.block2 = nn.ModuleList([Block( + dim=embed_dims[1], num_heads=num_heads[1], mlp_ratio=mlp_ratios[1], qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, drop_path=dpr[cur + + i], norm_layer=norm_layer, + sr_ratio=sr_ratios[1]) + for i in range(depths[1])]) + self.norm2 = norm_layer(embed_dims[1]) + + cur += depths[1] + self.block3 = nn.ModuleList([Block( + dim=embed_dims[2], num_heads=num_heads[2], mlp_ratio=mlp_ratios[2], qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, drop_path=dpr[cur + + i], norm_layer=norm_layer, + sr_ratio=sr_ratios[2]) + for i in range(depths[2])]) + self.norm3 = norm_layer(embed_dims[2]) + + cur += depths[2] + self.block4 = nn.ModuleList([Block( + dim=embed_dims[3], num_heads=num_heads[3], mlp_ratio=mlp_ratios[3], qkv_bias=qkv_bias, qk_scale=qk_scale, + drop=drop_rate, attn_drop=attn_drop_rate, drop_path=dpr[cur + + i], norm_layer=norm_layer, + sr_ratio=sr_ratios[3]) + for i in range(depths[3])]) + self.norm4 = norm_layer(embed_dims[3]) + + # classification head + # self.head = nn.Linear(embed_dims[3], num_classes) if num_classes > 0 else nn.Identity() + + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + elif isinstance(m, nn.Conv2d): + fan_out = m.kernel_size[0] * m.kernel_size[1] * m.out_channels + fan_out //= m.groups + m.weight.data.normal_(0, math.sqrt(2.0 / fan_out)) + if m.bias is not None: + m.bias.data.zero_() + + def reset_drop_path(self, drop_path_rate): + dpr = [x.item() for x in torch.linspace( + 0, drop_path_rate, sum(self.depths))] + cur = 0 + for i in range(self.depths[0]): + self.block1[i].drop_path.drop_prob = dpr[cur + i] + + cur += self.depths[0] + for i in range(self.depths[1]): + self.block2[i].drop_path.drop_prob = dpr[cur + i] + + cur += self.depths[1] + for i in range(self.depths[2]): + self.block3[i].drop_path.drop_prob = dpr[cur + i] + + cur += self.depths[2] + for i in range(self.depths[3]): + self.block4[i].drop_path.drop_prob = dpr[cur + i] + + def freeze_patch_emb(self): + self.patch_embed1.requires_grad = False + + @torch.jit.ignore + def no_weight_decay(self): + # has pos_embed may be better + return {'pos_embed1', 'pos_embed2', 'pos_embed3', 'pos_embed4', 'cls_token'} + + def get_classifier(self): + return self.head + + def reset_classifier(self, num_classes, global_pool=''): + self.num_classes = num_classes + self.head = nn.Linear( + self.embed_dim, num_classes) if num_classes > 0 else nn.Identity() + + def forward_features(self, x): + B = x.shape[0] + outs = [] + + # stage 1 + x, H, W = self.patch_embed1(x) + for i, blk in enumerate(self.block1): + x = blk(x, H, W) + x = self.norm1(x) + x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous() + outs.append(x) + + # stage 2 + x, H, W = self.patch_embed2(x) + for i, blk in enumerate(self.block2): + x = blk(x, H, W) + x = self.norm2(x) + x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous() + outs.append(x) + + # stage 3 + x, H, W = self.patch_embed3(x) + for i, blk in enumerate(self.block3): + x = blk(x, H, W) + x = self.norm3(x) + x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous() + outs.append(x) + + # stage 4 + x, H, W = self.patch_embed4(x) + for i, blk in enumerate(self.block4): + x = blk(x, H, W) + x = self.norm4(x) + x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous() + outs.append(x) + + return outs + + def forward(self, x): + x = self.forward_features(x) + # x = self.head(x) + + return x + + +class DWConv(nn.Module): + def __init__(self, dim=768): + super(DWConv, self).__init__() + self.dwconv = nn.Conv2d(dim, dim, 3, 1, 1, bias=True, groups=dim) + + def forward(self, x, H, W): + B, N, C = x.shape + x = x.transpose(1, 2).view(B, C, H, W) + x = self.dwconv(x) + x = x.flatten(2).transpose(1, 2) + + return x + + +class mit_b0(MixVisionTransformer): + def __init__(self, **kwargs): + super(mit_b0, self).__init__( + patch_size=4, embed_dims=[32, 64, 160, 256], num_heads=[1, 2, 5, 8], mlp_ratios=[4, 4, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[2, 2, 2, 2], sr_ratios=[8, 4, 2, 1], + drop_rate=0.0, drop_path_rate=0.1) + + +class mit_b1(MixVisionTransformer): + def __init__(self, **kwargs): + super(mit_b1, self).__init__( + patch_size=4, embed_dims=[64, 128, 320, 512], num_heads=[1, 2, 5, 8], mlp_ratios=[4, 4, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[2, 2, 2, 2], sr_ratios=[8, 4, 2, 1], + drop_rate=0.0, drop_path_rate=0.1) + + +class mit_b2(MixVisionTransformer): + def __init__(self, **kwargs): + super(mit_b2, self).__init__( + patch_size=4, embed_dims=[64, 128, 320, 512], num_heads=[1, 2, 5, 8], mlp_ratios=[4, 4, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[3, 4, 6, 3], sr_ratios=[8, 4, 2, 1], + drop_rate=0.0, drop_path_rate=0.1) + + +class mit_b3(MixVisionTransformer): + def __init__(self, **kwargs): + super(mit_b3, self).__init__( + patch_size=4, embed_dims=[64, 128, 320, 512], num_heads=[1, 2, 5, 8], mlp_ratios=[4, 4, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[3, 4, 18, 3], sr_ratios=[8, 4, 2, 1], + drop_rate=0.0, drop_path_rate=0.1) + + +class mit_b4(MixVisionTransformer): + def __init__(self, **kwargs): + super(mit_b4, self).__init__( + patch_size=4, embed_dims=[64, 128, 320, 512], num_heads=[1, 2, 5, 8], mlp_ratios=[4, 4, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[3, 8, 27, 3], sr_ratios=[8, 4, 2, 1], + drop_rate=0.0, drop_path_rate=0.1) + + +class mit_b5(MixVisionTransformer): + def __init__(self, **kwargs): + super(mit_b5, self).__init__( + patch_size=4, embed_dims=[64, 128, 320, 512], num_heads=[1, 2, 5, 8], mlp_ratios=[4, 4, 4, 4], + qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[3, 6, 40, 3], sr_ratios=[8, 4, 2, 1], + drop_rate=0.0, drop_path_rate=0.1) + + +if __name__ == "__main__": + import pdb + + model = mit_b5() + pdb.set_trace() \ No newline at end of file diff --git a/model/model.py b/model/model.py new file mode 100644 index 0000000000000000000000000000000000000000..94b12bc4f7c3bc9689781279f4850a6002929a93 --- /dev/null +++ b/model/model.py @@ -0,0 +1,100 @@ +import torch +import torch.nn as nn + +from model.mit import mit_b4 + + +class GLPDepth(nn.Module): + def __init__(self, max_depth=10.0): + super().__init__() + self.max_depth = max_depth + + self.encoder = mit_b4() + + channels_in = [512, 320, 128] + channels_out = 64 + + self.decoder = Decoder(channels_in, channels_out) + + self.last_layer_depth = nn.Sequential( + nn.Conv2d(channels_out, channels_out, kernel_size=3, stride=1, padding=1), + nn.ReLU(inplace=False), + nn.Conv2d(channels_out, 1, kernel_size=3, stride=1, padding=1)) + + def forward(self, x): + conv1, conv2, conv3, conv4 = self.encoder(x) + out = self.decoder(conv1, conv2, conv3, conv4) + out_depth = self.last_layer_depth(out) + out_depth = torch.sigmoid(out_depth) * self.max_depth + + return out_depth + + +class Decoder(nn.Module): + def __init__(self, in_channels, out_channels): + super().__init__() + + self.bot_conv = nn.Conv2d( + in_channels=in_channels[0], out_channels=out_channels, kernel_size=1) + self.skip_conv1 = nn.Conv2d( + in_channels=in_channels[1], out_channels=out_channels, kernel_size=1) + self.skip_conv2 = nn.Conv2d( + in_channels=in_channels[2], out_channels=out_channels, kernel_size=1) + + self.up = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=False) + + self.fusion1 = SelectiveFeatureFusion(out_channels) + self.fusion2 = SelectiveFeatureFusion(out_channels) + self.fusion3 = SelectiveFeatureFusion(out_channels) + + def forward(self, x_1, x_2, x_3, x_4): + x_4_ = self.bot_conv(x_4) + out = self.up(x_4_) + + x_3_ = self.skip_conv1(x_3) + out = self.fusion1(x_3_, out) + out = self.up(out) + + x_2_ = self.skip_conv2(x_2) + out = self.fusion2(x_2_, out) + out = self.up(out) + + out = self.fusion3(x_1, out) + out = self.up(out) + out = self.up(out) + + return out + + +class SelectiveFeatureFusion(nn.Module): + def __init__(self, in_channel=64): + super().__init__() + + self.conv1 = nn.Sequential( + nn.Conv2d(in_channels=int(in_channel * 2), + out_channels=in_channel, kernel_size=3, stride=1, padding=1), + nn.BatchNorm2d(in_channel), + nn.ReLU()) + + self.conv2 = nn.Sequential( + nn.Conv2d(in_channels=in_channel, + out_channels=int(in_channel / 2), kernel_size=3, stride=1, padding=1), + nn.BatchNorm2d(int(in_channel / 2)), + nn.ReLU()) + + self.conv3 = nn.Conv2d(in_channels=int(in_channel / 2), + out_channels=2, kernel_size=3, stride=1, padding=1) + + self.sigmoid = nn.Sigmoid() + + def forward(self, x_local, x_global): + x = torch.cat((x_local, x_global), dim=1) + x = self.conv1(x) + x = self.conv2(x) + x = self.conv3(x) + attn = self.sigmoid(x) + + out = x_local * attn[:, 0, :, :].unsqueeze(1) + \ + x_global * attn[:, 1, :, :].unsqueeze(1) + + return out diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..736929d160a5c4b97fd23652b1fc86212ea990c2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +gradio==4.36.1 +matplotlib==3.9.0 +numpy==1.26.4 +open3d==0.18.0 +Pillow==10.3.0 +timm==1.0.3 +torch==2.3.0 \ No newline at end of file