%load_ext autoreload
%autoreload 2
from fusus.book import Book
B = Book(cd="~/github/among/fusus/example")
# cd to the book directory
!cd `pwd`
The following function runs the pipeline for one or more pages.
If all pages are selected, batch mode is on.
def checkOcr(pg, quiet=True, **kwargs):
if pg is None:
for pg in B.allPagesList:
page = B.process(
batch=False,
pages=pg,
doOcr=True,
quiet=quiet,
**kwargs,
)
page.show(stage="proofword,proofchar")
return B.process(
batch=False,
pages=pg,
doOcr=True,
quiet=quiet,
**kwargs,
)
Our first example is page 132.
The OCR result is shown in data form and as a proof page.
page = checkOcr(132)
0.00s Batch of 1 pages: 132 0.00s Start batch processing images | 1.35s Loading for Kraken: ~/github/among/fusus/model/arabic_generalized.mlmodel | 8.86s model loaded | 15s 1 132.jpg 15s all done
Here is the page image with the detected layout:
page.show(stage="layout")
We can inspect the results of the OCR by calling for a proof:
page.show("proofword")
There is a proof page at character level as well.
page.show(stage="proofchar")
N.B.: If you work with a file in an online GitHub repo, and if your local files are in a directory
under ~/github/
, then the links above will show those files in NB-Viewer, provided the repo in question has been
pushed to GitHub.
If you are experimenting locally, you can use the paths to the local files to open them in your browser yourself.
We can also ask for the OCR data.
Here are the line, word, and character data:
page.show(stage="line")
page stripe block line left top right bottom 1 l 1 123 372 1032 449 1 l 2 123 459 1032 543 1 l 3 373 553 1032 634 1 r 1 1170 381 2081 457 1 r 2 1948 471 2081 537 1 r 3 1181 551 1976 642 2 1 993 719 1217 1061 2 2 565 2805 1668 3178
For the terms stripe, column and line, see: layout.
page.show(stage="word")
page stripe block line left top right bottom confidence letters punc 1 l 1 950 372 1029 450 100 أعم 1 l 1 885 372 950 450 89 من 1 l 1 677 372 885 450 97 المبادىء ، 1 l 1 591 372 676 450 96 وهو 1 l 1 547 372 592 450 98 ما 1 l 1 407 372 547 450 93 يتوقف 1 l 1 324 372 406 450 98 عليه 1 l 1 171 372 325 450 100 المسائل 1 l 1 123 372 171 450 100 بلا 1 l 2 905 459 1029 544 100 واسطة 1 l 2 870 459 905 544 100 ، 1 l 2 687 459 870 544 96 والمقدمة 1 l 2 640 459 687 544 93 ما 1 l 2 500 459 641 544 95 يتوقف 1 l 2 415 459 500 544 93 عليه 1 l 2 253 459 416 544 96 المسائل 1 l 2 123 459 254 544 100 بواسطة 1 l 3 983 553 1025 635 99 و 1 l 3 930 553 983 635 100 لا 1 l 3 801 553 930 635 92 واسطة 1 l 3 770 553 801 635 100 ؛ 1 l 3 373 553 771 635 93 فتأمل ! 1 r 1 1991 381 2078 458 100 أعـم 1 r 1 1912 381 1990 458 99 من 1 r 1 1770 381 1912 458 96 مقدمة 1 r 1 1619 381 1770 458 97 العلم ، 1 r 1 1487 381 1619 458 99 بينهما 1 r 1 1369 381 1487 458 100 عموم 1 r 1 1170 381 1369 458 92 وخصوص 1 r 2 1948 471 2078 538 96 مطلق . 1 r 3 1957 551 1973 643 100 1 r 3 1822 551 1958 643 99 والفرق 1 r 3 1755 551 1823 643 96 بين 1 r 3 1605 551 1755 643 96 المقدمة 1 r 3 1409 551 1605 643 98 والمبادىء 1 r 3 1379 551 1410 643 100 ، 1 r 3 1327 551 1380 643 100 أن 1 r 3 1181 551 1327 643 85 المقدمة 2 1 1105 719 1208 1062 85 لا 2 1 1058 719 1105 1062 100 2 1 993 719 1059 1062 68 ل 2 2 585 2805 1117 3179 75 60 2 2 565 2805 1632 3179 99 59
Here is the OCR data at character level:
page.show(stage="char")
page stripe block line left top right bottom confidence letters 1 l 1 1021 372 1029 450 100 ا 1 l 1 1008 372 1022 450 100 ٔ 1 l 1 984 372 1008 450 99 ع 1 l 1 964 372 984 450 100 م 1 l 1 950 372 963 450 100 1 l 1 926 372 950 450 69 م 1 l 1 902 372 926 450 100 ن 1 l 1 885 372 902 450 99 1 l 1 871 372 885 450 100 ا 1 l 1 858 372 872 450 74 ل 1 l 1 834 372 857 450 100 م 1 l 1 820 372 834 450 100 ب 1 l 1 800 372 820 450 100 ا 1 l 1 779 372 799 450 93 د 1 l 1 748 372 779 450 100 ى 1 l 1 721 372 748 450 100 ء 1 l 1 701 372 721 450 99 ، 1 l 1 677 372 700 450 100 1 l 1 656 372 676 450 91 و 1 l 1 632 372 656 450 100 ه 1 l 1 612 372 632 450 94 و 1 l 1 591 372 611 450 100 1 l 1 574 372 592 450 99 م 1 l 1 557 372 574 450 96 ا 1 l 1 547 372 557 450 98 1 l 1 533 372 547 450 90 ي 1 l 1 520 372 533 450 100 ت 1 l 1 499 372 519 450 67 و 1 l 1 479 372 499 450 100 ق 1 l 1 445 372 478 450 100 ف 1 l 1 407 372 444 450 100 1 l 1 390 372 406 450 97 ع 1 l 1 369 372 389 450 91 ل 1 l 1 356 372 369 450 100 ي 1 l 1 338 372 355 450 100 ه 1 l 1 324 372 339 450 100 1 l 1 317 372 325 450 100 ا 1 l 1 298 372 318 450 100 ل 1 l 1 274 372 297 450 100 م 1 l 1 246 372 273 450 100 س 1 l 1 229 372 246 450 100 ا 1 l 1 215 372 229 450 100 ي 1 l 1 208 372 216 450 100 ٔ 1 l 1 191 372 209 450 99 ل 1 l 1 171 372 192 450 100 1 l 1 157 372 171 450 100 ب 1 l 1 140 372 157 450 100 ل 1 l 1 123 372 141 450 100 ا 1 l 2 1015 459 1029 544 100 و 1 l 2 997 459 1014 544 98 ا 1 l 2 965 459 997 544 99 س 1 l 2 933 459 965 544 100 ط 1 l 2 919 459 933 544 100 ة 1 l 2 905 459 919 544 100 1 l 2 891 459 905 544 100 ، 1 l 2 870 459 891 544 100 1 l 2 853 459 870 544 100 و 1 l 2 831 459 852 544 100 ا 1 l 2 818 459 832 544 100 ل 1 l 2 792 459 817 544 99 م 1 l 2 775 459 792 544 73 ق 1 l 2 750 459 774 544 96 د 1 l 2 722 459 750 544 100 م 1 l 2 708 459 722 544 100 ة 1 l 2 687 459 708 544 100 1 l 2 673 459 687 544 78 م 1 l 2 655 459 673 544 100 ا 1 l 2 640 459 655 544 100 1 l 2 630 459 641 544 100 ي 1 l 2 612 459 630 544 94 ت 1 l 2 592 459 613 544 100 و 1 l 2 574 459 591 544 76 ق 1 l 2 539 459 574 544 99 ف 1 l 2 500 459 539 544 100 1 l 2 479 459 500 544 100 ع 1 l 2 461 459 478 544 93 ل 1 l 2 447 459 461 544 73 ي 1 l 2 429 459 447 544 100 ه 1 l 2 415 459 430 544 100 1 l 2 401 459 416 544 100 ا 1 l 2 388 459 402 544 64 ل 1 l 2 363 459 387 544 100 م 1 l 2 334 459 363 544 98 س 1 l 2 316 459 334 544 100 ا 1 l 2 302 459 317 544 100 ي 1 l 2 295 459 303 544 100 ٔ 1 l 2 278 459 296 544 100 ل 1 l 2 253 459 278 544 99 1 l 2 236 459 254 544 100 ب 1 l 2 222 459 236 544 100 و 1 l 2 200 459 222 544 100 ا 1 l 2 168 459 201 544 100 س 1 l 2 137 459 169 544 100 ط 1 l 2 123 459 137 544 100 ة 1 l 3 1001 553 1025 635 100 و 1 l 3 983 553 1002 635 98 1 l 3 967 553 983 635 100 ل 1 l 3 948 553 968 635 100 ا 1 l 3 930 553 949 635 100 1 l 3 910 553 930 635 100 و 1 l 3 895 553 911 635 100 ا 1 l 3 862 553 896 635 100 س 1 l 3 831 553 862 635 99 ط 1 l 3 816 553 832 635 78 ة 1 l 3 801 553 816 635 74 1 l 3 793 553 801 635 100 ؛ 1 l 3 770 553 794 635 100 1 l 3 755 553 771 635 100 ف 1 l 3 740 553 756 635 100 ت 1 l 3 733 553 741 635 100 ا 1 l 3 721 553 733 635 100 ٔ 1 l 3 706 553 722 635 100 م 1 l 3 680 553 707 635 90 ل 1 l 3 373 553 680 635 60 ! 1 r 1 2072 381 2078 458 100 ا 1 r 1 2063 381 2072 458 99 ٔ 1 r 1 2042 381 2063 458 100 ع 1 r 1 2021 381 2042 458 100 ـ 1 r 1 2000 381 2021 458 99 م 1 r 1 1991 381 2000 458 100 1 r 1 1957 381 1990 458 100 م 1 r 1 1930 381 1957 458 98 ن 1 r 1 1912 381 1930 458 100 1 r 1 1891 381 1912 458 90 م 1 r 1 1864 381 1891 458 100 ق 1 r 1 1834 381 1864 458 100 د 1 r 1 1804 381 1834 458 95 م 1 r 1 1779 381 1803 458 97 ة 1 r 1 1770 381 1779 458 97 1 r 1 1758 381 1770 458 99 ا 1 r 1 1740 381 1758 458 93 ل 1 r 1 1719 381 1740 458 91 ع 1 r 1 1689 381 1719 458 99 ل 1 r 1 1653 381 1689 458 100 م 1 r 1 1635 381 1653 458 100 ، 1 r 1 1619 381 1635 458 100 1 r 1 1604 381 1619 458 100 ب 1 r 1 1592 381 1604 458 100 ي 1 r 1 1577 381 1592 458 94 ن 1 r 1 1553 381 1577 458 100 ه 1 r 1 1523 381 1553 458 100 م 1 r 1 1502 381 1523 458 99 ا 1 r 1 1487 381 1502 458 99 1 r 1 1460 381 1487 458 100 ع 1 r 1 1432 381 1460 458 100 م 1 r 1 1402 381 1433 458 100 و 1 r 1 1378 381 1402 458 100 م 1 r 1 1369 381 1378 458 100 1 r 1 1342 381 1369 458 100 و 1 r 1 1309 381 1342 458 63 خ 1 r 1 1269 381 1309 458 100 ص 1 r 1 1227 381 1270 458 99 و 1 r 1 1170 381 1227 458 100 ص 1 r 2 2060 471 2078 538 97 م 1 r 2 2030 471 2060 538 92 ط 1 r 2 2011 471 2030 538 100 ل 1 r 2 1984 471 2012 538 100 ق 1 r 2 1948 471 1984 538 92 . 1 r 3 1957 551 1973 643 100 1 r 3 1938 551 1958 643 100 و 1 r 3 1919 551 1939 643 100 ا 1 r 3 1908 551 1920 643 100 ل 1 r 3 1890 551 1909 643 100 ف 1 r 3 1867 551 1890 643 94 ر 1 r 3 1844 551 1868 643 100 ق 1 r 3 1822 551 1845 643 100 1 r 3 1811 551 1823 643 100 ب 1 r 3 1792 551 1811 643 85 ي 1 r 3 1769 551 1792 643 100 ن 1 r 3 1755 551 1770 643 100 1 r 3 1739 551 1755 643 100 ا 1 r 3 1724 551 1740 643 100 ل 1 r 3 1698 551 1725 643 100 م 1 r 3 1680 551 1699 643 100 ق 1 r 3 1657 551 1680 643 98 د 1 r 3 1631 551 1658 643 100 م 1 r 3 1619 551 1631 643 100 ة 1 r 3 1605 551 1620 643 66 1 r 3 1586 551 1605 643 95 و 1 r 3 1567 551 1586 643 99 ا 1 r 3 1552 551 1567 643 94 ل 1 r 3 1526 551 1552 643 100 م 1 r 3 1515 551 1526 643 94 ب 1 r 3 1496 551 1515 643 100 ا 1 r 3 1474 551 1496 643 100 د 1 r 3 1444 551 1474 643 100 ى 1 r 3 1421 551 1444 643 100 ء 1 r 3 1409 551 1421 643 100 1 r 3 1395 551 1410 643 100 ، 1 r 3 1379 551 1395 643 100 1 r 3 1372 551 1380 643 99 ا 1 r 3 1361 551 1373 643 100 ٔ 1 r 3 1346 551 1361 643 100 ن 1 r 3 1327 551 1346 643 100 1 r 3 1319 551 1327 643 87 ا 1 r 3 1297 551 1320 643 100 ل 1 r 3 1278 551 1298 643 99 م 1 r 3 1260 551 1279 643 58 ق 1 r 3 1237 551 1260 643 50 د 1 r 3 1211 551 1238 643 100 م 1 r 3 1181 551 1211 643 100 ة 2 1 1171 719 1208 1062 85 ل 2 1 1147 719 1170 1062 91 ا 2 1 1105 719 1147 1062 80 2 1 1058 719 1105 1062 100 2 1 993 719 1059 1062 68 ل 2 2 585 2805 1117 3179 52 6 2 2 614 2805 586 3179 72 0 2 2 1122 2805 615 3179 100 2 2 1633 2805 1122 3179 100 5 2 2 565 2805 1632 3179 98 9
Here is some statistics about the general quality of the OCR for this page. See measureOcr.ipynb for more.
B.measureQuality(132)
33s Batch of 1 pages: 132 33s Start measuring ocr quality of these images | 0.00s word-confidences of OCR results for 1 pages
item | # of words | min | max | average | notes |
---|---|---|---|---|---|
overall | 43 | 68 | 100 | 96 | |
p132 | 43 | 68 | 100 | 96 |
| 0.01s char-confidences of OCR results for 1 pages
item | # of chars | min | max | average | notes |
---|---|---|---|---|---|
overall | 211 | 50 | 100 | 96 | |
p132 | 211 | 50 | 100 | 96 |
| 0.01s by-char-confidences of OCR results for 32 characters
item | # of chars | min | max | average | worst results |
---|---|---|---|---|---|
⌊ ⌋ | 35 | 66 | 100 | 97 | p132 p132 p132 p132 p132 p132 p132 p132 p132 p132 p132 p132 p132 p132 p132 p132 p132 p132 p132 p132 |
⌊!⌋ | 1 | 60 | 60 | 60 | p132 |
⌊.⌋ | 1 | 92 | 92 | 92 | p132 |
⌊0⌋ | 1 | 72 | 72 | 72 | p132 |
⌊5⌋ | 1 | 100 | 100 | 100 | p132 |
⌊6⌋ | 1 | 52 | 52 | 52 | p132 |
⌊9⌋ | 1 | 98 | 98 | 98 | p132 |
⌊،⌋ | 4 | 99 | 100 | 100 | p132 p132 p132 p132 |
⌊؛⌋ | 1 | 100 | 100 | 100 | p132 |
33s all done
N.B.: If you work with a file in an online GitHub repo, and if your local file is in a directory
under ~/github/
, then the links above refer to files in NB-Viewer, provided the repo in question has been
pushed to GitHub.
If you are experimenting locally, you see the path to the local file when you hover over it, and you have to open it in your browser yourself.
For developers
If you are tweaking the generation and formatting of the proof pages, you do not need to perform the costly OCR process over and over again. The following method regenerates the proof pages on the basis of the existing OCR data.
page.proofing()
If you need to regenerate all proofing pages, this will work:
B.measureQuality(None, updateProofs=True)
Now we check all example pages in batch
page = checkOcr(None)
0.00s Batch of 1 pages: 47 0.00s Start batch processing images | 3.21s 1 047.tif 3.22s all done
0.00s Batch of 1 pages: 48 0.00s Start batch processing images | 2.98s 1 048.tif 2.98s all done
0.00s Batch of 1 pages: 58 0.00s Start batch processing images | 2.71s 1 058.tif 2.71s all done
0.00s Batch of 1 pages: 59 0.00s Start batch processing images | 3.81s 1 059.tif 3.81s all done
0.00s Batch of 1 pages: 63 0.00s Start batch processing images | 3.78s 1 063.tif 3.78s all done
0.00s Batch of 1 pages: 67 0.00s Start batch processing images | 3.70s 1 067.tif 3.70s all done
0.00s Batch of 1 pages: 101 0.00s Start batch processing images | 4.79s 1 101.jpg 4.79s all done
0.00s Batch of 1 pages: 102 0.00s Start batch processing images | 5.81s 1 102.jpg 5.81s all done
0.00s Batch of 1 pages: 111 0.00s Start batch processing images | 9.26s 1 111.jpg 9.26s all done
0.00s Batch of 1 pages: 112 0.00s Start batch processing images | 8.70s 1 112.jpg 8.70s all done
0.00s Batch of 1 pages: 113 0.00s Start batch processing images | 8.09s 1 113.jpg 8.09s all done
0.00s Batch of 1 pages: 121 0.00s Start batch processing images | 7.18s 1 121.jpg 7.18s all done
0.00s Batch of 1 pages: 122 0.00s Start batch processing images | 6.79s 1 122.jpg 6.79s all done
0.00s Batch of 1 pages: 131 0.00s Start batch processing images | 9.85s 1 131.jpg 9.85s all done
0.00s Batch of 1 pages: 132 0.00s Start batch processing images | 7.76s 1 132.jpg 7.76s all done
0.00s Batch of 1 pages: 200 0.00s Start batch processing images | 26s 1 200.tif 26s all done
0.00s Batch of 1 pages: 300 0.00s Start batch processing images | 16s 1 300.tif 16s all done
0.00s Batch of 1 pages: 400 0.00s Start batch processing images | 19s 1 400.tif 19s all done
0.00s Batch of 1 pages: 400 0.00s Start batch processing images | 19s 1 400.tif 19s all done
Measure the quality of all these pages (and update all proof pages)
B.measureQuality(updateProofs=True)
37s Batch of 18 pages: 47-48,58-59,63,67,101-102,111-113,121-122,131-132,200,300,400 37s Start measuring ocr quality of these images 37s end regenrating proof files | 0.10s word-confidences of OCR results for 18 pages
| 0.11s char-confidences of OCR results for 18 pages
| 0.11s by-char-confidences of OCR results for 61 characters
item | # of chars | min | max | average | worst results |
---|---|---|---|---|---|
⌊ ⌋ | 3664 | 30 | 100 | 98 | p111 p111 p101 p111 p112 p112 p111 p400 p200 p101 p111 p113 p048 p067 p113 p101 p101 p112 p400 p101 |
⌊!⌋ | 6 | 60 | 100 | 84 | p132 p112 p113 p113 p113 p113 |
⌊(⌋ | 110 | 52 | 100 | 93 | p063 p122 p112 p122 p048 p200 p111 p121 p112 p112 p200 p400 p058 p113 p122 p059 p101 p113 p200 p121 |
⌊)⌋ | 104 | 26 | 100 | 95 | p048 p200 p122 p059 p111 p122 p122 p063 p122 p101 p400 p121 p058 p067 p067 p059 p063 p048 p067 p400 |
⌊-⌋ | 42 | 55 | 100 | 97 | p112 p059 p400 p048 p102 p067 p048 p058 p067 p101 p101 p113 p400 p047 p059 p059 p063 p112 p113 p200 |
⌊.⌋ | 154 | 38 | 100 | 93 | p131 p101 p101 p113 p058 p102 p101 p102 p112 p400 p122 p121 p102 p102 p112 p113 p400 p131 p121 p112 |
⌊0⌋ | 13 | 72 | 100 | 95 | p132 p102 p102 p102 p101 p101 p102 p102 p102 p102 p102 p102 p112 |
⌊1⌋ | 81 | 39 | 100 | 93 | p121 p200 p047 p102 p102 p102 p102 p200 p048 p101 p101 p102 p122 p101 p200 p102 p102 p122 p400 p102 |
⌊2⌋ | 48 | 54 | 100 | 93 | p059 p400 p067 p101 p111 p102 p101 p113 p102 p101 p102 p121 p047 p200 p063 p058 p101 p047 p048 p063 |
38s all done
Here is how we color the degrees of confidence reported by the Kraken OCR engine. We translate a confidence (a number between 0 and 100 including) into a HSL color:
from fusus.ocr import getProofColor
for i in range(101):
clr = getProofColor(100 - i, test=True)
conf=100 ⇒ hue= 90 op=0.30
conf= 99 ⇒ hue= 87 op=0.31
conf= 98 ⇒ hue= 84 op=0.32
conf= 97 ⇒ hue= 81 op=0.33
conf= 96 ⇒ hue= 78 op=0.34
conf= 95 ⇒ hue= 75 op=0.35
conf= 94 ⇒ hue= 72 op=0.36
conf= 93 ⇒ hue= 69 op=0.37
conf= 92 ⇒ hue= 66 op=0.38
conf= 91 ⇒ hue= 63 op=0.39
conf= 90 ⇒ hue= 60 op=0.40
conf= 89 ⇒ hue= 57 op=0.41
conf= 88 ⇒ hue= 54 op=0.42
conf= 87 ⇒ hue= 51 op=0.43
conf= 86 ⇒ hue= 48 op=0.44
conf= 85 ⇒ hue= 45 op=0.45
conf= 84 ⇒ hue= 42 op=0.46
conf= 83 ⇒ hue= 39 op=0.47
conf= 82 ⇒ hue= 36 op=0.48
conf= 81 ⇒ hue= 33 op=0.49
conf= 80 ⇒ hue= 30 op=0.50
conf= 79 ⇒ hue= 29 op=0.50
conf= 78 ⇒ hue= 29 op=0.51
conf= 77 ⇒ hue= 28 op=0.51
conf= 76 ⇒ hue= 27 op=0.51
conf= 75 ⇒ hue= 27 op=0.52
conf= 74 ⇒ hue= 26 op=0.52
conf= 73 ⇒ hue= 25 op=0.52
conf= 72 ⇒ hue= 25 op=0.53
conf= 71 ⇒ hue= 24 op=0.53
conf= 70 ⇒ hue= 23 op=0.53
conf= 69 ⇒ hue= 23 op=0.54
conf= 68 ⇒ hue= 22 op=0.54
conf= 67 ⇒ hue= 21 op=0.54
conf= 66 ⇒ hue= 21 op=0.55
conf= 65 ⇒ hue= 20 op=0.55
conf= 64 ⇒ hue= 19 op=0.55
conf= 63 ⇒ hue= 19 op=0.56
conf= 62 ⇒ hue= 18 op=0.56
conf= 61 ⇒ hue= 17 op=0.56
conf= 60 ⇒ hue= 17 op=0.57
conf= 59 ⇒ hue= 16 op=0.57
conf= 58 ⇒ hue= 15 op=0.57
conf= 57 ⇒ hue= 15 op=0.58
conf= 56 ⇒ hue= 14 op=0.58
conf= 55 ⇒ hue= 13 op=0.58
conf= 54 ⇒ hue= 13 op=0.59
conf= 53 ⇒ hue= 12 op=0.59
conf= 52 ⇒ hue= 11 op=0.59
conf= 51 ⇒ hue= 11 op=0.60
conf= 50 ⇒ hue= 10 op=0.60
conf= 49 ⇒ hue= 10 op=0.60
conf= 48 ⇒ hue= 10 op=0.60
conf= 47 ⇒ hue= 9 op=0.60
conf= 46 ⇒ hue= 9 op=0.60
conf= 45 ⇒ hue= 9 op=0.60
conf= 44 ⇒ hue= 9 op=0.60
conf= 43 ⇒ hue= 9 op=0.60
conf= 42 ⇒ hue= 8 op=0.60
conf= 41 ⇒ hue= 8 op=0.60
conf= 40 ⇒ hue= 8 op=0.60
conf= 39 ⇒ hue= 8 op=0.60
conf= 38 ⇒ hue= 8 op=0.60
conf= 37 ⇒ hue= 7 op=0.60
conf= 36 ⇒ hue= 7 op=0.60
conf= 35 ⇒ hue= 7 op=0.60
conf= 34 ⇒ hue= 7 op=0.60
conf= 33 ⇒ hue= 7 op=0.60
conf= 32 ⇒ hue= 6 op=0.60
conf= 31 ⇒ hue= 6 op=0.60
conf= 30 ⇒ hue= 6 op=0.60
conf= 29 ⇒ hue= 6 op=0.60
conf= 28 ⇒ hue= 6 op=0.60
conf= 27 ⇒ hue= 5 op=0.60
conf= 26 ⇒ hue= 5 op=0.60
conf= 25 ⇒ hue= 5 op=0.60
conf= 24 ⇒ hue= 5 op=0.60
conf= 23 ⇒ hue= 5 op=0.60
conf= 22 ⇒ hue= 4 op=0.60
conf= 21 ⇒ hue= 4 op=0.60
conf= 20 ⇒ hue= 4 op=0.60
conf= 19 ⇒ hue= 4 op=0.60
conf= 18 ⇒ hue= 4 op=0.60
conf= 17 ⇒ hue= 3 op=0.60
conf= 16 ⇒ hue= 3 op=0.60
conf= 15 ⇒ hue= 3 op=0.60
conf= 14 ⇒ hue= 3 op=0.60
conf= 13 ⇒ hue= 3 op=0.60
conf= 12 ⇒ hue= 2 op=0.60
conf= 11 ⇒ hue= 2 op=0.60
conf= 10 ⇒ hue= 2 op=0.60
conf= 9 ⇒ hue= 2 op=0.60
conf= 8 ⇒ hue= 2 op=0.60
conf= 7 ⇒ hue= 1 op=0.60
conf= 6 ⇒ hue= 1 op=0.60
conf= 5 ⇒ hue= 1 op=0.60
conf= 4 ⇒ hue= 1 op=0.60
conf= 3 ⇒ hue= 1 op=0.60
conf= 2 ⇒ hue= 0 op=0.60
conf= 1 ⇒ hue= 0 op=0.60
conf= 0 ⇒ hue= 0 op=0.60