megadetector 5.0.18__py3-none-any.whl → 5.0.19__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of megadetector might be problematic. Click here for more details.
- megadetector/data_management/cct_to_md.py +1 -1
- megadetector/data_management/yolo_output_to_md_output.py +2 -2
- megadetector/detection/process_video.py +6 -3
- megadetector/detection/run_detector_batch.py +1 -1
- megadetector/detection/video_utils.py +3 -1
- megadetector/postprocessing/validate_batch_results.py +186 -0
- megadetector/utils/md_tests.py +7 -1
- {megadetector-5.0.18.dist-info → megadetector-5.0.19.dist-info}/METADATA +1 -1
- {megadetector-5.0.18.dist-info → megadetector-5.0.19.dist-info}/RECORD +12 -11
- {megadetector-5.0.18.dist-info → megadetector-5.0.19.dist-info}/LICENSE +0 -0
- {megadetector-5.0.18.dist-info → megadetector-5.0.19.dist-info}/WHEEL +0 -0
- {megadetector-5.0.18.dist-info → megadetector-5.0.19.dist-info}/top_level.txt +0 -0
|
@@ -79,7 +79,7 @@ def cct_to_md(input_filename,output_filename=None):
|
|
|
79
79
|
results = {}
|
|
80
80
|
|
|
81
81
|
info = {}
|
|
82
|
-
info['format_version'] =
|
|
82
|
+
info['format_version'] = '1.4'
|
|
83
83
|
info['detector'] = 'cct_to_md'
|
|
84
84
|
results['info'] = info
|
|
85
85
|
results['detection_categories'] = category_id_to_name
|
|
@@ -301,7 +301,7 @@ def yolo_json_output_to_md_output(yolo_json_file,
|
|
|
301
301
|
|
|
302
302
|
d = {}
|
|
303
303
|
d['images'] = output_images
|
|
304
|
-
d['info'] = {'format_version':1.
|
|
304
|
+
d['info'] = {'format_version':'1.4','detector':detector_name}
|
|
305
305
|
d['detection_categories'] = {}
|
|
306
306
|
|
|
307
307
|
for cat_id in yolo_category_id_to_name:
|
|
@@ -411,7 +411,7 @@ def yolo_txt_output_to_md_output(input_results_folder,
|
|
|
411
411
|
'info': {
|
|
412
412
|
'detector': detector_string,
|
|
413
413
|
'detector_metadata': {},
|
|
414
|
-
'format_version': '1.
|
|
414
|
+
'format_version': '1.4'
|
|
415
415
|
},
|
|
416
416
|
'detection_categories': {
|
|
417
417
|
'1': 'animal',
|
|
@@ -578,6 +578,7 @@ def process_video_folder(options):
|
|
|
578
578
|
video_results = md_results['results']
|
|
579
579
|
|
|
580
580
|
for i_video,video_filename in enumerate(md_results['video_filenames']):
|
|
581
|
+
video_filename = video_filename.replace('\\','/')
|
|
581
582
|
assert video_filename not in video_filename_to_fs
|
|
582
583
|
video_filename_to_fs[video_filename] = md_results['frame_rates'][i_video]
|
|
583
584
|
|
|
@@ -621,9 +622,11 @@ def process_video_folder(options):
|
|
|
621
622
|
frames_to_extract=options.frames_to_extract,
|
|
622
623
|
allow_empty_videos=options.allow_empty_videos)
|
|
623
624
|
|
|
624
|
-
for i_video,
|
|
625
|
-
|
|
626
|
-
|
|
625
|
+
for i_video,video_filename_abs in enumerate(video_filenames):
|
|
626
|
+
video_filename_relative = os.path.relpath(video_filename_abs,options.input_video_file)
|
|
627
|
+
video_filename_relative = video_filename_relative.replace('\\','/')
|
|
628
|
+
assert video_filename_relative not in video_filename_to_fs
|
|
629
|
+
video_filename_to_fs[video_filename_relative] = Fs[i_video]
|
|
627
630
|
|
|
628
631
|
print('Extracted frames for {} videos'.format(len(set(video_filenames))))
|
|
629
632
|
image_file_names = list(itertools.chain.from_iterable(frame_filenames))
|
|
@@ -781,7 +781,9 @@ class FrameToVideoOptions:
|
|
|
781
781
|
self.non_video_behavior = 'error'
|
|
782
782
|
|
|
783
783
|
|
|
784
|
-
def frame_results_to_video_results(input_file,
|
|
784
|
+
def frame_results_to_video_results(input_file,
|
|
785
|
+
output_file,
|
|
786
|
+
options=None,
|
|
785
787
|
video_filename_to_frame_rate=None):
|
|
786
788
|
"""
|
|
787
789
|
Given an MD results file produced at the *frame* level, corresponding to a directory
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"""
|
|
2
|
+
|
|
3
|
+
validate_batch_results.py
|
|
4
|
+
|
|
5
|
+
Given a .json file containing MD results, validate that it's compliant with the format spec:
|
|
6
|
+
|
|
7
|
+
https://lila.science/megadetector-output-format
|
|
8
|
+
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
#%% Constants and imports
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
import sys
|
|
15
|
+
import json
|
|
16
|
+
import argparse
|
|
17
|
+
|
|
18
|
+
from megadetector.detection.video_utils import is_video_file
|
|
19
|
+
from megadetector.utils.ct_utils import args_to_object
|
|
20
|
+
|
|
21
|
+
typical_info_fields = ['detector','detection_completion_time',
|
|
22
|
+
'classifier','classification_completion_time',
|
|
23
|
+
'detection_metadata','classifier_metadata']
|
|
24
|
+
required_keys = ['info','images','detection_categories']
|
|
25
|
+
typical_keys = ['classification_categories']
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
#%% Classes
|
|
29
|
+
|
|
30
|
+
class ValidateBatchResultsOptions:
|
|
31
|
+
"""
|
|
32
|
+
Options controlling the behavior of validate_bach_results()
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def __init__(self):
|
|
36
|
+
|
|
37
|
+
#: Should we verify that images exist? If this is True, and the .json
|
|
38
|
+
#: file contains relative paths, relative_path_base needs to be specified.
|
|
39
|
+
self.check_image_existence = False
|
|
40
|
+
|
|
41
|
+
#: If check_image_existence is True, where do the images live?
|
|
42
|
+
#:
|
|
43
|
+
#: If None, assumes absolute paths.
|
|
44
|
+
self.relative_path_base = None
|
|
45
|
+
|
|
46
|
+
# ...class ValidateBatchResultsOptions
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
#%% Main function
|
|
51
|
+
|
|
52
|
+
def validate_batch_results(json_filename,options=None):
|
|
53
|
+
"""
|
|
54
|
+
Verify that [json_filename] is a valid MD output file. Currently errors on invalid files.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
json_filename (str): the filename to validate
|
|
58
|
+
options (ValidateBatchResultsOptions, optionsl): all the parameters used to control this
|
|
59
|
+
process, see ValidateBatchResultsOptions for details
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
bool: reserved; currently always errors or returns True.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
if options is None:
|
|
66
|
+
options = ValidateBatchResultsOptions()
|
|
67
|
+
|
|
68
|
+
with open(json_filename,'r') as f:
|
|
69
|
+
d = json.load(f)
|
|
70
|
+
|
|
71
|
+
## Info validation
|
|
72
|
+
|
|
73
|
+
assert 'info' in d
|
|
74
|
+
info = d['info']
|
|
75
|
+
|
|
76
|
+
assert isinstance(info,dict)
|
|
77
|
+
assert 'format_version' in info
|
|
78
|
+
format_version = float(info['format_version'])
|
|
79
|
+
assert format_version >= 1.3, 'This validator can only be used with format version 1.3 or later'
|
|
80
|
+
|
|
81
|
+
print('Validating a .json results file with format version {}'.format(format_version))
|
|
82
|
+
|
|
83
|
+
## Category validation
|
|
84
|
+
|
|
85
|
+
assert 'detection_categories' in d
|
|
86
|
+
for k in d['detection_categories'].keys():
|
|
87
|
+
# Categories should be string-formatted ints
|
|
88
|
+
assert isinstance(k,str)
|
|
89
|
+
_ = int(k)
|
|
90
|
+
assert isinstance(d['detection_categories'][k],str)
|
|
91
|
+
|
|
92
|
+
if 'classification_categories' in d:
|
|
93
|
+
for k in d['classification_categories'].keys():
|
|
94
|
+
# Categories should be string-formatted ints
|
|
95
|
+
assert isinstance(k,str)
|
|
96
|
+
_ = int(k)
|
|
97
|
+
assert isinstance(d['classification_categories'][k],str)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
## Image validation
|
|
101
|
+
|
|
102
|
+
assert 'images' in d
|
|
103
|
+
assert isinstance(d['images'],list)
|
|
104
|
+
|
|
105
|
+
# im = d['images'][0]
|
|
106
|
+
for im in d['images']:
|
|
107
|
+
|
|
108
|
+
assert isinstance(im,dict)
|
|
109
|
+
assert 'file' in im
|
|
110
|
+
|
|
111
|
+
file = im['file']
|
|
112
|
+
|
|
113
|
+
if options.check_image_existence:
|
|
114
|
+
if options.relative_path_base is None:
|
|
115
|
+
file_abs = file
|
|
116
|
+
else:
|
|
117
|
+
file_abs = os.path.join(options.relative_path_base,file)
|
|
118
|
+
assert os.path.isfile(file_abs), 'Cannot find file {}'.format(file_abs)
|
|
119
|
+
|
|
120
|
+
if 'detections' not in im or im['detections'] is None:
|
|
121
|
+
assert 'failure' in im and isinstance(im['failure'],str)
|
|
122
|
+
else:
|
|
123
|
+
assert isinstance(im['detections'],list)
|
|
124
|
+
|
|
125
|
+
if is_video_file(im['file']) and (format_version >= 1.4):
|
|
126
|
+
assert 'frame_rate' in im
|
|
127
|
+
if 'detections' in im and im['detections'] is not None:
|
|
128
|
+
for det in im['detections']:
|
|
129
|
+
assert 'frame_number' in det
|
|
130
|
+
|
|
131
|
+
# ...for each image
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
## Checking on other keys
|
|
135
|
+
|
|
136
|
+
for k in d.keys():
|
|
137
|
+
if k not in typical_keys and k not in required_keys:
|
|
138
|
+
print('Warning: non-standard key {} present at file level'.format(k))
|
|
139
|
+
|
|
140
|
+
# ...def validate_batch_results(...)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
#%% Interactive driver(s)
|
|
144
|
+
|
|
145
|
+
if False:
|
|
146
|
+
|
|
147
|
+
#%%
|
|
148
|
+
|
|
149
|
+
options = ValidateBatchResultsOptions()
|
|
150
|
+
# json_filename = r'g:\temp\format.json'
|
|
151
|
+
# json_filename = r'g:\temp\test-videos\video_results.json'
|
|
152
|
+
json_filename = r'g:\temp\test-videos\image_results.json'
|
|
153
|
+
options.check_image_existence = True
|
|
154
|
+
options.relative_path_base = r'g:\temp\test-videos'
|
|
155
|
+
validate_batch_results(json_filename,options)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
#%% Command-line driver
|
|
159
|
+
|
|
160
|
+
def main():
|
|
161
|
+
|
|
162
|
+
options = ValidateBatchResultsOptions()
|
|
163
|
+
|
|
164
|
+
parser = argparse.ArgumentParser()
|
|
165
|
+
parser.add_argument(
|
|
166
|
+
'json_filename',
|
|
167
|
+
help='path to .json file containing MegaDetector results')
|
|
168
|
+
parser.add_argument(
|
|
169
|
+
'--check_image_existence', action='store_true',
|
|
170
|
+
help='check that all images referred to in the results file exist')
|
|
171
|
+
parser.add_argument(
|
|
172
|
+
'--relative_path_base', default=None,
|
|
173
|
+
help='if --check_image_existence is specified and paths are relative, use this as the base folder')
|
|
174
|
+
if len(sys.argv[1:]) == 0:
|
|
175
|
+
parser.print_help()
|
|
176
|
+
parser.exit()
|
|
177
|
+
|
|
178
|
+
args = parser.parse_args()
|
|
179
|
+
|
|
180
|
+
args_to_object(args, options)
|
|
181
|
+
|
|
182
|
+
validate_batch_results(args.json_filename,options)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
if __name__ == '__main__':
|
|
186
|
+
main()
|
megadetector/utils/md_tests.py
CHANGED
|
@@ -683,10 +683,16 @@ def run_python_tests(options):
|
|
|
683
683
|
|
|
684
684
|
## Verify results
|
|
685
685
|
|
|
686
|
+
# Verify format correctness
|
|
687
|
+
from megadetector.postprocessing.validate_batch_results import validate_batch_results
|
|
688
|
+
validate_batch_results(inference_output_file)
|
|
689
|
+
|
|
690
|
+
# Verify value correctness
|
|
686
691
|
expected_results_file = get_expected_results_filename(is_gpu_available(verbose=False),
|
|
687
692
|
options=options)
|
|
688
693
|
compare_results(inference_output_file,expected_results_file,options)
|
|
689
|
-
|
|
694
|
+
|
|
695
|
+
|
|
690
696
|
# Make note of this filename, we will use it again later
|
|
691
697
|
inference_output_file_standard_inference = inference_output_file
|
|
692
698
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: megadetector
|
|
3
|
-
Version: 5.0.
|
|
3
|
+
Version: 5.0.19
|
|
4
4
|
Summary: MegaDetector is an AI model that helps conservation folks spend less time doing boring things with camera trap images.
|
|
5
5
|
Author-email: Your friendly neighborhood MegaDetector team <cameratraps@lila.science>
|
|
6
6
|
Maintainer-email: Your friendly neighborhood MegaDetector team <cameratraps@lila.science>
|
|
@@ -54,7 +54,7 @@ megadetector/classification/efficientnet/utils.py,sha256=dzrDrQQcvINdJFbODmrHQMU
|
|
|
54
54
|
megadetector/data_management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
55
|
megadetector/data_management/camtrap_dp_to_coco.py,sha256=WC5u5nK5BwXpV26_pGy6CppQryJMgsJ9NtDbGIRQqLg,8629
|
|
56
56
|
megadetector/data_management/cct_json_utils.py,sha256=LuNbxU5EAslWanC08PTKzwzCUmesGnbbJhZ1e2dCgnI,15140
|
|
57
|
-
megadetector/data_management/cct_to_md.py,sha256=
|
|
57
|
+
megadetector/data_management/cct_to_md.py,sha256=zgMU2_NjPs5nPGDKf0n1ouJdyiAsgR4Q9wj-Q9Y-c88,5070
|
|
58
58
|
megadetector/data_management/cct_to_wi.py,sha256=hnFErIlBDmhZtBv21kDW14MSdHlUjwtCGn2vnG-cN34,9771
|
|
59
59
|
megadetector/data_management/coco_to_labelme.py,sha256=Uql6f1TaMmKIZClCcqUB1bPxokdXgyAKsQm5pk5foKk,8986
|
|
60
60
|
megadetector/data_management/coco_to_yolo.py,sha256=rTDOh3XdoOoo7HCSH7obT3xpQgiSykf71ba8uOXfnxc,28121
|
|
@@ -69,7 +69,7 @@ megadetector/data_management/remove_exif.py,sha256=vIWnJfw1i9JgyQKUDGEzzqkHro4nd
|
|
|
69
69
|
megadetector/data_management/rename_images.py,sha256=AG3YIxXEYdGmK4G-rv0_XZIylPqOZpS6gfEkydF6oDg,6918
|
|
70
70
|
megadetector/data_management/resize_coco_dataset.py,sha256=AaiV7efIcNnqsXsnQckmHq2G__7ZQHBV_jN6rhZfMjo,6810
|
|
71
71
|
megadetector/data_management/wi_download_csv_to_coco.py,sha256=ilnJZhNZK-FGUR-AfUSWjIDUk9Gytgxw7IOK_N8WKLE,8350
|
|
72
|
-
megadetector/data_management/yolo_output_to_md_output.py,sha256=
|
|
72
|
+
megadetector/data_management/yolo_output_to_md_output.py,sha256=1RUJSWiVa7CVVQ_CresOVXAD3Eb7oHjdgPg7fTX_Vwg,17563
|
|
73
73
|
megadetector/data_management/yolo_to_coco.py,sha256=TzAagQ2ATbB_tn1oZxrHCWsrFGO_OhfZmi-3X45WdDU,26180
|
|
74
74
|
megadetector/data_management/annotations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
75
75
|
megadetector/data_management/annotations/annotation_constants.py,sha256=1597MpAr_HdidIHoDFj4RgUO3K5e2Xm2bGafGeonR2k,953
|
|
@@ -136,14 +136,14 @@ megadetector/data_management/lila/get_lila_image_counts.py,sha256=UxXS5RDnSA_Wbx
|
|
|
136
136
|
megadetector/data_management/lila/lila_common.py,sha256=IEnGoyRgcqbek1qJ1gFE83p1Pg_5kaMS-nQI25lRWIs,10132
|
|
137
137
|
megadetector/data_management/lila/test_lila_metadata_urls.py,sha256=jqN7UID16fu78BK_2sygb4s9BBeVCpSZT3_oL2GYxxY,4438
|
|
138
138
|
megadetector/detection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
139
|
-
megadetector/detection/process_video.py,sha256=
|
|
139
|
+
megadetector/detection/process_video.py,sha256=ugBpIPy7ogrbHSklIA7FTh5YqnTzDtfeN5z8JmrXJpc,50282
|
|
140
140
|
megadetector/detection/pytorch_detector.py,sha256=StOnaspDBkMeePiTyq5ZEcFUDBEddq36nigHXbF-zAQ,14029
|
|
141
141
|
megadetector/detection/run_detector.py,sha256=vEfq3jJTseD0sIM9MaIhbeEVqP6JoLXOC2cl8Dhehxs,30553
|
|
142
|
-
megadetector/detection/run_detector_batch.py,sha256=
|
|
142
|
+
megadetector/detection/run_detector_batch.py,sha256=P1sb922Vo_TD-ioGGkwt1FfXLyJFJms-MLGIcnmBtfg,57304
|
|
143
143
|
megadetector/detection/run_inference_with_yolov5_val.py,sha256=yjNm130qntOyJ4jbetdt5xDHWnSmBXRydyxB2I56XjM,49099
|
|
144
144
|
megadetector/detection/run_tiled_inference.py,sha256=vw0713eNuMiEOjHfweQl58zPHNxPOMdFWZ8bTDLhlMY,37883
|
|
145
145
|
megadetector/detection/tf_detector.py,sha256=5V94a0gR6WmGPacKm59hl1eYEZI8cG04frF4EvHrmzU,8285
|
|
146
|
-
megadetector/detection/video_utils.py,sha256=
|
|
146
|
+
megadetector/detection/video_utils.py,sha256=tMKl47sg7jtU07vBeobGvjVgXdHWpHrMOx3jRvJ3iLo,41471
|
|
147
147
|
megadetector/detection/detector_training/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
148
148
|
megadetector/detection/detector_training/model_main_tf2.py,sha256=YwNsZ7hkIFaEuwKU0rHG_VyqiR_0E01BbdlD0Yx4Smo,4936
|
|
149
149
|
megadetector/postprocessing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -163,6 +163,7 @@ megadetector/postprocessing/render_detection_confusion_matrix.py,sha256=_wsk4W0P
|
|
|
163
163
|
megadetector/postprocessing/separate_detections_into_folders.py,sha256=k42gxnL8hbBiV0e2T-jmFrhxzIxnhi57Nx9cDSSL5s0,31218
|
|
164
164
|
megadetector/postprocessing/subset_json_detector_output.py,sha256=PDgb6cnsFm9d4E7_sMVIguLIU7s79uFQa2CRCxAO0F4,27064
|
|
165
165
|
megadetector/postprocessing/top_folders_to_bottom.py,sha256=Dqk-KZXiRlIYlmLZmk6aUapmaaLJUKOf8wK1kxt9W6A,6283
|
|
166
|
+
megadetector/postprocessing/validate_batch_results.py,sha256=uFS-Iag7tZYMWJeDuIYwDhEdc8F_5BGKhV4V7y3SGVw,5551
|
|
166
167
|
megadetector/postprocessing/repeat_detection_elimination/find_repeat_detections.py,sha256=e4Y9CyMyd-bLN3il8tu76vI0nVYHZlhZr6vcL0J4zQ0,9832
|
|
167
168
|
megadetector/postprocessing/repeat_detection_elimination/remove_repeat_detections.py,sha256=tARPxuY0OyQgpKU2XqiQPko3f-hHnWuISB8ZlZgXwxI,2819
|
|
168
169
|
megadetector/postprocessing/repeat_detection_elimination/repeat_detections_core.py,sha256=vEmWLSSv0_rxDwhjz_S9YaKZ_LM2tADTz2JYb_zUCnc,67923
|
|
@@ -181,7 +182,7 @@ megadetector/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
|
|
|
181
182
|
megadetector/utils/azure_utils.py,sha256=0BdnkG2hW-X0yFpsJqmBhOd2wysz_LvhuyImPJMVPJs,6271
|
|
182
183
|
megadetector/utils/ct_utils.py,sha256=1LXAjnzeeFeQqp59cWn3Nxt5OQk3t2DfO5wQ30flA5E,19441
|
|
183
184
|
megadetector/utils/directory_listing.py,sha256=r4rg2xA4O9ZVxVtzPZzXIXa0DOEukAJMTTNcNSiQcuM,9668
|
|
184
|
-
megadetector/utils/md_tests.py,sha256=
|
|
185
|
+
megadetector/utils/md_tests.py,sha256=qRotO_FCRQEs2jGm4aQCrfnktJws29O9iRzha_vjZ4Q,58435
|
|
185
186
|
megadetector/utils/path_utils.py,sha256=o68jfPDaLj3NizipVCQEnmB5GfPHpMOLUmQWamYM4w0,37165
|
|
186
187
|
megadetector/utils/process_utils.py,sha256=2SdFVxqob-YUW2BTjUEavNuRH3jA4V05fbKMtrVSd3c,5635
|
|
187
188
|
megadetector/utils/sas_blob_utils.py,sha256=k76EcMmJc_otrEHcfV2fxAC6fNhxU88FxM3ddSYrsKU,16917
|
|
@@ -196,8 +197,8 @@ megadetector/visualization/render_images_with_thumbnails.py,sha256=kgJYW8BsqRO4C
|
|
|
196
197
|
megadetector/visualization/visualization_utils.py,sha256=J53VsI8aQmzzBBeu-msm8c-qC6pm_HCMkMKYvnylqjo,63083
|
|
197
198
|
megadetector/visualization/visualize_db.py,sha256=x9jScwG-3V-mZGy5cB1s85KWbiAIfvgVUcLqUplHxGA,22110
|
|
198
199
|
megadetector/visualization/visualize_detector_output.py,sha256=LY8QgDWpWlXVLZJUskvT29CdkNvIlEsFTk4DC_lS6pk,17052
|
|
199
|
-
megadetector-5.0.
|
|
200
|
-
megadetector-5.0.
|
|
201
|
-
megadetector-5.0.
|
|
202
|
-
megadetector-5.0.
|
|
203
|
-
megadetector-5.0.
|
|
200
|
+
megadetector-5.0.19.dist-info/LICENSE,sha256=RMa3qq-7Cyk7DdtqRj_bP1oInGFgjyHn9-PZ3PcrqIs,1100
|
|
201
|
+
megadetector-5.0.19.dist-info/METADATA,sha256=fxnqQFFPLS8pROblOELOmej7ULwUYhV16VWcxuanq8k,7464
|
|
202
|
+
megadetector-5.0.19.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
|
|
203
|
+
megadetector-5.0.19.dist-info/top_level.txt,sha256=wf9DXa8EwiOSZ4G5IPjakSxBPxTDjhYYnqWRfR-zS4M,13
|
|
204
|
+
megadetector-5.0.19.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|