Расскажу про различные полезные библиотеки и функции Python: от простых и известных, до специфичных и редких. Поделюсь тем, какие технологии мы используем при разработке, обучении и деплое наших моделей: что помогало улучшить качество, а что тормозило разработку.
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Маслович
1. CV в пайплайне распознавания
ценников товаров
Трюки и хитрости
Николай Маслович, Metacommerce, 2020
2. 2011 — год основания
107 сотрудников
2 офиса (Россия, Европа)
Резидент IT-кластера
Фонда «Сколково»
Мультиканальный мониторинг
ассортимента и цен
Создано с содействием инвестиций
Фонда развития интернет-инициатив
Собираем в день 3,6 терабайт
сырых данных о 100 млн. товаров
Нам доверяют
О компании
2
3. Про меня
3
● CV & ML специалист в R&D отделе
● 1.5 года
● НИТУ МИСиС: Прикладная Математика
@maslovich
4. Про задачи
4
Проблематика мониторинга цен продуктового ритейла:
● 100 товарных позиций в день с помощью блокнота и ручки
● 100% ручной мониторинг
● 200 – 300 ценников в день с человека
● Полностью ручной ввод в систему ценообразования
● Ошибки ручного поиска товаров
5. Про задачи
5
Результат работы R&D отдела по автоматизации:
● 12 000 ценников в день на человека
● Полный контроль качества исполнения
● Качество распознавания 99%+
● Удешевление процессов в 7 раз
6. Как мы это сделали
Детекция Сегментация Распознавание
6
Пайплайн
10. Если нет своего сервера...
● Vast.ai https://vast.ai
Цены заметно ниже, чем на amazon, google
Максимально простое использование
Дорогой трафик
10
11. Executable python
● click module https://click.palletsprojects.com
● jobs | disown
● screen, tmux https://help.ubuntu.ru/wiki/screen,
https://linuxize.com/post/getting-started-with-tmux/
● Прогресс-бары https://github.com/tqdm/tqdm
11
Как создавать скрипты с CLI и запускать без
остановки после разрыва ssh?
12. Чтение и сохранение данных
Как быстро и просто хранить и обрабатывать
данные?
12
13. Чтение и сохранение данных
● pathlib.Path вместо os
Стандартная библиотека в
python >= 3.4
13
14. Чтение и сохранение данных
● ujson вместо json
https://pypi.org/project/ujson/
14
15. Чтение и сохранение данных
● ilio вместо with open
https://github.com/gowhari/ilio
15
23. Организация кода
Как разрабатывать код в команде без
копипаста и боли?
23
● python-package и установка как гит-сабмодуль.
● при разработке pip install -e submodule/
24. Организация кода
● Для кода всегда используйте git. Даже если вам нужна только “бэкап”
функциональность
● Никогда не используйте git для хранения датасетов
● Сформируйте .gitignore для всех ML-проектов и копипастьте его
● Не забывайте использовать info/exclude
● Всегда используйте только ssh подключения
24
26. Эксперименты
● Cata... jupyter + .py
Код в PyCharm
Параметры в Jupyter с %autoreload
Свой велосипед лучше, если чаще всего вы меняете код, а не параметры.
26
27. А теперь про нейроночки
torch
cv2
tf
pandas
jupyter
flask
numpy
go
tf
torch
27
28. Чистка данных
Как без переразметки убрать часть ошибок в
разметке и улучшить скор?
28
4 6 0 7 0 6 4 2 2 1 4 5 5
30. Чистка данных
1. Train
2. Peel
Выкидываем часть данных, на которых сеть показывает плохой
результат (например 5% квантиль или даже все с неидеальным скором)
30
31. Чистка данных
1. Train
2. Peel
3. Repeat
Файнтюним / обучаем с нуля модель на новом датасете. Повторяем, пока
число примеров с плохим скором не перестанет значительно меняться /
качество на валидации станет падать.
Работает, если разметка имеет значительные изъяны, например
отсутствует часть последовательности
31
33. Про pytorch и подводные камни
● Denormal values
https://discuss.pytorch.org/t/conv2d-is-very
-slow-on-trained-weights-vs-random-weights/4337
7
33
%Total OwnTime TotalTime Function (filename:line)
80.00% 34.93s 34.93s forward (torch/nn/modules/conv.py:320)
34. Про pytorch и подводные камни
● .pt vs .pth
● Saving optimizer
● Initialization
torch.save({
'epoch': epoch,
'model_state_dict': model.state_dict(),
'optimizer_state_dict':
optimizer.state_dict(),
'loss': loss,
...
}, PATH)
34
torch_utils.py
35. Маски для сегментатора
1. Генерация на лету vs чтение с диска
2. Если число классов <= 8, можно хранить в битах с помощью
np.(un)packbits
3. npz vs npy vs sparse
35
Хранить или создавать на лету? Если
хранить, то в чём?
37. “Липкая” сегментация
● Грубая сегментация:
Обвести сегмент через opencv черным цветом
На постпроцессинге увеличить размер bounding box-a
37
38. “Липкая” сегментация
● Точная сегментация:
Прининцип watershed:
from scipy import ndimage as ndi
distance = ndi.distance_transform_edt(mask).astype(np.float32)
Нормируем на максимальное значение
mask = np.max(np.stack(distances), axis=0)
Подбираем пороговое значение на постпроцессинге, уменьшая пока не
появится слипание
38
40. Пропущенная разметка в многоклассовой
сегментации
Как сказать нейросетке, чтобы она не училась
на ложно-отсутствующей разметке?
40
41. Пропущенная разметка в многоклассовой
сегментации
● Кастомный loss
В датагенераторе добавить к сэмплу маску индексов
Отобрать из предиктнутой маски и GT маски каналы для обучения
41
42. Секция про наш pipeline
torch
cv2
tf
pandas
jupyter
flask
numpy
go
tf
torch
Та самая SOTA с медиума
Конвейер
данных
42
43. Обучение на “больших данных”
★ Много ресурсов, мало профита
★ Систематические ошибки
★ Отбор лучшего решения
★ Устойчивость модели
43
● Noise - первое обучение
● Fine4Test - валидация
● Fine4Train - дообучение
● Устойчивые метрики
47. Шасси
● Uwsgi + flask (НЕ flask only)
https://uwsgi-docs.readthedocs.io/en/latest/,
https://flask.palletsprojects.com/
@before_first_request
47
На чем деплоить модели в прод?
49. OCR Наименований товаров
● Что не зашло:
Tesseract – не справляется с текстом “in the wild”, только текст как
картинка/скан. Только консольный интерфейс
Google OCR – недостаточное качество. Систематические ошибки.
Возможные просадки качества. Дороговизна, даже с трюками
49
50. OCR Наименований товаров
● Что не зашло:
AlexNet на стероидах с MSE-Loss
Обучение на малых и точных данных
50
51. OCR Наименований товаров
● Что зашло:
ResNet-18-UNet и efficientNet-b3-UNet
GRCNN, T=3. 77 символов, 32x1600x3, 201 Ts
Отсутствие сложных замен символов
Levenshtein distance (Needleman–Wunsch algorithm)
https://en.wikipedia.org/wiki/Needleman–Wunsch_algorithm,
https://biopython.org
MSE + CTC magic
51
52. OCR: CTC
● 2 * n + 1
● Горизонтальная конкатенация и паддинг черным справа
● pytorch: collate_fn
● Грязная разметка работает
● Confidence: warp_ctc, CTCDecoder
https://github.com/SeanNaren/warp-ctc,
https://github.com/githubharald/CTCDecoder
● Best path decoding
52
https://www.youtube.com/watch?v=eYIL4TMAeRI