Как Tankbook читает табло колонки

В Tankbook 1.1 снимок табло колонки может помочь начать запись о заправке. Приложение предлагает сумму, объём и цену, которые сумело прочитать. Перед сохранением вы сверяете их с фотографией. Ввести числа сразу вручную можно с тем же успехом.

Самая трудная часть – решить, какие цифры заслуживают места в форме. Запятая, поставленная не туда, меняет вполне правдоподобную заправку до неузнаваемости.

Правило, на котором держится чтение

Ошибочная цифра обходится дороже пустого поля. Поэтому читатель проверяет форму строки, её место на табло и связь чисел между собой. Поле может остаться пустым. Если цифры видны, а арифметика не сходится, приложение может показать лучший вариант с предупреждением, не выдавая его за проверенный. Любое предложенное число можно исправить.

Путь от снимка до чисел

Сначала приложение приводит снимок в правильную ориентацию. Затем ищет строки цифр, определяет, похоже ли фото на табло колонки, выпрямляет строки, раздаёт им роли, читает цифры и проверяет результат арифметикой. Обычное распознавание текста тоже работает над снимком и может заполнить поле, которое читатель табло оставил открытым.

1 · Снимок12 Мп, поворот из EXIF «впечатан» в пиксели2 · Поиск строк цифр (RowSeg)нейросеть по пикселям → повёрнутые прямоугольники строк3 · Колонка это или нет≥ 2 крупные строки одна над другой; иначе – медленный путьнетПуть чекаOCR + разбор строк4 · Проверка геометрии каждой строкизнакоместа, шаг, полоса чернил, клавиатура, дубликаты5 · Роли строкнаклон снят; табло цен отделено; столбец читается сверху вниз6 · Выпрямление полоскигомография: четырёхугольник → прямая полоса 96 px7 · Чтение строки целиком (RowRead)CRNN + CTC → цифры с вероятностями всех вариантов8 · Закон чтениялитры × цена = итого до цента, формат валюты,одна замена цифры; не сошлось – с предупреждениемвыданоФормаподтверждения9 · Ничего не выдано → поворот 90° / 270°лучший поворот по геометрии, затем шаги 2–8 заново;результат берётся, только если он что-то выдалничего не выдано
Читатель находит строки и цифры; арифметика определяет, какие значения подтверждены перед открытием экрана проверки.

Найти строки

На входе – снимок после поворота. На выходе – четырёхугольники вокруг предполагаемых строк цифр.

RowSeg работает по принципу PixelLink. Сеть отмечает точки, похожие на часть строки, и связывает соседние точки. Связанные области становятся строками. Повернутый четырёхугольник подгоняется к самой строке, в том числе на косом снимке. Строка может относиться к заправке, к табло цен разных сортов или вообще к другой части колонки.

Определить, что снято табло

На входе – найденные строки. На выходе – решение читать табло либо передать снимок обычному разбору документа.

Быстрая проверка ищет крупные строки цифр, расположенные одна над другой в одной части кадра. Когда их недостаточно, читатель проверяет форму других предполагаемых строк и считает строки текста на снимке. У чека их обычно много. На колонке тоже бывают надписи, поэтому число текстовых строк участвует лишь в более медленной проверке. После выбора пути табло цифрам ещё предстоит пройти проверку чтения.

Строки от RowSegоставить: высота ≥ 2,5 %, ширина ≥ 18 % кадраЕсть пара строк, которые• по горизонтали совпадают (±25 % ширины)• стоят одна над другой (зазор ≤ 3 высоты)?даКолонка · быстрый путьбез распознавания текстанетМедленный путь (≤ 1,5 с)• строк текста по Vision ≤ 30• ≥ 2 строки прошли проверку геометрии• самая широкая ≥ 18 % кадрадаКолонка · медленный путьпроверенные строки идут в чтениенет или время вышлоНе колонка → путь чека
Крупные строки одна над другой позволяют быстро узнать табло; в сомнительном кадре помогают форма строк и окружающий текст.

Выпрямить строку и проверить её форму

На входе – четырёхугольник предполагаемой строки. На выходе – прямая полоска и решение, похожа ли она на строку табло.

Читатель отображает четырёхугольник на ровную полоску. Так заодно исправляются наклон и перспектива. Нарезчик смотрит, светлые цифры на тёмном фоне или наоборот, как повторяются знакоместа, где есть пробелы и десятичная точка. Клавиатура или печатная надпись могут не пройти эту проверку. Если строка едва не проходит одно из правил формы, она ещё может попасть на арифметическую проверку с меньшим весом.

Сами цифры заправки нарезчик уже не читает. Его ячейки по-прежнему помогают проверять найденные строки и, при необходимости, определять верх у бокового снимка.

Строка на снимке (под углом)0020,20TLTRBRBLугол = atan2(TR.y − TL.y, TR.x − TL.x)гомографияПрямая полоска0020,20высота 96 px, ширина = 96 × пропорция строкикаждая точка полоски берётся билинейно из снимка
Углы наклонной строки переводятся в прямую полоску, по которой можно проверить форму и прочитать цифры.

Разобраться, где сумма, литры и цена

На входе – строки, прошедшие проверку формы. На выходе – роли суммы, объёма, цены заправки и табло цен сортов топлива.

Сначала читатель учитывает общий наклон строк. Похожие по размеру соседние окна цен он объединяет в табло сортов и откладывает в сторону. Оставшийся столбец упорядочивает по высоте: сверху сумма, ниже объём, затем цена заправки, если она показана отдельно. У некоторых колонок цена находится среди цен сортов. Арифметика может отвергнуть число, но не переставляет роли строк ради красивого результата.

Gilbarco: столбец + табло цен слеватабло (столбецодинаковых окон)1 · итого2 · литры3 · ценаWayne: табло цен в ряд, цены сделки нет1 · итого2 · литрытабло (ряд одинаковых окон) → ценаберётся из табло, если тройка сходится
Расположение строк помогает отделить числа заправки от цен других сортов топлива.

Прочитать строку целиком

На входе – выпрямленная цветная полоска. На выходе – последовательность цифр, возможная запятая и варианты для неясных знаков.

RowRead – сеть CRNN, обученная с помощью CTC. Она читает всю полоску как последовательность. CTC объединяет разные пути через ответы сети, если они дают одну строку; между одинаковыми цифрами может быть пустой шаг. Декодер сохраняет вероятные строки, затем оценивает замены отдельных цифр и положение запятой. Эти варианты пригодятся, когда блик скрыл сегмент индикатора.

0014,00полоска строки (высота 32 px)00–00–144,0–00––лучший символ на каждом шаге («–» – пусто)0014,00повторы слиты,«пусто» убрано
Разные пути сети могут складываться в одну строку; их свидетельства объединяются перед арифметической проверкой.

Проверить смысл прочитанного

На входе – варианты объёма, цены и суммы. На выходе – подтверждённые проверкой значения или предупреждение с лучшим доступным чтением.

Закон чтения перебирает правдоподобные цифры и положения запятой. Объём, умноженный на цену за единицу, должен дать сумму после округления или отсечения дробной части на табло. Для заправки на заранее заданную круглую сумму есть узкий допуск: показанный объём тоже округлён. Читатель может поправить один неясный сегмент, если сама сеть допускает другую цифру. Когда близкие варианты дают разные значения, поле может остаться без подтверждения.

Валюта помогает расположить запятую и оценить правдоподобие цены. Сначала берётся валюта машины, а если она неизвестна – валюта региона. Когда по этим правилам числа не сходятся, читатель пробует другие измеренные форматы и выбирает значения, за которые сошлось больше форматов. Обозначение валюты на самом табло полезно человеку при проверке снимка; нынешний читатель пока не использует его при выборе формата. Одно только несовпадение с валютой машины не скрывает сошедшиеся числа.

Если отдельной цены заправки нет, читатель может сверить сумму и объём с ценой в другой части табло. Когда показанная цена расходится с вычисленной, пара может попасть в форму с предупреждением, а цену придётся ввести самому. Если ни один формат не даёт сходящейся тройки, достаточно отчётливо прочитанные цифры всё же могут попасть в форму как непроверенные. Нулевой объём на колонке в покое не превращается в заправку.

Ночной снимок под углом: сеть ошиблась в первой цифре цены, арифметика поправила20,209,515,124запас 15,9 · 16,4 …запас 16,5 · 18,6 …первая цифра: запас всего 4,3Как прочитала сеть: 9,51 × 5,124 = 48,73 ≠ 20,20 – тройка не сходится.Ступень «чтение» допускает одну замену: у первой цифры цены «2» – среди трёх лучших вариантов:9,51 ×2,124 = 20,19924 → 20,20 ✓ (единственная сходящаяся тройка)Тройка в пределах 6 нат от прочтения сети, одна замена – цена выдана как 2,124.Итого и литры прочитаны уверенно (запас 7–23 ната) и не менялись.
Варианты цифр и запятой сверяются с арифметикой табло; непроверенное чтение сопровождается предупреждением.

Проверить поворот и передать результат вам

На входе – табло, с которого первоначальное чтение не подтвердило ни одного поля. На выходе – более надёжное чтение, если поворот помогает.

Читатель сравнивает боковые положения снимка по числу строк, прошедших проверку формы. Когда противоположные положения выглядят одинаково, помогает уверенность старого классификатора сегментов. Затем чтение повторяется при выбранном повороте. Числа, для которых арифметика не сошлась, получают этот шанс до передачи в форму с предупреждением.

На экране проверки фотография и редактируемые поля находятся рядом. Если все предложенные числа не сходятся, жёлтая плашка просит сверить их со снимком: «Числа не сходятся – сверьте их с фото». Когда одного числа не хватает, приложение говорит: «Не удалось проверить числа – введите недостающее с фото». Если прочитать ничего не удалось, числа можно ввести вручную; снимок останется прикреплённым. Запись появится лишь после вашего сохранения.

Где табло обманывает читателя

На ночном снимке под углом строки могут читаться после выпрямления. Соседнее табло цен сложнее: цену другого сорта легко принять за цену заправки, поэтому важны и расположение окон, и арифметика.

Ночное табло под углом: строки заправки и отдельное табло цен. Наклон строк помогает выпрямить цифры.
Ночное табло под углом: строки заправки и отдельное табло цен. Наклон строк помогает выпрямить цифры.

Экран со шрифтом, рекламой или сильными отражениями может дать ложные строки и скрыть нужные. На тёмном ЖК-индикаторе читатель иногда находит слишком мало строк. Тогда на экране проверки будет мало чисел или не будет ни одного. Снимок останется рядом с формой для ручного ввода.

На экране числа заправки соседствуют с другим текстом. Одного поиска строк недостаточно, чтобы установить их роли.
На экране числа заправки соседствуют с другим текстом. Одного поиска строк недостаточно, чтобы установить их роли.

Два поколения читателя

Первое поколение вышло 20 сентября 2026 года. Детектор объектов Create ML искал строки цифр и занимал около 31 МБ. Он возвращал только прямоугольники с вертикальными сторонами. Нарезчик делил каждую строку на знакоместа. Классификатор размером около 64 КБ выдавал восемь ответов для каждой ячейки: семь сегментов и десятичную точку. Затем выбирал ближайший из десяти допустимых рисунков цифры. Над этим чтением работал закон арифметики.

Качество сильно зависело от рамки. В сравнении на одних и тех же размеченных вручную строках прямые рамки позволили прочитать 89 ячеек, повёрнутые четырёхугольники – 111. Обучающие рамки старого детектора в 90 % случаев были наклонены меньше чем на 4°. Слишком свободная или обрезанная рамка портила цифры, а при нарезке терялось ещё больше ячеек. Ночные табло, янтарные светодиоды и экраны были представлены слабо или вовсе отсутствовали.

Второе поколение появилось в два приёма 25 сентября 2026 года. RowSeg заменил прежний детектор сегментатором по принципу PixelLink. Модель размером 1,8 МБ подгоняет повёрнутые четырёхугольники к пикселям строки. Затем RowRead заменил чтение отдельных знакомест сетью CRNN с CTC, которая читает всю строку; её размер – 3,9 МБ. Старые нарезчик и классификатор остались для проверки формы и ориентации.

На 68 отложенных снимках колонок, которые не участвовали в обучении моделей, старый детектор передал в форму 47 ячеек, все верные. После замены одного лишь детектора получилось 62 ячейки, из них 61 верная. Чтение целой строки дало 117 ячеек, из них 116 верных. Снимков, где все оцениваемые поля прочитаны верно, стало 40 вместо 21 из 68. На том же отложенном сравнении медианное перекрытие с ручной разметкой повёрнутых строк выросло с 0,771 до 0,861. Число ложных строк на снимок снизилось с 0,647 до 0,088. Это результат тех моделей на том наборе снимков, а не прогноз для любой колонки.

Как мы измеряем

Модели учатся на размеченной обучающей части корпуса. Отложенные фотографии не попадают в обучение. Проверка сравнивает значения, дошедшие до формы по пути приложения, с разметкой этих снимков. Отдельно считаются выданные поля, верные среди них и доля заполненных полей. Значения с предупреждением учитываются отдельно от подтверждённых: на экране пользователь видит между ними разницу.

В сборке 1.1 зафиксирован более поздний замер читателя на 68 отложенных снимках со 183 оцениваемыми числовыми полями. Читатель подтвердил 128 полей, из них 127 верно. Этот результат проходит пороги точности и заполнения для сборки, но ничего не гарантирует для отдельного снимка. Последняя проверка – фотография рядом с редактируемыми полями.