Учитывая изображение козла, ваша программа должна попытаться определить, перевернутый козел или нет.
Примеры
Это примеры того, что может быть входом. Не фактические входы
Входные данные:
Выход:
Downgoat
спекуляция
Ваша программа должна быть не более 30 000 байтов
- На входе будет полный козел
- Картина всегда будет содержать козу
- Если коза перевернута, выведите
Downgoat
, иначеUpgoat
Ввод будет, однако, вы можете взять изображение в качестве ввода (имя файла, base64 изображения и т. Д.)
Не полагайтесь на имя изображения или другие метаданные, содержащие «Upgoat» или «Downgoat», поскольку имена файлов gist приведены только для справки.
Пожалуйста, не используйте жесткий код . Это скучно, я не могу навязать это полностью, но могу спросить.
Тестовые случаи
Суть с изображениями . изображения , начиная с downgoat
есть Downgoat
выход и изображения , начиная с upgoat
есть Upgoat
выход.
Вторая партия тестовых случаев
Обязательно протестируйте свои изображения во всех тестовых случаях. Эти изображения jpg
с. Размеры изображений действительно изменяются , но не что много.
Примечание. Перед принятием ответа можно добавить несколько тестовых примеров, чтобы избежать жестких кодов ответов и проверить общую производительность программы.
Бонусные баллы за правильный аватар: P
счет
Оценка - это процент, который можно рассчитать по формуле: (number_correct / total) * 100
источник
Ответы:
Mathematica, 100%, 141 байт
Ну, это больше похоже на обман. Это также невероятно медленно и очень глупо. Функция
f
примерно показывает, насколько высоко вы можете установить порог распознавания в одном из встроенных в компьютерное зрение Mathematica изображений, и при этом распознавать изображение как животное-каприн.Затем мы видим, является ли изображение или перевернутое изображение более козлиным. Работает над изображением вашего профиля только потому, что галстук нарушен в пользу понижения. Вероятно, существует множество способов, которыми это можно улучшить, включая вопрос о том, представляет ли изображение Bovids или другие обобщения типа сущностей животных-капринов.
Ответьте в виде письменных оценок 100% для первого набора тестирования и 94% для второго набора тестирования, поскольку алгоритм дает неубедительный результат для козы 1. Это может быть повышено до 100% за счет еще более длительного вычислительного времени: тестирование больше значений
RecognitionThreshold
. Повышение от100
до1000
достаточности; по какой-то причине Mathematica считает, что это очень плохой образ! Изменение объекта распознавания с животного-каприна на копытного млекопитающего также, кажется, работает.Ungolfed:
Альтернативное решение, 100% + бонус
Этот использует ту же стратегию, что и раньше, но с бинарным поиском через порог. Здесь задействованы две функции:
g[t]
возвращает, является ли его аргумент козлиным изображением с порогомt
.f
принимает три параметра: изображение и верхнюю и нижнюю границу порога. Это рекурсивно; это работает, проверяя порогm
между верхним и нижним порогами (смещенный к нижнему). Если изображение и отраженное изображение являются козлиными или не козлиными, оно удаляет нижнюю или верхнюю часть диапазона в зависимости от ситуации и вызывает себя снова. В противном случае, если одно изображение является козлиным, а другое - не козлиным, оно возвращается,Upgoat
если первое изображение является козьим, а вDowngoat
противном случае (если второе, отраженное изображение является козлиным).Определения функций заслуживают небольшого пояснения. Во-первых, применение функции левоассоциативно. Это означает, что нечто подобное
g[x][y]
интерпретируется как(g[x])[y]
; «Результатg[x]
применения кy
.»Во-вторых, назначение в Mathematica примерно эквивалентно определению правила замены. То есть,
f[x_] := x^2
это не значит «объявить функцию с именемf
с параметром ,x
который возвращаетx^2
;» его значение ближе к: «всякий раз, когда вы видите что-то подобноеf[ ... ]
, называйте вещь внутриx
и заменяйте все наx^2
».Соединяя эти два значения вместе, мы можем видеть, что определение
g
говорит Mathematica заменить любое выражение формы(g[ ... ])[ ... ]
правой частью присваивания.Когда Mathematica встречает выражение
g[m]
(во второй строкеf
), оно видит, что выражение не соответствует ни одному из известных ему правил, и оставляет его без изменений. Затем он соответствуетMap
оператору/@
, чьи аргументыg[m]
и список{i, ImageReflect@i}
. (/@
это инфиксная запись; это выражение в точности эквивалентноMap[g[m], { ... }]
.)Map
Заменяется путем применения его первого аргумента к каждому элементу его второго аргумента, поэтому мы получаем{(g[m])[i], (g[m])[ ... ]}
. Теперь Mathematica видит, что каждый элемент соответствует определениюg
и выполняет замену.Таким образом, мы
g
должны действовать как функция, которая возвращает другую функцию; то есть он действует примерно так, как мы написали:(За исключением того, что в этом случае само
g[t]
по себе оценивается как aFunction
, тогда как раньше самоg[t]
по себе не было преобразовано вообще.)Последний трюк, который я использую - это необязательный шаблон. Шаблон
l_ : 0
означает «сопоставить любое выражение и сделать его доступным какl
, или ничего не сопоставить и сделать0
доступным какl
». Итак, если вы вызываетеf[i]
с одним аргументом (проверяемое изображение), это как если бы вы звонилиf[i, 0, 1]
.Вот тестовый жгут, который я использовал:
источник
JavaScript, 93,9%
объяснение
Простая реализация идеи @BlackCap по проверке источника света.
Большинство коз находится в центре их изображений, а их животы всегда темнее спины из-за солнечного света. Программа запускается в середине изображения и запоминает цвет. Затем он получает среднюю яркость пикселей выше и ниже центра до того места, где цвет отличается от цвета в центре (когда тело козла заканчивается и начинается фон). Независимо от того, какая сторона светлее, определяется, является ли она нижней или нижней.
Сбои для отрицательной 9 и 7 и 9 во втором контрольном примере.
источник
Python, 100%, 225 байт
Используйте обратный поиск изображений на козе. Если страница возвращает удовлетворительное количество результатов, это, вероятно, козел вверх. Это решение, вероятно, не будет работать на нарисованных от руки козлах или если Bing когда-либо будет поврежден.
источник
Ява,
93,9%100%Это работает путем определения контрастности строк в верхней и нижней части изображения. Я предполагаю, что контраст в нижней половине изображения больше по двум причинам:
Я определяю контраст для каждой строки, вычисляя разницу значений соседних пикселей, возводя в квадрат разницу и суммируя все квадраты.
Обновить
Некоторые изображения из второй партии вызвали проблемы с оригинальным алгоритмом.
upgoat3.jpg
Это изображение использовало прозрачность, которая была проигнорирована ранее. Есть несколько возможностей решить эту проблему, но я просто выбрал рендеринг всех изображений на черном фоне размером 400x400. Это имеет следующие преимущества:
downgoat8.jpg / upgoat8.jpg
Эти изображения имеют преувеличенные детали в теле козла. Решением здесь было размытие изображения только в вертикальном направлении. Однако это породило проблемы с изображениями из первого пакета, которые имеют вертикальные структуры на заднем плане. Решение здесь состояло в том, чтобы просто считать различия, которые превышают определенный порог, и игнорировать фактическое значение разницы.
Вкратце, обновленный алгоритм ищет области с множеством различий в изображениях, которые после предварительной обработки выглядят так:
источник
Python 3, 91,6%
отредактированный с новыми тестами
установите имя файла к изображению козы, которое вы хотите проверить. Он использует ядро, чтобы сделать изображение сверху / снизу асимметричным. Я попробовал оператор sobel, но это было лучше.
источник
pip install Pillow
OpenCV с Hough Transform, 100%
Моя первоначальная идея состояла в том, чтобы обнаружить вертикальные линии ног козла и определить его вертикальное положение относительно тела и горизонта.
Как выясняется, на всех изображениях земля чрезвычайно шумная, что приводит к большому количеству выходных данных обнаружения края Канни и соответствующих обнаруженных линий из преобразования Хафа. Тогда моей стратегией было определить, лежат ли горизонтальные линии в верхней или нижней половине изображения, что было достаточно для решения проблемы.
Вот вся функция без вывода изображений:
Нижние края 1:
Downgoat1 линии:
Upgoat2 края и линии:
Метод даже хорошо работал на особенно шумных изображениях. Вот нижние края и линии:
добавление
Получается, что среднее размытие и адаптивное пороговое значение Гаусса до преобразования Хафа работают намного лучше, чем обнаружение краев Канни, в основном потому, что среднее размытие хорошо в шумных областях. Однако проблемы моего первоначального подхода сразу очевидны: на некоторых изображениях видны фоновые линии, а также лицо козла.
Вот downgoat8:
Контуры (код не показан) довольно хорошо обнаруживают верхний край козла (позвоночник), но не в состоянии получить всю форму.
Дальнейшие исследования: OpenCV имеет функцию обнаружения объектов на основе Haar, которая обычно используется для таких вещей, как машины и лица, но, вероятно, может работать и для коз, учитывая их отличительную форму.
Распознавание 2D-объектов выглядит многообещающе (сопоставление с шаблоном не будет работать из-за масштабирования и поворота), но мне лень разбираться в OpenCV для C ++.
источник
Python 3, NumPy, Scikit, 100%
Этот код запускает обученный козлом классификатор изображений по одному имени файла, распечатывая «Upgoat» или «Downgoat». Сам код представляет собой одну строку python3, которой предшествует одна гигантская строка и строка импорта. Гигантская строка на самом деле является обученным козлом классификатором, который выбирается во время выполнения и получает входное изображение для классификации.
Классификатор был создан с использованием системы TPOT от Рэндала Олсона и команды Университета Пенсильвании. TPOT помогает развивать конвейеры машинного обучения с использованием генетического программирования. В основном он использует искусственный отбор для выбора различных параметров и типов классификации, чтобы лучше всего работать с вводимыми вами входными данными, поэтому вам не нужно много знать о машинном обучении, чтобы получить довольно хорошую настройку конвейера. https://github.com/EpistasisLab/tpot . TPOT работает над Scikit-Learn, INRIA и др., Http://scikit-learn.org/stable/
Я дал TPOT около ста изображений коз, которые я нашел в интернете. Я выбрал те, которые выглядели относительно похожими на коз в Тесте, то есть «в поле», сбоку, и больше ничего не происходило на изображении. Результатом этого процесса TPOT был в основном объект ExtraTreesClassifier scikit-learn. Этот классификатор изображений после обучения (или «подгонки») моих козлов был протравлен в огромную строку. Строка, таким образом, содержит не только код классификатора, но и «отпечаток» обучения всех изображений коз, на которых она обучалась.
Я слегка обманул во время тренировок, включив тестовое изображение «козел на бревне» в тренировочные образы, но оно все равно довольно хорошо работает с общими изображениями «козел в поле». Кажется, есть компромисс: чем дольше я запускаю TPOT, тем лучше он создает классификатор. Тем не менее, лучшие классификаторы также кажутся «большими» и, в конечном счете, сталкиваются с лимитом в 30000 байт, заданным @Downgoat в игре в гольф. Эта программа в настоящее время составляет около 27 КБ. Обратите внимание, что «вторая группа» тестовых изображений не работает, как и «резервная ссылка», поэтому я не уверен, как это будет с ними работать. Если бы они были восстановлены, я, вероятно, начал бы заново, перезапустил TPOT и передал бы ему кучу новых изображений, и посмотрел бы, смогу ли я создать новый классификатор размером менее 30 Кбайт.
Спасибо
обновление: для каждого запроса приведены данные обучения, размер которых увеличен до 24x12 и объединен в одно изображение для удобства загрузки / презентации. его более ста изображений. http://deeplearning.net/datasets/ , http://www.vision.caltech.edu/Image_Datasets/Caltech256/ , поиск изображений duckduckgo, поиск изображений в Google и т. д.
источник
Scikit-Learn со случайными лесами, 100%
Испытанный и верный подход - это коннет, но случайные леса могут работать очень хорошо из коробки (несколько параметров для настройки). Здесь я показываю некоторые общие методы в задачах классификации изображений.
Я начал с 100 изображений коз для обучения, которые я нашел через Google Images (AFAIK ни один в данных обучения не соответствует данным теста). Каждое изображение масштабируется до 20x16 в оттенках серого, затем массив выравнивается, чтобы создать одну строку в двумерном массиве. Перевернутая версия изображения также добавляется в виде строки для обучающих данных. Мне не нужно было использовать какие-либо методы увеличения данных .
Затем я передаю двумерный массив в классификатор случайных лесов и вызываю предикат, чтобы получить 50 деревьев решений. Вот (грязный) код:
Вот первое дерево решений (хотя, поскольку модель находится в ансамбле, она не особенно полезна )
источник