Дело в том, что здесь у нас строгая математическая модель цилиндра и строгая математическая модель проекции цилиндра на плоскость. Зачем обучать нейронную сеть, тратить ресурсы, память, если вся необходимая информация у нас уже есть? Грубо говоря, массив надо просто отсортировать. А для машинного обучения, чтобы модель обнаружила нужные свертки, надо еще предоставить миллион изображений под разными углами, и все ради чего, ради нескольких формул, которым она обучится, но которые, при этом, были известны априори?
Это похоже на случай с простой задачей на собеседовании, когда надо вывести, какие числа от одного до ста делятся на пять, какие на семь, а какие и на пять, и на семь. Конечно, можно построить модель перцептрона, но зачем? Нейронки хороши там, где модель данных неизвестна или не может быть строго сформулирована. Применение нейронки в таких задачах скорее выдает необразованность специалиста в этой области.
Что касается производительности Python в задачах CV, то если дергать только стандартные методы, то все ок. В компьютерном зрении приходится много экспериментировать, поэтому Питон здесь хорошо работает. Но проблема Питона в том, что он осуществляет постоянную аллокацию/деаллокацию маленьких объектов, поэтому если надо делать какие-то низкоуровневые микрооперации, то Питон сильно уступает C/C++. Иногда в сотни раз! Попробуйте реализовать преобразование Хафа, чтобы это было быстро на Питоне.
Машинное обучение не нужно там, где можно написать алгоритм. Вы же не будете писать нейронку, которая сортирует массив?
Получение градиента изображения — хорошо. Нахождение линий цилиндра — тоже, хотя надо написать свое преобразование Хафа, поскольку в имплементации OpenCV есть два дефекта: он не взвешивает точки по силе градиента (т.е. для него пиксели бинарны — или ноль, или не ноль) и не возвращает аккумулятор. Имея аккумулятор можно, например, брать в анализ только самые сильные линии. Можно размывать (не забывая про wrap around) по rho, чтобы получить самые сильные толстые линии. Правда, на Питоне его не напишешь, слишком медленный язык, разве что на Cython.
Как альтернатива, можно использовать LSD детектор (в том же OpenCV), он быстрый и хорошо находит фрагменты линии. Далее их можно соединять и получать длинные отрезки.
Следующий момент — поскольку у нас уже есть две линии, то можно их преобразовать, чтобы сделать их параллельными. Это в том числе упростит поиск эллипсов.
Еще вариант — собрать точки градиента и рассмотреть задачу как задачу оптимизации модели цилиндра под перспективными искажениями, как это делается в фотограмметрии.
Такие задачи появляются с частотой где-то раз в два дня на Upwork.
Средние скиллы — линейная алгебра/матстатистика/обработка изображений (базовые курсы), 3 года программирования на C++ или Python, несколько книг по компьютерному зрению.
Можно начинать с простых заданий, потом переходить на более сложные. Типичные задания ограничены только фантазией =)
Самые простые: скрипт, повторяющий операции фотошопа; считывание показаний фиксированного прибора по изображению с камеры; поиск и чтение определенных регионов на скриншотах.
Видно-видно, даже не сомневайтесь. Выравнивания не соблюдаются, строки не режутся, блоки скачут, как хотят. У такого кода нет ни эстетической, ни обучающей составляющей.
А в винде можно запустить хром в докер контейнере с GUI так, чтобы он был неотличим от других десктопных приложений, но при этом не мог жрать больше одного процессора и 512 Мб оперативки? Нет? Ну ладно.
Гарантия на Upwork еще та байда. Если вдруг возникает конфликт и не удается договориться, то за суд третьей стороной и клиент, и заказчик должны заплатить безвозвратные $300. Т.е. если заказ, скажем, в $500, то даже если суд будет в твою пользу, то выйграешь ты от него $200. С другой стороны, если ты заплатил $300 за суд, а заказчик — нет, то ты выигрываешь конфликт в любом случае, и тебе возвращаются и $300, и $500. Такая вот проверка серьезности намерений.
Раньше была еще хорошая биржа, VWork, пока ее не купил freelancer.com. Так вот там если выигрываешь суд (бесплатный), то выигрывшая сторона имеет право поставить отзыв хоть в единицу, а проигравшая не может оставить отзыв вообще.
Фрилансер не обязательно должен «постоянно искать новый проект». Долгосрочные заказчики — нередкое явление среди фрилансеров. Иногда заказчик сразу сообщает, что ищет долгое сотрудичество, иногда так получается само собой, что одна работа тянет за собой другую.
WordPress, PHP и натягивание дизайнов на шаблончики всегда и в любом количестве, но время от времени попадаются крутые стартаперы, софт для роботов и долгосрочные заказы на R&D.
останавливает от фриланса именно понимание, что рост как специалиста закончится в целом
Почему-то многие повторяют эту фразу, как само собой разумеющееся, хотя я не понимаю, как можно расти как специалист имея постоянный поток задач в офисе. Когда учить новые вещи, после рабочего дня и в выходные, что ли?
Я работал в офисе во многих областях — embedded, gamedev, mobile development, и в каждой из них рост в первые полгода-год, дальше — рутина на изученном стеке технологий своего проекта.
С другой стороны, когда ты выходишь на международную биржу типа Upwork, то попадаешь в водоворот таких технологий, о которых ты даже не слышал, работая в офисе. Надо подтянуть линейную алгебру — ок, полдня работаешь, полдня слушаешь лекции и решаешь задачи. Машинное обучение? Выбирай курс.
Забудьте этот штамп — в мире слишком много интересных вещей в области IT, чтобы рост как специалиста остановился. По крайней мере фриланс уж точно будет последней причиной.
Был похожий случай, когда мне надоело брать заказы — стал повышать цену, и случилось невероятное — рейт поднялся в два раза! По общей сумме я стал получать на 10% меньше из-за уменьшения количества заказов, но по времени выйгрыш в два раза.
Вы правильно говорите — авторские права на проекты, за которые было заплачено, принадлежат заказчику. Хотя это подразумевается законодательством, на Upwork, например, еще при регистрации подписывается публичный договор, где это четко прописано.
Это вы еще не видели, как возле одного монастыря в Японии все камни в ручье скованы друг с другом цепью! Вроде как — чтобы не смещались вдоль ручья (а то безобразие!)
Теоретически можно было бы перебрать разные варианты цвета чернил/бумаги до получения наилучшего контраста. Представляю себе программу, которая перебирает варианты и оценивает контраст автоматически.
Кстати, я посмотрел оригинальный плагин — автор логарифмирует цветовое пространство согласно статье:
// log transform the RGB data
int R = (pixels[j] & 0xff0000)>>16;
int G = (pixels[j] & 0x00ff00)>>8 ;
int B = (pixels[j] & 0x0000ff);
double Rlog = -((255.0*Math.log(((double)R+1)/255.0))/log255);
double Glog = -((255.0*Math.log(((double)G+1)/255.0))/log255);
double Blog = -((255.0*Math.log(((double)B+1)/255.0))/log255);
Спасибо, только смотрите, чтобы не получилось как с Готлобом Фреге, когда он получил от Рассела опровержение работы всей его жизни незадолго до публикации второго тома своих «Основ» =) (Фреге добавил такой эпилог в свою книгу: «Вряд ли ученый может встретиться с чем-то более нежеланным, чем разрушение самой основы своей работы сразу после ее завершения»)
Имея базис линейно-независимых векторов, не мудрено разложить любой вектор по этому базису — и это будет «работать». Только что будет в ответе — концентрация или «е» в степени концентрация, или некие коэффициенты, которые коррелируют с концентрацией?
Дело в том, что без логарифмирования ваша программа будет работать только в узком диапазоне концентрации красителей. Наверное, не надо будет тогда и порог яркости пикселя выставлять — в логарифмическом пространстве разница между темным и светлым пикселем сократится и алгоритм заработает для самых темных/светлых участков.
Это похоже на случай с простой задачей на собеседовании, когда надо вывести, какие числа от одного до ста делятся на пять, какие на семь, а какие и на пять, и на семь. Конечно, можно построить модель перцептрона, но зачем? Нейронки хороши там, где модель данных неизвестна или не может быть строго сформулирована. Применение нейронки в таких задачах скорее выдает необразованность специалиста в этой области.
Что касается производительности Python в задачах CV, то если дергать только стандартные методы, то все ок. В компьютерном зрении приходится много экспериментировать, поэтому Питон здесь хорошо работает. Но проблема Питона в том, что он осуществляет постоянную аллокацию/деаллокацию маленьких объектов, поэтому если надо делать какие-то низкоуровневые микрооперации, то Питон сильно уступает C/C++. Иногда в сотни раз! Попробуйте реализовать преобразование Хафа, чтобы это было быстро на Питоне.
Получение градиента изображения — хорошо. Нахождение линий цилиндра — тоже, хотя надо написать свое преобразование Хафа, поскольку в имплементации OpenCV есть два дефекта: он не взвешивает точки по силе градиента (т.е. для него пиксели бинарны — или ноль, или не ноль) и не возвращает аккумулятор. Имея аккумулятор можно, например, брать в анализ только самые сильные линии. Можно размывать (не забывая про wrap around) по rho, чтобы получить самые сильные толстые линии. Правда, на Питоне его не напишешь, слишком медленный язык, разве что на Cython.
Как альтернатива, можно использовать LSD детектор (в том же OpenCV), он быстрый и хорошо находит фрагменты линии. Далее их можно соединять и получать длинные отрезки.
Следующий момент — поскольку у нас уже есть две линии, то можно их преобразовать, чтобы сделать их параллельными. Это в том числе упростит поиск эллипсов.
Еще вариант — собрать точки градиента и рассмотреть задачу как задачу оптимизации модели цилиндра под перспективными искажениями, как это делается в фотограмметрии.
А вообще классная задача, такие приятно решать.
Средние скиллы — линейная алгебра/матстатистика/обработка изображений (базовые курсы), 3 года программирования на C++ или Python, несколько книг по компьютерному зрению.
Можно начинать с простых заданий, потом переходить на более сложные. Типичные задания ограничены только фантазией =)
Самые простые: скрипт, повторяющий операции фотошопа; считывание показаний фиксированного прибора по изображению с камеры; поиск и чтение определенных регионов на скриншотах.
Раньше была еще хорошая биржа, VWork, пока ее не купил freelancer.com. Так вот там если выигрываешь суд (бесплатный), то выигрывшая сторона имеет право поставить отзыв хоть в единицу, а проигравшая не может оставить отзыв вообще.
Я работал в офисе во многих областях — embedded, gamedev, mobile development, и в каждой из них рост в первые полгода-год, дальше — рутина на изученном стеке технологий своего проекта.
С другой стороны, когда ты выходишь на международную биржу типа Upwork, то попадаешь в водоворот таких технологий, о которых ты даже не слышал, работая в офисе. Надо подтянуть линейную алгебру — ок, полдня работаешь, полдня слушаешь лекции и решаешь задачи. Машинное обучение? Выбирай курс.
Забудьте этот штамп — в мире слишком много интересных вещей в области IT, чтобы рост как специалиста остановился. По крайней мере фриланс уж точно будет последней причиной.