Browse Source

more results

Felix Kleinsteuber 2 years ago
parent
commit
007915bc0a
100 changed files with 735 additions and 51 deletions
  1. 17 4
      approach1a_basic_frame_differencing.ipynb
  2. 16 12
      approach2_background_estimation.ipynb
  3. 3 4
      approach3_local_features.ipynb
  4. 8 14
      approach4_autoencoder.ipynb
  5. 3 2
      eval_autoencoder.py
  6. 8 1
      eval_bow.py
  7. 75 0
      generate_lapseless_session.ipynb
  8. BIN
      plots/approach1a/roc_curves/Beaver_01_absmean.pdf
  9. BIN
      plots/approach1a/roc_curves/Beaver_01_absmean_sigma2.pdf
  10. BIN
      plots/approach1a/roc_curves/Beaver_01_absmean_sigma2.png
  11. BIN
      plots/approach1a/roc_curves/Beaver_01_absmean_sigma4.pdf
  12. BIN
      plots/approach1a/roc_curves/Beaver_01_absmean_sigma4.png
  13. BIN
      plots/approach1a/roc_curves/Beaver_01_absvar.pdf
  14. BIN
      plots/approach1a/roc_curves/Beaver_01_absvar_sigma2.pdf
  15. BIN
      plots/approach1a/roc_curves/Beaver_01_absvar_sigma2.png
  16. BIN
      plots/approach1a/roc_curves/Beaver_01_absvar_sigma4.pdf
  17. BIN
      plots/approach1a/roc_curves/Beaver_01_sqmean.pdf
  18. BIN
      plots/approach1a/roc_curves/Beaver_01_sqmean_sigma2.pdf
  19. BIN
      plots/approach1a/roc_curves/Beaver_01_sqmean_sigma2.png
  20. BIN
      plots/approach1a/roc_curves/Beaver_01_sqmean_sigma4.pdf
  21. BIN
      plots/approach1a/roc_curves/Beaver_01_sqvar.pdf
  22. BIN
      plots/approach1a/roc_curves/Beaver_01_sqvar_sigma2.pdf
  23. BIN
      plots/approach1a/roc_curves/Beaver_01_sqvar_sigma2.png
  24. BIN
      plots/approach1a/roc_curves/Beaver_01_sqvar_sigma4.pdf
  25. BIN
      plots/approach1a/roc_curves/Marten_01_absmean.pdf
  26. BIN
      plots/approach1a/roc_curves/Marten_01_absmean.png
  27. BIN
      plots/approach1a/roc_curves/Marten_01_absmean_sigma2.pdf
  28. BIN
      plots/approach1a/roc_curves/Marten_01_absmean_sigma2.png
  29. BIN
      plots/approach1a/roc_curves/Marten_01_absmean_sigma4.pdf
  30. BIN
      plots/approach1a/roc_curves/Marten_01_absmean_sigma4.png
  31. BIN
      plots/approach1a/roc_curves/Marten_01_absvar.pdf
  32. BIN
      plots/approach1a/roc_curves/Marten_01_absvar.png
  33. BIN
      plots/approach1a/roc_curves/Marten_01_absvar_sigma2.pdf
  34. BIN
      plots/approach1a/roc_curves/Marten_01_absvar_sigma2.png
  35. BIN
      plots/approach1a/roc_curves/Marten_01_absvar_sigma4.pdf
  36. BIN
      plots/approach1a/roc_curves/Marten_01_absvar_sigma4.png
  37. BIN
      plots/approach1a/roc_curves/Marten_01_sqmean.pdf
  38. BIN
      plots/approach1a/roc_curves/Marten_01_sqmean.png
  39. BIN
      plots/approach1a/roc_curves/Marten_01_sqmean_sigma2.pdf
  40. BIN
      plots/approach1a/roc_curves/Marten_01_sqmean_sigma2.png
  41. BIN
      plots/approach1a/roc_curves/Marten_01_sqmean_sigma4.pdf
  42. BIN
      plots/approach1a/roc_curves/Marten_01_sqmean_sigma4.png
  43. BIN
      plots/approach1a/roc_curves/Marten_01_sqvar.pdf
  44. BIN
      plots/approach1a/roc_curves/Marten_01_sqvar.png
  45. BIN
      plots/approach1a/roc_curves/Marten_01_sqvar_sigma2.pdf
  46. BIN
      plots/approach1a/roc_curves/Marten_01_sqvar_sigma2.png
  47. BIN
      plots/approach1a/roc_curves/Marten_01_sqvar_sigma4.pdf
  48. BIN
      plots/approach1a/roc_curves/Marten_01_sqvar_sigma4.png
  49. BIN
      plots/approach2/roc_curves/Beaver_01_sqmean.pdf
  50. BIN
      plots/approach2/roc_curves/Beaver_01_sqmean_sigma2.pdf
  51. BIN
      plots/approach2/roc_curves/Beaver_01_sqmean_sigma4.pdf
  52. BIN
      plots/approach2/roc_curves/Beaver_01_sqvar.pdf
  53. BIN
      plots/approach2/roc_curves/Beaver_01_sqvar_sigma2.pdf
  54. BIN
      plots/approach2/roc_curves/Beaver_01_sqvar_sigma4.pdf
  55. BIN
      plots/approach2/roc_curves/GFox_03_sqmean.pdf
  56. BIN
      plots/approach2/roc_curves/GFox_03_sqmean.png
  57. BIN
      plots/approach2/roc_curves/GFox_03_sqmean_sigma4.pdf
  58. BIN
      plots/approach2/roc_curves/GFox_03_sqmean_sigma4.png
  59. BIN
      plots/approach2/roc_curves/GFox_03_sqvar.pdf
  60. BIN
      plots/approach2/roc_curves/GFox_03_sqvar.png
  61. BIN
      plots/approach2/roc_curves/GFox_03_sqvar_sigma4.pdf
  62. BIN
      plots/approach2/roc_curves/GFox_03_sqvar_sigma4.png
  63. BIN
      plots/approach2/roc_curves/Marten_01_sqmean.pdf
  64. BIN
      plots/approach2/roc_curves/Marten_01_sqmean.png
  65. BIN
      plots/approach2/roc_curves/Marten_01_sqvar.pdf
  66. BIN
      plots/approach2/roc_curves/Marten_01_sqvar.png
  67. BIN
      plots/approach3/roc_curves/Beaver_01_20_20_2048.pdf
  68. BIN
      plots/approach3/roc_curves/Beaver_01_20_20_2048.png
  69. BIN
      plots/approach3/roc_curves/Beaver_01_20_20_2048_random.pdf
  70. BIN
      plots/approach3/roc_curves/Beaver_01_20_20_2048_random.png
  71. BIN
      plots/approach3/roc_curves/Beaver_01_20_20_4096_random.pdf
  72. BIN
      plots/approach3/roc_curves/Beaver_01_20_20_4096_random.png
  73. BIN
      plots/approach3/roc_curves/Beaver_01_30_30_1024.pdf
  74. BIN
      plots/approach3/roc_curves/Beaver_01_30_30_1024.png
  75. BIN
      plots/approach3/roc_curves/Beaver_01_30_30_2048.pdf
  76. BIN
      plots/approach3/roc_curves/Beaver_01_30_30_2048.png
  77. BIN
      plots/approach3/roc_curves/Beaver_01_30_30_4096.pdf
  78. BIN
      plots/approach3/roc_curves/Beaver_01_30_30_4096.png
  79. BIN
      plots/approach3/roc_curves/Beaver_01_30_30_8192.pdf
  80. BIN
      plots/approach3/roc_curves/Beaver_01_30_30_8192.png
  81. BIN
      plots/approach3/roc_curves/Beaver_01_40_40_2048.pdf
  82. BIN
      plots/approach3/roc_curves/Beaver_01_40_40_2048.png
  83. BIN
      plots/approach3/roc_curves/GFox_03_30_30_4096_random.pdf
  84. BIN
      plots/approach3/roc_curves/GFox_03_30_30_4096_random.png
  85. BIN
      plots/approach3/roc_curves/Marten_01_30_30_4096_random.pdf
  86. BIN
      plots/approach3/roc_curves/Marten_01_30_30_4096_random.png
  87. BIN
      plots/approach4/roc_curves/GFox_03_kde.pdf
  88. BIN
      plots/approach4/roc_curves/GFox_03_kde.png
  89. BIN
      plots/approach4/roc_curves/GFox_03_loss.pdf
  90. BIN
      plots/approach4/roc_curves/GFox_03_loss.png
  91. BIN
      plots/approach4/roc_curves/Marten_01_kde.pdf
  92. BIN
      plots/approach4/roc_curves/Marten_01_kde.png
  93. BIN
      plots/approach4/roc_curves/Marten_01_loss.pdf
  94. BIN
      plots/approach4/roc_curves/Marten_01_loss.png
  95. 1 0
      py/Labels.py
  96. 16 0
      py/LocalFeatures.py
  97. 3 0
      py/Session.py
  98. 8 4
      quick_label.py
  99. 553 0
      read_csv_annotations.ipynb
  100. 24 10
      resize_session.ipynb

File diff suppressed because it is too large
+ 17 - 4
approach1a_basic_frame_differencing.ipynb


File diff suppressed because it is too large
+ 16 - 12
approach2_background_estimation.ipynb


File diff suppressed because it is too large
+ 3 - 4
approach3_local_features.ipynb


File diff suppressed because it is too large
+ 8 - 14
approach4_autoencoder.ipynb


+ 3 - 2
eval_autoencoder.py

@@ -110,10 +110,11 @@ def main():
     # Motion eval
 
     def is_labeled(filename: str) -> bool:
-        return int(filename[10:-4]) <= LABELS[session.name]["max"]
+        img_nr = int(filename[-9:-4])
+        return (img_nr <= LABELS[session.name]["max"]) and (img_nr not in LABELS[session.name]["not_annotated"])
 
     def labeler(filename: str) -> int:
-        is_normal = (int(filename[10:-4]) in LABELS[session.name]["normal"])
+        is_normal = (int(filename[-9:-4]) in LABELS[session.name]["normal"])
         return 0 if is_normal else 1
     
     if os.path.isfile(motion_eval_file):

+ 8 - 1
eval_bow.py

@@ -19,6 +19,7 @@ def main():
     parser.add_argument("--step_size", type=int, help="DSIFT keypoint step size. Smaller step size = more keypoints.", default=30)
     parser.add_argument("--keypoint_size", type=int, help="DSIFT keypoint size. Defaults to step_size.", default=-1)
     parser.add_argument("--include_motion", action="store_true", help="Include motion images for training.")
+    parser.add_argument("--random_prototypes", action="store_true", help="Pick random prototype vectors instead of doing kmeans.")
 
     args = parser.parse_args()
     if args.keypoint_size <= 0:
@@ -29,7 +30,13 @@ def main():
     session = ds.create_session(args.session_name)
     save_dir = f"./bow_train_NoBackup/{session.name}"
 
-    suffix = "_motion" if args.include_motion else ""
+    suffix = ""
+    if args.include_motion:
+        suffix += "_motion"
+        print("Including motion data for prototype selection!")
+    if args.random_prototypes:
+        suffix += "_random"
+        print("Picking random prototypes instead of using kmeans!")
     dictionary_file = os.path.join(save_dir, f"bow_dict_{args.step_size}_{args.keypoint_size}_{args.clusters}{suffix}.npy")
     train_feat_file = os.path.join(save_dir, f"bow_train_{args.step_size}_{args.keypoint_size}_{args.clusters}{suffix}.npy")
     eval_file = os.path.join(save_dir, f"bow_eval_{args.step_size}_{args.keypoint_size}_{args.clusters}{suffix}.csv")

File diff suppressed because it is too large
+ 75 - 0
generate_lapseless_session.ipynb


BIN
plots/approach1a/roc_curves/Beaver_01_absmean.pdf


BIN
plots/approach1a/roc_curves/Beaver_01_absmean_sigma2.pdf


BIN
plots/approach1a/roc_curves/Beaver_01_absmean_sigma2.png


BIN
plots/approach1a/roc_curves/Beaver_01_absmean_sigma4.pdf


BIN
plots/approach1a/roc_curves/Beaver_01_absmean_sigma4.png


BIN
plots/approach1a/roc_curves/Beaver_01_absvar.pdf


BIN
plots/approach1a/roc_curves/Beaver_01_absvar_sigma2.pdf


BIN
plots/approach1a/roc_curves/Beaver_01_absvar_sigma2.png


BIN
plots/approach1a/roc_curves/Beaver_01_absvar_sigma4.pdf


BIN
plots/approach1a/roc_curves/Beaver_01_sqmean.pdf


BIN
plots/approach1a/roc_curves/Beaver_01_sqmean_sigma2.pdf


BIN
plots/approach1a/roc_curves/Beaver_01_sqmean_sigma2.png


BIN
plots/approach1a/roc_curves/Beaver_01_sqmean_sigma4.pdf


BIN
plots/approach1a/roc_curves/Beaver_01_sqvar.pdf


BIN
plots/approach1a/roc_curves/Beaver_01_sqvar_sigma2.pdf


BIN
plots/approach1a/roc_curves/Beaver_01_sqvar_sigma2.png


BIN
plots/approach1a/roc_curves/Beaver_01_sqvar_sigma4.pdf


BIN
plots/approach1a/roc_curves/Marten_01_absmean.pdf


BIN
plots/approach1a/roc_curves/Marten_01_absmean.png


BIN
plots/approach1a/roc_curves/Marten_01_absmean_sigma2.pdf


BIN
plots/approach1a/roc_curves/Marten_01_absmean_sigma2.png


BIN
plots/approach1a/roc_curves/Marten_01_absmean_sigma4.pdf


BIN
plots/approach1a/roc_curves/Marten_01_absmean_sigma4.png


BIN
plots/approach1a/roc_curves/Marten_01_absvar.pdf


BIN
plots/approach1a/roc_curves/Marten_01_absvar.png


BIN
plots/approach1a/roc_curves/Marten_01_absvar_sigma2.pdf


BIN
plots/approach1a/roc_curves/Marten_01_absvar_sigma2.png


BIN
plots/approach1a/roc_curves/Marten_01_absvar_sigma4.pdf


BIN
plots/approach1a/roc_curves/Marten_01_absvar_sigma4.png


BIN
plots/approach1a/roc_curves/Marten_01_sqmean.pdf


BIN
plots/approach1a/roc_curves/Marten_01_sqmean.png


BIN
plots/approach1a/roc_curves/Marten_01_sqmean_sigma2.pdf


BIN
plots/approach1a/roc_curves/Marten_01_sqmean_sigma2.png


BIN
plots/approach1a/roc_curves/Marten_01_sqmean_sigma4.pdf


BIN
plots/approach1a/roc_curves/Marten_01_sqmean_sigma4.png


BIN
plots/approach1a/roc_curves/Marten_01_sqvar.pdf


BIN
plots/approach1a/roc_curves/Marten_01_sqvar.png


BIN
plots/approach1a/roc_curves/Marten_01_sqvar_sigma2.pdf


BIN
plots/approach1a/roc_curves/Marten_01_sqvar_sigma2.png


BIN
plots/approach1a/roc_curves/Marten_01_sqvar_sigma4.pdf


BIN
plots/approach1a/roc_curves/Marten_01_sqvar_sigma4.png


BIN
plots/approach2/roc_curves/Beaver_01_sqmean.pdf


BIN
plots/approach2/roc_curves/Beaver_01_sqmean_sigma2.pdf


BIN
plots/approach2/roc_curves/Beaver_01_sqmean_sigma4.pdf


BIN
plots/approach2/roc_curves/Beaver_01_sqvar.pdf


BIN
plots/approach2/roc_curves/Beaver_01_sqvar_sigma2.pdf


BIN
plots/approach2/roc_curves/Beaver_01_sqvar_sigma4.pdf


BIN
plots/approach2/roc_curves/GFox_03_sqmean.pdf


BIN
plots/approach2/roc_curves/GFox_03_sqmean.png


BIN
plots/approach2/roc_curves/GFox_03_sqmean_sigma4.pdf


BIN
plots/approach2/roc_curves/GFox_03_sqmean_sigma4.png


BIN
plots/approach2/roc_curves/GFox_03_sqvar.pdf


BIN
plots/approach2/roc_curves/GFox_03_sqvar.png


BIN
plots/approach2/roc_curves/GFox_03_sqvar_sigma4.pdf


BIN
plots/approach2/roc_curves/GFox_03_sqvar_sigma4.png


BIN
plots/approach2/roc_curves/Marten_01_sqmean.pdf


BIN
plots/approach2/roc_curves/Marten_01_sqmean.png


BIN
plots/approach2/roc_curves/Marten_01_sqvar.pdf


BIN
plots/approach2/roc_curves/Marten_01_sqvar.png


BIN
plots/approach3/roc_curves/Beaver_01_20_20_2048.pdf


BIN
plots/approach3/roc_curves/Beaver_01_20_20_2048.png


BIN
plots/approach3/roc_curves/Beaver_01_20_20_2048_random.pdf


BIN
plots/approach3/roc_curves/Beaver_01_20_20_2048_random.png


BIN
plots/approach3/roc_curves/Beaver_01_20_20_4096_random.pdf


BIN
plots/approach3/roc_curves/Beaver_01_20_20_4096_random.png


BIN
plots/approach3/roc_curves/Beaver_01_30_30_1024.pdf


BIN
plots/approach3/roc_curves/Beaver_01_30_30_1024.png


BIN
plots/approach3/roc_curves/Beaver_01_30_30_2048.pdf


BIN
plots/approach3/roc_curves/Beaver_01_30_30_2048.png


BIN
plots/approach3/roc_curves/Beaver_01_30_30_4096.pdf


BIN
plots/approach3/roc_curves/Beaver_01_30_30_4096.png


BIN
plots/approach3/roc_curves/Beaver_01_30_30_8192.pdf


BIN
plots/approach3/roc_curves/Beaver_01_30_30_8192.png


BIN
plots/approach3/roc_curves/Beaver_01_40_40_2048.pdf


BIN
plots/approach3/roc_curves/Beaver_01_40_40_2048.png


BIN
plots/approach3/roc_curves/GFox_03_30_30_4096_random.pdf


BIN
plots/approach3/roc_curves/GFox_03_30_30_4096_random.png


BIN
plots/approach3/roc_curves/Marten_01_30_30_4096_random.pdf


BIN
plots/approach3/roc_curves/Marten_01_30_30_4096_random.png


BIN
plots/approach4/roc_curves/GFox_03_kde.pdf


BIN
plots/approach4/roc_curves/GFox_03_kde.png


BIN
plots/approach4/roc_curves/GFox_03_loss.pdf


BIN
plots/approach4/roc_curves/GFox_03_loss.png


BIN
plots/approach4/roc_curves/Marten_01_kde.pdf


BIN
plots/approach4/roc_curves/Marten_01_kde.png


BIN
plots/approach4/roc_curves/Marten_01_loss.pdf


BIN
plots/approach4/roc_curves/Marten_01_loss.png


File diff suppressed because it is too large
+ 1 - 0
py/Labels.py


+ 16 - 0
py/LocalFeatures.py

@@ -71,6 +71,22 @@ def generate_dictionary_from_descriptors(dscs, dictionary_size: int):
     assert dictionary.shape == (dictionary_size, 128)
     return dictionary
 
+def pick_random_descriptors(dscs, dictionary_size: int):
+    """Picks dictionary_size random descriptors to use as a vocabulary.
+    Much faster but less accurate alternative to kmeans clustering.
+
+    Args:
+        dscs (np.array, shape(-1, 128)): (D)SIFT descriptors to pick from.
+        dictionary_size (int): Number of clusters / vocabulary size.
+
+    Returns:
+        np.array, shape=(dictionary_size, 128): Randomly picked BOW dictionary.
+    """
+    assert len(dscs.shape) == 2 and dscs.shape[1] == 128
+    assert dictionary_size > 0 and dictionary_size <= dscs.shape[0]
+
+    return dscs[np.random.choice(len(dscs), size=dictionary_size, replace=False)]
+
 def generate_bow_features(images: list[SessionImage], dictionary, kp_step: int = 30, kp_size: int = 60):
     """Calculates the BOW features for the provided images using dictionary.
     Yields a feature vector for every image.

+ 3 - 0
py/Session.py

@@ -76,6 +76,9 @@ class Session:
     def get_motion_folder(self) -> str:
         return os.path.join(self.folder, "Motion")
     
+    def get_full_folder(self) -> str:
+        return os.path.join(self.folder, "Full")
+    
     def scan(self, force=False, auto_save=True):
         if self.scanned and not force:
             raise ValueError("Session is already scanned. Use force=True to scan anyway and override scan progress.")

+ 8 - 4
quick_label.py

@@ -1,3 +1,7 @@
+# Quick labeling script.
+# The user is displayed every image and can then assign an image as "normal" (1-key) or "anomalous" (2-key).
+# The list of all normal and anomalous images will be printed after every image to be copied to Labels.py.
+
 import cv2
 import argparse
 import os
@@ -23,17 +27,17 @@ def main():
     anomalous = []
     motion_folder = session.get_motion_folder()
     quit = False
-    print(list_jpegs_recursive(motion_folder), motion_folder)
+    # print(list_jpegs_recursive(motion_folder), motion_folder)
     for img_file in sorted(list_jpegs_recursive(motion_folder)):
         if skip > 0:
             skip -= 1
-            print(skip)
             continue
         img_nr = int(img_file[-9:-4])
-
-        print(f"Labeling img #{img_nr}... ", end="")
+        print(f"Labeling img #{img_nr} ({img_file})... ", end="")
         image = cv2.imread(os.path.join(motion_folder, img_file))
         cv2.imshow("labeler", image)
+
+        # wait for user to press label or exit key
         while True:
             key = cv2.waitKey(0)
             if key == ord("1"):

File diff suppressed because it is too large
+ 553 - 0
read_csv_annotations.ipynb


+ 24 - 10
resize_session.ipynb

@@ -9,15 +9,15 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Found 32 sessions\n",
-      "Session 'Beaver_01' at folder: /home/AMMOD_data/camera_traps/BayerWald/Vielkadaver-Projekt/VIELAAS_Spring_Session01-VIELAAS_Beaver_01\n",
+      "Found 1 sessions\n",
+      "Session 'GFox_03' at folder: /home/kleinsteuber/vscode/GeneratedSessions_NoBackup/VIELAAS_Spring_Session03-VIELAAS_GFox_03\n",
       "Loaded scans.\n"
      ]
     }
@@ -31,15 +31,15 @@
     "from py.Dataset import Dataset\n",
     "from py.FileUtils import list_jpegs_recursive\n",
     "\n",
-    "DIR = '/home/AMMOD_data/camera_traps/BayerWald/Vielkadaver-Projekt/' # dataset directory\n",
+    "DIR = \"/home/kleinsteuber/vscode/GeneratedSessions_NoBackup/\" # '/home/AMMOD_data/camera_traps/BayerWald/Vielkadaver-Projekt/' # dataset directory\n",
     "\n",
     "ds = Dataset(DIR)\n",
-    "session = ds.create_session(\"beaver_01\")"
+    "session = ds.create_session(\"gfox_03\")"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -62,14 +62,21 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "/home/kleinsteuber/vscode/GeneratedSessions_NoBackup/VIELAAS_Spring_Session03-VIELAAS_GFox_03/**/*.jpg\n"
+     ]
+    },
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "100%|██████████| 2629/2629 [08:16<00:00,  5.29it/s]\n"
+      "100%|██████████| 5701/5701 [08:15<00:00, 11.51it/s]\n"
      ]
     }
    ],
@@ -79,14 +86,21 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "/home/kleinsteuber/vscode/GeneratedSessions_NoBackup/VIELAAS_Spring_Session03-VIELAAS_GFox_03/**/*.jpg\n"
+     ]
+    },
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "100%|██████████| 5767/5767 [17:31<00:00,  5.48it/s] \n"
+      "100%|██████████| 5701/5701 [07:17<00:00, 13.04it/s]\n"
      ]
     }
    ],

Some files were not shown because too many files changed in this diff