Компьютерное зрение интересно, да? Вы видели демонстрации Pulse [1] или NVIDIA Maxine [2]?
Однако часто бывает так, что для вашей задачи нет обученных моделей, нет тестовых наборов данных, нет простых руководств, и вы не знаете есть целая команда для разработки замечательных моделей машинного обучения.

Как добиться за очень короткое время и с небольшими предварительными знаниями приемлемых результатов, которые могут служить доказательством концепции? В этом руководстве вы изучите этот процесс от начала до конца, следуя практическому примеру о распознавание монет.

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

Уменьшение масштаба

Наша цель проста: идентифицировать бразильские монеты.
Ну… не все так просто: есть 4 разных типа монет, которые могут быть ржавыми или в плохом состоянии, которые могут быть частично скрыты на фотографии, сцены могут сильно различаться по освещению, среди прочих проблем.< br /> Поэтому мы решили сократить объем проекта до минимума, простейшей функции, которая могла бы продемонстрировать, что идея может работать: определить один тип монеты (монета в 1 бразильский реал, как показано ниже) под при нормальном комнатном освещении, на четких и «легких» фотографиях.

Выбор технологий

Что мы будем использовать? Какие языки, фреймворки, среды разработки?
Мы ищем простые для понимания технологии с приемлемыми результатами, с хорошей документацией и учебными пособиями. Вы можете изменить его в будущем, когда столкнетесь с такими ограничениями, как вычислительная производительность или простота развертывания, но сейчас основное внимание уделяется тому, чтобы доказать, что ваш проект может быть реализован. Нам не нужно изобретать велосипед.
Среди нескольких вариантов фреймворк ImageAI [3] хорошо подходит для наших нужд: его легко освоить, очень мало шаблонов, очень хорошая документация и впечатляющие результаты. По сравнению с другими библиотеками, ImageAI было проще всего изучить и с лучшими результатами.
Для маркировки набора данных мы выбрали библиотеку labelImg [4], потому что это решение с открытым исходным кодом, легкое в освоении и обладающее всеми необходимыми функциями.

Маркировка набора данных

Вы уже определили свою область, теперь: какой тип данных вам нужен для представления нужной вам информации?
В нашем случае будет достаточно фотографий нескольких монет на столе и на наша рука, снятая камерой мобильного телефона (в современных мобильных телефонах есть хорошие камеры для выполнения подобных задач), с ограничивающими рамками вокруг единицы из 1 реального (1BRL).

Мы решили аннотировать 250 изображений, но это было просто предположение: вам может понадобиться больше, вам может понадобиться меньше, возможно, вам придется пометить больше данных после попытки обучить модель и не добиться достаточно хороших результатов, это зависит от обстоятельств.
Мы будем использовать эти данные для обучения нашей модели, но как мы узнаем, насколько хорошо она будет работать при столкновении с новыми данными в реальной ситуации?
Возможно, в будущем мы захотим пометить больше данных и сравнить прогнозы модели с нашими собственными ярлыками. Это хорошая идея, но почему бы не пометить этот «тестовый набор данных» прямо сейчас? Еще лучше, почему бы просто не придержать часть уже размеченного набора данных, исключив его из обучения и используя только для тестирования? Эта методология называется перекрестной проверкой и широко используется в области машинного обучения.
Совет: процесс маркировки очень долгий, и поверьте мне, это нужно делать правильно. Так что не торопитесь, включите музыку и сделайте это со вниманием.

Обучение модели

Теперь вы не хотите тратить много времени на обучение или платить целое состояние за облачные вычисления. Кроме того, вы не хотите выполнять точную настройку модели, вам просто нужна приемлемая точность (которая для большинства задач намного ниже уровня техники). После настройки среды сам код занимает всего 6 строк (объявить используемую архитектуру нейронной сети, указать на данные, задать гиперпараметры, начать обучение):

from imageai.Detection.Custom import DetectionModelTrainer
trainer = DetectionModelTrainer()
trainer.setModelTypeAsYOLOv3()
trainer.setDataDirectory(data_directory=”hololens”)
trainer.setTrainConfig(object_names_array=[“hololens”], batch_size=4, num_experiments=100, train_from_pretrained_model=”pretrained-yolov3.h5")
trainer.trainModel()

Мы будем использовать известную архитектуру YoloV3, предварительно обученную на известном наборе данных ImageNet. Это ускорит обучение и облегчит получение хороших результатов, именно этого мы и добиваемся. Сравнивая с этим примером библиотеки ImageAI, они использовали 400 эпох в наборе данных из 300 изображений, занимая 300 секунд на эпоху. В нашем случае мы использовали 30 эпох по 3000 в каждой. ЗАЧЕМ? Потому что наши изображения были ОГРОМНЫМИ, и чем выше разрешение, тем выше будет время обучения. Усвоенный урок: используйте изображения настолько четкие, насколько это возможно, и с разрешением, которое фиксирует все необходимые вам детали, но НЕ БОЛЬШЕ.
Примечание: отношение 1epoch/3000s основано на моем компьютере. Предполагая, что пример в документах ImageAI также был сделан на домашнем компьютере, предыдущее утверждение верно. Если нет, мой совет остается прежним: изображения должны быть достаточно большими, чтобы запечатлеть нужные вам детали. Время, затраченное на эпоху, будет ниже, но не в той пропорции, которую я сравнивал ранее.

Ну… А сколько мне нужно было эпох?
Поскольку библиотека ImageAI сама изменит параметры машинного обучения, чем больше, тем лучше. Для начала хорошим числом будет 25. Затем вам нужно будет запустить оценочный скрипт, который будет использовать тестовые изображения для проверки точности нашей модели. При этом с 25 эпохами точность, полученная в процессе, составила:

Который, как мы видим, начался очень плохо, но улучшился до пикового значения 0,87 в 20-й эпохе.

Отчетность и общение

Для подтверждения концепции мы уже многого добились. Наша модель не нуждается в точности человеческого уровня, чтобы быть полезной: если она может сэкономить время или помочь кому-то выполнить свою работу, она уже стоит затраченных усилий
Итак, ГОТОВО!!
Пока нет.
Если вы хотите продолжить работу над моделью (и есть еще много возможностей для улучшений), вам, вероятно, придется убедить других, что ваше время стоит затраченных усилий. В частности, для распознавания монет машинное обучение, вероятно, является лучшим подходом, но для большинства реальных проблем решение гораздо менее ясно, поэтому вам нужно тщательно проанализировать свои результаты и методологию, которая привела к ним, чтобы решить, как действовать дальше.
Вот несколько советов после разработки:

  • Четко определите процедуры, необходимые для получения результатов (что-то вроде того, что мы делаем здесь);
  • Объясните свои показатели оценки и их значение в практическом контексте;
  • Поймите, что вы сделали, если вы этого не сделали раньше. Это не обширный учебник по теоретическим основам, но мы настоятельно рекомендуем вам углубиться и понять, что было сделано;
  • Покажите, что это был только первоначальный результат, и укажите направления для дальнейшей работы.
  • Организуйте все это в виде слайд-презентации, онлайн-панели, какого-нибудь удобного для чтения документа, readme репозитория и так далее.

использованная литература

[1] - С. Менон, А. Дамиан, М. Ху, Н. Рави и К. Рудин (2020). PULSE: самоконтролируемое повышение частоты дискретизации фотографий с помощью исследования скрытого пространства генеративных моделей. Конференция IEEE по компьютерному зрению и распознаванию образов (CVPR). http://pulse.cs.duke.edu/

[2] — NVIDIA (2020 г.). NVIDIA Максин. https://blogs.nvidia.com/blog/2020/10/05/gan-video-conferencing-maxine/

[3] — Моисей и Дж. Олафенва (2018). ImageAI, библиотека Python с открытым исходным кодом, созданная для того, чтобы дать разработчикам возможность создавать приложения и системы с автономными возможностями Computer Vision. https://github.com/OlafenwaMoses/ImageAI.

[4] — Цуталин (2015). ЯрлыкImg. Git-код. https://github.com/tzutalin/labelImg

[4] — Цуталин (2015). ЯрлыкImg. Git-код. https://github.com/tzutalin/labelImg