Приложение Curb Cut — упражнение в доступности. Часть I — ИИ

Вот история создания приложения. Тот, который объединяет Google Maps API (GMA), TensorFlow Lite (TFL) и веб-сервисы Amazon (AWS) в едином значимом приложении. Значимо, потому что приложение записывает проезд по бордюрам для людей с ограниченными возможностями или для тех, кто полагается на проезд по бордюрам, таких как пожилые люди или люди с колясками. Для тех из вас, кто не знает, бордюр — это углубление в тротуаре, обеспечивающее беспрепятственный доступ к соседней улице. Их еще называют пешеходными пандусами.

В Нью-Йорке более 215 000 бордюров. И Нью-Йорк изучил их всех. Есть база данных со всей этой информацией. Но он статичен. Если срез бордюра ухудшается, необходимо создать новую запись для отчетности. Введите бордюр. Я создал это приложение, чтобы пользователь мог сфотографировать бордюр, классифицировать его и сохранить, чтобы любой, у кого есть приложение, также имел доступ к фотографии и ко всем фотографиям, сделанным другими.

Приложение работает следующим образом: зафиксируйте местоположение пользователя и представьте ему карту того, где он находится. Затем пользователь подтверждает свое местоположение относительно того места, где, по словам устройства, находится его местоположение. И тогда они могут сделать фото. Фотография анализируется и, если она проходит проверку, сохраняется в корзине AWS S3.

При первом открытии приложения загружаются метаданные фотографий и для каждой фотографии в поле зрения создаются маркеры карты. Если пользователь нажимает на маркер, сама фотография загружается и представляется пользователю. Вот что делает приложение: фотографирует, сохраняет фото, просматривает фото. Но это делает гораздо больше для тех, кто полагается на сокращение бордюра, чтобы передвигаться. Он обеспечивает простой способ записи срезов бордюра, которые находятся в аварийном состоянии, с полной записью того, что, где и когда.

Часть 1 посвящена ИИ в коде. Он вступает в игру после того, как пользователь сделает снимок. Я хочу знать, что они фотографируют бордюр, а не собаку, крышку люка или здание. Введите ТФЛ. Эта структура позволяет создавать модели на основе собственных классификаций и обучать модель, предоставляя фотоизображения. В Интернете можно найти гораздо больше информации о TFL и Android, начиная, пожалуй, со следующего:



or



Настройка TFL проста. Сначала добавьте следующее на уровень приложения build.gradle:

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:1.12.0'

Я большой поклонник исходного кода. Полные исходные коды этой зависимости доступны на GitHub по адресу:



Основным классом для ИИ в этом проекте (и загрузки фотографий) является классификатор. Пример классификатора приложений можно найти по адресу:



Классификатор — это единственная точка входа из основного проекта, которая передает изображение и возвращает результаты вероятности. Это так просто! Что не просто, так это то, что сделано в классификаторе. Классификатор вызывает anInterpreter, который вызывает NativeInterpreterWrapper, который вызывает

private static native boolean run(long interpreterHandle, long errorHandle);

Родной код. Много чего происходит. А с нуля ничего не напишешь, так как сложно. Для реализации решения необходимо использовать пример кода. Отсюда и класс Classifier в примерах.

Классификатор изображений возьмет растровое изображение определенного размера, в моем случае 224 x 224 пикселя, проведет свои волшебные вычисления и вернется с двумя числами. Два числа являются вероятностями, и вместе они составляют 1,0. Одна цифра означает «Да», а другая «Нет». Это основанные на расчетах вероятности того, что изображение относится к одной из двух категорий — категорий, которые я установил.

Итак, давайте немного отступим. В этой классификации изображений я установил два «ведра». У одного есть изображения бордюров, у другого другие изображения. Вы предоставляете как можно больше изображений для каждого сегмента. TensorFlow Lite позволит нам создать модель на основе этих изображений. Мы немного схитрим и используем модель, которая уже хорошо справляется с этими классификациями, и еще немного обучим ее с нашими конкретными изображениями. После обучения цель модели состоит в том, чтобы получить изображение (входные данные) и произвести две ранее упомянутые вероятности (выходные данные). КАК модель это делает - это целый объем работы для обсуждения. В лучшем случае это математический расчет с добавлением творческой мысли о самом моделировании. Вывод здесь заключается в том, что нам не нужно было создавать модель с нуля. Мы использовали существующую модель и обучили ее.

Важно понимать, что я предоставил два набора изображений. Этот метод классификации изображений не берет кучу обрезанных изображений и не создает модель. Он берет кучу изображений с обрезкой бордюра И кучу изображений без бордюра и создает модель. У вас должно быть два ведра. У вас должен быть компаратор. У вас нет сравнения между одним ведром и подразумеваемым «всем остальным». Вы должны предоставить «все остальное» в ведре. Там много "всего остального". Грррр. Ну что ж.

Моему приложению нужно два ведра. Бордюрные и небордюрные резы. Это минимум для любой классификации. Но у вас может быть более двух сегментов для классификации изображений. Скажи для классификации цветов. Затем у вас будет ведро с изображениями роз, одно с изображениями ромашек и т. д. Тогда ваши вероятности будут распределены по этим ведрам. Если вы дадите ему изображение здания, вы все равно получите вероятность для каждого сегмента, которая в сумме составляет 1,0. Классификатор изображений скажет, что здание определенно является одним из цветов, которые вы собрали! (На самом деле это говорит о том, что «если бы я классифицировал здание как цветок…»)

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

Я решил установить пороговую вероятность на уровне 0,80 (80%). Если классификатор определяет, что предоставленное изображение является бордюром с вероятностью не менее 0,80, оно загружается в облако.

Итак, после создания видео, извлечения изображений, создания двух сегментов, а затем предоставления TensorFlow Lite возможности обучить модель, мы закончили с моделированием. Мы берем модель и помещаем ее в наше приложение. Его размер составляет около 5 МБ. Магия в том, что этот файл содержит большую часть «логики» нашей классификации изображений. И он был создан в автономном режиме, заранее. Затем мы можем выполнить классификацию изображений за доли секунды на мобильном устройстве.

Вот и все! Часть II расскажет о реализации проекта Google Maps. Спасибо за чтение. Выходи и начинай внедрять собственные решения!