Обнаружение объектов с 10 строчками кода

Dmitry Kulbeda
NOP::Nuances of Programming
6 min readAug 11, 2018

Перевод статьи Moses Olafenwa: Object Detection with 10 lines of code

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

Обнаружение объекта ссылается на способность компьютера и систем программного обеспечения находить объекты на изображении/сцене и идентифицировать каждый объект. Обнаружение объекта широко используется для обнаружения лиц, обнаружения транспортных средств, подсчета пешеходов, веб-изображений, систем безопасности и машин без водителя. Существует много способов для использования технологии обнаружения объектов, ровно как и много областей для изучения. Как и с любой другой компьютерной технологией, широкий спектр удивительных и творческих применений технологии обнаружения объектов, безусловно, будет исходить от программистов и разработчиков программного обеспечения.

Использование современных методов обнаружения объектов в приложениях и системах, а также создание новых приложений на основе этих методов не является прямой задачей. Ранние реализации технологии обнаружения объектов включали в себя использование классических алгоритмов, например из тез, которые поддерживаются в OpenCV — популярной библиотеке компьютерного зрения. Тем не менее, эти классические алгоритмы не смогли обеспечить достаточную производительность для работы в разных условиях.

Прорыв и быстрое внедрение глубокого изучения в 2012 году привели к появлению таких современных и высокоточных алгоритмов и методов обнаружения объектов, как R-CNN, Fast-RCNN, Faster-RCNN, RetinaNet и пока ещё быстрых и высокоточных SSD и YOLO. Использование этих методов и алгоритмов, основанных на глубоком изучении, которое также основано на машинном обучении, требует хорошего понимания фреймворков математического и глубокого обучения. Существуют миллионы экспертов-программистов и разработчиков программного обеспечения, которые хотят интегрировать и создать новые продукты, которые используют технологию обнаружения объектов. Но эта технология остается вне досягаемости в виду дополнительного сложного пути по её пониманию и практическому использованию.

Моя команда осознала эту проблему несколько месяцев назад, поэтому я и John Olafenwa создали ImageAI — библиотеку python, которая позволяет программистам и разработчикам программного обеспечения легко интегрировать новейшие технологии компьютерного зрения в свои уже существующие или новые приложения, используя лишь несколько строк кода.

Чтобы выполнить обнаружение объекта с помощью ImageAI, все, что вам нужно сделать, это:

  1. Установить Python на свой компьютер
  2. Установить ImageAI и все его зависимости

3. Скачать модельный файл Object Detection

4. Запустить образец кода (который состоит из десяти строк)

А теперь — к делу.

1) Загрузите и установите Python 3 с официального сайта Python.
https://python.org
2)Установите следующие зависимости с помощью пакетного менеджера pip:
i. Tensorflow

pip install tensorflow

ii. Numpy

pip install numpy

iii. SciPy

pip install scipy

iv. OpenCV

pip install opencv-python

v. Pillow

pip install pillow

vi. Matplotlib

pip install matplotlib

vii. H5py

pip install h5py

viii. Keras

pip install keras

ix. ImageAI

pip3 install https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.2/imageai-2.0.2-py3-none-any.whl

3) Перейдите по этой ссылке, чтобы загрузить файл модели RetinaNet, который будет использоваться для обнаружения объектов на изображении.

Отлично. Теперь, когда все пакеты установлены, вы можете приступить к написанию своего первого кода по распознаванию объектов. Создайте файл Python и назовите его (например, FirstDetection.py), после чего добавьте в него код, написанный ниже. Скопируйте файл модели RetinaNet и изображение, объекты которого вы бы хотели распознать, в папку, в которой был создан файл python.

FirstDetection.py

Запустите код и дождитесь, когда результаты отобразятся в консоли. Когда результат будет выведен в консоль, откройте папку, в которой лежит ваш файл FirstDetection.py. Новое изображение будет сохранено в этой папке. Посмотрите на два примера изображений ниже и на новое изображение, полученное в результате.

Изображение до обнаружения объектов:

Image Credit: alzheimers.co.uk
Image Credit: Wikicommons

Изображение после обнаружения объектов:

Результаты в консоли для вышеуказанной картинки:
человек: 55.8402955532074
человек: 53.21805477142334
человек: 69.25139427185059
человек: 76.41745209693909
велосипед: 80.30363917350769
человек: 83.58567953109741
человек: 89.06581997871399
грузовик: 63.10953497886658
человек: 69.82483863830566
человек: 77.11606621742249
автобус: 98.00949096679688
грузовик: 84.02870297431946
автомобиль: 71.98476791381836

Результаты в консоли для вышеуказанной картинки:
человек: 71.10445499420166
человек: 59.28672552108765
человек: 59.61582064628601
человек: 75.86382627487183
мотоцикл: 60.1050078868866
автобус: 99.39600229263306
автомобиль: 74.05484318733215
человек: 67.31776595115662
человек: 63.53200078010559
человек: 78.2265305519104
человек: 62.880998849868774
человек: 72.93365597724915
человек: 60.01397967338562
человек: 81.05944991111755
мотоцикл: 50.591760873794556
мотоцикл: 58.719027042388916
человек: 71.69321775436401
велосипед: 91.86570048332214
мотоцикл: 85.38855314254761

А теперь давайте разберемся, как работает этот десятистрочный код.

Что касается первых трех строк, мы импортировали класс обнаружения объектов из ImageAI в первой строке, импортировали python модуль os во второй строке и инициализировали переменную, указывающую путь к папке с файлом python, файлом модели RetinaNet и изображениями в третьей строке.

Что касается следующих пяти строчек кода, в первой из них мы определили нужный нам класс обнаружения объектов, во второй — установили тип модели для RetinaNet, указали путь модели к пути нашей модели в RetinaNet в третьей, загрузили модель в класс обнаружения объектов в четвертой, и запарсили входящий и исходящий пути к картинке в пятой строке.

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

Модуль ImageAI предоставляет широкие возможности по кастомизации процесса обнаружения объектов. Одной из возможностей модуля является способность извлекать изображение обнаруженного объекта из исходного изображения. Всё просто: если добавить параметр extract_detected_objects=True в парсинг, который будет использован в функции detectObjeсtsFromImage как показано ниже, класс обнаружения объектов создаст папку для изображений объектов, извлечет их изображения, создаст новые папки и сохранит каждое из них в отдельную, и вернет специальный массив, содержащий пути к каждому из изображений.

Давайте проверим эту возможность на первой картинке и посмотрим на полученные изображения:

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

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

-Изменение минимального процента точности: по умолчанию, объекты, точность определения которых ниже 50%, не показываются и не включаются в отчет. Вы можете установить более высокий порог для случаев с большей вероятностью обнаружения или более низкий для тех случаев, когда необходимо определить все потенциальные объекты.

- Персонализированное распознавание объектов: с помощью предоставляемого модулем класса CustomObject, вы можете задать параметры, в соответствии с которыми класс обнаружения будет включать в отчет результаты по одному или нескольким уникальным объектам.

- Скорость обнаружения: выбирая скорость обнаружения между «быстро», «быстрее», «еще быстрее», вы можете уменьшать время, необходимое для обнаружения объектов на изображении.

- Тип исходного файла: в качестве исходного файла вы можете указать, а потом и парсить, путь к изображению, массив Numpy или файловый поток изображения.

- Тип итогового файла: для функции detectObjectsFromImage вы можете задать параметры, согласно которым функция будет сохранять изображение в виде файла или массива Numpy.

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

https://github.com/OlafenwaMoses/ImageAI

Если вам понравилась статья и вы считаете её полезной, жмите на «аплодисменты». Также буду рад, если вы поделитесь этой статьей с друзьями и коллегами.

Остались вопросы, предложения, или хотите обратиться ко мне?

--

--