megadetector 5.0.14__py3-none-any.whl → 5.0.15__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/detection/process_video.py +2 -2
- megadetector/detection/run_detector_batch.py +7 -2
- megadetector/detection/video_utils.py +3 -0
- megadetector/utils/md_tests.py +202 -87
- {megadetector-5.0.14.dist-info → megadetector-5.0.15.dist-info}/METADATA +1 -1
- {megadetector-5.0.14.dist-info → megadetector-5.0.15.dist-info}/RECORD +9 -9
- {megadetector-5.0.14.dist-info → megadetector-5.0.15.dist-info}/LICENSE +0 -0
- {megadetector-5.0.14.dist-info → megadetector-5.0.15.dist-info}/WHEEL +0 -0
- {megadetector-5.0.14.dist-info → megadetector-5.0.15.dist-info}/top_level.txt +0 -0
|
@@ -146,7 +146,7 @@ class ProcessVideoOptions:
|
|
|
146
146
|
#: detector.
|
|
147
147
|
self.class_mapping_filename = None
|
|
148
148
|
|
|
149
|
-
#: JPEG quality for frame output, from 0-100.
|
|
149
|
+
#: JPEG quality for frame output, from 0-100. Use None or -1 to let opencv decide.
|
|
150
150
|
self.quality = 90
|
|
151
151
|
|
|
152
152
|
#: Resize frames so they're at most this wide
|
|
@@ -957,7 +957,7 @@ def main():
|
|
|
957
957
|
|
|
958
958
|
parser.add_argument('--quality', type=int,
|
|
959
959
|
default=default_options.quality,
|
|
960
|
-
help='JPEG quality for extracted frames (defaults to {})'.format(
|
|
960
|
+
help='JPEG quality for extracted frames (defaults to {}), use -1 to force no quality setting'.format(
|
|
961
961
|
default_options.quality))
|
|
962
962
|
|
|
963
963
|
parser.add_argument('--max_width', type=int,
|
|
@@ -748,8 +748,13 @@ def load_and_run_detector_batch(model_file,
|
|
|
748
748
|
results += new_results
|
|
749
749
|
|
|
750
750
|
# ...if checkpointing is/isn't enabled
|
|
751
|
-
|
|
752
|
-
|
|
751
|
+
|
|
752
|
+
try:
|
|
753
|
+
pool.close()
|
|
754
|
+
except Exception as e:
|
|
755
|
+
print('Warning: error closing multiprocessing pool:\n{}'.format(str(e)))
|
|
756
|
+
|
|
757
|
+
# ...if we're running (1) with image queue, (2) on one core, or (3) on multiple cores
|
|
753
758
|
|
|
754
759
|
# 'results' may have been modified in place, but we also return it for
|
|
755
760
|
# backwards-compatibility.
|
|
@@ -250,6 +250,9 @@ def video_to_frames(input_video_file,
|
|
|
250
250
|
|
|
251
251
|
assert os.path.isfile(input_video_file), 'File {} not found'.format(input_video_file)
|
|
252
252
|
|
|
253
|
+
if quality is not None and quality < 0:
|
|
254
|
+
quality = None
|
|
255
|
+
|
|
253
256
|
if isinstance(frames_to_extract,int):
|
|
254
257
|
frames_to_extract = [frames_to_extract]
|
|
255
258
|
|
megadetector/utils/md_tests.py
CHANGED
|
@@ -10,6 +10,8 @@ This module should not depend on anything else in this repo outside of the
|
|
|
10
10
|
tests themselves, even if it means some duplicated code (e.g. for downloading files),
|
|
11
11
|
since much of what it tries to test is, e.g., imports.
|
|
12
12
|
|
|
13
|
+
"Correctness" is determined by agreement with a file that this script fetches from lila.science.
|
|
14
|
+
|
|
13
15
|
"""
|
|
14
16
|
|
|
15
17
|
#%% Imports and constants
|
|
@@ -108,7 +110,9 @@ class MDTestOptions:
|
|
|
108
110
|
|
|
109
111
|
def get_expected_results_filename(gpu_is_available,
|
|
110
112
|
model_string='mdv5a',
|
|
111
|
-
test_type='
|
|
113
|
+
test_type='image',
|
|
114
|
+
augment=False,
|
|
115
|
+
options=None):
|
|
112
116
|
"""
|
|
113
117
|
Expected results vary just a little across inference environments, particularly
|
|
114
118
|
between PT 1.x and 2.x, so when making sure things are working acceptably, we
|
|
@@ -150,7 +154,21 @@ def get_expected_results_filename(gpu_is_available,
|
|
|
150
154
|
except Exception:
|
|
151
155
|
pass
|
|
152
156
|
|
|
153
|
-
|
|
157
|
+
aug_string = ''
|
|
158
|
+
if augment:
|
|
159
|
+
aug_string = 'augment-'
|
|
160
|
+
|
|
161
|
+
fn = '{}-{}{}-{}-{}.json'.format(model_string,aug_string,test_type,hw_string,pt_string)
|
|
162
|
+
|
|
163
|
+
from megadetector.utils.path_utils import insert_before_extension
|
|
164
|
+
|
|
165
|
+
if test_type == 'video':
|
|
166
|
+
fn = insert_before_extension(fn,'frames')
|
|
167
|
+
|
|
168
|
+
if options is not None and options.scratch_dir is not None:
|
|
169
|
+
fn = os.path.join(options.scratch_dir,fn)
|
|
170
|
+
|
|
171
|
+
return fn
|
|
154
172
|
|
|
155
173
|
|
|
156
174
|
def download_test_data(options=None):
|
|
@@ -220,7 +238,12 @@ def download_test_data(options=None):
|
|
|
220
238
|
|
|
221
239
|
# ...for each file in the zipfile
|
|
222
240
|
|
|
223
|
-
|
|
241
|
+
try:
|
|
242
|
+
zipf.close()
|
|
243
|
+
except Exception as e:
|
|
244
|
+
print('Warning: error closing zipfile:\n{}'.format(str(e)))
|
|
245
|
+
|
|
246
|
+
# Warn if files are present that aren't expected
|
|
224
247
|
test_files = glob.glob(os.path.join(scratch_dir,'**/*'), recursive=True)
|
|
225
248
|
test_files = [os.path.relpath(fn,scratch_dir).replace('\\','/') for fn in test_files]
|
|
226
249
|
test_files_set = set(test_files)
|
|
@@ -336,6 +359,100 @@ def output_files_are_identical(fn1,fn2,verbose=False):
|
|
|
336
359
|
# ...def output_files_are_identical(...)
|
|
337
360
|
|
|
338
361
|
|
|
362
|
+
def compare_results(inference_output_file,expected_results_file,options):
|
|
363
|
+
"""
|
|
364
|
+
Compare two MD-formatted output files that should be nearly identical, allowing small
|
|
365
|
+
changes (e.g. rounding differences). Generally used to compare a new results file to
|
|
366
|
+
an expected results file.
|
|
367
|
+
|
|
368
|
+
Args:
|
|
369
|
+
inference_output_file (str): the first results file to compare
|
|
370
|
+
expected_results_file (str): the second results file to compare
|
|
371
|
+
options (MDTestOptions): options that determine tolerable differences between files
|
|
372
|
+
"""
|
|
373
|
+
|
|
374
|
+
# Read results
|
|
375
|
+
with open(inference_output_file,'r') as f:
|
|
376
|
+
results_from_file = json.load(f) # noqa
|
|
377
|
+
|
|
378
|
+
with open(os.path.join(options.scratch_dir,expected_results_file),'r') as f:
|
|
379
|
+
expected_results = json.load(f)
|
|
380
|
+
|
|
381
|
+
filename_to_results = {im['file'].replace('\\','/'):im for im in results_from_file['images']}
|
|
382
|
+
filename_to_results_expected = {im['file'].replace('\\','/'):im for im in expected_results['images']}
|
|
383
|
+
|
|
384
|
+
assert len(filename_to_results) == len(filename_to_results_expected), \
|
|
385
|
+
'Error: expected {} files in results, found {}'.format(
|
|
386
|
+
len(filename_to_results_expected),
|
|
387
|
+
len(filename_to_results))
|
|
388
|
+
|
|
389
|
+
max_coord_error = 0
|
|
390
|
+
max_conf_error = 0
|
|
391
|
+
|
|
392
|
+
# fn = next(iter(filename_to_results.keys()))
|
|
393
|
+
for fn in filename_to_results.keys():
|
|
394
|
+
|
|
395
|
+
actual_image_results = filename_to_results[fn]
|
|
396
|
+
expected_image_results = filename_to_results_expected[fn]
|
|
397
|
+
|
|
398
|
+
if 'failure' in actual_image_results:
|
|
399
|
+
assert 'failure' in expected_image_results and \
|
|
400
|
+
'detections' not in actual_image_results and \
|
|
401
|
+
'detections' not in expected_image_results
|
|
402
|
+
continue
|
|
403
|
+
assert 'failure' not in expected_image_results
|
|
404
|
+
|
|
405
|
+
actual_detections = actual_image_results['detections']
|
|
406
|
+
expected_detections = expected_image_results['detections']
|
|
407
|
+
|
|
408
|
+
s = 'expected {} detections for file {}, found {}'.format(
|
|
409
|
+
len(expected_detections),fn,len(actual_detections))
|
|
410
|
+
s += '\nExpected results file: {}\nActual results file: {}'.format(
|
|
411
|
+
expected_results_file,inference_output_file)
|
|
412
|
+
|
|
413
|
+
if options.warning_mode:
|
|
414
|
+
if len(actual_detections) != len(expected_detections):
|
|
415
|
+
print('Warning: {}'.format(s))
|
|
416
|
+
continue
|
|
417
|
+
assert len(actual_detections) == len(expected_detections), \
|
|
418
|
+
'Error: {}'.format(s)
|
|
419
|
+
|
|
420
|
+
# i_det = 0
|
|
421
|
+
for i_det in range(0,len(actual_detections)):
|
|
422
|
+
actual_det = actual_detections[i_det]
|
|
423
|
+
expected_det = expected_detections[i_det]
|
|
424
|
+
assert actual_det['category'] == expected_det['category']
|
|
425
|
+
conf_err = abs(actual_det['conf'] - expected_det['conf'])
|
|
426
|
+
coord_differences = []
|
|
427
|
+
for i_coord in range(0,4):
|
|
428
|
+
coord_differences.append(abs(actual_det['bbox'][i_coord]-expected_det['bbox'][i_coord]))
|
|
429
|
+
coord_err = max(coord_differences)
|
|
430
|
+
|
|
431
|
+
if conf_err > max_conf_error:
|
|
432
|
+
max_conf_error = conf_err
|
|
433
|
+
if coord_err > max_coord_error:
|
|
434
|
+
max_coord_error = coord_err
|
|
435
|
+
|
|
436
|
+
# ...for each detection
|
|
437
|
+
|
|
438
|
+
# ...for each image
|
|
439
|
+
|
|
440
|
+
if not options.warning_mode:
|
|
441
|
+
|
|
442
|
+
assert max_conf_error <= options.max_conf_error, \
|
|
443
|
+
'Confidence error {} is greater than allowable ({})'.format(
|
|
444
|
+
max_conf_error,options.max_conf_error)
|
|
445
|
+
|
|
446
|
+
assert max_coord_error <= options.max_coord_error, \
|
|
447
|
+
'Coord error {} is greater than allowable ({})'.format(
|
|
448
|
+
max_coord_error,options.max_coord_error)
|
|
449
|
+
|
|
450
|
+
print('Max conf error: {}'.format(max_conf_error))
|
|
451
|
+
print('Max coord error: {}'.format(max_coord_error))
|
|
452
|
+
|
|
453
|
+
# ...def compare_results(...)
|
|
454
|
+
|
|
455
|
+
|
|
339
456
|
def _args_to_object(args, obj):
|
|
340
457
|
"""
|
|
341
458
|
Copies all fields from a Namespace (typically the output from parse_args) to an
|
|
@@ -449,6 +566,8 @@ def run_python_tests(options):
|
|
|
449
566
|
|
|
450
567
|
|
|
451
568
|
## Run inference on a folder
|
|
569
|
+
|
|
570
|
+
print('\n** Running MD on images **\n')
|
|
452
571
|
|
|
453
572
|
from megadetector.detection.run_detector_batch import load_and_run_detector_batch,write_results_to_file
|
|
454
573
|
from megadetector.utils import path_utils
|
|
@@ -458,95 +577,38 @@ def run_python_tests(options):
|
|
|
458
577
|
inference_output_file = os.path.join(options.scratch_dir,'folder_inference_output.json')
|
|
459
578
|
image_file_names = path_utils.find_images(image_folder,recursive=True)
|
|
460
579
|
results = load_and_run_detector_batch(options.default_model, image_file_names, quiet=True)
|
|
461
|
-
_ = write_results_to_file(results,
|
|
462
|
-
|
|
580
|
+
_ = write_results_to_file(results,
|
|
581
|
+
inference_output_file,
|
|
582
|
+
relative_path_base=image_folder,
|
|
583
|
+
detector_file=options.default_model)
|
|
463
584
|
|
|
464
|
-
# Read results
|
|
465
|
-
with open(inference_output_file,'r') as f:
|
|
466
|
-
results_from_file = json.load(f) # noqa
|
|
467
585
|
|
|
468
|
-
|
|
469
586
|
## Verify results
|
|
470
587
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
filename_to_results = {im['file'].replace('\\','/'):im for im in results_from_file['images']}
|
|
478
|
-
filename_to_results_expected = {im['file'].replace('\\','/'):im for im in expected_results['images']}
|
|
588
|
+
expected_results_file = get_expected_results_filename(is_gpu_available(verbose=False),
|
|
589
|
+
options=options)
|
|
590
|
+
compare_results(inference_output_file,expected_results_file,options)
|
|
591
|
+
|
|
592
|
+
|
|
593
|
+
## Run and verify again with augmentation enabled
|
|
479
594
|
|
|
480
|
-
|
|
481
|
-
'Error: expected {} files in results, found {}'.format(
|
|
482
|
-
len(filename_to_results_expected),
|
|
483
|
-
len(filename_to_results))
|
|
595
|
+
print('\n** Running MD on images with augmentation **\n')
|
|
484
596
|
|
|
485
|
-
|
|
486
|
-
max_conf_error = 0
|
|
597
|
+
from megadetector.utils.path_utils import insert_before_extension
|
|
487
598
|
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
assert 'failure' not in expected_image_results
|
|
500
|
-
|
|
501
|
-
actual_detections = actual_image_results['detections']
|
|
502
|
-
expected_detections = expected_image_results['detections']
|
|
503
|
-
|
|
504
|
-
s = 'expected {} detections for file {}, found {}'.format(
|
|
505
|
-
len(expected_detections),fn,len(actual_detections))
|
|
506
|
-
s += '\nExpected results file: {}\nActual results file: {}'.format(
|
|
507
|
-
expected_results_filename,inference_output_file)
|
|
508
|
-
|
|
509
|
-
if options.warning_mode:
|
|
510
|
-
if len(actual_detections) != len(expected_detections):
|
|
511
|
-
print('Warning: {}'.format(s))
|
|
512
|
-
continue
|
|
513
|
-
assert len(actual_detections) == len(expected_detections), \
|
|
514
|
-
'Error: {}'.format(s)
|
|
515
|
-
|
|
516
|
-
# i_det = 0
|
|
517
|
-
for i_det in range(0,len(actual_detections)):
|
|
518
|
-
actual_det = actual_detections[i_det]
|
|
519
|
-
expected_det = expected_detections[i_det]
|
|
520
|
-
assert actual_det['category'] == expected_det['category']
|
|
521
|
-
conf_err = abs(actual_det['conf'] - expected_det['conf'])
|
|
522
|
-
coord_differences = []
|
|
523
|
-
for i_coord in range(0,4):
|
|
524
|
-
coord_differences.append(abs(actual_det['bbox'][i_coord]-expected_det['bbox'][i_coord]))
|
|
525
|
-
coord_err = max(coord_differences)
|
|
526
|
-
|
|
527
|
-
if conf_err > max_conf_error:
|
|
528
|
-
max_conf_error = conf_err
|
|
529
|
-
if coord_err > max_coord_error:
|
|
530
|
-
max_coord_error = coord_err
|
|
531
|
-
|
|
532
|
-
# ...for each detection
|
|
599
|
+
inference_output_file_augmented = insert_before_extension(inference_output_file,'augmented')
|
|
600
|
+
results = load_and_run_detector_batch(options.default_model, image_file_names, quiet=True, augment=True)
|
|
601
|
+
_ = write_results_to_file(results,
|
|
602
|
+
inference_output_file_augmented,
|
|
603
|
+
relative_path_base=image_folder,
|
|
604
|
+
detector_file=options.default_model)
|
|
605
|
+
|
|
606
|
+
expected_results_file_augmented = \
|
|
607
|
+
get_expected_results_filename(is_gpu_available(verbose=False),
|
|
608
|
+
augment=True,options=options)
|
|
609
|
+
compare_results(inference_output_file_augmented,expected_results_file_augmented,options)
|
|
533
610
|
|
|
534
|
-
# ...for each image
|
|
535
611
|
|
|
536
|
-
if not options.warning_mode:
|
|
537
|
-
|
|
538
|
-
assert max_conf_error <= options.max_conf_error, \
|
|
539
|
-
'Confidence error {} is greater than allowable ({})'.format(
|
|
540
|
-
max_conf_error,options.max_conf_error)
|
|
541
|
-
|
|
542
|
-
assert max_coord_error <= options.max_coord_error, \
|
|
543
|
-
'Coord error {} is greater than allowable ({})'.format(
|
|
544
|
-
max_coord_error,options.max_coord_error)
|
|
545
|
-
|
|
546
|
-
print('Max conf error: {}'.format(max_conf_error))
|
|
547
|
-
print('Max coord error: {}'.format(max_coord_error))
|
|
548
|
-
|
|
549
|
-
|
|
550
612
|
## Postprocess results
|
|
551
613
|
|
|
552
614
|
from megadetector.postprocessing.postprocess_batch_results import \
|
|
@@ -647,6 +709,8 @@ def run_python_tests(options):
|
|
|
647
709
|
|
|
648
710
|
## Video test (single video)
|
|
649
711
|
|
|
712
|
+
print('\n** Running MD on a single video **\n')
|
|
713
|
+
|
|
650
714
|
from megadetector.detection.process_video import ProcessVideoOptions, process_video
|
|
651
715
|
|
|
652
716
|
video_options = ProcessVideoOptions()
|
|
@@ -668,7 +732,7 @@ def run_python_tests(options):
|
|
|
668
732
|
video_options.fourcc = options.video_fourcc
|
|
669
733
|
# video_options.rendering_confidence_threshold = None
|
|
670
734
|
# video_options.json_confidence_threshold = 0.005
|
|
671
|
-
video_options.frame_sample =
|
|
735
|
+
video_options.frame_sample = 10
|
|
672
736
|
video_options.n_cores = 5
|
|
673
737
|
# video_options.debug_max_frames = -1
|
|
674
738
|
# video_options.class_mapping_filename = None
|
|
@@ -683,6 +747,8 @@ def run_python_tests(options):
|
|
|
683
747
|
|
|
684
748
|
## Video test (folder)
|
|
685
749
|
|
|
750
|
+
print('\n** Running MD on a folder of videos **\n')
|
|
751
|
+
|
|
686
752
|
from megadetector.detection.process_video import ProcessVideoOptions, process_video_folder
|
|
687
753
|
|
|
688
754
|
video_options = ProcessVideoOptions()
|
|
@@ -705,15 +771,30 @@ def run_python_tests(options):
|
|
|
705
771
|
video_options.fourcc = options.video_fourcc
|
|
706
772
|
# video_options.rendering_confidence_threshold = None
|
|
707
773
|
# video_options.json_confidence_threshold = 0.005
|
|
708
|
-
video_options.frame_sample =
|
|
709
|
-
video_options.n_cores = 5
|
|
774
|
+
video_options.frame_sample = 10
|
|
775
|
+
video_options.n_cores = 5
|
|
710
776
|
# video_options.debug_max_frames = -1
|
|
711
777
|
# video_options.class_mapping_filename = None
|
|
712
778
|
|
|
779
|
+
# Use quality == None, because we can't control whether YOLOv5 has patched cm2.imread,
|
|
780
|
+
# and therefore can't rely on using the quality parameter
|
|
781
|
+
video_options.quality = None
|
|
782
|
+
|
|
713
783
|
_ = process_video_folder(video_options)
|
|
714
784
|
|
|
715
785
|
assert os.path.isfile(video_options.output_json_file), \
|
|
716
786
|
'Python video test failed to render output .json file'
|
|
787
|
+
|
|
788
|
+
frame_output_file = insert_before_extension(video_options.output_json_file,'frames')
|
|
789
|
+
assert os.path.isfile(frame_output_file)
|
|
790
|
+
|
|
791
|
+
|
|
792
|
+
## Verify results
|
|
793
|
+
|
|
794
|
+
expected_results_file = \
|
|
795
|
+
get_expected_results_filename(is_gpu_available(verbose=False),test_type='video',options=options)
|
|
796
|
+
assert os.path.isfile(expected_results_file)
|
|
797
|
+
compare_results(frame_output_file,expected_results_file,options)
|
|
717
798
|
|
|
718
799
|
# ...if we're not skipping video tests
|
|
719
800
|
|
|
@@ -925,7 +1006,7 @@ def run_cli_tests(options):
|
|
|
925
1006
|
results_from_file = json.load(f) # noqa
|
|
926
1007
|
|
|
927
1008
|
|
|
928
|
-
## Run inference on a folder (augmented)
|
|
1009
|
+
## Run inference on a folder (augmented, w/YOLOv5 val script)
|
|
929
1010
|
|
|
930
1011
|
if options.yolo_working_dir is None:
|
|
931
1012
|
|
|
@@ -1218,3 +1299,37 @@ python md_tests.py --cli_working_dir "/mnt/c/git/MegaDetector" --yolo_working_di
|
|
|
1218
1299
|
|
|
1219
1300
|
python -c "import md_tests; print(md_tests.get_expected_results_filename(True))"
|
|
1220
1301
|
"""
|
|
1302
|
+
|
|
1303
|
+
|
|
1304
|
+
#%% Scrap
|
|
1305
|
+
|
|
1306
|
+
if False:
|
|
1307
|
+
|
|
1308
|
+
pass
|
|
1309
|
+
|
|
1310
|
+
#%%
|
|
1311
|
+
|
|
1312
|
+
import sys; sys.path.append(r'c:\git\yolov5-md')
|
|
1313
|
+
|
|
1314
|
+
#%%
|
|
1315
|
+
|
|
1316
|
+
fn1 = r"G:\temp\md-test-package\mdv5a-video-cpu-pt1.10.1.frames.json"
|
|
1317
|
+
fn2 = r"G:\temp\md-test-package\mdv5a-video-gpu-pt1.10.1.frames.json"
|
|
1318
|
+
fn3 = r"G:\temp\md-test-package\mdv5a-video-cpu-pt2.x.frames.json"
|
|
1319
|
+
fn4 = r"G:\temp\md-test-package\mdv5a-video-gpu-pt2.x.frames.json"
|
|
1320
|
+
|
|
1321
|
+
assert all([os.path.isfile(fn) for fn in [fn1,fn2,fn3,fn4]])
|
|
1322
|
+
print(output_files_are_identical(fn1,fn1,verbose=False))
|
|
1323
|
+
print(output_files_are_identical(fn1,fn2,verbose=False))
|
|
1324
|
+
print(output_files_are_identical(fn1,fn3,verbose=False))
|
|
1325
|
+
|
|
1326
|
+
#%%
|
|
1327
|
+
|
|
1328
|
+
fn1 = r"G:\temp\md-test-package\mdv5a-image-gpu-pt1.10.1.json"
|
|
1329
|
+
fn2 = r"G:\temp\md-test-package\mdv5a-augment-image-gpu-pt1.10.1.json"
|
|
1330
|
+
print(output_files_are_identical(fn1,fn2,verbose=True))
|
|
1331
|
+
|
|
1332
|
+
fn1 = r"G:\temp\md-test-package\mdv5a-image-cpu-pt1.10.1.json"
|
|
1333
|
+
fn2 = r"G:\temp\md-test-package\mdv5a-augment-image-cpu-pt1.10.1.json"
|
|
1334
|
+
print(output_files_are_identical(fn1,fn2,verbose=True))
|
|
1335
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: megadetector
|
|
3
|
-
Version: 5.0.
|
|
3
|
+
Version: 5.0.15
|
|
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>
|
|
@@ -135,14 +135,14 @@ megadetector/data_management/lila/get_lila_image_counts.py,sha256=UxXS5RDnSA_Wbx
|
|
|
135
135
|
megadetector/data_management/lila/lila_common.py,sha256=IEnGoyRgcqbek1qJ1gFE83p1Pg_5kaMS-nQI25lRWIs,10132
|
|
136
136
|
megadetector/data_management/lila/test_lila_metadata_urls.py,sha256=2zKNjgqC3kxdFfyvQC3KTlpc9lf2iMzecHQBf--r_Tk,4438
|
|
137
137
|
megadetector/detection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
138
|
-
megadetector/detection/process_video.py,sha256=
|
|
138
|
+
megadetector/detection/process_video.py,sha256=xV24TWlQ0ImN21DCPkLs7y3oUOP7cjmyrFD0PFzzhsY,42713
|
|
139
139
|
megadetector/detection/pytorch_detector.py,sha256=p70kAX5pqU4SO4GjYJmzbTPV4tKUp5WRapOs7vgSKes,13885
|
|
140
140
|
megadetector/detection/run_detector.py,sha256=biXbeS8aNDlidilxjzhZ-p4_wr2ID-rpsRklbNEd7ME,30094
|
|
141
|
-
megadetector/detection/run_detector_batch.py,sha256=
|
|
141
|
+
megadetector/detection/run_detector_batch.py,sha256=nplmaxOcEe_vnS3VrUd49uZoCQNRmJQmbSMpi8uhh8k,57064
|
|
142
142
|
megadetector/detection/run_inference_with_yolov5_val.py,sha256=u9i1ndwl_k0DsiAWYQcYrrrB9D9Wt56_k6iGTAetUaM,46786
|
|
143
143
|
megadetector/detection/run_tiled_inference.py,sha256=vw0713eNuMiEOjHfweQl58zPHNxPOMdFWZ8bTDLhlMY,37883
|
|
144
144
|
megadetector/detection/tf_detector.py,sha256=-vcBuYRRLKumUj6imcDYgCgClGji0a21uMjoUAtY3yw,8104
|
|
145
|
-
megadetector/detection/video_utils.py,sha256=
|
|
145
|
+
megadetector/detection/video_utils.py,sha256=DNEW10EgWN5ZiJg9uRpxxfJLuBX9Ts2l0eJ66F9kmmw,32474
|
|
146
146
|
megadetector/detection/detector_training/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
147
147
|
megadetector/detection/detector_training/model_main_tf2.py,sha256=YwNsZ7hkIFaEuwKU0rHG_VyqiR_0E01BbdlD0Yx4Smo,4936
|
|
148
148
|
megadetector/postprocessing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -180,7 +180,7 @@ megadetector/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
|
|
|
180
180
|
megadetector/utils/azure_utils.py,sha256=0BdnkG2hW-X0yFpsJqmBhOd2wysz_LvhuyImPJMVPJs,6271
|
|
181
181
|
megadetector/utils/ct_utils.py,sha256=RTMc0UszYuW9QpMo-qetaWder1mFWIzkMLL2UM6PYdY,17960
|
|
182
182
|
megadetector/utils/directory_listing.py,sha256=r4rg2xA4O9ZVxVtzPZzXIXa0DOEukAJMTTNcNSiQcuM,9668
|
|
183
|
-
megadetector/utils/md_tests.py,sha256=
|
|
183
|
+
megadetector/utils/md_tests.py,sha256=mtjxQ_dQYBgo8OOVta5JrPhuDMT1ZNh0S-OQXRocBEM,51236
|
|
184
184
|
megadetector/utils/path_utils.py,sha256=Uj_aNvA_P0buq-3ebQLZz-6to8mNO5JyBhD7n1-pUoU,37149
|
|
185
185
|
megadetector/utils/process_utils.py,sha256=2SdFVxqob-YUW2BTjUEavNuRH3jA4V05fbKMtrVSd3c,5635
|
|
186
186
|
megadetector/utils/sas_blob_utils.py,sha256=k76EcMmJc_otrEHcfV2fxAC6fNhxU88FxM3ddSYrsKU,16917
|
|
@@ -194,8 +194,8 @@ megadetector/visualization/render_images_with_thumbnails.py,sha256=kgJYW8BsqRO4C
|
|
|
194
194
|
megadetector/visualization/visualization_utils.py,sha256=jWiXlLpmWh_CH2vApZURclOC7fdip1aKWQ66wuNabyA,62369
|
|
195
195
|
megadetector/visualization/visualize_db.py,sha256=3FhOtn3GHvNsomwSpsSEzYe58lF9B4Ob3MEi_xplrdo,21256
|
|
196
196
|
megadetector/visualization/visualize_detector_output.py,sha256=LY8QgDWpWlXVLZJUskvT29CdkNvIlEsFTk4DC_lS6pk,17052
|
|
197
|
-
megadetector-5.0.
|
|
198
|
-
megadetector-5.0.
|
|
199
|
-
megadetector-5.0.
|
|
200
|
-
megadetector-5.0.
|
|
201
|
-
megadetector-5.0.
|
|
197
|
+
megadetector-5.0.15.dist-info/LICENSE,sha256=RMa3qq-7Cyk7DdtqRj_bP1oInGFgjyHn9-PZ3PcrqIs,1100
|
|
198
|
+
megadetector-5.0.15.dist-info/METADATA,sha256=E3ZvrTIEHvAVmogrd9wXYmYgvHBo9YsFmIb6-I9uEb0,7893
|
|
199
|
+
megadetector-5.0.15.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
200
|
+
megadetector-5.0.15.dist-info/top_level.txt,sha256=wf9DXa8EwiOSZ4G5IPjakSxBPxTDjhYYnqWRfR-zS4M,13
|
|
201
|
+
megadetector-5.0.15.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|