Обучаемся основам компьютерного зрения с помощью Lichee Pi 4A и Python-библиотеки Pillow |
||
|
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ Атаки на ИИ Внедрение ИИИИ теория Компьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Промпты. Генеративные запросы Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2025-05-28 11:24 Привет, Хабр! На связи команда регионального научно-образовательного центра «Искусственный интеллект и анализ больших данных» при НГТУ им. Р. Е. Алексеева. При поддержке компании YADRO мы изучаем архитектуру RISC-V и компьютерное зрение, чтобы внедрить результаты в учебный процесс. Предлагаем вместе с нами проверить, на что способен одноплатный компьютер Lichee Pi 4A в задачах обработки изображений, несмотря на его ограниченные ресурсы. А заодно — получить базовые навыки по разработке систем компьютерного зрения. Пройдем путь от настройки системы до отслеживания кликов по картинке и распознавания объектов с моделью YOLOX. Кратко расскажем, что ждет вас в статье. Мы создадим виртуальное окружение Python и установим подходящую среду разработки — Visual Studio Code. Далее перейдем к работе с изображениями. Начнем с базовых операций, таких как получение информации о файле, изменение отдельных пикселей и работа с цветовыми каналами. Затем освоим более продвинутые приемы: динамическую перекраску, фильтрацию, обрезку, вращение и комбинированные преобразования. Также коснемся интерактивной работы с изображениями — научимся отслеживать клики пользователя и добавлять графические элементы. И в завершении распознаем объекты на картинке. Почему мы выбрали библиотеку Pillow и Lichee Pi 4A Pillow — это мощная и удобная библиотека для работы с изображениями в Python. Она позволяет выполнять основные операции: изменять размер, фильтровать и поворачивать изображения, а также конвертировать в другие форматы. Мы решили узнать, насколько эффективно Lichee Pi 4A справится с этими задачами и можно ли его использовать для базовых операций компьютерного зрения. Lichee Pi 4A — это одноплатный компьютер (single-board computer, SBC) на базе четырехъядерного процессора Alibaba T-Head TH1520 RISC-V Xuantie C910 2,0 ГГц и графического процессора Imagination. За ускорение ИИ-задач отвечает нейронный процессор (NPU), производительность которого составляет 4 TOPS. В целом Lichee Pi 4A по вычислительной мощности сравним с Raspberry Pi 4. У Lichee Pi 4A есть широкий набор интерфейсов для подключения оборудования: USB 3.0, USB Type-C, HDMI 2.0, два интерфейса для камер (1?4-lane MIPI CSI и 1?2-lane MIPI CSI), гигабитный Ethernet, Wi-Fi и Bluetooth. Основные преимущества Lichee Pi 4A:
Мы выбрали именно Lichee Pi 4A, а не Raspberry Pi 4 по трем причинам:
Теперь перейдем к практическим шагам и займемся настройкой нужного ПО. Устанавливаем и настраиваем инструменты Для начала нам нужно подготовить базовую конфигурацию среды для работы с Python — нам поможет документация настройки окружения для Lichee Pi 4A. Обновим список пакетов и установим актуальные версии библиотек и утилит:
Устанавливаем основные инструменты:
Проверяем версию Python: Обновить или установить Python на Linux поможет официальная документация. Устанавливаем библиотеку SHL Она нужна для работы с Lichee Pi 4A, порядок установки также описан в документации к устройству. Архив с библиотекой после скачивания нужно распаковать, а библиотечные файлы скопировать в системные директории. Настраиваем менеджер пакетов и создаем виртуальное окружения Чтобы упростить управление зависимостями Python-проектов, мы установили менеджер пакетов После этого создаем и активируем виртуальную среду: Так мы изолируем зависимости каждого проекта и обеспечиваем стабильность работы приложений на Lichee Pi 4A. Теперь у нас есть полностью подготовленное рабочее окружение. Можно переходить к установке дополнительных библиотек Python и разработке наших проектов. Настроенное виртуальное окружение позволяет управлять установленными пакетами и минимизировать возможные конфликты между версиями библиотек. Visual Studio Code для разработки Для удобства разработки мы решили установить интегрированную среду разработки (IDE) Visual Studio Code, которая поддерживает работу с Python и другими языками программирования через расширения. Мы выбрали Visual Studio Code, потому что это кроссплатформенный инструмент с удобной интеграцией с Git, встроенным терминалом, отладчиком и поддержкой удаленной разработки. Кроме того, его активно развивает и поддерживает сообщество разработчиков. Lichee Pi 4A основан на архитектуре RISC-V, поэтому официальная сборка Visual Studio Code для него недоступна. Мы установили VS Code на x86_64-машину разработчика и подключались к микрокомпьютеру по SSH. Код писали и редактировали локально, а запускали и отлаживали удаленно на Lichee Pi 4A.
Операционная система Lichee Pi 4A создана на базе Debian/Ubuntu, поэтому на локальную машину мы установили Debian через Сначала скачиваем .deb-пакет для 64-разрядной версии: Устанавливаем пакет через Если у вас старая версия дистрибутива, возможно, сначала придется установить пакет через Установка .deb-пакета автоматически добавляет репозиторий Visual Studio Code в систему и настраивает ключ подписи. Так можно получать обновления через стандартный механизм обновления пакетов Теперь практически все нужные нам инструменты установлены и настроены, перейдем к работе с картинками. Базовые приемы обработки изображений с Pillow Начнем с основ — анализа картинки и базовых манипуляций, таких как изменение цвета пикселя и смена цветовой модели. Получаем основную информацию об изображении Первый шаг — загрузить изображение, определить его цветовую модель и получить информацию о его размере и границах. ![]() Эти базовые данные нам нужны для дальнейшей работы с изображением, анализ и визуализацию. Меняем цвет пикселя К отдельным пикселям можно обращаться с помощью метода Открываем white.jpg с помощью Pillow: Выбираем пиксель с координатами (25, 45) и меняем его цвет: Сохраняем отредактированное изображение: Визуально проверяем, что цвет пикселя изменился. Использование метода ![]() Меняем цветовую модель Чтобы лучше понять структуру цифровых изображений, научимся работать с цветовыми каналами с помощью методов Открываем исходное изображение: Разделяем изображение на три независимых канала: красный (R), зеленый (G) и синий (B): Создаем новый альфа-канал (mask), который заполнен полупрозрачными пикселями:
Объединяем каналы в изображение RGBA-формата: Зачем нам нужно уметь менять цветовую модель:
![]() Новое изображение и более сложные манипуляции Чтобы закрепить базовые навыки работы с Pillow, создадим простое изображение и будем постепенно усложнять задачи, добавляя элементы цветовой динамики и расчетов на основе координат. Нарисуем черный квадрат 100?100 пикселей: Он будет нашим первым тестовым объектом для экспериментов. ![]() Также нарисуем прямоугольник размером 320?240 пикселей и заполним его пурпурным цветом (RGB: 205, 100, 200): ![]() Эксперименты с различными значениями каналов RGB помогли нам добиться яркого и насыщенного оттенка. Этот навык пригодится для проектирования цветовых схем и тем оформления. Теперь попробуем создать прямоугольник с более сложной, функциональной раскраской. Вместо того, чтобы использовать статичные значения цветовых каналов, мы решили вычислять их динамически, в зависимости от координат пикселей на изображении. Создаем новое изображение в форме прямоугольника и приступаем к заполнению его пикселей по собственной формуле для вычисления значений красного, зеленого и синего каналов: Мы намеренно используем метод Наша формула учитывает горизонтальное и вертикальное положение каждого пикселя, мы смогли получить плавные переходы и динамичные визуальные эффекты. Эксперименты с различными математическими выражениями позволили нам добиться красивых, плавно переходящих оттенков, которые создают эффект мерцания и глубины: ![]() Меняем цветовые каналы Посмотрим, как будет выглядеть привычная картинка, если поменять местами красный, зеленый и синий компоненты: Мы перебрали все пиксели исходного изображения и извлекли для каждого значения трех цветовых каналов: R (красный), G (зеленый) и B (синий). Эти числовые значения хранят информацию об интенсивности соответствующего цвета в данном пикселе. Продолжим экспериментировать и сделаем перестановку каналов RGB: R станет B, G — R, а B — G. Так мы получим новые значения для каждого пикселя, которые отражают смещение цветовых компонент. ![]() Наконец, попробуем перемешать каналы: Мы визуализировали картинку с новыми значениями R, G и B для каждого пикселя. В результате получился довольно необычный эффект: ![]() Учимся работать с отдельными цветовыми каналами Разделяя изображение на отдельные цветовые каналы и собирая их обратно, мы можем по-разному влиять на его внешний вид и проводить эксперименты с цветом. Методом Теперь соберем изображение обратно из трех каналов с помощью конструкции Мы восстановили исходное изображение: ![]() Строим гистограммы Этот наглядный инструмент показывает, как распределены пиксели по значениям цветовых компонент. Гистограмма позволяет быстро понять особенности цветового состава изображения, что нам пригодится для дальнейшего анализа и обработки изображений. Загружаем изображение в переменную Теперь нам нужно перебрать все пиксели изображения и извлечь значения каналов R, G и B для каждого пикселя. Добавляем полученное количество пикселей и их значения в список гистограммы. Наконец, с помощью значений из списка строим три графика гистограммы, которые показывают распределение интенсивности для красного, синего и зеленого каналов: ![]() Копируем и меняем размер Сначала мы открываем исходное изображение и создаем его копию, чтобы работать с дубликатом и не вносить изменений в оригинал. Затем снова открываем изображение и получаем его исходные размеры. После этого изменяем размер изображения пропорционально с помощью метода Далее мы снова открываем исходное изображение, определяем его размеры и создаем версию с новыми параметрами методом Таким образом, ![]() Вырезаем фрагмент и меняем его размер Открываем исходное изображение и с помощью метода Мы получили новое изображение, которое содержит только выделенный фрагмент. Теперь мы можем с ним работать, не меняя остальную часть картинки. Методом В результате мы получили уменьшенную версию выбранной области, при этом исходное изображение осталось без изменений: ![]() Такой подход полезен, когда необходимо работать с отдельными фрагментами — например, для создания миниатюр, акцентирования на деталях или подготовки данных для задач машинного обучения. Вращение и отражение изображения Изменение ориентации изображения — полезная операция в обработке графических данных, особенно для задач дополнения данных (data augmentation) в машинном обучении и при создании эффектов в графических приложениях. Разберемся с основными способами вращения изображения с помощью библиотеки Pillow. Открываем исходное изображение и получаем его размеры: Поворачиваем изображение на 90° без изменения размеров холста: Поворачиваем изображение на 45°: Часть изображения обрезается, поэтому воспользуемся параметром Поворачиваем изображение на 180° с параметром ![]() Запомним, что без А теперь перейдем к зеркальным отражениям. Они могут пригодится для подготовки дополнительных вариантов изображений в системах компьютерного зрения. Сделаем зеркальные отражения картинки по горизонтали и вертикали с помощью метода Закрашиваем изображения нужным цветом Заливка частей или всей картинки выбранным цветом может понадобится, если нужно выделить какую-то область, подготовить изображение к обработке или сделать фон. Закрасим прямоугольную область в верхнем левом углу с помощью метода Теперь снова открываем наше изображение и полностью заливаем его зеленым цветом с помощью ![]() Проводим комбинированные манипуляции Такие операции позволяют накладывать графические элементы, чтобы создавать новые изображения. Разместим уменьшенную копию изображения в левый угол исходного и нарисуем красную рамку вокруг фрагмента, чтобы его выделить: Теперь добавим новый графический элемент. Нарисуем белую полупрозрачную горизонтальную полосу и наложим ее на изображение: Наконец, вставим уменьшенное изображение в центр исходного: ![]() Выводим координаты клика по точке на картинке Теперь напишем программу, которая умеет отслеживать и сохранять координаты кликов пользователя по изображению. Инструмент может пригодиться, например, для анализа взаимодействия пользователя с картинкой, выявления популярных областей или сбора данных для машинного обучения. Пользователь сделал три клика, и программа вывела координаты этих точек в консоль: Рисуем графические элементы Для начала нам нужно импортировать две библиотеки:
Выведем изображение на экран с помощью функции Теперь определим координаты точек, которые хотим визуализировать, — для этого создадим списки x и y, которые содержат значения координат. Нанесем две серии точек с помощью функции Наконец, добавим заголовок plotting: 'picture.jpg' с помощью функции ![]() Обратите внимание: если необходимо не просто визуализировать, а сохранить изображение с нанесенными элементами, лучше использовать библиотеку Pillow и модуль Обрабатываем картинки с помощью фильтров С помощью фильтрации можно выделять детали или создавать художественные эффекты на изображениях. Разберемся, как работают три встроенных фильтра из модуля Импортируем нужные модули: Загружаем исходное изображение: Теперь применим три разных фильтра и посмотрим, как они работают и для чего нужны. EMBOSS — фильтр, создающий эффект тиснения (embossing), придает изображению вид трехмерной текстуры и ощущение рельефности. Подходит для художественной обработки и стилизации изображений: ![]() FIND_EDGES — фильтр, который выделяет границы объектов (edge detection). Это полезно для анализа форм, сегментации, построения контурных моделей, создания технических схем и предобработки перед детектированием: ![]() CONTOUR — подчеркивает основные границы объектов, создавая четкий и графический вид: ![]() Строим контуры Этот инструмент выделяет структурные особенности изображения. Функция Загружаем исходную картинку и преобразуем ее в оттенки серого — с черно-белым изображением работать будет проще. Вызываем функцию Мы получили изображение с четко выделенными границами и контурами: ![]() Мы рассмотрели базовые функции для работы с изображениями в библиотеки Pillow и познакомились с фильтрами Matplotlib. Теперь разберемся, как обнаруживать объекты на картинках. Распознаем объекты с помощью модели YOLOX YOLOX — это легковесная и быстрая модель обнаружения объектов, которая обеспечивает хороший баланс между точностью и скоростью. Она хорошо работает на одноплатных компьютерах, таких как Lichee Pi 4A, за счет оптимизированной архитектуры. Для начала работы с YOLOX клонируем ее официальный репозиторий для архитектуры RISC-V, который содержит примеры. На вики Lichee Pi 4A есть подробная инструкция для этой модели. Теперь настроим среду. Экосистема ПО для RISC-V активно развивается, поэтому загрузим и установим предварительно скомпилированные версии необходимых Python-библиотек. Обратите внимание, что нужно установить специальную версию ONNX Runtime, которая оптимизирована для процессоров Gentej. Документация к Lichee Pi 4A рекомендует модифицированную версию HHB-onnxruntime, которая оптимизирована для платформы SHL. Подготовим скрипт для запуска: в demo/ONNXRuntime нужно адаптировать пути к библиотекам и зависимостям для корректной работы на одноплатном компьютере. Для запуска инференса используем скрипт
В результате работы скрипта мы получили новое изображение, на котором:
Заключение Одноплатный компьютер Lichee Pi 4A на архитектуре RISC-V доказал, что его вычислительных мощностей достаточно для обучения основами компьютерного зрения — от базовой обработки изображений с Python-библиотекой Pillow до распознавания объектов с моделью YOLOX. Уверены, что наш опыт будет полезен начинающим инженерам, которые хотят изучить основы компьютерного зрения и обработки изображений. Работа с Lichee Pi 4A поможет получить базовые навыки адаптации и оптимизации ПО под новые аппаратные решения, а это особенно важно, если вы планируете работать в сферах интернета вещей, встроенных систем или Edge AI. Если остались вопросы или хотите поделиться своим опытом — пишите в комментариях, будем рады обсудить. Источник: habr.com Комментарии: |
|