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

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

Прежде чем перейти к основным темам, стоит отметить, что система PicTrace-X1 обладает широким функционалом: от сравнения схожих изображений до цифрового зрения в реальном времени, способного распознавать объекты, голос и даже описывать происходящее перед пользователем. Каждая из этих технологий будет подробно рассмотрена в отдельных статьях, а так же выложена в тестовый версии в будущем на сайте, где каждый сможет их протестировать.


Тестирование системы PicTrace-X1 для обучения
Тестирование системы PicTrace-X1 для обучения

PicTrace-X1: Умные очки для цифрового зрения и навигации

Мой проект интеграции самодельных умных очков на базе PicTrace-X1 и Raspberry Pi 4 Model B (8 ГБ ОЗУ) открывает большие перспективы в области персональной навигации и цифрового зрения. Эти очки будут предназначены для помощи пользователям в ориентировании в пространстве с помощью аудиовизуальных подсказок, обеспечивая при этом безопасность и удобство использования в различных сценариях. Кроме того, устройство может отображать актуальную информацию о погоде и новостях того района в котором вы находитесь, а также выполнять голосовые команды благодаря встроенному помощнику искусственного интеллекта.

Тестирование системы PicTrace-X1 по нахождению объектов
Тестирование системы PicTrace-X1 по нахождению объектов

Хотя многие "умные очки" уже существуют довольно давно, но я бы хотел реализовать эти очки для каждого человека, чтобы они были доступны для обычного обывателя, и стоили не так много. И поэтому корпус для будущего прототипа устройства будет изготовлен методом FDM 3D-печати из PETG-материала и будет обладать модульной конструкцией, что позволит легко создавать, заменять и обновлять компоненты. Такая гибкость конструкции обеспечит возможность интеграции новых технологий и адаптацию устройства под различные потребности для каждого человека.

Raspberry Pi
Raspberry Pi

«Снизу показана схема интеграции камер, модулей обработки, SLAM-системы, голосовых команд и аудиовыхода, что позволяет устройству обеспечивать полноценное цифровое зрение и навигацию.»

graph TD
    A[Камера (захват визуальных данных)] --> B{Обработчик кадров (предобработка)}
    B --> C[SLAM-модуль (построение карты)]
    B --> D[Детектор объектов (распознавание)]
    C --> E[Карта окружения (визуальная карта)]
    D --> F[Список объектов (перечень распознанных)]
    E --> G[Навигационный AI (принятие решений)]
    F --> G
    G --> H[TTS-движок (преобразование текста в речь)]
    H --> I[Аудиовыход (вывод инструкций)]
    
    J[Аккумулятор (источник питания)] --> K[Управление питанием (распределение энергии)]
    K -->|Оптимизация| B
    K -->|Энергосбережение| C
    K -->|Режим сна| D
    
    L[Голосовой ввод (команды пользователя)] --> G[Навигационный AI (принятие решений)]
    
    %% Дополнительные элементы
    B --> M[Предобработка изображений (улучшение качества)]
    M --> C
    M --> D

Ключевые функции и возможности PicTrace-X1:

В настоящий момент PicTrace-X1 объединяет технологии цифрового зрения и навигации, создавая единую систему, которая обеспечивает непрерывное взаимодействие с окружающей средой. Это достигается благодаря синергии между различными модулями устройства:

  • Озвучивание окружающих объектов: Система способна определять местоположение объектов вокруг пользователя и сообщать, например, «Стол находится в 2 метрах справа». Это особенно полезно для людей с ограниченными возможностями зрения.

  • Навигация через аудиоподсказки: Пользователь получает четкие указания для безопасного перемещения, такие как «Поверните налево через 10 шагов».

  • AR-маршруты поверх реального мира: С помощью технологий дополненной реальности виртуальные маршруты накладываются на реальное изображение, обеспечивая интуитивно понятное направление.

  • Предупреждения о препятствиях: Система своевременно сообщает о возможных опасностях (ямы, дорожные работы), снижая риск несчастных случаев.

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

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

И стоит заметить, что 3D-печать играет ключевую роль в разработке проекта, открывая безграничные возможности для кастомизации и быстрой реализации тестовых прототипов. Благодаря этой технологии, можно легко спроектировать и изготовить корпуса, идеально подогнанные под нужды устройства и его пользователя. Это позволяет не только сократить время разработки, но и уменьшить затраты на производство, что особенно важно при создании доступного продукта для массового рынка, конечно если будет такая идея в далекой перспективе.

Концепт-Макет корпуса с размещением компонентов (1 — камеры, 2 — дисплей, 3 — аккумуляторный отсек).
Концепт-Макет корпуса с размещением компонентов (1 — камеры, 2 — дисплей, 3 — аккумуляторный отсек).

И если отойти от 3D-печати, то я бы хотел отметить, что многие энтузиасты уже брали за основу обычные очки и интегрировали в них системы умного зрения, что заслуживает отдельного признания, так как люди популизируют концепт самой идеи, что даже любые очки могут в концепции стать "умными" и полезными для вашей сферы деятельности.

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

Технология SLAM (Simultaneous Localization and Mapping)

Алгоритм SLAM играет ключевую роль в работе системы PicTrace-X1, обеспечивая точное позиционирование и построение карты окружающего пространства в реальном времени. Это достигается за счёт анализа ключевых особенностей пространства, таких как углы, границы и текстуры. Благодаря SLAM система эффективно функционирует даже в условиях динамично меняющегося окружения, что особенно важно для навигации в городских условиях или внутри зданий.

Пример визуализации работы SLAM-алгоритма.
Пример визуализации работы SLAM-алгоритма.

Интеграция нейронных сетей: ResNet50 и FAISS

В предыдущей статье (ссылка) я описывал функционал PicTrace с точки зрения сравнения изображений в отдельной базе данных на сервере. Это делало систему удобной для определённых задач, но ограничивало её функциональность. С развитием веб-версии приложения были исправлены многочисленные баги, а также начата работа по увеличению скорости обработки изображений. В этой связи была интегрирована предобученная нейронная сеть, которая компилируется на архиве баз данных фотографий заранее что позволило значительно ускорить выполнение поиска.

ResNet50
ResNet50

Характеристика

ResNet50

EfficientNet-B0

VGG16

Точность (ImageNet)

76.15%

77.10%

71.29%

Время инференса (ms)

4.2

5.8

8.1

Потребление RAM (MB)

98

85

528

И немного о ней:

Ключевые особенности ResNet50:

  • Остаточные соединения (skip connections) решают проблему исчезающего градиента за счёт пропуска активаций через несколько слоёв. Формально, выход слоя определяется как F(x) + x, где F(x) — преобразование, а x — оригинальный вход.

  • Глубина сети: Состоит из 50 слоев, что позволяет модели захватывать сложные и высокоуровневые особенности изображений.

Эффективность на CPU: Благодаря использованию Global Average Pooling вместо полносвязных слоёв, модель требует меньше памяти и вычислений.

Интеграция с FAISS:

Если подробнее, то такой подход, использующий предобученную модель ResNet50 для извлечения признаков изображений и последующего их сохранения для быстрого поиска, является эффективным и широко распространённым в задачах поиска по изображениям. Интеграция таких инструментов, как FAISS, может ещё больше повысить производительность и масштабируемость подобных проектов.

Пример кода для извлечения признаков из изображений:

def extract_features_from_zip():  # Извлечение признаков из всех изображений в ZIP-архиве и сохранение в pickle-файл
    image_features = {}  # Инициализация пустого словаря для хранения признаков изображений
    with zipfile.ZipFile(ZIP_PATH, 'r') as archive:  # Открытие ZIP-архива в режиме чтения
        # Получение списка файлов в архиве, отфильтрованных по расширениям изображений
        image_keys = [name for name in archive.namelist() if name.lower().endswith(('.jpg', '.jpeg', '.png'))]
        for image_key in image_keys:  # Итерация по каждому изображению в списке
            try:
                with archive.open(image_key) as image_file:  # Открытие текущего файла изображения из архива
                    image = Image.open(image_file).convert('RGB')  # Загрузка изображения и конвертация в RGB
                    features = get_image_features(image)  # Извлечение признаков из изображения с помощью функции get_image_features
                    image_features[image_key] = features  # Сохранение извлечённых признаков в словарь с ключом-именем файла
            except UnidentifiedImageError:
                print(f"Не удалось открыть изображение: {image_key}")  # Сообщение об ошибке, если изображение не распознано
            except Exception as e:
                print(f"Ошибка при обработке {image_key}: {e}")  # Сообщение о любых других ошибках при обработке изображения

    # Сохранение словаря с признаками изображений в pickle-файл
    with open(FEATURES_PATH, 'wb') as f:
        pickle.dump(image_features, f) 
    print(f"Признаки извлечены и сохранены в {FEATURES_PATH}")  # Вывод сообщения об успешном сохранении

Интеграция поиска изображений в браузер

Одним из значимых этапов развития проекта стало перенесение функционала поиска схожих изображений непосредственно в браузер. Благодаря этому пользователи могут выполнять поиск копий изображений через удобный веб-интерфейс. Переход на нейросетевую архитектуру позволил PicTrace-X1 обрабатывать до 15,000 изображений в час (на кластере из 2 CPU) с точностью 84%.

Поиск изображений в браузере.
Поиск изображений в браузере.

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

Ключевые возможности системы на данный момент:

  • Интеграция с веб-ресурсами: Автоматизация браузера через Selenium позволяет системе осуществлять поиск по таким сервисам, как Яндекс, Google или Edge, так же стороной и не обошёл социальные сети как ВКонтакте. Код реализует механизм динамической прокрутки, обработки всплывающих окон и даже дополнительного поиска по релевантным запросам, что обеспечивает сбор максимально полных данных.

  • Многоуровневая обработка данных: Использование spaCy для обработки текста и TF-IDF векторизации позволяет не только анализировать визуальные данные, но и извлекать ключевые характеристики из текстового контента, сопровождающего изображения. Это обеспечивает дополнительную точность при генерации заголовков и определении даты публикации.

PicTrace-X1 в навигации и в безопасности:

В основном очки можно использовать и в сфере "безопасности", хоть я и не делаю на этом сильный уклон. Но на отрезке видео демонстрируется, как система PicTrace-X1 сканирует окружающую местность и, согласно заданной конфигурации, распознаёт лица людей и распознает их по базе данных или же проводит поиск в интернете.

Такая специализированная функция позволит более оперативно выявлять нарушителей порядка с основных камер наблюдения, что помогает в нашем случае охране метрополитена быстро локализовать разные инциденты. Более того, подобно умным очкам, данная система ориентируется в пространстве, мгновенно обнаруживая предметы на переднем плане и обрабатывая визуальную информацию быстрее, чем это способен сделать человеческий глаз. При этом PicTrace-X1 может озвучивать распознанные объекты, что особенно ценно для пользователей с нарушениями зрения.

PicTrace 2.0 отслеживает объекты с камеры.
PicTrace 2.0 отслеживает объекты с камеры.

Система представляет из себя:

  • Сканирование местности и обнаружение объектов: С помощью алгоритмов на базе нейросетей (например, YOLOv5) PicTrace-X1 обнаруживает людей, транспортные средства и другие объекты, позволяя оперативно реагировать на потенциальные угрозы.

  • Распознавание лиц и поз: Применяя инструменты, такие как MediaPipe, система может анализировать позы людей и выделять лица. Это особенно полезно для выявления нарушителей или для поддержки пользователей с нарушениями зрения.

  • Аудиотранскрипция и синхронизация субтитров: Используя модель Whisper, PicTrace-X1 преобразует аудиодорожку видео в текст, что позволяет добавить субтитры или голосовое сопровождение, информирующее пользователя о происходящем.

  • Визуальное наложение технической информации: Помимо распознавания объектов, система выводит дополнительные данные, например, технические параметры (диафрагма, выдержка, ISO и т.д.) прямо на кадре.

Пример кода для транскрипции аудио сегментов:

# ---------------------------
# Функция для транскрипции аудио сегментов
# (получает аудиоданные из общего буфера, собирает их в сегменты,
# сохраняет сегмент в WAV-файл, транскрибирует аудио и сохраняет результаты)
# ---------------------------
def audio_transcription(audio_buffer, segments, lock, channels, rate):
    buffer = bytearray()  # Инициализируем пустой буфер для накопления аудиоданных
    frames_per_segment = rate  # Определяем количество аудиокадров для одного сегмента (1 секунда аудио)
    sample_width = 2  # Ширина сэмпла в байтах (2 байта соответствует формату paInt16)

    # Основной цикл для непрерывной обработки поступающих аудиоданных
    while True:
        # Обеспечиваем потокобезопасный доступ к разделяемому аудио буферу
        with lock:
            if audio_buffer:
                # Извлекаем и добавляем данные из первого элемента списка в наш буфер
                buffer.extend(audio_buffer.pop(0))
        
        # Проверяем, накопилось ли достаточно данных для формирования полного сегмента
        if len(buffer) >= frames_per_segment * sample_width * channels:
            # Извлекаем данные, соответствующие одному сегменту аудио
            segment_data = buffer[:frames_per_segment * sample_width * channels]
            # Обновляем буфер, удаляя уже использованные данные
            buffer = buffer[frames_per_segment * sample_width * channels:]
            
            # Создаем временный WAV-файл для сохранения сегмента аудио
            with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp_audio:
                tmp_audio_path = tmp_audio.name  # Получаем путь к временно созданному файлу
                
                # Открываем WAV-файл для записи аудиоданных
                with wave.open(tmp_audio, 'wb') as wf:
                    wf.setnchannels(channels)       # Устанавливаем число аудиоканалов (например, моно или стерео)
                    wf.setsampwidth(sample_width)     # Устанавливаем ширину сэмпла (количество байтов на сэмпл)
                    wf.setframerate(rate)             # Устанавливаем частоту дискретизации (кадров в секунду)
                    wf.writeframes(segment_data)      # Записываем аудиоданные сегмента в файл
            
            # Пытаемся транскрибировать аудио, сохраненное во временном файле
            try:
                new_segments = transcribe_audio(tmp_audio_path)  # Вызов внешней функции транскрипции
                # Добавляем полученные сегменты в общий список результатов
                with lock:
                    segments.extend(new_segments)
                # Логируем информацию об успешно обработанном сегменте
                logging.info(f"Транскрибировано {len(new_segments)} сегментов.")
            except Exception as e:
                # В случае ошибки транскрипции, логируем сообщение с описанием ошибки
                logging.error(f'Ошибка транскрипции аудио: {str(e)}')
            finally:
                # Удаляем временный файл, чтобы освободить системные ресурсы
                os.unlink(tmp_audio_path)

Заключение

Благодаря модульной конструкции и гибкой архитектуре система легко адаптируется к постоянно меняющимся требованиям цифрового мира. Интеграция технологий поиска изображений, анализа визуальных данных и голосового управления открывает новые горизонты в навигации и обеспечении безопасности, делая PicTrace-X1 незаменимым помощником в повседневной жизни.

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

Благодарю вас за внимание к этой статье и надеюсь, что вы нашли в ней что-то новое и полезное!

Комментарии (0)