Как определить породу собаки по фото
Люди очень часто берут беспородных собак и щенков с улицы, а по мере взросления малыша начинают задумываться — а вдруг домашний любимец имеет породу? Для этого существуют специальные сайты и приложения.
Программа из Play Market
Сайты и порталы в телефонах давно вышли из моды и им на смену пришли мобильные приложения. Можно скачать из Play Market программу «Определить породу собак». Даже если пушистый друг не является породистым, программа укажет на породу, которую он больше всего напоминает.
Нейронная сеть делает результат более точным, несмотря на качество изображения.
Приложение очень простое в использовании. На экране всего лишь две кнопки. Нужно взять фотографию из галереи или сделать фото в реальном времени, зайдя в главное меню. Сразу после загрузки, выскочит информация о породе. Приложение не работает без интернета!
В приложении также есть энциклопедия, которая позволяет узнавать информацию более, чем о 50 породах собак. Разработчики обещают расширить список.
Найти породу собаки и всё о ней на сайтах
В мире более 500 пород собак! И очень велик шанс найти породу пёсика по фото. У некоторых сайтов есть своя собственная энциклопедия с подробным описанием большинства из них. Полезный ресурс также может указать породу, на которую больше всего похож «дворянин». Понадобится лишь одно фото питомца.
Благодаря этой программе, можно узнать про все нюансы в содержании домашнего зверя или отказаться от покупки щенка, если он не подходит по каким-то критериям.
Специальный сайт
Можно узнать породу питомца, просто загрузив в поисковик сайта фото или найдя в поиске похожую. Но об этом способе лучше вспомнить позже. Если в распоряжении уже имеется фото питомца, то можно опробовать сайт Kisapes.
Сайт также предоставляет возможность узнать, на какую породу собак похож человек, ориентируясь на селфи. Для этого стоит зайти в комментарии, авторизоваться Вконтакте и оставить комментарий с селфи. Дружелюбная аудитория с радостью поможет!
Поиск в интернете через фото
У поисковых систем есть свои возможности. Она может находить максимально похожие фотографии на загруженные изображения. Для этого нужно открыть раздел «Картинки» и нажать на иконку с лупой. После загрузки фото, появится множество изображений с породами, похожих на собаку с фотографии.
Программа позволяет также определить вид или разновидность любого животного.
А Ваш питомец породистый или дворняга?
Как определить породу собаки — по внешнему виду, по фото, по щенку
Хочется приобрести породистого щенка, чтобы можно было гордиться своей собакой. Вокруг столько предложений, подходящих по цене. Интернет пестрит объявлениями о продаже милых питомцев. Однако закрадываются сомнения, и небезосновательные – а вдруг обманут. Как определить породу собаки точнее, чтобы не ошибиться и зря не потратить деньги?
Как определить породу собаки по фото
Все объявления о продаже собак онлайн сопровождаются фотографиями, порой, весьма привлекательными. Кажется, вот она, долгожданная мечта, смотрит на тебя с очередного снимка такими умилительными глазами. Стоит ли доверять этому снимку?
Точно определить породу собаки по фото практически невозможно. При условии, что нет информации о родословной и не представлены отсканированные документы. Не только потому, что недобросовестный продавец может изменить представленную в интернете на доске объявлений картинку с помощью фотошопа. Дело в том, что в тексте объявления обычно не публикуют те параметры экстерьера, что требуются для определения чистокровности.
Это, например, рост, вес, объем грудной клетки, длина тела от холки до хвоста и др. К тому же, каждая порода имеет собственные уникальные международные стандарты. Все нюансы знает только специалист, который занимается конкретно той или иной породной группой.
Даже высококвалифицированный профессионал не в состоянии сказать конкретно, рассмотрев фотографию собаки. Он может лишь констатировать, что это животное имеет в большей или меньшей степени сходство с той или иной породой. Насколько же внешний вид собаки соответствует стандарту, судить будет сложно.
К тому же далеко не у каждого желающего имеется возможность найти такого специалиста. Тем не менее, в интернете есть ресурс, который помогает не точно, но всё же определить по фото онлайн возможную принадлежность собаки к определенной породе. Этот ресурс следует воспринимать, скорее, как игру и не считать выданные им сведения основательными.
Технология состоит в том, что компьютерная программа распознает разновидность животного по расположению глаз, конфигурации носа, ушей собаки, изображенной на фотоснимке. Однако камера способна несколько искажать реальную внешность питомца. Ведь предлагается для фотографирования применять веб-камеру, которая тем более не сравнится по качеству получаемых снимков с хорошим фотоаппаратом. Поэтому вряд ли результат будет достоверным.
По щенку
Любой специалист-кинолог скажет, что определить породу собаки по щенку, тем более – новорожденному, нельзя. Ведь щенки меняются буквально каждую неделю, растут. Может измениться не только длина лап или посадка ушей, но даже окрас.
Например, йоркширские терьеры в щенячьем возрасте короткошерстные и коричневые по окрасу. А когда становятся взрослыми, то их шерсть становится длинной и на спине может приобрести особый голубоватый оттенок.
Сколько случаев, когда приобретали вроде бы чистокровного щенка, а выросло нечто невообразимое. Лишь отдаленно похожее на представителя выбранной породы.
Единственный критерий – это приобретать щенка у авторитетного заводчика, который заботится именно о сохранении и распространении породы, а не только занят личным обогащением. Документы должны быть в порядке, не поддельными. Следует взглянуть и на родителей своего будущего питомца, чтобы убедиться окончательно в добропорядочности заводчика.
Как мне предложили разводить «породистых чихуашек»
Со мной был любопытный случай. Я прогуливалась со своей собакой Зосей, болонкой, по улице. К нам подошел некий гражданин, который предложил свести мою собаку с одним из его кобельков породы чихуахуа. Он, как оказалось, заводчик и специализируется на разведении «чихуашек», как он выразился.
Его совершенно не смутило, что я задала вопрос о чистокровности тех щенков, которые получатся в результате такого скрещивания. Он только заметил, что обязательно родятся «чихуашки», которых просто с руками оторвут клиенты за большие деньги, что мы с ним потом и поделим.
Естественно, я не согласилась на подобную авантюру. Мне ни к чему обманывать людей, желающих приобрести породистых животных, тем более по серьезной цене. Да и перспектива сделать из любимой собаки рожающую машину как-то не порадовала. Не говоря уже о судьбе щенков-метисов.
Так что авторитетность заводчика, известность и хорошие отзывы довольных клиентов – практически самые важные критерии для выбора породистого щенка.
Самые непохожие на взрослых особей щенки
Вот породы, щенки которых совершенно не похожи на взрослых собак:
Как можно определить породу собаки по внешнему виду
Точно определить породу собаки по внешнему виду можно в возрасте старше 1, а в некоторых случаях и 2-х лет. Легче всего обратиться к ветеринару и сделать ДНК-тест. Однако это дорогостоящая процедура, которая займет не один день. К тому же, далеко не в каждом городе есть подобная технология.
Можно попытаться сделать это самостоятельно, вооружившись справочником с описанием международных стандартов различных пород. Для этого потребуется запастись терпением и понять, с чего следует начинать и в каком направлении двигаться. В первую очередь следует ознакомиться с основами.
Абсолютно всех собак можно распределить на три основные группы:
Способы определения породы
Существует множество стандартных критериев, соответствующих особенностям той или иной породы. Однако, с основными стоит ознакомиться подробнее.
Возраст
Любой специалист, начиная осмотр животного, в первую очередь обращает внимание на его возраст. Поскольку необходимо понять – взрослое животное или щенок перед ним.
Устанавливают возраст обычно по зубам. Здесь достоверность не очень высока, если собака была подобрана на улице. Ведь даже у щенка, в результате нелегкой жизни, зубы могут оказаться стертыми и совсем не в том состоянии, что у малыша, родившегося в благоприятных условиях, в семье или в питомнике.
Размер
Затем приступают к осмотру тела, чтобы определить основные параметры. Одним из главных является размер собаки:
Костяк
Принадлежность к определенной породной группе можно понять по особенностям строения костяка животного в сочетании с другими параметрами. Например, строение черепа – длина морды, постановка ушей. Высоте лап и их форме и т.д.
Другие признаки породы
Важные особенности, которые встречаются в международных стандартах пород, на которые следует обратить внимание:
Шерсть
Шерсть животного – один из важнейших критериев породы. Здесь оценивается не только её окрас, но и структура.
Взгляните, как совершенно уникальный специалист, с поразительными знаниями и необычной чувствительностью определяет породу собак наощупь, по структуре шерсти. Хотя, имейте в виду, это всего лишь шоу, а Ирина Корх устанавливает на самом деле не породу, а фенотип:
У собак существует 5 видов шерсти:
Окрас шерсти имеет, порой, принципиальное значение для определения породности животного. У собак он весьма разнообразен. Основные цвета – черный, коричневый, рыжий. Все остальные являются лишь вариантами и оттенками, свидетельствующими об осветлении основных цветов: серый, палевый, голубой, абрикосовый, муругий, кофейный.
Белый окрас также является основным. Шерстинки в этом случае содержат чрезвычайно малое количество красящего пигмента, по сути это альбинизм. Однако полных альбиносов среди собак не встречается.
Окрас шерсти у собак может быть не сплошным, а состоять из разных участков двух или более цветов. За счет чего на теле собаки складывается определенный рисунок. Такой эффект называется расцветкой:
Следует отметить, что для некоторых пород очень важны сочетание цвета шерсти, глаз, век и мочки носа.
Поведение и характер
Различные породы собак селекционеры разводили не только ради красоты. Человеку нужны были помощники на охоте, защитники, спасатели. Поэтому корректировался в процессе отбора не только внешний вид, но и поведение животного. Одни инстинкты выделялись, другие старались как бы затушевать, сделать менее явными. Так родились рабочие качества собак, характеризующие ту или иную породу и являющиеся их отличительными признаками.
Например, овчарки – это пастушьи собаки. В них генетически заложено такое поведение. Встретив на своём пути корову, овцу, овчарка тут же примется за свои «обязанности». Её забота – это собрать животных в стадо и охранять их. Иногда овчарки ведут себя также и по отношению к людям, детям. Заботясь о детишках, собака может даже иногда слегка покусывать их за пятки, как она делает это, загоняя овец.
Охотничьи собаки обладают необычайно тонким обонянием. Делают стойку, если завидят добычу, у них сильно развит инстинкт преследования, но при этом они не в состоянии осуществлять охранные функции.
Как узнать породу собаки по фото
Как определить породу собаки через телефон по фотографии
В мобильных телефонах сайты и порталы давно сменились мобильными приложениями. Поэтому для того, чтобы узнать породу, необходимо воспользоваться программой из Play Market — «Определить породы собак». Эта программа работает таким образом, что если точно не удастся определить породу собаки, она предложит ту, которую считается похожей на вашу собаку.
Мобильное приложение для поиска породы собак
В приложении задействована нейронная сеть, в связи с чем результаты часто точные, несмотря на качество предоставляемой фотографии.
Информация о мобильном приложении
Несмотря на сложность организации данного приложения, пользовательский интерфейс достаточно прост. В главном меню нужно выбрать, откуда будет взята фотография — из галереи или вы создадите фото в реальном времени. В соответствии с этим на экране две кнопки. Приложение будет работать только в том случае, если телефон подключен к сети Интернет. Сразу же после выбора фотографии из галереи на экране телефона появится информация о собаке.
Результат поиска породы собаки
Пользователь может вызвать дополнительное окно с информацией об определённой породе из энциклопедии с фото. Оно всё ещё находится на стадии разработки и способно распознавать до 50 пород собак. Создатели приложения обещают увеличивать это количество и улучшать качество определения.
Как определить породу собаки по щенку?
В щенячьем возрасте невероятно трудно определить точную породу, к которой принадлежит животное. Если вы хотите приобрести определённого щенка, стоит покупать его только у профессиональных заводчиков, которые имеют животных с документами и продают щенков тоже только с документами, подтверждающими породу. Имейте в виду, что такие щенки стоят недешево.
Внимание! Экономия при покупке чистокровных собак без документов опасна. Возможна ошибка, которая станет явной по мере взросления питомца.
Вероятность ошибки в определении породы по внешнему виду в щенячьем возрасте очень высока и вместо чистокровной собаки вырастет дворняжка.
Как определить породу собаки по щенку, если документы полностью отсутствуют? В таком случае следует действовать в том же порядке, что и для взрослой особи. Но больший акцент нужно делать на общение с профессиональными заводчиками животных.
Поиск породы собаки по изображению на ресурсе poroda-sobaki.by-photo.net
В мире большое количество пород собак, достигающее полу тысячи. И практически все они разные, со своим характером, манерой поведения, окрасом. По этим параметрам их хоть и сложно, но можно отличить. Поэтому у нас есть большие шансы определить породу на фотографии. В этом нам на помощь придёт первый ресурс — https://poroda-sobaki.by-photo.net/. Он специализируется только на поиске собак и в его базе данных есть все породы, а также их подробное описание.
Всё что вам нужно для поиска — это фото с собакой, которое вы можете загрузить на сайт:
На экране появятся другие изображения той же породы, которая есть на фото пользователя. Под ней описание: порода, окрас, продолжительность жизни, вес для разных полов, похожие породы. Из этой информации можно определить, нужна ли вам такая собака дома. Присмотритесь к другим похожим породам, которые предлагаются в описании. Поделиться найденной информацией можно в социальных сетях ниже по ссылкам.
Как определить породу собаки по внешнему виду
Можно попробовать определить породу по внешности питомца собственноручно, с помощью информации из интернета. Для этого надо выяснить некоторые характеристики животного и поискать в сети списки подобных пород (с фотографиями).
Вес и размер собаки
Для начала нужно оценить габариты питомца. Для этого понадобятся весы и рулетка. Породистые собаки делятся на следующие группы:
Йорки — одни из самых популярных мелких собачек в наше время и перепутать их с «дворняжками» вряд ли возможно
Шерсть собаки
Также у любого пса несложно оценить показатели шерстяного покрова. Животное может быть:
Следует отметить, что у многих пород собак существуют короткошёрстные и длинношёрстные разновидности, поэтому ориентироваться только на длину волосков не стоит.
Чихуахуа бывают длинношёрстные и короткошёрстные
Могут помочь в выяснении породы и другие особенности собачьей шерсти: жёсткость, различная длина на разных участках тела (усы, борода, штанишки и т. д.), наличие и строение подшёрстка. Но разобраться во всех этих нюансах обычному человеку будет достаточно сложно.
Другие признаки
Обратившись к физиологии собак, можно определить тип строения скелета (узкий, средний, укороченный, удлинённый, широкий), особенности формы и постановки хвоста и ушей, тип кожного покрова (есть ли складки), вид окраса. Выяснение этих характеристик сильно сократит списки возможных вариантов породы животного.
Разная форма грудной клетки собак: овальная, узкая, бочкообразная (слева направо)
Для большинства пород разработаны чёткие стандарты, в которых прописаны габариты животных, особенности строения и шёрстного покрова, окрас и многое другое. Именно обращение к официальным стандартам позволит с помощью самостоятельно собранной информации причислить собаку к определённой породе. Для этого лучше использовать официальные ресурсы, такие как rkf.org.ru и www.fci.be.
Для определения породы лучше изучать официальные стандарты, но в качестве развлечения можно попробовать специальные ресурсы в интернете
В сети существуют специальные программы и мобильные приложения, в которые можно зарузить фотографию животного и они выдадут заключение, к какой породе можно отнести собаку (poroda-sobaki.by-photo.net, www.what-dog.net и другие). Есть сервисы, помогающие определить породу с помощью специальных тестов, к примеру, whoyougle.ru. Эти методы, конечно, больше напоминают развлечение, чем серьёзный анализ, но первичную информацию получить помогут.
Сервисы для определения породы могут сделать выводы о сочетании у собаки признаков разных пород
Еще один сайт для определения вида собак и кошек по фото
Порой всё что удалось узнать о понравившейся собаке — это её фотография из Интернета. Хочется завести именно такую, а не похожую. Но нужно помнить, что бывают смеси пород собак и виды вовсе без породы. Несмотря на то, что у неё отличный вид и выглядит она великолепно. Фотографию понравившейся собаки можно загрузить на компьютер. Любой браузер способен выполнить эту команду при нажатии по изображению ПКМ.
Найдите форму для поиска собак на сайте Kisapes
Если у вас уже есть изображение животного, поможет в поиске сайт Kisapes:
Хотите узнать, на какую породу собак похожи вы? Тогда предоставьте своё селфи сайту и дождитесь ответа. Посетители оставляют просьбы помочь в определении породы в комментариях к форме.
Комментарии на сайте Kisapes
Для того, чтобы оставить свой, вам понадобится аккаунт в ВКонтакте. А также загрузить в свой комментарий фотографию, которые вы использовали. И через некоторое время помочь узнать породу кошки или собаки по изображению помогут другие пользователи.
Это интересно: как найти человека по фото в ВК.
Как определить породу собаки?
Большинство владельцев беспородных собак (дворянинов или двортерьеров) хотят знать какие породы собак намешаны в родословной их любимца. Многие верят, что это помеси двух чистокровных собак, но суровая реальность такова, что чаще всего такие дворняги — это помеси точно таких же дворняг. Однако, по внешнему виду и поведению все-таки можно узнать, на кого больше похож ваш питомец.
Действительно, сейчас существует мода на так называемые «дизайнерские породы», когда скрещивают двух чистокровных собак различных пород. Поэтому шанс иметь потомка голубых кровей, но разных пород все-таки есть. Например, вот паггл — метис бигля и мопса.
Для начала найдите каталог пород собак. Это не сложно: существует большое количество сайтов и изданий, имеющих фото различных пород с кратким описанием. Так, моему другу в 90-х годах продали «чистокровного кромфорлендера» на Птичьем рынке, хорошо, за небольшие деньги. О том, что такая порода действительно существует, он узнал намного позднее.
Другой вариант — это пойти на выставку собак, здесь вы увидите большое количество собак разных размеров и окрасов. Если нашли похожего «родственника» — расспросите владельца о его породе. Однако, подойдите к его словам со здравым скепсисом: для владельцев и приверженцев конкретных пород их собаки — самые-самые: самые умные, самые добрые, самые здоровые, самые преданные и самые общительные с детьми.
Интересно, как определяют породу собак люди, занимающиеся их пристройством (ТОП-5):
Еще одной подсказкой в определении предков может стать генетика:
В США владельцам собак предлагается услуга — генетический тест, результатом которого является список пород, которые намешаны в данной собаке и доля их влияния.
Однако, как мы видим результаты удивительны. Столбец слева — то, что показал генетический анализ, справа — предположение, сделанное на глаз. Собака с нормальной длиной ног не может иметь 30% крови коротконогих предков (денди-нинмонт терьер и глен-оф-имаал-терьер), шерсть у этой собаки короткая, а у «генетических» предков — длинная или жесткая. Так что тест — явная пустая трата времени и денег. Видимо, такие результаты получаются из-за малого количества генетических маркеров, полученных от малых групп породистых собак.
Как сказал З. Фрейд «Иногда сигара — это просто сигара», или в нашем случае, иногда дворняга — это просто дворняга.
Смотрите также:
Использование поисковика, чтобы узнать породу собаки
Поисковые система Гугл и Яндекс оснащены инструментами поиска по картинкам. Они умеют находить всю информацию из своей базы, которая имеется по данному изображению. Или похожа на картинку, которую вы предоставили. Чтобы определить точную породу собаки, нужно открыть раздел поиска «Картинки» и выбрать иконку с лупой.
Поиск породы собак через поисковик
Когда вы предоставите изображение или ссылку на него в Интернете, поисковая система отдаст вам все страницы по запросу. Из описания на них вы сможете определить, к какому виду относится животное, изображённое на вашем фотоснимке.
Определяем породу собаки: полный цикл разработки, от нейросети на Питоне до приложения на Google Play
Прогресс в области нейросетей вообще и распознавания образов в частности, привел к тому, что может показаться, будто создание нейросетевого приложения для работы с изображениями — это рутинная задача. В некотором смысле, так и есть — если вам пришла в голову идея, связанныя с распознаватием образов, не сомневайтесь, что кто-то уже что-то подобное написал. Все, что от вас требуется, это найти в Гугле соответствующий кусок кода и «скомпилировать» его у автора.
Однако, все еще есть многочисленные детали, делающие задачу не столько неразрешимой, сколько… нудной, я бы сказал. Отнимающей слишком много времени, особенно если вы — новичок, которому нужно руководство, step-by-step, проект, выполненный прямо на ваших глазах, и выполненный от начала и до конца. Без обычных в таких случаях «пропустим эту очевидную часть» отговорок.
В этой статье мы рассмотрим задачу создания определителя пород собак (Dog Breed Identifier): создадим и обучим нейросеть, а затем портируем ее на Java для Android и опубликуем на Google Play.
Если вы хотите посмотреть на готовый результат, вот он: NeuroDog App на Google Play.
Веб сайт с моей робототехникой (в процессе): robotics.snowcron.com.
Веб сайт с самой программой, включая руководство: NeuroDog User Guide.
А вот скриншот программы:
Постановка задачи
Мы будем использовать Keras: гугловскую библиотеку для работы с нейросетями. Это библиотека высокого уровня, что означает — ею проще пользоваться, по сравнению с известными мне альтернативами. Если что — в сети есть много учебников по Керас, высокого качества.
Мы будем использовать CNN — Convolutional Neural Networks. CNN (и более продвинутые конфигурации, основанные на них) являются de-facto стандартом в распознавании изображений. В то же время, обучить такую сеть не всегда просто: надо правильно подобрать структуру сети, параметры обучения (все эти learning rate, momentum, L1 and L2 и т.п.). Задача требует значительных вычислительных ресурсов, и поэтому, решить ее, просто перебрав ВСЕ параметры не получится.
Это одна из нескольких причин, по которым в большинстве случаев используют так называемый «transfer knowlege», вместо так называемого «vanilla» подхода. Transfer Knowlege использует нейросеть, обученную кем-то до нас (например, Гуглом) и обычно — для похожей, но все-таки другой задачи. Мы берем от нее начальные слои, заменяем конечные слои на свой собственный классификатор — и это работает, причем, работает прекрасно.
Поначалу подобный результат может вызвать удивление: как же так, мы взяли гугловскую сеть, обученную отличать кошек от стульев, и она нам распознает породы собак? Чтобы понять, как это происходит, нужно представлять себе основные принципы работы Deep Neural Networks, включая те, что используются для распознавания образов.
Мы «скормили» сети картинку (массив чисел, то есть) в качестве ввода. Первый слой анализирует изображение на предмет простых паттернов, вроде «горизонтальная линия», «дуга» и т.п. Следующий слой получает на вход эти паттерны, и выдает паттерны второго порядка, вроде «мех», «угол глаза»… В конечном счете, мы получаем некий паззл, из которого можно реконструировать собаку: шерсть, два глаза и человеческая рука в зубах.
Все вышеописанное было сделано с помощью предобученных слоев, полученных нами (например, от Гугла). Далее мы добавляем свои слои, и обучаем их из этих паттернов извлекать информацию о породе. Звучит логично.
Подводя итог, в этой статье мы создадим как «vanilla» CNN, так и несколько «transfer learning» вариантов сетей разных типов. Что касается «vanilla»: создать-то я ее создам, а вот настраивать, подбирая параметры, не планирую, поскольку «pre-trained» сети обучать и конфигурировать гораздо проще.
Поскольку мы планируем научить нашу нейросеть разпознавать породы собак, мы должны «показать» ей образцы различных пород. К счастью, есть набор фотографий вот здесь созданный для подобной задачи (оригинал здесь).
Потом я планирую портировать лучшую из полученных сетей под андроид. Портирование керасовских сетей под андроид относительно просто, хорошо формализовано и мы проделаем все необходимые шаги, так что воспроизвести эту часть будет несложно.
Затем мы опубликуем все это на Google Play. Естественно, Google будет сопротивляться, так что в ход пойдут дополнительные трюки. Например, размер нашего приложения (из-за громоздкой нейросети) будет больше, чем допустимый размер Android APK, принимаемый Google Play: нам придется использовать bundles. Кроме того, Google не будет показывать наше приложение в результатах поиска, это можно фиксить, прописывая поисковые тэги в приложении, либо просто подождать… неделю или две.
В результате мы получим полностью работоспособное «коммерческое» (в кавычках, так как выкладывается бесплатно) приложение для андроида и с использованием нейросетей.
Среда разработки
Программировать под Керас можно по-разному, в зависимости от OS, которую вы используете (рекомендуется Ubuntu), наличия или отсутствия видео карты и так далее. Ничего плоохого в разработке на локальном компьютере (и, соответственно, его конфигурировании) нет, за исключением того, что это — не самый простой путь.
Во-первых, установка и конфигурирование большого количества инструментов и библиотек требует времени, и потом, когда выйдут новые версии, вам придется тратить время снова. Во-вторых, нейросети требуют больших вычислительных мощностей для обучения. Вы можете ускорить (в 10 и более раз) этот процесс, если используете GPU… на момент написания данной статьи, топовые GPU, наиболее подходящие для этой работы, стоили 2000 — 7000 долларов. И да, их тоже надо конфигурировать.
Так что мы пойдем другим путем. Дело в том, что Google позволяет бедным ёжикам вроде нас использовать GPUs из своего кластера — бесплатно, для вычислений, связанных с нейросетями, он также предоставляет полностью сконфигурированное окружение, все вместе, это называется Google Colab. Сервис дает вам доступ к Jupiter Notebook с питоном, Keras и огромным количеством прочих библиотек, уже настроенных. Все, что вам нужно сделать, это получить Google account (получите Gmail account, и это даст доступ ко всему остальному).
В настоящий момент, Colab можно наяте здесь, но зная Гугл, это может измениться в любой момент. Просто погуглите «Google Colab».
Очевидная проблема с использованием Colab заключается в том, что это WEB сервис. Как нам получить доступ к НАШИМ данным? Сохранить нейросеть после обучения, например, загрузить данные, специфичные для нашей задачи и так далее?
Существует несколько (на момент написания данной статьи — три) разных способа, мы используем тот, который я полагаю наиболее удобным — мы используем Google Drive.
Google Drive это облачное хранилище данных, которое работает примерно как обычный жесткий диск, и оно может быть mapped на Google Colab (см. код ниже). После этого, вы можете работать с ним, как работали бы с файлами на локальном диске. То есть, например, чтобы получить доступ к фотографиям собак для обучения нашей нейросети, нам нужно загрузить их на Google Drive, вот и все.
Создание и обучение нейросети
Ниже я привожу код на Python, блок за блоком (из Jupiter Notebook). Вы можете копировать этот код в свой Jupiter Notebook и запустить его, тоже блок за блоком, так как блоки могут исполняться независимо (разумеется, переменные, определенные в раннем блоке могут потребоваться в позднем, но это очевидная зависимость).
Инициализация
Прежде всего, давайте подмонтируем Google Drive. Всего две строчки. Этот код должен быть выполнен за сессию Colab лишь однажды (скажем, раз за 6 часов работы). Если вы вызовете его вторично, пока сессия еще «жива», он будет пропущен, так как диск уже подмонтирован.
При первом запуске, вас попросят подтвердить ваши намерения, здесь нет ничего сложного. Вот как это выглядит:
Вполне стандартная include секция; вполне возможно, что некоторые из включаемых файлов не нужны, ну… простите. Также, поскольку я собираюсь тестировать разные нейросети, вам придется comment / uncomment некоторые из включаемых модулей для конкретных типов нейросетей: например, для того, чтобы использовать InceptionV3 NN, раскомментируйте включение InceptionV3, и закомментируйте, например, ResNet50. Или нет: все, что от этого изменится, это размер используемой памяти, и то не очень сильно.
На Google Drive, мы создаём папку для наших файлов. Вторая строка выводит ее содержимое:
Как выдите, фотографии собачек (скопированные из Stanford dataset (см. выше) на Google Drive), сначала сохранены в папке all_images. Позже, мы скопируем их в директории train, valid и test. Мы будем сохранять обученные модели в фолдере models. Что касается файла labels.csv, это часть датасета с фотографиями, он содержит таблицу соответствий имен картинок и пород собак.
Есть множество тестов, которые можно прогнать, чтобы понять, что именно мы получили во временное пользование от Гугла. Например:
Как видим, GPU действительно подключен, а если нет, надо в настройках Jupiter Notebook найти и включить эту опцию.
Далее нам нужно декларировать некоторые константы, как то размер картинок и т.п. Мы будем использовать картинки размером 256×256 пикселов, это достаточно большое изображение, чтобы не потерять детали, и достаточно маленькое, чтобы все поместилось в памяти. Заметим, однако, что некоторые типы нейросетей, которые мы будем использовать, ожидают изображения размером 224×224 пиксела. В таких случаях, мы комментируем 256 и раскомментируем 224.
Тот же подход (comment one — uncomment) будет применен к именам моделей, которые мы сохраняем, просто потому, что мы не хотим перезаписывать файлы, которые еще могут пригодиться.
Загрузка данных
Прежде всего, давайте загрузим labels.csv файл и разобьем его на training и validation части. Заметьте, что пока еще нет части testing, поскольку я собираюсь «сжульничать», чтобы получить больше данных для обучения.
Далее, копируем файлы с картинками в training/validation/testing фолдеры, в соответствии с именами файлов. Следующая функция копирует файлы, имена которых мы передаем, в указанный фолдер.
Как видите, мы только копируем один файл на каждую породу собак как test. Также при копировании, мы создаем подпапки, по одной на каждую породу. Соответственно, фотографии копируются в подпапки по породам.
Делается это потому, что Keras может работать с директорией подобной структуры, загружая файлы изображений по мере надобности, а не все сразу, что экономит память. Загружать все 15,000 картинок одновременно — плохая идея.
Вызывать эту функцию нам придется лишь однажды, поскольку она копирует изображения — и более не нужна. Соответственно, для дальнейшего использования, мы должны ее закомментировать:
Получаем список пород собак:
Обработка изображений
Мы собираемся использовать фичу библиотеки Keras, носящую название ImageDataGenerators. ImageDataGenerator может обрабатывать изображение, масштабировать, поворачивать, и так далее. Он также может принимать processing функцию, которая может обрабатывать изображения дополнительно.
Обратите внимание на следующий код:
Мы можем произвести нормализацию (подконку данных под диапазон 0-1 вместо исходных 0-255) в самом ImageDataGenerator. Зачем же тогда нам нужен preprocessor? В качестве примера, рассмотрим (закомментированный, я его не использую) вызов blur: это та самая custom image manipulation, которая может быть произвольной. Что угодно, от контрастирования до HDR.
Мы будем использовать два разных ImageDataGenerators, один для обучения, и второй для validation. Разница в том, что для обучения нам нужны повороты и масштабирование, чтобы увеличить «разнообразие» данных, а вот для валидации — не нужны, по крайней мере, не в этой задаче.
Создание нейросети
Как уже упоминалось, мы собираемся создать несколько типов нейросетей. Каждый раз мы будем вызывать другую функцию для создания, включать другие файлы и иногда определять другой размер изображения. Так что, для переключения между разными типами нейросетей, мы должны comment/uncomment соответствующий код.
Прежде всего, создадим «vanilla» CNN. Он работает плохо, поскольку я решил не тратить время на его доводку, но по крайней мере, он предоставляет основу, которую можно развивать, есл иесть желание (обычно, это плохая идея, поскольку предобученные сети дают лучший результат).
Когда мы создаем сети, используя transfer learning, процедура меняется:
Создание сетей других типов следует тому же шаблону:
Внимание: победитель! Эта NN показала лучший результат:
Разные типы нейросетей могут быть использованы для разных задач. Так, в дополнение к требованиям точности предсказания, размер может иметь значение (mobile NN в 5 раз меньше, чем Inception) и скорость (если нам нужна обработка видео потока в реальном времени, то точностью придется пожертвовать).
Обучение нейросети
Прежде всего, мы экспериментируем, поэтому мы должны иметь возможность удалить нейросети, которые мы сохранили, но более не используем. Следующая функция удаляет NN, если она существует:
То, как мы создаем и удаляем нейросети, достаточно просто и прямолинейно. Сначала удаляем. При вызове delete (только), следует иметь в виду, что у Jupiter Notebook есть функция «run selection» выделите только то, что хотите использовать, и запускайте.
Затем мы создаем нейросеть, если ее файл не существовал, или вызываем load, если он есть: разумеется, мы не можем вызвать «delete» и затем ожидать, что NN существует, так что, чтобы использовать сохраненную нейросеть, не вызывайтеdelete.
Другими словами, мы можем создать новую NN, либо использовать существующую, в зависимости от ситуации и от того, с чем мы в данный момент экспериментируем. Простой сценарий: мы обучили нейросеть, затем уехали в отпуск. Вернулись, а Google прибил сессию, так что нам надо загрузить, сохраненную ранее: закомментируйте «delete» и раскомментируйте «load».
Checkpoints это очень важный элемент нашей программы. Мы можем создать массив функций, которые должны вызываться в конце каждой эпохи обучения, и передать его в чекпойнт. Например, можно сохранить нейросеть если она показывает результаты, лучшие чем у уже сохраненной.
Наконец, учим нейросеть на training наборе:
Графики для accuracy и loss для лучшей из конфигураций выглядят следующим образом:
Как видите, нейросеть учится, и весьма неплохо.
Тестирование нейросети
После того, как обучение завершено, мы должны протестировать результат; для этого NN предъявляются картинки, которых она никогда ранее не видела — те, что мы скопировали в фолдер testing — по одной для каждой породы собак.
Экспорт нейросети в Java приложение
Прежде всего, нам нужно организовать загрузку нейросети с диска. Причина понятна: экспорт происходит в другом блоке кода, так что скорее всего, мы будем запускать экспорт отдельно — когда нейросеть будет доведена до оптимального состояния. То есть, непосредственно перед экспортом, в тот же прогон программы, мы сеть обучать не будем. Если вы будете использовать приведенный здесь код, то разницы нет, оптимальную сеть подобрали до вас. А вот если вы будете учить что-то свое, то тренировать все заново перед сохранением — пустая трата времени, если до этого вы все сохранили.
По этой же причине — чтобы не прыгать по коду — я включаю необходимые для экспорта файлы здесь. Никто не мешает вам передвинуть их в начало программы, если того требует ваше чувство прекрасного:
Небольшой тест после загрузки нейросети, просто чтобы убедиться, что все загруженное — работает:
Далее, нам нужно получить имена входного (input) и выходного (output) слоев сети (либо так, либо в функции создания мы должны явным образом «назвать» слои, чего мы не сделали).
Мы будем использовать имена входного и выходного слоев позже, когда будем импортировать нейросеть в Java приложение.
В сети бродит еще один код для получения этих данных:
Но мне он не нравится и я его не рекомендую.
Следующий код экспортируем Keras Neural Network в pb формат, тот, что мы будем захватывать из Android.
Вызов этих функций для экспорта нейросети:
Последняя строка печатает структуру полученной нейросети.
Создание Android приложения использующего нейросети
Экспорт нейросетей в Android хорошо формализован и не должен вызывать затруднений. Есть, как всегда, несколько способов, мы используем наиболее (на момент написания статьи) популярный.
Прежде всего, используем Android Studio чтобы создать новый проект. Мы будем «срезать углы», поскольку наша задача — не учебник по андроиду. Так что приложение будет содержать лишь одну activity.
Как видите, мы добавили фолдер «assets» и скопировали в него нашу нейросеть (ту, что до этого экспортировали).
Файл Gradle
В этом файле надо сделать несколько изменений. Прежде всего, нам нужно импортировать библиотеку tensorflow-android. Она используется для того, чтобы работать с Tensorflow (и, соответственно, Keras) из Java:
Манифест
Прежде всего, наше приложение будет «тяжелым» — 100 Mb Neural Network легко поместится в память современных сотовых телефонов, но открывать отдельный instance для каждой фотографии «расшаренной» из Facebook определенно является плохой идеей.
Так что мы запрещаем создавать более одного instance нашего приложения:
Добавив android:launchMode=«singleTask» к MainActivity, мы говорим Android, что надо открывать (активировать) существующую копию приложения, вместо того, чтобы создавать еще одну instance.
Затем нам нужно включить наше приложение в список, который система показывает, когда кто-то «расшаривает» картинку:
Наконец, нам нужно запросить фичи и разрешения, которые будет использовать наше приложение:
Если вы знакомы с программированием под Android, эта часть не должна вызвать вопросов.
Layout приложения.
Мы создадим два layouts, один для портретной, и второй для альбомной ориентации. Так выглядит Portrait layout.
Что мы впдим: большое поле (view) чтобы показывать картинку, надоедливый список рекламы (показывается, когда нажата кнопка с «косточкой»), кнопка «Help», кнопки для загрузки картинки из File/Gallery и захвата с камеры, и наконец (изначально скрытая) кнопка «Process» для обработки картинки.
Активность сама по себе содержит всю логику показа и скрытия, а также enabling/disabling кнопок, в зависимости от состояния приложения.
MainActivity
Это activity наследует (extends) стандартное Android Activity:
Рассмотрим код, ответственный за работу нейросети.
Прежде всего, нейросеть принимает Bitmap. Изначально, это большой Bitmap (произвольного размера) от камеры или из файла (m_bitmap), потом мы трансформируем его, приводя к стандарту 256×256 пикселей (m_bitmapForNn). Мы также храним размер битмапа (256) в константе:
Мы должны сообщить нейросети имена входного и выходного слоев; мы получили их ранее (см. листинг), но имейте в виду, что в вашем случае они могут отличаться:
Затем мы декларируем переменную для хранения объекта TensofFlow. Также, мы храним путь к файлу нейросети (который лежит в assets):
Породы собак храним в списке, чтобы потом показать пользователю их, а не индексы массива:
Изначально, мы загрузили Bitmap. Однако, нейросеть ожидает массив RGB значений, а ее выход — это массив вероятностей того, что данная порода — это то, что показано на картинке. Соответственно, нам нужно добавить еще два массива (заметьте, что 120 это число пород собак, присутствующих в наших обучающих данных):
Загружаем tensorflow inference library:
Так как нейросетевые операции требуют времени, то нам нужно выполнить их в отдельном потоке, иначе есть шанс, что мы получим системное сообщение «приложение не отзывается», на говоря уже о недовольном пользователе.
In onCreate() of the MainActivity, we need to add the onClickListener for the «Process» button:
Здесь processImage() просто вызывает поток, который мы описали выше:
Дополнительные замечания
Мы не планируем обсуждать детали UI-программирования под Андроид, поскольку это совершенно точно не относится к задаче портирования нейросетей. Однако, одну вещь все же упомянем.
Когда мы предотвратили создание дополнительных instances нашего приложения, мы также заодно сломали нормальный порядок создания и удаления активности (flow of control): если вы «расшарите» картинку из Facebook, а затем расшарите еще одну, то приложение не перезапустится. Это значит, что «традиционный» способ ловли переданных данных в onCreate будет недостаточен, поскольку onCreate не будет вызван.
Вот как можно решить эту проблему:
1. В onCreate в MainActivity, вызываем функцию onSharedIntent:
Также добавляем обработчик для onNewIntent:
Вот сама функция onSharedIntent:
Теперь мы обрабатываем переданные данные в onCreate (если приложения не было в памяти) либо в onNewIntent (если оно было запущено ранее).
Удачи! Если вам понравилась статья, пожалуйста, «лайкните» ее всеми возможными способами, «социальные» кнопки есть также на сайте.