Skip to content

OMRChecker v2.0.0#220

Closed
Udayraj123 wants to merge 527 commits into
masterfrom
dev
Closed

OMRChecker v2.0.0#220
Udayraj123 wants to merge 527 commits into
masterfrom
dev

Conversation

@Udayraj123

@Udayraj123 Udayraj123 commented Sep 29, 2024

Copy link
Copy Markdown
Owner

Closes multiple feature requests/issues: #156 #128 #125 #105 #39 #185 #247

  • Support for colored outputs! OMRChecker can optionally become colorful with a very small performance overhead :)
  • Showing scores, colored verdicts and symbols from the answer key (credits @palash018)
  • Major refactoring done around read_response and for general code readability
  • Upgraded overall preprocessors structure
  • Upgraded CropOnMarkers plugin to support patch areas, blob detection(for the four corners and more), line detection
  • Upgraded CropPage preprocessor to correct page curvature slightly (ref)
  • Added a top level try catch to mention debug mode
  • Introduces the schema for reading barcodes and sorting files
  • Support for exporting omr metrics (exportable to a JSON object which can be used for visualisations and calculating quality/confidence scores)
  • More refactors:
    • Renamed pageDimensions -> templateDimensions
    • Support for a top level processingImageShape as well as pre-processor level processingImageShape
    • Added conditionalSets in the schema.
    • Rename the fieldType to bubbleFieldType and introduced fieldDetectionType
    • Support multiple images in image utils like resize/normalize, etc
    • support imports in pre-commit hook scripts
    • add auto remove unused imports hook
    • add code coverage module
    • add virtual environment support

Changelogs from #237

  • Support for barcode field(pyzbar)
  • Refactor drawing classes to enable drawing any field types
  • Add a simple launch.json(VScode py debugger)

Changelogs from #186

  • update snapshots using pandas to_string()
  • feat: support for image snapshots
  • feat: use $ref and $def addresses in all schemas
  • refactor drawing utils
  • refactor: detection logic
  • feat: run_sample_fixture
  • feat: working save_image_levels for color and grayscale debug stack images

Changelogs from #192

Fixes #190 and #191
Also addresses: #36

  • feat: separately merge questions, answers and marking schemes from parent
  • feat: basic working conditional set
  • feat: pass matched set name

Other Features covered

  • feat: template roi gui; created local scripts folder as todo; add new template for conditional sets

  • fix: defaultSelector issue

  • feat: support for customFieldTypes in template.json; fix template matching issue

  • Added support for show_preprocessor_diff{} to display per-processor level before-after images (apart from show_image_level)

  • Stabilised autorotate by giving option to crop from preview

  • preview can be enabled for all preprocessors in config.json (autorotating sample is available in Autorotating folder in samples)

Changelogs from #197

  • add Contrast preprocessor
  • add AutoRotate preprocessor
  • rename scan areas to scan zones
  • template alignment using SIFT and delaunay triangulation
  • add phase_correlation_shifts
  • foundation for local scripts
  • support for output_mode==moderation
  • support for section-wise streak marking in evaluation
  • fixed utf character issue in windows
  • add coverage module

Current Master branch:

~35 Files, 4441 loc == Avg 126.8 lines per file, yet highly coupled code and restricted to bubble fields.

After code merge

~112 Files, 16000 loc == Avg 142.8 lines per file, Yet much more readable, more extensible and full of features.

Udayraj123 and others added 30 commits March 30, 2024 18:44
@fph

fph commented Feb 1, 2026

Copy link
Copy Markdown

Thanks! The updates look great. Is this new version ready to test / use? Do you have an idea when they will be merged?

@paolini and I have been using v1 for a project related to the Italian math Olympiad; it would be great to have all these new features in main (and maybe we can contribute some code back to the project once we're using v2).

@Udayraj123

Copy link
Copy Markdown
Owner Author

@fph thanks for checking in. There are active efforts going on with more streamlined approach for the code to be maintainable. I'm simplifying the processing pipeline and also preparing a browser-only version in the latest branch feature/js-port

Cannot provide a timeline on merging to master since it's a side project. But I can make it stable to be usable for your usecase. You may text me over discord channel and I'll be happy to unblock you in using it.

Udayraj123 and others added 5 commits March 9, 2026 23:18
Kept dev branch architecture (src.algorithm.*, src.processors.internal.*,
src.schemas.*) over master's PR #250 constants refactor which was based
on an older codebase.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
uv sync --frozen already creates the .venv; calling uv venv again
fails with "virtual environment already exists". source activate also
has no effect between steps — uv run handles venv activation itself.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Mar 10, 2026

Copy link
Copy Markdown

CI Feedback 🧐

(Feedback updated until commit 0f453e0)

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: Test and Coverage (3.11)

Failed stage: Run pytest [❌]

Failed test name: src/tests/test_all_samples.py::test_run_omr_marker

Failure summary:

The GitHub Action failed because multiple pytest snapshot tests in src/tests/test_all_samples.py did
not match their stored snapshots, causing pytest to exit with code 1.
-
src/tests/test_all_samples.py:12 (test_run_omr_marker) failed due to a snapshot mismatch in
generated CSV content (the received output contains extra trailing whitespace at the end of a row,
e.g., after the last column q22).
- src/tests/test_all_samples.py:72 (test_run_crop_four_dots)
failed due to snapshot mismatches; the diff shows both formatting/whitespace differences in
Manual/ErrorFiles.csv (extra trailing spaces) and also indicates a missing/changed snapshot entry
for Evaluation/IMG_20201116_150750830_evaluation.csv compared to what the snapshot expected.
-
src/tests/test_all_samples.py:77 (test_run_crop_two_dots_one_line) failed due to snapshot mismatch
in Manual/ErrorFiles.csv (extra trailing whitespace in the produced table/CSV row).
-
src/tests/test_all_samples.py:87 (test_run_template_shifts) failed with snapshot mismatch (details
elided in the summary, but reported as assert [- snapshot] == [+ received]).
-
src/tests/test_all_samples.py:107 (test_run_community_Sandeep_1507) failed with snapshot mismatch
(details elided similarly).
Overall snapshot report: 5 snapshots failed, 16 snapshots passed; test
suite result: 5 failed, 31 passed, leading to Process completed with exit code 1.

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

318:  env:
319:  UV_PYTHON: 3.11
320:  UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
321:  OMR_CHECKER_CONTAINER: true
322:  ##[endgroup]
323:  ============================= test session starts ==============================
324:  platform linux -- Python 3.11.15, pytest-8.4.1, pluggy-1.6.0
325:  rootdir: /home/runner/work/OMRChecker/OMRChecker
326:  configfile: pytest.ini
327:  testpaths: src/tests
328:  plugins: mock-3.14.0, cov-6.2.1, syrupy-4.6.1
329:  collected 36 items
330:  src/tests/test_all_samples.py .F......FF.F...F...                        [ 52%]
331:  src/tests/test_edge_cases.py ...                                         [ 61%]
332:  src/tests/test_template_validations.py ..............                    [100%]
333:  =================================== FAILURES ===================================
334:  _____________________________ test_run_omr_marker ______________________________
335:  run_sample = <function run_sample_fixture.<locals>.run_sample at 0x7fbcf11b1440>
336:  mocker = <pytest_mock.plugin.MockerFixture object at 0x7fbd080e1350>
337:  snapshot = dict({
338:  'ScanBatch1/Evaluations/camscanner-1.csv': '''
339:  Marking Scheme Question Marked    Answer(s)      ...-2.jpg   55.0  E204420109  C  C  B  C  C   1  19  10  10   18   D   A   D   D   D   C   C   C   C   D   B   A
340:  ''',
341:  })
342:  image_snapshot = <function image_snapshot_fixture.<locals>._image_snapshot at 0x7fbd043c77e0>
343:  def test_run_omr_marker(run_sample, mocker, snapshot, image_snapshot) -> None:
344:  sample_outputs = run_sample(mocker, "2-omr-marker")
345:  >       assert snapshot == sample_outputs
346:  E       AssertionError: assert [- snapshot] == [+ received]
347:  E           dict({
348:  E                   ...
349:  E                           file_id                                        input_path                                                   output_path  score        Roll q1 q2 q3 q4 q5  q6  q7  q8  q9  q10 q11 q12 q13 q14 q15 q16 q17 q18 q19 q20 q21 q22
350:  E         -     0  camscanner-1.jpg  samples/2-omr-marker/ScanBatch1/camscanner-1.jpg  outputs/2-omr-marker/ScanBatch1/CheckedOMRs/camscanner-1.jpg   -4.0  E204420102  D  C  A  C  B   8  52  21  85   36   B   C   A   A   D   C   C  AD   A   A   D
351:  E         +     0  camscanner-1.jpg  samples/2-omr-marker/ScanBatch1/camscanner-1.jpg  outputs/2-omr-marker/ScanBatch1/CheckedOMRs/camscanner-1.jpg   -4.0  E204420102  D  C  A  C  B   8  52  21  85   36   B   C   A   A   D   C   C  AD   A   A   D    
352:  E             ''',
353:  E            ...
354:  E           })
355:  src/tests/test_all_samples.py:12: AssertionError
356:  ----------------------------- Captured stdout call -----------------------------
...

368:  outputs/2-omr-marker/ScanBatch2/CheckedOMRs/stack           
369:  INFO     Created :                                         file.py:70
370:  outputs/2-omr-marker/ScanBatch2/CheckedOMRs/stack           
371:  /colored                                                    
372:  INFO     Created :                                         file.py:70
373:  outputs/2-omr-marker/ScanBatch2/CheckedOMRs/_MULT           
374:  I_                                                          
375:  INFO     Created :                                         file.py:70
376:  outputs/2-omr-marker/ScanBatch2/CheckedOMRs/_MULT           
377:  I_/colored                                                  
378:  INFO     Created : outputs/2-omr-marker/ScanBatch2/Manual  file.py:79
379:  INFO     Created :                                         file.py:79
380:  outputs/2-omr-marker/ScanBatch2/Manual/MultiMarke           
381:  dFiles                                                      
382:  INFO     Created :                                         file.py:79
383:  outputs/2-omr-marker/ScanBatch2/Manual/ErrorFiles           
384:  INFO     Created : outputs/2-omr-marker/ScanBatch2/Results file.py:90
385:  INFO     Created :                                         file.py:90
386:  outputs/2-omr-marker/ScanBatch2/ImageMetrics                
387:  INFO     Created :                                         file.py:90
388:  outputs/2-omr-marker/ScanBatch2/Evaluations                 
389:  INFO     Checking Files...                    directory_handler.py:32
390:  INFO     Created new file:                    directory_handler.py:60
391:  'outputs/2-omr-marker/ScanBatch2/Res                        
392:  ults/Results_12AM.csv'                                      
393:  INFO     Created new file:                    directory_handler.py:60
394:  'outputs/2-omr-marker/ScanBatch2/Man                        
395:  ual/MultiMarkedFiles.csv'                                   
396:  INFO     Created new file:                    directory_handler.py:60
397:  'outputs/2-omr-marker/ScanBatch2/Man                        
398:  ual/ErrorFiles.csv'                                         
399:  INFO                                                      entry.py:44
...

566:  INFO     Saving Image to                                  image.py:55
567:  'outputs/2-omr-marker/ScanBatch2/CheckedOMRs/col            
568:  ored/camscanner-2.jpg'                                      
569:  INFO     Gray Stack level: 1 ['Input Image', 'Marked      file.py:130
570:  Template']                                                  
571:  INFO     Saved stack image to:                            file.py:136
572:  outputs/2-omr-marker/ScanBatch2/CheckedOMRs/stac            
573:  k/camscanner-2_1_stack.jpg                                  
574:  INFO     Colored Stack level: 1 ['Input Image', 'Marked   file.py:144
575:  Template']                                                  
576:  INFO     Saved colored stack image to:                    file.py:154
577:  outputs/2-omr-marker/ScanBatch2/CheckedOMRs/stac            
578:  k/colored/camscanner-2_1_stack.jpg                          
579:  DEBUG    Closed file Results                  directory_handler.py:77
580:  DEBUG    Closed file MultiMarked              directory_handler.py:77
581:  DEBUG    Closed file Errors                   directory_handler.py:77
582:  INFO                                                     entry.py:487
...

603:  outputs/2-omr-marker/ScanBatch1/CheckedOMRs/stack           
604:  INFO     Created :                                         file.py:70
605:  outputs/2-omr-marker/ScanBatch1/CheckedOMRs/stack           
606:  /colored                                                    
607:  INFO     Created :                                         file.py:70
608:  outputs/2-omr-marker/ScanBatch1/CheckedOMRs/_MULT           
609:  I_                                                          
610:  INFO     Created :                                         file.py:70
611:  outputs/2-omr-marker/ScanBatch1/CheckedOMRs/_MULT           
612:  I_/colored                                                  
613:  INFO     Created : outputs/2-omr-marker/ScanBatch1/Manual  file.py:79
614:  INFO     Created :                                         file.py:79
615:  outputs/2-omr-marker/ScanBatch1/Manual/MultiMarke           
616:  dFiles                                                      
617:  INFO     Created :                                         file.py:79
618:  outputs/2-omr-marker/ScanBatch1/Manual/ErrorFiles           
619:  INFO     Created : outputs/2-omr-marker/ScanBatch1/Results file.py:90
620:  INFO     Created :                                         file.py:90
621:  outputs/2-omr-marker/ScanBatch1/ImageMetrics                
622:  INFO     Created :                                         file.py:90
623:  outputs/2-omr-marker/ScanBatch1/Evaluations                 
624:  INFO     Checking Files...                    directory_handler.py:32
625:  INFO     Created new file:                    directory_handler.py:60
626:  'outputs/2-omr-marker/ScanBatch1/Res                        
627:  ults/Results_12AM.csv'                                      
628:  INFO     Created new file:                    directory_handler.py:60
629:  'outputs/2-omr-marker/ScanBatch1/Man                        
630:  ual/MultiMarkedFiles.csv'                                   
631:  INFO     Created new file:                    directory_handler.py:60
632:  'outputs/2-omr-marker/ScanBatch1/Man                        
633:  ual/ErrorFiles.csv'                                         
634:  INFO                                                      entry.py:44
...

833:  INFO     Saving Image to                                  image.py:55
834:  'outputs/2-omr-marker/ScanBatch1/CheckedOMRs/col            
835:  ored/camscanner-1.jpg'                                      
836:  INFO     Gray Stack level: 1 ['Input Image', 'Marked      file.py:130
837:  Template']                                                  
838:  INFO     Saved stack image to:                            file.py:136
839:  outputs/2-omr-marker/ScanBatch1/CheckedOMRs/stac            
840:  k/camscanner-1_1_stack.jpg                                  
841:  INFO     Colored Stack level: 1 ['Input Image', 'Marked   file.py:144
842:  Template']                                                  
843:  INFO     Saved colored stack image to:                    file.py:154
844:  outputs/2-omr-marker/ScanBatch1/CheckedOMRs/stac            
845:  k/colored/camscanner-1_1_stack.jpg                          
846:  DEBUG    Closed file Results                  directory_handler.py:77
847:  DEBUG    Closed file MultiMarked              directory_handler.py:77
848:  DEBUG    Closed file Errors                   directory_handler.py:77
849:  INFO                                                     entry.py:487
...

862:  Tip: To see some awesome visuals, increase                  
863:  `outputs.show_image_level` in your config:                  
864:  'samples/2-omr-marker/config.json'                          
865:  ------------------------------ Captured log call -------------------------------
866:  INFO     src.utils.logger:validations.py:85 Loading config.json: samples/2-omr-marker/config.json
867:  INFO     src.utils.logger:validations.py:50 Loading template.json: samples/2-omr-marker/template.json
868:  INFO     src.utils.logger:validations.py:12 Loading evaluation.json: samples/2-omr-marker/evaluation.json
869:  INFO     src.utils.logger:file.py:56 Checking Directories...
870:  INFO     src.utils.logger:file.py:70 Created : outputs/2-omr-marker/ScanBatch2/CheckedOMRs/colored
871:  INFO     src.utils.logger:file.py:70 Created : outputs/2-omr-marker/ScanBatch2/CheckedOMRs/stack
872:  INFO     src.utils.logger:file.py:70 Created : outputs/2-omr-marker/ScanBatch2/CheckedOMRs/stack/colored
873:  INFO     src.utils.logger:file.py:70 Created : outputs/2-omr-marker/ScanBatch2/CheckedOMRs/_MULTI_
874:  INFO     src.utils.logger:file.py:70 Created : outputs/2-omr-marker/ScanBatch2/CheckedOMRs/_MULTI_/colored
875:  INFO     src.utils.logger:file.py:79 Created : outputs/2-omr-marker/ScanBatch2/Manual
876:  INFO     src.utils.logger:file.py:79 Created : outputs/2-omr-marker/ScanBatch2/Manual/MultiMarkedFiles
877:  INFO     src.utils.logger:file.py:79 Created : outputs/2-omr-marker/ScanBatch2/Manual/ErrorFiles
878:  INFO     src.utils.logger:file.py:90 Created : outputs/2-omr-marker/ScanBatch2/Results
879:  INFO     src.utils.logger:file.py:90 Created : outputs/2-omr-marker/ScanBatch2/ImageMetrics
880:  INFO     src.utils.logger:file.py:90 Created : outputs/2-omr-marker/ScanBatch2/Evaluations
881:  INFO     src.utils.logger:directory_handler.py:32 Checking Files...
882:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/2-omr-marker/ScanBatch2/Results/Results_12AM.csv'
883:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/2-omr-marker/ScanBatch2/Manual/MultiMarkedFiles.csv'
884:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/2-omr-marker/ScanBatch2/Manual/ErrorFiles.csv'
885:  INFO     src.utils.logger:entry.py:44 
...

902:  parsed_destination_points=[[  0.   0.]
903:  [325.   0.]
904:  [325. 449.]
905:  [  0. 449.]] 
906:  warped_dimensions=(325, 449)
907:  DEBUG    src.utils.logger:interpretation_pass.py:62 Thresholding: 	 file_level_fallback_threshold: 167.7 	global_std_THR: 10	
908:  INFO     src.utils.logger:entry.py:333 (/1) Graded with score: 55.0	 Correct: 22 Incorrect: 0 Unmarked: 0 	 file: 'camscanner-2.jpg'
909:  INFO     src.utils.logger:image.py:55 Saving Image to 'outputs/2-omr-marker/ScanBatch2/CheckedOMRs/camscanner-2.jpg'
910:  INFO     src.utils.logger:image.py:55 Saving Image to 'outputs/2-omr-marker/ScanBatch2/CheckedOMRs/colored/camscanner-2.jpg'
911:  INFO     src.utils.logger:file.py:130 Gray Stack level: 1 ['Input Image', 'Marked Template']
912:  INFO     src.utils.logger:file.py:136 Saved stack image to: outputs/2-omr-marker/ScanBatch2/CheckedOMRs/stack/camscanner-2_1_stack.jpg
913:  INFO     src.utils.logger:file.py:144 Colored Stack level: 1 ['Input Image', 'Marked Template']
914:  INFO     src.utils.logger:file.py:154 Saved colored stack image to: outputs/2-omr-marker/ScanBatch2/CheckedOMRs/stack/colored/camscanner-2_1_stack.jpg
915:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file Results
916:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file MultiMarked
917:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file Errors
918:  INFO     src.utils.logger:entry.py:487 
...

922:  INFO     src.utils.logger:entry.py:491 Total file(s) processed    : 1 (Sum Tallied!)
923:  INFO     src.utils.logger:entry.py:496 
924:  Finished Checking 1 file(s) in 1 seconds i.e. ~0.0 minute(s).
925:  INFO     src.utils.logger:entry.py:499 OMR Processing Rate        : 	 ~ 1.0 seconds/OMR
926:  INFO     src.utils.logger:entry.py:502 OMR Processing Speed       : 	 ~ 60.0 OMRs/minute
927:  INFO     src.utils.logger:entry.py:173 
928:  Tip: To see some awesome visuals, increase `outputs.show_image_level` in your config: 'samples/2-omr-marker/config.json'
929:  INFO     src.utils.logger:file.py:56 Checking Directories...
930:  INFO     src.utils.logger:file.py:70 Created : outputs/2-omr-marker/ScanBatch1/CheckedOMRs/colored
931:  INFO     src.utils.logger:file.py:70 Created : outputs/2-omr-marker/ScanBatch1/CheckedOMRs/stack
932:  INFO     src.utils.logger:file.py:70 Created : outputs/2-omr-marker/ScanBatch1/CheckedOMRs/stack/colored
933:  INFO     src.utils.logger:file.py:70 Created : outputs/2-omr-marker/ScanBatch1/CheckedOMRs/_MULTI_
934:  INFO     src.utils.logger:file.py:70 Created : outputs/2-omr-marker/ScanBatch1/CheckedOMRs/_MULTI_/colored
935:  INFO     src.utils.logger:file.py:79 Created : outputs/2-omr-marker/ScanBatch1/Manual
936:  INFO     src.utils.logger:file.py:79 Created : outputs/2-omr-marker/ScanBatch1/Manual/MultiMarkedFiles
937:  INFO     src.utils.logger:file.py:79 Created : outputs/2-omr-marker/ScanBatch1/Manual/ErrorFiles
938:  INFO     src.utils.logger:file.py:90 Created : outputs/2-omr-marker/ScanBatch1/Results
939:  INFO     src.utils.logger:file.py:90 Created : outputs/2-omr-marker/ScanBatch1/ImageMetrics
940:  INFO     src.utils.logger:file.py:90 Created : outputs/2-omr-marker/ScanBatch1/Evaluations
941:  INFO     src.utils.logger:directory_handler.py:32 Checking Files...
942:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/2-omr-marker/ScanBatch1/Results/Results_12AM.csv'
943:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/2-omr-marker/ScanBatch1/Manual/MultiMarkedFiles.csv'
944:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/2-omr-marker/ScanBatch1/Manual/ErrorFiles.csv'
945:  INFO     src.utils.logger:entry.py:44 
...

962:  parsed_destination_points=[[  0.   0.]
963:  [325.   0.]
964:  [325. 449.]
965:  [  0. 449.]] 
966:  warped_dimensions=(325, 449)
967:  DEBUG    src.utils.logger:interpretation_pass.py:62 Thresholding: 	 file_level_fallback_threshold: 187.3 	global_std_THR: 17.39	
968:  INFO     src.utils.logger:entry.py:333 (/1) Graded with score: -4.0	 Correct: 5 Incorrect: 16 Unmarked: 1 	 file: 'camscanner-1.jpg'
969:  INFO     src.utils.logger:image.py:55 Saving Image to 'outputs/2-omr-marker/ScanBatch1/CheckedOMRs/camscanner-1.jpg'
970:  INFO     src.utils.logger:image.py:55 Saving Image to 'outputs/2-omr-marker/ScanBatch1/CheckedOMRs/colored/camscanner-1.jpg'
971:  INFO     src.utils.logger:file.py:130 Gray Stack level: 1 ['Input Image', 'Marked Template']
972:  INFO     src.utils.logger:file.py:136 Saved stack image to: outputs/2-omr-marker/ScanBatch1/CheckedOMRs/stack/camscanner-1_1_stack.jpg
973:  INFO     src.utils.logger:file.py:144 Colored Stack level: 1 ['Input Image', 'Marked Template']
974:  INFO     src.utils.logger:file.py:154 Saved colored stack image to: outputs/2-omr-marker/ScanBatch1/CheckedOMRs/stack/colored/camscanner-1_1_stack.jpg
975:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file Results
976:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file MultiMarked
977:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file Errors
978:  INFO     src.utils.logger:entry.py:487 
...

1032:  E         -   'Evaluation/IMG_20201116_150750830_evaluation.csv': '''
1033:  E         -     "Question","Marked","Answer(s)","Verdict","Delta","Score"
1034:  E         -     "q1","A","B","Incorrect","-1.0","-1.0"
1035:  E         -     "q2","","D","Unmarked","0.0","-1.0"
1036:  E         -     "q3","D","C","Incorrect","-1.0","-2.0"
1037:  E         -     "q4","C","B","Incorrect","-1.0","-3.0"
1038:  E         -     "q5","AC","D","Incorrect","-1.0","-4.0"
1039:  E         -     "q6","A","C","Incorrect","-1.0","-5.0"
1040:  E         -     "q7","D","['B', 'C', 'BC']","Incorrect","-1.0","-6.0"
1041:  E         -     "q8","B","A","Incorrect","-1.0","-7.0"
1042:  E         -     "q9","C","C","Correct","3.0","-4.0"
1043:  E         -     "q10","D","D","Correct","3.0","-1.0"
1044:  E         -     "q11","D","C","Incorrect","-1.0","-2.0"
1045:  E         - 
1046:  E         -   ''',
1047:  E             'Manual/ErrorFiles.csv': '''
1048:  E                    ...
1049:  E                            file_id                                                             input_path                                                                        output_path  score        Roll  Subject Code bookletNo q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 q16 q17 q18 q19 q20 q21 q22 q23 q24 q25 q26 q27 q28 q29 q30 q31 q32 q33 q34 q35 q36 q37 q38 q39 q40 q41 q42 q43 q44 q45 q46 q47 q48 q49 q50 q51 q52 q53 q54 q55 q56 q57 q58 q59 q60 q61 q62 q63 q64 q65 q66 q67 q68 q69 q70 q71 q72 q73 q74 q75 q76 q77 q78 q79 q80 q81 q82 q83 q84 q85 q86 q87 q88 q89 q90 q91 q92 q93 q94 q95 q96 q97 q98 q99 q100
1050:  E         -     0  omr-four-dots.jpg  samples/experimental/1-timelines-and-dots/four-dots/omr-four-dots.jpg  outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/omr-four-dots.jpg      0  1000001064             6         A  C  C  A  B     D  C  D  A   A   D       B   A   B   A   C   B               D   C   D   C   C       C   D   B       B   B           B   A   B   A   A   B   D   D   C   B   C   C   D   B   D       A   A   C   B   B   D   C   B   A   C   A   C   C   B   B   D   C   B   A       C   D   B   D   C   A   C   C   B   C   B   C   D   A   B   C   B   B                   D   D   B           D
1051:  E         +     0  omr-four-dots.jpg  samples/experimental/1-timelines-and-dots/four-dots/omr-four-dots.jpg  outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/omr-four-dots.jpg      0  1000001064             6         A  C  C  A  B     D  C  D  A   A   D       B   A   B   A   C   B               D   C   D   C   C       C   D   B       B   B           B   A   B   A   A   B   D   D   C   B   C   C   D   B   D       A   A   C   B   B   D   C   B   A   C   A   C   C   B   B   D   C   B   A       C   D   B   D   C   A   C   C   B   C   B   C   D   A   B   C   B   B                   D   D   B           D     
1052:  E             ''',
1053:  E           })
1054:  src/tests/test_all_samples.py:72: AssertionError
1055:  ----------------------------- Captured stdout call -----------------------------
...

1071:  ts/CheckedOMRs/stack/colored                                
1072:  INFO     Created :                                         file.py:70
1073:  outputs/experimental/1-timelines-and-dots/four-do           
1074:  ts/CheckedOMRs/_MULTI_                                      
1075:  INFO     Created :                                         file.py:70
1076:  outputs/experimental/1-timelines-and-dots/four-do           
1077:  ts/CheckedOMRs/_MULTI_/colored                              
1078:  INFO     Created :                                         file.py:79
1079:  outputs/experimental/1-timelines-and-dots/four-do           
1080:  ts/Manual                                                   
1081:  INFO     Created :                                         file.py:79
1082:  outputs/experimental/1-timelines-and-dots/four-do           
1083:  ts/Manual/MultiMarkedFiles                                  
1084:  INFO     Created :                                         file.py:79
1085:  outputs/experimental/1-timelines-and-dots/four-do           
1086:  ts/Manual/ErrorFiles                                        
1087:  INFO     Created :                                         file.py:90
...

1092:  ts/ImageMetrics                                             
1093:  INFO     Created :                                         file.py:90
1094:  outputs/experimental/1-timelines-and-dots/four-do           
1095:  ts/Evaluations                                              
1096:  INFO     Checking Files...                    directory_handler.py:32
1097:  INFO     Created new file:                    directory_handler.py:60
1098:  'outputs/experimental/1-timelines-an                        
1099:  d-dots/four-dots/Results/Results_12A                        
1100:  M.csv'                                                      
1101:  INFO     Created new file:                    directory_handler.py:60
1102:  'outputs/experimental/1-timelines-an                        
1103:  d-dots/four-dots/Manual/MultiMarkedF                        
1104:  iles.csv'                                                   
1105:  INFO     Created new file:                    directory_handler.py:60
1106:  'outputs/experimental/1-timelines-an                        
1107:  d-dots/four-dots/Manual/ErrorFiles.c                        
1108:  sv'                                                         
...

1251:  'q53': 'A', 'q89': 'B', 'q80': 'B', 'q52': 'A',             
1252:  'q22': 'D', 'q25': 'C'}                                     
1253:  INFO     (/1) Processed file: 'omr-four-dots.jpg'        entry.py:341
1254:  INFO     Saving Image to                                  image.py:55
1255:  'outputs/experimental/1-timelines-and-dots/four-            
1256:  dots/CheckedOMRs/omr-four-dots.jpg'                         
1257:  INFO     Gray Stack level: 1 ['Input Image', 'Marked      file.py:130
1258:  Template']                                                  
1259:  INFO     Saved stack image to:                            file.py:136
1260:  outputs/experimental/1-timelines-and-dots/four-d            
1261:  ots/CheckedOMRs/stack/omr-four-dots_1_stack.jpg             
1262:  INFO     Note: Nothing to save for colored image. Stack   file.py:161
1263:  level: 1                                                    
1264:  DEBUG    Closed file Results                  directory_handler.py:77
1265:  DEBUG    Closed file MultiMarked              directory_handler.py:77
1266:  DEBUG    Closed file Errors                   directory_handler.py:77
1267:  INFO                                                     entry.py:487
...

1280:  Tip: To see some awesome visuals, increase                  
1281:  `outputs.show_image_level` in your config:                  
1282:  'samples/experimental/1-timelines-and-dots/four             
1283:  -dots/config.json'                                          
1284:  ------------------------------ Captured log call -------------------------------
1285:  INFO     src.utils.logger:validations.py:85 Loading config.json: samples/experimental/1-timelines-and-dots/four-dots/config.json
1286:  INFO     src.utils.logger:validations.py:50 Loading template.json: samples/experimental/1-timelines-and-dots/four-dots/template.json
1287:  INFO     src.utils.logger:file.py:56 Checking Directories...
1288:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/colored
1289:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/stack
1290:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/stack/colored
1291:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/_MULTI_
1292:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/_MULTI_/colored
1293:  INFO     src.utils.logger:file.py:79 Created : outputs/experimental/1-timelines-and-dots/four-dots/Manual
1294:  INFO     src.utils.logger:file.py:79 Created : outputs/experimental/1-timelines-and-dots/four-dots/Manual/MultiMarkedFiles
1295:  INFO     src.utils.logger:file.py:79 Created : outputs/experimental/1-timelines-and-dots/four-dots/Manual/ErrorFiles
1296:  INFO     src.utils.logger:file.py:90 Created : outputs/experimental/1-timelines-and-dots/four-dots/Results
1297:  INFO     src.utils.logger:file.py:90 Created : outputs/experimental/1-timelines-and-dots/four-dots/ImageMetrics
1298:  INFO     src.utils.logger:file.py:90 Created : outputs/experimental/1-timelines-and-dots/four-dots/Evaluations
1299:  INFO     src.utils.logger:directory_handler.py:32 Checking Files...
1300:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/experimental/1-timelines-and-dots/four-dots/Results/Results_12AM.csv'
1301:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/experimental/1-timelines-and-dots/four-dots/Manual/MultiMarkedFiles.csv'
1302:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/experimental/1-timelines-and-dots/four-dots/Manual/ErrorFiles.csv'
1303:  INFO     src.utils.logger:entry.py:44 
...

1344:  parsed_destination_points=[[  3.   0.]
1345:  [770.   0.]
1346:  [770. 922.]
1347:  [  0. 920.]] 
1348:  warped_dimensions=(770, 922)
1349:  DEBUG    src.utils.logger:interpretation_pass.py:62 Thresholding: 	 file_level_fallback_threshold: 151.98 	global_std_THR: 23.49	
1350:  INFO     src.utils.logger:entry.py:340 Read Response: 
1351:  {'Subject Code': '06', 'Roll': '1000001064', 'q65': 'B', 'q27': '', 'q78': 'C', 'q66': 'B', 'q97': '', 'q90': '', 'q8': 'D', 'q95': 'D', 'q19': '', 'q5': '', 'q71': '', 'q14': 'A', 'q94': 'D', 'q16': 'A', 'q7': 'C', 'q29': 'D', 'q15': 'B', 'q34': '', 'q92': '', 'q3': 'A', 'q88': 'B', 'q58': 'C', 'q46': 'C', 'q67': 'D', 'q24': 'D', 'q32': 'B', 'q36': 'B', 'q48': 'D', 'q57': 'D', 'q54': 'C', 'q86': 'B', 'q44': 'C', 'q2': 'C', 'q38': 'B', 'q28': 'C', 'q42': 'D', 'q64': 'C', 'q20': '', 'q84': 'D', 'q72': 'C', 'q11': 'D', 'q18': 'B', 'q43': 'D', 'q77': 'A', 'q50': 'D', 'q51': '', 'q41': 'B', 'q35': '', 'q85': 'A', 'q62': 'A', 'q87': 'C', 'q9': 'A', 'q55': 'B', 'q99': 'D', 'q47': 'C', 'q83': 'C', 'q1': 'C', 'q81': 'C', 'q30': 'B', 'q31': '', 'q75': 'D', 'q96': 'B', 'q6': 'D', 'q13': 'B', 'q76': 'C', 'q82': 'B', 'q39': 'A', 'q10': 'A', 'q98': '', 'q21': '', 'q61': 'C', 'q33': 'B', 'q69': 'B', 'q40': 'A', 'q4': 'B', 'q17': 'C', 'q63': 'C', 'q93': '', 'q68': 'C', 'q100': '', 'q60': 'A', 'q49': 'B', 'bookletNo': 'A', 'q12': '', 'q45': 'B', 'q70': 'A', 'q59': 'B', 'q73': 'D', 'q26': 'C', 'q37': 'A', 'q79': 'C', 'q23': 'C', 'q56': 'B', 'q74': 'B', 'q91': '', 'q53': 'A', 'q89': 'B', 'q80': 'B', 'q52': 'A', 'q22': 'D', 'q25': 'C'}
1352:  INFO     src.utils.logger:entry.py:341 (/1) Processed file: 'omr-four-dots.jpg'
1353:  INFO     src.utils.logger:image.py:55 Saving Image to 'outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/omr-four-dots.jpg'
1354:  INFO     src.utils.logger:file.py:130 Gray Stack level: 1 ['Input Image', 'Marked Template']
1355:  INFO     src.utils.logger:file.py:136 Saved stack image to: outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/stack/omr-four-dots_1_stack.jpg
1356:  INFO     src.utils.logger:file.py:161 Note: Nothing to save for colored image. Stack level: 1
1357:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file Results
1358:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file MultiMarked
1359:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file Errors
1360:  INFO     src.utils.logger:entry.py:487 
1361:  INFO     src.utils.logger:entry.py:488 Total file(s) moved        : 0
1362:  INFO     src.utils.logger:entry.py:489 Total file(s) not moved    : 1
1363:  INFO     src.utils.logger:entry.py:490 --------------------------------
1364:  INFO     src.utils.logger:entry.py:491 Total file(s) processed    : 1 (Sum Tallied!)
1365:  INFO     src.utils.logger:entry.py:496 
1366:  Finished Checking 1 file(s) in 1 seconds i.e. ~0.0 minute(s).
1367:  INFO     src.utils.logger:entry.py:499 OMR Processing Rate        : 	 ~ 1.0 seconds/OMR
1368:  INFO     src.utils.logger:entry.py:502 OMR Processing Speed       : 	 ~ 60.0 OMRs/minute
1369:  INFO     src.utils.logger:entry.py:173 
1370:  Tip: To see some awesome visuals, increase `outputs.show_image_level` in your config: 'samples/experimental/1-timelines-and-dots/four-dots/config.json'
1371:  _______________________ test_run_crop_two_dots_one_line ________________________
1372:  run_sample = <function run_sample_fixture.<locals>.run_sample at 0x7fbcf0bda8e0>
1373:  mocker = <pytest_mock.plugin.MockerFixture object at 0x7fbcec9328d0>
1374:  snapshot = dict({
1375:  'Manual/ErrorFiles.csv': '''
1376:  Empty DataFrame
1377:  Columns: [file_id, input_path, output_path, score, Roll,...C   D   B   D   C   A   C   C   B   C   B   C   D   A   B   C   B   B                   D   D   B           D
1378:  ''',
1379:  })
1380:  def test_run_crop_two_dots_one_line(run_sample, mocker, snapshot) -> None:
1381:  sample_outputs = run_sample(mocker, "experimental/1-timelines-and-dots/four-dots")
1382:  >       assert snapshot == sample_outputs
1383:  E       AssertionError: assert [- snapshot] == [+ received]
1384:  E           dict({
1385:  E                   ...
1386:  E                            file_id                                                             input_path                                                                        output_path  score        Roll  Subject Code bookletNo q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 q16 q17 q18 q19 q20 q21 q22 q23 q24 q25 q26 q27 q28 q29 q30 q31 q32 q33 q34 q35 q36 q37 q38 q39 q40 q41 q42 q43 q44 q45 q46 q47 q48 q49 q50 q51 q52 q53 q54 q55 q56 q57 q58 q59 q60 q61 q62 q63 q64 q65 q66 q67 q68 q69 q70 q71 q72 q73 q74 q75 q76 q77 q78 q79 q80 q81 q82 q83 q84 q85 q86 q87 q88 q89 q90 q91 q92 q93 q94 q95 q96 q97 q98 q99 q100
1387:  E         -     0  omr-four-dots.jpg  samples/experimental/1-timelines-and-dots/four-dots/omr-four-dots.jpg  outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/omr-four-dots.jpg      0  1000001064             6         A  C  C  A  B     D  C  D  A   A   D       B   A   B   A   C   B               D   C   D   C   C       C   D   B       B   B           B   A   B   A   A   B   D   D   C   B   C   C   D   B   D       A   A   C   B   B   D   C   B   A   C   A   C   C   B   B   D   C   B   A       C   D   B   D   C   A   C   C   B   C   B   C   D   A   B   C   B   B                   D   D   B           D
1388:  E         +     0  omr-four-dots.jpg  samples/experimental/1-timelines-and-dots/four-dots/omr-four-dots.jpg  outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/omr-four-dots.jpg      0  1000001064             6         A  C  C  A  B     D  C  D  A   A   D       B   A   B   A   C   B               D   C   D   C   C       C   D   B       B   B           B   A   B   A   A   B   D   D   C   B   C   C   D   B   D       A   A   C   B   B   D   C   B   A   C   A   C   C   B   B   D   C   B   A       C   D   B   D   C   A   C   C   B   C   B   C   D   A   B   C   B   B                   D   D   B           D     
1389:  E             ''',
1390:  E           })
1391:  src/tests/test_all_samples.py:77: AssertionError
1392:  ----------------------------- Captured stdout call -----------------------------
...

1408:  ts/CheckedOMRs/stack/colored                                
1409:  INFO     Created :                                         file.py:70
1410:  outputs/experimental/1-timelines-and-dots/four-do           
1411:  ts/CheckedOMRs/_MULTI_                                      
1412:  INFO     Created :                                         file.py:70
1413:  outputs/experimental/1-timelines-and-dots/four-do           
1414:  ts/CheckedOMRs/_MULTI_/colored                              
1415:  INFO     Created :                                         file.py:79
1416:  outputs/experimental/1-timelines-and-dots/four-do           
1417:  ts/Manual                                                   
1418:  INFO     Created :                                         file.py:79
1419:  outputs/experimental/1-timelines-and-dots/four-do           
1420:  ts/Manual/MultiMarkedFiles                                  
1421:  INFO     Created :                                         file.py:79
1422:  outputs/experimental/1-timelines-and-dots/four-do           
1423:  ts/Manual/ErrorFiles                                        
1424:  INFO     Created :                                         file.py:90
...

1429:  ts/ImageMetrics                                             
1430:  INFO     Created :                                         file.py:90
1431:  outputs/experimental/1-timelines-and-dots/four-do           
1432:  ts/Evaluations                                              
1433:  INFO     Checking Files...                    directory_handler.py:32
1434:  INFO     Created new file:                    directory_handler.py:60
1435:  'outputs/experimental/1-timelines-an                        
1436:  d-dots/four-dots/Results/Results_12A                        
1437:  M.csv'                                                      
1438:  INFO     Created new file:                    directory_handler.py:60
1439:  'outputs/experimental/1-timelines-an                        
1440:  d-dots/four-dots/Manual/MultiMarkedF                        
1441:  iles.csv'                                                   
1442:  INFO     Created new file:                    directory_handler.py:60
1443:  'outputs/experimental/1-timelines-an                        
1444:  d-dots/four-dots/Manual/ErrorFiles.c                        
1445:  sv'                                                         
...

1588:  'q53': 'A', 'q89': 'B', 'q80': 'B', 'q52': 'A',             
1589:  'q22': 'D', 'q25': 'C'}                                     
1590:  INFO     (/1) Processed file: 'omr-four-dots.jpg'        entry.py:341
1591:  INFO     Saving Image to                                  image.py:55
1592:  'outputs/experimental/1-timelines-and-dots/four-            
1593:  dots/CheckedOMRs/omr-four-dots.jpg'                         
1594:  INFO     Gray Stack level: 1 ['Input Image', 'Marked      file.py:130
1595:  Template']                                                  
1596:  INFO     Saved stack image to:                            file.py:136
1597:  outputs/experimental/1-timelines-and-dots/four-d            
1598:  ots/CheckedOMRs/stack/omr-four-dots_1_stack.jpg             
1599:  INFO     Note: Nothing to save for colored image. Stack   file.py:161
1600:  level: 1                                                    
1601:  DEBUG    Closed file Results                  directory_handler.py:77
1602:  DEBUG    Closed file MultiMarked              directory_handler.py:77
1603:  DEBUG    Closed file Errors                   directory_handler.py:77
1604:  INFO                                                     entry.py:487
...

1617:  Tip: To see some awesome visuals, increase                  
1618:  `outputs.show_image_level` in your config:                  
1619:  'samples/experimental/1-timelines-and-dots/four             
1620:  -dots/config.json'                                          
1621:  ------------------------------ Captured log call -------------------------------
1622:  INFO     src.utils.logger:validations.py:85 Loading config.json: samples/experimental/1-timelines-and-dots/four-dots/config.json
1623:  INFO     src.utils.logger:validations.py:50 Loading template.json: samples/experimental/1-timelines-and-dots/four-dots/template.json
1624:  INFO     src.utils.logger:file.py:56 Checking Directories...
1625:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/colored
1626:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/stack
1627:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/stack/colored
1628:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/_MULTI_
1629:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/_MULTI_/colored
1630:  INFO     src.utils.logger:file.py:79 Created : outputs/experimental/1-timelines-and-dots/four-dots/Manual
1631:  INFO     src.utils.logger:file.py:79 Created : outputs/experimental/1-timelines-and-dots/four-dots/Manual/MultiMarkedFiles
1632:  INFO     src.utils.logger:file.py:79 Created : outputs/experimental/1-timelines-and-dots/four-dots/Manual/ErrorFiles
1633:  INFO     src.utils.logger:file.py:90 Created : outputs/experimental/1-timelines-and-dots/four-dots/Results
1634:  INFO     src.utils.logger:file.py:90 Created : outputs/experimental/1-timelines-and-dots/four-dots/ImageMetrics
1635:  INFO     src.utils.logger:file.py:90 Created : outputs/experimental/1-timelines-and-dots/four-dots/Evaluations
1636:  INFO     src.utils.logger:directory_handler.py:32 Checking Files...
1637:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/experimental/1-timelines-and-dots/four-dots/Results/Results_12AM.csv'
1638:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/experimental/1-timelines-and-dots/four-dots/Manual/MultiMarkedFiles.csv'
1639:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/experimental/1-timelines-and-dots/four-dots/Manual/ErrorFiles.csv'
1640:  INFO     src.utils.logger:entry.py:44 
...

1681:  parsed_destination_points=[[  3.   0.]
1682:  [770.   0.]
1683:  [770. 922.]
1684:  [  0. 920.]] 
1685:  warped_dimensions=(770, 922)
1686:  DEBUG    src.utils.logger:interpretation_pass.py:62 Thresholding: 	 file_level_fallback_threshold: 151.98 	global_std_THR: 23.49	
1687:  INFO     src.utils.logger:entry.py:340 Read Response: 
1688:  {'Subject Code': '06', 'Roll': '1000001064', 'q65': 'B', 'q27': '', 'q78': 'C', 'q66': 'B', 'q97': '', 'q90': '', 'q8': 'D', 'q95': 'D', 'q19': '', 'q5': '', 'q71': '', 'q14': 'A', 'q94': 'D', 'q16': 'A', 'q7': 'C', 'q29': 'D', 'q15': 'B', 'q34': '', 'q92': '', 'q3': 'A', 'q88': 'B', 'q58': 'C', 'q46': 'C', 'q67': 'D', 'q24': 'D', 'q32': 'B', 'q36': 'B', 'q48': 'D', 'q57': 'D', 'q54': 'C', 'q86': 'B', 'q44': 'C', 'q2': 'C', 'q38': 'B', 'q28': 'C', 'q42': 'D', 'q64': 'C', 'q20': '', 'q84': 'D', 'q72': 'C', 'q11': 'D', 'q18': 'B', 'q43': 'D', 'q77': 'A', 'q50': 'D', 'q51': '', 'q41': 'B', 'q35': '', 'q85': 'A', 'q62': 'A', 'q87': 'C', 'q9': 'A', 'q55': 'B', 'q99': 'D', 'q47': 'C', 'q83': 'C', 'q1': 'C', 'q81': 'C', 'q30': 'B', 'q31': '', 'q75': 'D', 'q96': 'B', 'q6': 'D', 'q13': 'B', 'q76': 'C', 'q82': 'B', 'q39': 'A', 'q10': 'A', 'q98': '', 'q21': '', 'q61': 'C', 'q33': 'B', 'q69': 'B', 'q40': 'A', 'q4': 'B', 'q17': 'C', 'q63': 'C', 'q93': '', 'q68': 'C', 'q100': '', 'q60': 'A', 'q49': 'B', 'bookletNo': 'A', 'q12': '', 'q45': 'B', 'q70': 'A', 'q59': 'B', 'q73': 'D', 'q26': 'C', 'q37': 'A', 'q79': 'C', 'q23': 'C', 'q56': 'B', 'q74': 'B', 'q91': '', 'q53': 'A', 'q89': 'B', 'q80': 'B', 'q52': 'A', 'q22': 'D', 'q25': 'C'}
1689:  INFO     src.utils.logger:entry.py:341 (/1) Processed file: 'omr-four-dots.jpg'
1690:  INFO     src.utils.logger:image.py:55 Saving Image to 'outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/omr-four-dots.jpg'
1691:  INFO     src.utils.logger:file.py:130 Gray Stack level: 1 ['Input Image', 'Marked Template']
1692:  INFO     src.utils.logger:file.py:136 Saved stack image to: outputs/experimental/1-timelines-and-dots/four-dots/CheckedOMRs/stack/omr-four-dots_1_stack.jpg
1693:  INFO     src.utils.logger:file.py:161 Note: Nothing to save for colored image. Stack level: 1
1694:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file Results
1695:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file MultiMarked
1696:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file Errors
1697:  INFO     src.utils.logger:entry.py:487 
1698:  INFO     src.utils.logger:entry.py:488 Total file(s) moved        : 0
1699:  INFO     src.utils.logger:entry.py:489 Total file(s) not moved    : 1
1700:  INFO     src.utils.logger:entry.py:490 --------------------------------
1701:  INFO     src.utils.logger:entry.py:491 Total file(s) processed    : 1 (Sum Tallied!)
1702:  INFO     src.utils.logger:entry.py:496 
1703:  Finished Checking 1 file(s) in 1 seconds i.e. ~0.0 minute(s).
1704:  INFO     src.utils.logger:entry.py:499 OMR Processing Rate        : 	 ~ 1.0 seconds/OMR
1705:  INFO     src.utils.logger:entry.py:502 OMR Processing Speed       : 	 ~ 60.0 OMRs/minute
1706:  INFO     src.utils.logger:entry.py:173 
1707:  Tip: To see some awesome visuals, increase `outputs.show_image_level` in your config: 'samples/experimental/1-timelines-and-dots/four-dots/config.json'
1708:  ___________________________ test_run_template_shifts ___________________________
1709:  run_sample = <function run_sample_fixture.<locals>.run_sample at 0x7fbcecb272e0>
1710:  mocker = <pytest_mock.plugin.MockerFixture object at 0x7fbcecb9d710>
1711:  snapshot = dict({
1712:  'alignment/Manual/ErrorFiles.csv': '''
1713:  Empty DataFrame
1714:  Columns: [file_id, input_path, output_path, sc...   D   C   D   A   A   C   B   C   D   C   A   B   C   B   D   A   A   C   A   B   D   C   D   A   C   B    A
1715:  ''',
1716:  })
1717:  def test_run_template_shifts(run_sample, mocker, snapshot) -> None:
1718:  sample_outputs = run_sample(mocker, "experimental/2-template-shifts")
1719:  >       assert snapshot == sample_outputs
1720:  E       assert [- snapshot] == [+ received]
1721:  E           ...
1722:  E           ...
1723:  E           })
1724:  src/tests/test_all_samples.py:87: AssertionError
1725:  ----------------------------- Captured stdout call -----------------------------
...

1744:  CheckedOMRs/stack/colored                                   
1745:  INFO     Created :                                         file.py:70
1746:  outputs/experimental/2-template-shifts/alignment/           
1747:  CheckedOMRs/_MULTI_                                         
1748:  INFO     Created :                                         file.py:70
1749:  outputs/experimental/2-template-shifts/alignment/           
1750:  CheckedOMRs/_MULTI_/colored                                 
1751:  INFO     Created :                                         file.py:79
1752:  outputs/experimental/2-template-shifts/alignment/           
1753:  Manual                                                      
1754:  INFO     Created :                                         file.py:79
1755:  outputs/experimental/2-template-shifts/alignment/           
1756:  Manual/MultiMarkedFiles                                     
1757:  INFO     Created :                                         file.py:79
1758:  outputs/experimental/2-template-shifts/alignment/           
1759:  Manual/ErrorFiles                                           
1760:  INFO     Created :                                         file.py:90
...

1765:  ImageMetrics                                                
1766:  INFO     Created :                                         file.py:90
1767:  outputs/experimental/2-template-shifts/alignment/           
1768:  Evaluations                                                 
1769:  INFO     Checking Files...                    directory_handler.py:32
1770:  INFO     Created new file:                    directory_handler.py:60
1771:  'outputs/experimental/2-template-shi                        
1772:  fts/alignment/Results/Results_12AM.c                        
1773:  sv'                                                         
1774:  INFO     Created new file:                    directory_handler.py:60
1775:  'outputs/experimental/2-template-shi                        
1776:  fts/alignment/Manual/MultiMarkedFile                        
1777:  s.csv'                                                      
1778:  INFO     Created new file:                    directory_handler.py:60
1779:  'outputs/experimental/2-template-shi                        
1780:  fts/alignment/Manual/ErrorFiles.csv'                        
1781:  INFO                                                      entry.py:44
...

8823:  'B', 'q70': 'D', 'q110': 'B', 'q59': 'D',                   
8824:  'q196': 'B', 'q121': 'C', 'q26': 'C', 'q161':               
8825:  'D', 'q169': 'D', 'q37': '', 'q91': '', 'q144':             
8826:  'A', 'q164': 'D', 'q53': 'D', 'q89': 'A',                   
8827:  'q194': 'C', 'q52': 'C'}                                    
8828:  INFO     (/2) Processed file: 'omr-2.jpeg'               entry.py:341
8829:  INFO     Saving Image to                                  image.py:55
8830:  'outputs/experimental/2-template-shifts/alignmen            
8831:  t/CheckedOMRs/omr-2.jpeg'                                   
8832:  INFO     Note: Nothing to save for gray image. Stack      file.py:139
8833:  level: 0                                                    
8834:  INFO     Note: Nothing to save for colored image. Stack   file.py:161
8835:  level: 0                                                    
8836:  DEBUG    Closed file Results                  directory_handler.py:77
8837:  DEBUG    Closed file MultiMarked              directory_handler.py:77
8838:  DEBUG    Closed file Errors                   directory_handler.py:77
8839:  INFO                                                     entry.py:487
...

8858:  in-sheet/CheckedOMRs/stack/colored                          
8859:  INFO     Created :                                         file.py:70
8860:  outputs/experimental/2-template-shifts/xeroxed-th           
8861:  in-sheet/CheckedOMRs/_MULTI_                                
8862:  INFO     Created :                                         file.py:70
8863:  outputs/experimental/2-template-shifts/xeroxed-th           
8864:  in-sheet/CheckedOMRs/_MULTI_/colored                        
8865:  INFO     Created :                                         file.py:79
8866:  outputs/experimental/2-template-shifts/xeroxed-th           
8867:  in-sheet/Manual                                             
8868:  INFO     Created :                                         file.py:79
8869:  outputs/experimental/2-template-shifts/xeroxed-th           
8870:  in-sheet/Manual/MultiMarkedFiles                            
8871:  INFO     Created :                                         file.py:79
8872:  outputs/experimental/2-template-shifts/xeroxed-th           
8873:  in-sheet/Manual/ErrorFiles                                  
8874:  INFO     Created :                                         file.py:90
...

8879:  in-sheet/ImageMetrics                                       
8880:  INFO     Created :                                         file.py:90
8881:  outputs/experimental/2-template-shifts/xeroxed-th           
8882:  in-sheet/Evaluations                                        
8883:  INFO     Checking Files...                    directory_handler.py:32
8884:  INFO     Created new file:                    directory_handler.py:60
8885:  'outputs/experimental/2-template-shi                        
8886:  fts/xeroxed-thin-sheet/Results/Resul                        
8887:  ts_12AM.csv'                                                
8888:  INFO     Created new file:                    directory_handler.py:60
8889:  'outputs/experimental/2-template-shi                        
8890:  fts/xeroxed-thin-sheet/Manual/MultiM                        
8891:  arkedFiles.csv'                                             
8892:  INFO     Created new file:                    directory_handler.py:60
8893:  'outputs/experimental/2-template-shi                        
8894:  fts/xeroxed-thin-sheet/Manual/ErrorF                        
8895:  iles.csv'                                                   
...

9043:  INFO     (/1) Processed file: 'grayscale-80-gsm.jpg'     entry.py:341
9044:  INFO     Saving Image to                                  image.py:55
9045:  'outputs/experimental/2-template-shifts/xeroxed-            
9046:  thin-sheet/CheckedOMRs/grayscale-80-gsm.jpg'                
9047:  INFO     Gray Stack level: 1 ['Input Image', 'Truncate    file.py:130
9048:  Threshold', 'Bounding Contour', 'Marked                     
9049:  Template']                                                  
9050:  INFO     Saved stack image to:                            file.py:136
9051:  outputs/experimental/2-template-shifts/xeroxed-t            
9052:  hin-sheet/CheckedOMRs/stack/grayscale-80-gsm_1_s            
9053:  tack.jpg                                                    
9054:  INFO     Note: Nothing to save for colored image. Stack   file.py:161
9055:  level: 1                                                    
9056:  DEBUG    Closed file Results                  directory_handler.py:77
9057:  DEBUG    Closed file MultiMarked              directory_handler.py:77
9058:  DEBUG    Closed file Errors                   directory_handler.py:77
9059:  INFO                                                     entry.py:487
...

9088:  ick-sheet/CheckedOMRs/stack/colored                         
9089:  INFO     Created :                                         file.py:70
9090:  outputs/experimental/2-template-shifts/colored-th           
9091:  ick-sheet/CheckedOMRs/_MULTI_                               
9092:  INFO     Created :                                         file.py:70
9093:  outputs/experimental/2-template-shifts/colored-th           
9094:  ick-sheet/CheckedOMRs/_MULTI_/colored                       
9095:  INFO     Created :                                         file.py:79
9096:  outputs/experimental/2-template-shifts/colored-th           
9097:  ick-sheet/Manual                                            
9098:  INFO     Created :                                         file.py:79
9099:  outputs/experimental/2-template-shifts/colored-th           
9100:  ick-sheet/Manual/MultiMarkedFiles                           
9101:  INFO     Created :                                         file.py:79
9102:  outputs/experimental/2-template-shifts/colored-th           
9103:  ick-sheet/Manual/ErrorFiles                                 
9104:  INFO     Created :                                         file.py:90
...

9109:  ick-sheet/ImageMetrics                                      
9110:  INFO     Created :                                         file.py:90
9111:  outputs/experimental/2-template-shifts/colored-th           
9112:  ick-sheet/Evaluations                                       
9113:  INFO     Checking Files...                    directory_handler.py:32
9114:  INFO     Created new file:                    directory_handler.py:60
9115:  'outputs/experimental/2-template-shi                        
9116:  fts/colored-thick-sheet/Results/Resu                        
9117:  lts_12AM.csv'                                               
9118:  INFO     Created new file:                    directory_handler.py:60
9119:  'outputs/experimental/2-template-shi                        
9120:  fts/colored-thick-sheet/Manual/Multi                        
9121:  MarkedFiles.csv'                                            
9122:  INFO     Created new file:                    directory_handler.py:60
9123:  'outputs/experimental/2-template-shi                        
9124:  fts/colored-thick-sheet/Manual/Error                        
9125:  Files.csv'                                                  
...

9214:  INFO     (/1) Processed file: 'rgb-100-gsm.jpg'          entry.py:341
9215:  INFO     Saving Image to                                  image.py:55
9216:  'outputs/experimental/2-template-shifts/colored-            
9217:  thick-sheet/CheckedOMRs/rgb-100-gsm.jpg'                    
9218:  INFO     Gray Stack level: 1 ['Input Image', 'Truncate    file.py:130
9219:  Threshold', 'Bounding Contour', 'Marked                     
9220:  Template']                                                  
9221:  INFO     Saved stack image to:                            file.py:136
9222:  outputs/experimental/2-template-shifts/colored-t            
9223:  hick-sheet/CheckedOMRs/stack/rgb-100-gsm_1_stack            
9224:  .jpg                                                        
9225:  INFO     Note: Nothing to save for colored image. Stack   file.py:161
9226:  level: 1                                                    
9227:  DEBUG    Closed file Results                  directory_handler.py:77
9228:  DEBUG    Closed file MultiMarked              directory_handler.py:77
9229:  DEBUG    Closed file Errors                   directory_handler.py:77
9230:  INFO                                                     entry.py:487
...

9244:  `outputs.show_image_level` in your config:                  
9245:  'samples/experimental/2-template-shifts/config.             
9246:  json'                                                       
9247:  ------------------------------ Captured log call -------------------------------
9248:  INFO     src.utils.logger:validations.py:85 Loading config.json: samples/experimental/2-template-shifts/config.json
9249:  INFO     src.utils.logger:validations.py:85 Loading config.json: samples/experimental/2-template-shifts/alignment/config.json
9250:  INFO     src.utils.logger:validations.py:50 Loading template.json: samples/experimental/2-template-shifts/alignment/template.json
9251:  INFO     src.utils.logger:file.py:56 Checking Directories...
9252:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/2-template-shifts/alignment/CheckedOMRs/colored
9253:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/2-template-shifts/alignment/CheckedOMRs/stack
9254:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/2-template-shifts/alignment/CheckedOMRs/stack/colored
9255:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/2-template-shifts/alignment/CheckedOMRs/_MULTI_
9256:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/2-template-shifts/alignment/CheckedOMRs/_MULTI_/colored
9257:  INFO     src.utils.logger:file.py:79 Created : outputs/experimental/2-template-shifts/alignment/Manual
9258:  INFO     src.utils.logger:file.py:79 Created : outputs/experimental/2-template-shifts/alignment/Manual/MultiMarkedFiles
9259:  INFO     src.utils.logger:file.py:79 Created : outputs/experimental/2-template-shifts/alignment/Manual/ErrorFiles
9260:  INFO     src.utils.logger:file.py:90 Created : outputs/experimental/2-template-shifts/alignment/Results
9261:  INFO     src.utils.logger:file.py:90 Created : outputs/experimental/2-template-shifts/alignment/ImageMetrics
9262:  INFO     src.utils.logger:file.py:90 Created : outputs/experimental/2-template-shifts/alignment/Evaluations
9263:  INFO     src.utils.logger:directory_handler.py:32 Checking Files...
9264:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/experimental/2-template-shifts/alignment/Results/Results_12AM.csv'
9265:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/experimental/2-template-shifts/alignment/Manual/MultiMarkedFiles.csv'
9266:  INFO     src.utils.logger:directory_handler.py:60 Created new file: 'outputs/experimental/2-template-shifts/alignment/Manual/ErrorFiles.csv'
9267:  INFO     src.utils.logger:entry.py:44 
...

14179:  [[208.24867   458.92172  ]]]
14180:  DEBUG    src.utils.logger:sift_matcher.py:100 SIFT: MCQBlock4a: homography dst points [[[  1.093976   -3.4436948]]
14181:  [[ -5.781818  520.5486   ]]
14182:  [[215.34456   525.6675   ]]
14183:  [[221.2685     -4.1432123]]]
14184:  DEBUG    src.utils.logger:template_alignment.py:127 field_block MCQBlock4a [986.0, 1061.0] [101.1, 387.4] [-1 -6]
14185:  DEBUG    src.utils.logger:interpretation_pass.py:62 Thresholding: 	 file_level_fallback_threshold: 155.9 	global_std_THR: 31.36	
14186:  INFO     src.utils.logger:entry.py:340 Read Response: 
14187:  {'Booklet_No': '15334', 'q167': 'B', 'q119': 'C', 'q134': 'B', 'q135': 'B', 'q78': 'B', 'q66': 'B', 'q97': 'D', 'q198': '', 'q157': 'D', 'q19': 'A', 'q126': 'C', 'q95': 'A', 'q138': '', 'q71': 'B', 'q14': 'A', 'q29': 'A', 'q7': 'D', 'q127': 'D', 'q15': 'A', 'q117': 'A', 'q137': 'D', 'q193': 'C', 'q197': 'C', 'q3': 'C', 'q179': 'C', 'q88': '', 'q191': 'B', 'q154': 'B', 'q175': 'A', 'q58': 'C', 'q67': 'B', 'q109': 'A', 'q32': 'B', 'q174': 'D', 'q54': 'C', 'q130': 'D', 'q36': 'C', 'q118': 'D', 'q181': 'B', 'q173': 'C', 'q44': 'A', 'q147': 'C', 'q2': 'A', 'q112': 'C', 'q28': 'C', 'q42': '', 'q131': 'C', 'q84': 'A', 'q72': 'B', 'q155': 'B', 'q43': 'D', 'q77': 'A', 'q148': '', 'q178': 'A', 'q165': 'D', 'q50': 'C', 'q35': 'D', 'q160': 'A', 'q186': 'A', 'q55': '', 'q83': 'C', 'q123': 'B', 'q101': 'D', 'q81': 'C', 'q30': 'C', 'q96': 'D', 'q6': 'D', 'q13': 'C', 'q115': 'D', 'q105': 'A', 'q168': 'B', 'q111': 'B', 'q82': 'A', 'q176': 'D', 'q39': 'C', 'q143': 'C', 'q104': 'A', 'q163': 'A', 'q120': 'D', 'q98': '', 'q146': '', 'q152': 'C', 'q103': 'B', 'q184': 'C', 'q61': 'C', 'q136': 'A', 'q166': 'C', 'q4': 'D', 'q73': 'C', 'q156': 'D', 'q45': 'A', 'q102': 'B', 'q122': 'C', 'q79': 'A', 'q23': 'A', 'q56': 'A', 'q74': 'D', 'q124': 'C', 'q177': 'D', 'q80': 'B', 'q199': '', 'q22': 'C', 'q25': 'D', 'q142': 'B', 'q65': 'A', 'q159': 'B', 'q27': 'C', 'q189': '', 'q90': 'B', 'q185': 'C', 'q8': 'A', 'q170': 'C', 'q145': 'D', 'q5': 'A', 'q188': '', 'q94': 'D', 'q16': 'C', 'q34': 'D', 'q92': 'B', 'q172': 'A', 'q171': 'B', 'q107': 'D', 'q133': 'D', 'q187': 'D', 'q46': 'A', 'q24': 'D', 'q57': 'B', 'q48': '', 'q86': 'D', 'q153': 'A', 'q139': 'B', 'q38': '', 'q64': 'D', 'q20': 'D', 'q11': 'A', 'q18': 'B', 'q192': '', 'q149': 'C', 'q51': 'C', 'q41': '', 'q106': 'D', 'q195': 'B', 'q85': 'C', 'q190': 'B', 'q200': 'B', 'q150': '', 'q182': 'D', 'q140': 'D', 'q62': 'C', 'q87': '', 'q9': 'C', 'q99': '', 'q128': 'A', 'q47': 'A', 'q162': 'D', 'q1': 'B', 'q75': 'B', 'q31': 'C', 'q180': 'A', 'q108': 'B', 'q113': 'C', 'q114': 'D', 'q141': 'B', 'q76': 'D', 'q129': 'B', 'q10': 'A', 'q125': 'D', 'q158': 'D', 'q21': 'C', 'q132': 'B', 'q33': 'B', 'q69': 'D', 'q151': 'B', 'q116': 'C', 'q63': 'C', 'q17': 'A', 'q40': 'B', 'q183': 'C', 'q68': 'B', 'q93': 'C', 'q60': 'B', 'q49': 'A', 'q100': 'C', 'q12': 'B', 'q70': 'D', 'q110': 'B', 'q59': 'D', 'q196': 'B', 'q121': 'C', 'q26': 'C', 'q161': 'D', 'q169': 'D', 'q37': '', 'q91': '', 'q144': 'A', 'q164': 'D', 'q53': 'D', 'q89': 'A', 'q194': 'C', 'q52': 'C'}
14188:  INFO     src.utils.logger:entry.py:341 (/2) Processed file: 'omr-2.jpeg'
14189:  INFO     src.utils.logger:image.py:55 Saving Image to 'outputs/experimental/2-template-shifts/alignment/CheckedOMRs/omr-2.jpeg'
14190:  INFO     src.utils.logger:file.py:139 Note: Nothing to save for gray image. Stack level: 0
14191:  INFO     src.utils.logger:file.py:161 Note: Nothing to save for colored image. Stack level: 0
14192:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file Results
14193:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file MultiMarked
14194:  DEBUG    src.utils.logger:directory_handler.py:77 Closed file Errors
14195:  INFO     src.utils.logger:entry.py:487 
14196:  INFO     src.utils.logger:entry.py:488 Total file(s) moved        : 0
14197:  INFO     src.utils.logger:entry.py:489 Total file(s) not moved    : 2
14198:  INFO     src.utils.logger:entry.py:490 --------------------------------
14199:  INFO     src.utils.logger:entry.py:491 Total file(s) processed    : 2 (Sum Tallied!)
14200:  INFO     src.utils.logger:entry.py:506 
14201:  Total script time          : 1 seconds
14202:  INFO     src.utils.logger:validations.py:50 Loading template.json: samples/experimental/2-template-shifts/xeroxed-thin-sheet/template.json
14203:  INFO     src.utils.logger:file.py:56 Checking Directories...
14204:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/2-template-shifts/xeroxed-thin-sheet/CheckedOMRs/colored
14205:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/2-template-shifts/xeroxed-thin-sheet/CheckedOMRs/stack
14206:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/2-template-shifts/xeroxed-thin-sheet/CheckedOMRs/stack/colored
14207:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/2-template-shifts/xeroxed-thin-sheet/CheckedOMRs/_MULTI_
14208:  INFO     src.utils.logger:file.py:70 Created : outputs/experimental/2-template-shifts/xeroxed-thin-sheet/CheckedOMRs/_MULTI_/colored
14209:  INFO     src.utils.logger:file.py:79 Created : outputs/experimental/2-template-shifts/xeroxed-thin-sheet/Manual
14210:  INFO     src.utils.logger:file.py:79 Created : outputs/experimental/2-template-shifts/xeroxed-thin-sheet/Manual/MultiMarkedFiles
14211:  INFO     src.utils.logger:file.py:79 Crea...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Support for Set mapping in the evaluation schema