Удаление водяного знака с изображения

opencv

Пришла задача спарсить сайт. Одним из требований было удаление водяного знака. Раньше я никогда с водяными знаками не работал. Да и не каждый день приходится писать парсеры. Пришлось пережить этот день и кое чему научиться.

Первое знакомство

Посмотрел сайт. Он оказался на битриксе, с обычной SSR загрузкой. То есть, это обычный сайт с пагинацией. С этим я точно работал и проблем не должно возникнуть. Можно не долго думая, решать вопрос с водяными знаками.

Нейросеть удаления водяных знаков

Убедился, что нейронки с этим отлично справляются, но не бесплатно. И при небольшом подсчете решил, что на больших объемах не выгодно. Есть несколько сервисов, которые предлагают данную услугу по API, с ценой от 15 центов за операцию. Я нашел как минимум 2 сервиса решающих эту задачу. Пробовал на образце - отличный результат.

Tesorflow и Google Colab

Стал искать способы решения задачи с возможностью автоматизации. Нашел обученную модель, но по инструкции не получилось запустить ни в google colab ни у себя в докере. Продолжил поиск и изучение. Судя по звезкам на гитхабе, эта разработка имеет успех, и она наверняка работает. Долго не мог отступить от этой идеи.

В google colab проблема с версией tensorflow. Предпринял несколько попыток побороть при помощи conda, и создания виртуального окружения, но бросил это после нескольких ошибок. Не особо вникал, может если бы я так не торопился, то все могло получиться.

Как всегда, когда пробуешь новый инструмент, теряешь время на привыкание работе с ним. И как часто оказывается, это было лишней тратой времени.

Решил пробовать поднять у себя на машине в докере. Мне так привычнее, я люблю пользоваться дебагером - он ставит все мысли на свои места.

В какой то момент понял, что я пытаюсь запустить модель машинного обучения без самой модели. Пришлось докачивать данные. Далее все попытки запуска не увенчались успехом. Даже с предложенными разработчиком образцами, уже казалось что вот вот получится, но нет. Попытка постичь ML и конкретно это решение - провалилась.

Opencv

Добрался до opencv, и разобрался как работают маски. На самом деле я с него начал, но не разобравшись бросился на поиски готового решения. После работы с библиотекой, до меня наконец дошло какие маски нужны для работы. Несмотря на мой опыт работы с фотошопом, никак не мог понять, ни как ее получить, ни какой она должна быть. В общем блуждал во тьме, хотя сто раз уже применял ранее.

Сделал маску в фотошопе, затем применил все в скрипте на python opencv. Успешно научился удалять водяные знаки автоматизировано. Это не идеальный результат, бывают артефакты, но в целом, результатом доволен. Ачивка! (как поговаривают игроманики)

Полдня работы - были не нужны

После изучения способа закрашивания водянного знака, связался с клиентом. Я ему сказал, что сайт на битрикс. При загрузке ставит водяной знак. На что он мне сказал, что битрикс хранит исходники по измененному адресу. Я растроился, что не догадался сам. Сэкономил бы время, но не познакомился бы с opencv.

Сроки и стоимость

Клиент спрашивает цену. А я опять не могу назвать, потому что знаю, что назови цену, обязательно накидают работы сверху или что то еще. Лучше повременить, и пообщаться еще. Я сказал, что ставка 1000 в час и уже потрачен 1 день. Спросил какой у них бюджет.

Сам парсер

Пока ждал его ответ, написал версию парсера, которая парсит ссылки на страницы товаров.

Затем дописал код, который собирает 10 товаров, в табличку csv. Тогда я понял, как же круто писать парсеры работая с базой данных. Все характеристики бы собирались в одну таблицу, не пришлось бы мучаться с заголовками. Можно проставить уникальный индекс и не дублировать товары. В общем открыл америку и буду рад попытать счастье непосредственно в деле.

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

Кстати, нейросеть оценивает данную задачу 20-50 тысяч. Считаю справедливо.