Warning: fopen(/home/isearch/.system/tmp/index-HJ3K45.tmp): failed to open stream: Disk quota exceeded in /home/isearch/isearch.net.ua/www/wp-admin/includes/class-wp-filesystem-ftpext.php on line 190

Warning: unlink(/home/isearch/.system/tmp/index-HJ3K45.tmp): No such file or directory in /home/isearch/isearch.net.ua/www/wp-admin/includes/class-wp-filesystem-ftpext.php on line 193
Модель штучного інтелекту Moondream, щоб наш Raspberry Pi бачив як людина – iSearch

Модель штучного інтелекту Moondream, щоб наш Raspberry Pi бачив як людина

Що, якби наш Raspberry Pi міг не просто обчислювати, а бачити світ так само, як ми? Уявіть собі крихітний пристрій, який не просто ідентифікує собаку на фотографії, а й повідомляє, чи відпочиває вона на дивані, чи ганяється за м’ячем у парку.

З появою передових моделей візуальної мови, таких як Moondream (https://moondream.ai/), це не наукова фантастика, а реальність. Moondream перетворює скромний Raspberry Pi на контекстно-залежний візуальний інтерпретатор, здатний відповідати на тонкі запитання про зображення простою мовою. Хоча він може працювати не зі швидкістю блискавки, його здатність розуміти взаємозв’язки, дії та тонкі деталі робить його фантастичним варіантом для тих, хто хоче розширити межі можливого з компактним обладнанням.

Core Electronics у своїй статті розкриває, як Moondream поєднує комп’ютерний зір з обробкою природної мови, щоб отримати інформацію, яка виходить далеко за рамки традиційного виявлення об’єктів. Незалежно від того, чи нам цікаво, як цей інструмент може покращити домашню автоматизацію, аналізувати записи з камер спостереження чи навіть виявляти емоції на фотографіях, ця стаття проведе нас через його фантастичний потенціал. Від практичного застосування до вимог до обладнання та порад щодо встановлення, ми розглянемо, як використовувати цю технологію, щоб зробити наш Raspberry Pi не лише розумнішим, а й більш людяним. Зрештою, бачити ‒ це не просто дивитися, це справжнє розуміння того, що бачиш.

Ключові особливості Moondream:

  • Moondream ‒ це модель візуальної мови з відкритим кодом, яка розуміє зображення за допомогою простих текстових підказок. Вона швидка та надзвичайно потужна.
  • Moondream розроблений для Raspberry Pi, пропонуючи розширений аналіз зображень та обробку природної мови для інтерпретації об’єктів у контексті та відповідей на складні запитання.
  • На відміну від моделей реального часу, таких як YOLO, Moondream надає пріоритет детальному контекстуальному мисленню над швидкістю, що робить його ідеальним для застосувань, що не працюють у реальному часі, таких як домашня автоматизація, аналіз безпеки та моніторинг пакетів.
  • Доступні два варіанти моделі: модель 2B для високої точності (22–25 секунд на зображення) та модель 0.5B для швидшої обробки (8–10 секунд на зображення), обидві підтримують зображення 512×512 пікселів.
  • Для оптимальної продуктивності потрібен Raspberry Pi 5 з щонайменше 8 ГБ оперативної пам’яті (рекомендовано 16 ГБ), активним охолодженням та модулем Pi Camera Module 3 для захоплення зображень у реальному часі.
  • Moondream підтримує розширені функції, такі як інтеграція з хмарою або локальним сервером, а також робочі процеси на основі API, що забезпечує швидшу обробку та масштабованість для складних застосунків.

Moondream виходить за рамки базового розпізнавання зображень, поєднуючи комп’ютерний зір із розумінням природної мови для отримання детальної аналітики. Наприклад, замість того, щоб просто ідентифікувати «собаку» на зображенні, він може відповідати на конкретні запитання, такі як: «Чи сидить собака на дивані?» або «Якого кольору нашийник у собаки?». Ця здатність надавати контекстуальне мислення відрізняє його від традиційних моделей, що робить його ідеальним для завдань, що потребують глибшого розуміння та аналізу. Завдяки інтеграції цих розширених функцій Moondream стає універсальним інструментом для застосувань, де інтерпретація взаємозв’язків, дій та тонких деталей є важливою.

Moondream проти YOLO: вибір правильного інструменту

YOLO (You Only Look Once ‒ дивишся тільки раз) широко відомий своєю швидкістю, відмінно демонструючи виявлення об’єктів у реальному часі шляхом ідентифікації та визначення місцезнаходження об’єктів за мілісекунди. Однак Moondream надає пріоритет глибині та деталізації над швидкістю. Він може розпізнавати дії, взаємозв’язки та складні деталі на зображенні, пропонуючи рівень аналізу, з яким YOLO не може зрівнятися. Це розширене мислення має один недолік: час обробки коливається від 8 до 25 секунд на зображення, залежно від варіанта моделі та складності запиту. Хоча YOLO є найкращим вибором для застосувань реального часу, Moondream краще підходить для сценаріїв, де детальний аналіз важливіший за швидкість.

Зробимо так, щоб наш Raspberry Pi бачив як людина

https://www.youtube.com/watch?v=ADuaiRnX5X0

Практичне застосування

Moondream Moondream особливо ефективний для програм, що не працюють у реальному часі та вимагають детального розуміння зображень. Його можливості роблять його цінним інструментом для різних випадків використання, зокрема:

  • Домашня автоматизація: Визначення того, чи відчинені дверцята холодильника, перевірка наявності білизни на мотузці або виявлення загублених контейнерів.
  • Моніторинг посилок: Перевірка, чи посилка була доставлена ​​до ваших дверей.
  • Аналіз безпеки: Аналіз записів з камер домашньої безпеки для відповіді на складні запити, такі як виявлення незвичайної активності або перевірка певних подій.

Ці приклади показують, як Moondream може покращити виконання повсякденних завдань, підвищити безпеку та підтримувати інноваційні проєкти на основі штучного інтелекту.

 Варіанти моделі: Балансування швидкості та точності

Moondream пропонує два варіанти моделі, кожна з яких розроблена для задоволення різних потреб у продуктивності:

  • Модель 2B: Цей варіант забезпечує вищу точність та ідеально підходить для складних запитів, але для обробки кожного зображення потрібно 22–25 секунд.
  • Модель 0.5B: Оптимізована для швидшої обробки (8–10 секунд на зображення), цей варіант підходить для простіших завдань, але може бути менш надійною для складних запитів.

Обидві моделі працюють із зображеннями 512×512 пікселів, забезпечуючи баланс між продуктивністю та деталізацією. Крім того, прості питання «так/ні» обробляються швидше, що робить систему адаптованою до різних рівнів складності.

 Вимоги до обладнання для оптимальної продуктивності

 Для ефективної роботи Moondream нам знадобиться Raspberry Pi 5 з щонайменше 8 ГБ оперативної пам’яті, хоча для плавної роботи під час ресурсомістких завдань рекомендується 16 ГБ. Активне охолодження є важливим через високе навантаження процесора, необхідне для обробки. Для захоплення зображень у реальному часі модуль камери Pi 3 повністю сумісний, що дозволяє безперешкодно інтегруватися у наші проєкти. Ця апаратна конфігурація гарантує ефективну роботу Moondream, дозволяючи нам досліджувати його повний потенціал без проблем з продуктивністю.

Початок роботи з Moondream

Початок роботи з Moondream передбачає простий процес налаштування. Виконаємо такі кроки, щоб встановити та налаштувати модель на нашому Raspberry Pi:

  • Створити віртуальне середовище для ізоляції залежностей та забезпечення сумісності.
  • Встановити необхідні програмні пакети, включаючи бібліотеки Python та системні утиліти.
  • Завантажити файли моделі та налаштувати систему для локальної або серверної обробки.

Після встановлення Moondream можна використовувати для локального аналізу зображень або захоплення зображень у реальному часі за допомогою камери Pi. Для досвідчених користувачів він також підтримує інтеграцію з хмарними або локальними серверами, що дозволяє швидше обробляти та створювати робочі процеси на основі API для складніших програм.

Встановлення Moondream

Починаючи з нової інсталяції Pi OS, ми спочатку оновимо наші пакети:

sudo apt update

sudo apt upgrade -y

Потім створимо нове віртуальне середовище (venv) під назвою moondream за допомогою такої команди:

python3 -m venv –system-site-packages moondream

Параметр –system-site-packages гарантує, що ми включимо всі пакети, які вже встановлені на нашому Pi. Ми робимо це, оскільки нам знадобиться Picamera2, а її надзвичайно складно встановити. Він попередньо встановлений разом з Pi OS, тому найпростіше просто включити його під час створення venv. Потім зможемо запустити наш термінал у цьому venv:

source moondream/bin/activate

Ми повинні побачити назву venv у дужках у новому рядку, як на зображенні. Якщо чомусь закриємо термінал і захочемо повернутися сюди (можливо, щоб встановити деякі додаткові пакети), знову виконаємо команду source, що вище.

Потім встановимо пакет Moondream Python. Встановимо трохи старішу версію пакета, оскільки новіші версії ускладнили локальний запуск моделі на Pi. Цей старіший пакет матиме мінімальний вплив на продуктивність.

pip install moondream==0.0.6

Коли включаємо системні пакети під час створення venv, то впроваджуємо дуже нову версію Numpy з Picamera2. Однак, Moondream вимагає трохи старішої версії, яку нам потрібно буде встановити вручну:

pip3 install numpy==1.26.4

І це все, що потрібно від пакету програм!

Нам також потрібно буде вказати нашому IDE Thonny використовувати віртуальне середовище, яке ми щойно створили та встановили в нього наші пакети. Під час першого запуску Thonny буде в базовому, спрощеному режимі. У верхньому правому куті натиснемо кнопку, щоб скористатися розширеним режимом за замовчуванням, а потім перезапустимо Thonny. Після перезапуску виберемо Run > Configure Interpreter, а потім у розділі Python Executable натиснемо три крапки, щоб вибрати новий. Тепер нам потрібно перейти до /home/pi/moondream/bin. У цій папці знайдемо файл під назвою Python, виберемо його та натиснемо ОК.

Нарешті, потрібно завантажити саму модель Moondream, що можемо зробити за допомогою простої команди wget. Насправді у нас є два варіанти розміру моделі.

Модель 2b ‒ це більша та потужніша модель з кращим логічним мисленням та контекстним аналізом. Найшвидший можливий час обробки кадру становить близько 20 секунд. Завантажимо її за допомогою:

wget https://huggingface.co/vikhyatk/moondream2/resolve/9dddae84d54db4ac56fe37817aeaeb502ed083e2/moondream-2b-int8.mf.gz?download=true

Модель 0.5b ‒ це менша та менш потужна модель з обмеженими можливостями мислення. Однак найшвидший можливий час обробки кадру становить близько 8 секунд. Ми можемо завантажити її, ввівши:

wget https://huggingface.co/vikhyatk/moondream2/resolve/9dddae84d54db4ac56fe37817aeaeb502ed083e2/moondream-0_5b-int8.mf.gz?download=true

Завантажимо обидві моделі та спробуємо їх, при бажанні.

Ці моделі завантажаться як ZIP-файли в домашню папку нашого Pi. Клацнемо правою кнопкою миші на файлі(ах) та натиснемо extract here, щоб розпакувати їх. Цей процес може зайняти цілу хвилину, оскільки це великі файли. Після отримання необроблених MZ-файлів (формат моделі Moondream) створимо нову папку в доступному місці. Ми створили її на робочому столі. Скопіюємо файли моделі в цю папку. У цій папці також створимо ще одну нову папку під назвою images. Ми розмістимо в цій папці всі зображення, які хочемо проаналізувати. Папка нашого проєкту повинна виглядати приблизно так, як на зображенні:

Тепер ми готові почати використовувати Moondream.

Використання Moondream з Python

Відкриємо новий скрипт у Thonny та вставимо наступний демонстраційний код. Збережемо скрипт у папці проєкту, яку щойно створили. Якщо скрипт не збережено в цій папці, він не зможе прочитати моделі чи зображення.

import moondream as md

from PIL import Image

import time

# Load the local .mf file

model = md.vl(model=”./moondream-0_5b-int8.mf”)

# Load your image

image = Image.open(“./images/crash1.jpg”)

# Encode the image

encoded_image = model.encode_image(image)

# Ask questions about the image

answer = model.query(encoded_image,”Is the car driveable?”)[“answer”]

print(answer)

Як бачимо, насправді, для запуску цього режиму потрібно не так багато коду. Почнемо з імпорту необхідного пакета Moondream та Python Imaging Library (PIL ‒ бібліотеки зображень Python):

import moondream as md

from PIL import Image

import time

Потім завантажуємо нашу модель. За замовчуванням код завантажує модель 0.5b, але ми можемо змінити його на модель 2b, змінивши назву на ./moondream-2b-int8.mf. Ця назва просто відповідатиме назві моделі у нашій папці проєкту.

# Load the local .mf file

model = md.vl(model=”./moondream-0_5b-int8.mf”)

Потім завантажуємо зображення з нашої папки images та кодуємо його. Цей процес кодування є необхідним кроком, оскільки готує зображення до аналізу Moondream. Це потрібно зробити лише один раз для кожного зображення.

# Load your image

image = Image.open(“./images/crash1.jpg”)

# Encode the image

encoded_image = model.encode_image(image)

І нарешті, беремо це закодоване зображення та використовуємо Moondream, щоб поставити про нього запитання. Після того, як ми закодували зображення, можемо поставити про нього скільки завгодно запитань.

# Ask questions about the image

answer = model.query(encoded_image,”Is the car driveable?”)[“answer”]

print(answer)

Після завантаження нашого питання подивимося, як модель 0.5b спрацює з ним.

Значна частина часу, який Pi витрачає на обробку зображення, припадає на генерацію текстової відповіді. Тож чим менше символів потрібно згенерувати, тим менше часу витрачається на кожне зображення. Щоб проаналізувати це, у нас є код, який вимірює час кожного кроку процесу:

import moondream as md

from PIL import Image

import time

# Start the timer

start_time = time.time()

# Load the local .mf file

model = md.vl(model=”./moondream-2b-int8.mf”)

model_time = time.time()

print(f”Model Load Time: {model_time – start_time:.2f} seconds”)

# Load your image

image = Image.open(“./images/flower2.jpg”)

# Encode the image

encoded_image = model.encode_image(image)

encode_time = time.time()

print(f”Image Encode Time: {encode_time – model_time:.2f} seconds”)

# Ask questions about the image

answer = model.query(encoded_image,”Answer only yes or no, are there flowers in this image?”)[“answer”]

print(answer)

answer_time = time.time()

print(f”Answer Time: {answer_time – encode_time:.2f} seconds”)

print(f”\nTotal Image Time: {answer_time – model_time:.2f} seconds”)

Якщо запустимо цей код на моделі 2b, то отримаємо наступний розподіл часу, який займав кожен крок, з питанням Answer only yes or no:

  • Час завантаження моделі: 23,47 секунди
  • Час кодування зображення: 18,61 секунди
  • Час відповіді: 1,34 секунди

По-перше, час завантаження моделі. Це неминуча плата, яку потрібно сплатити, але її потрібно сплатити лише один раз! Щоразу, коли ми запускаємо скрипт, модель має бути завантажена, але після завантаження можемо аналізувати скільки завгодно зображень у циклі while true.Єдиний раз, коли нам потрібно буде знову завантажити модель, це коли ми перезапустимо скрипт.

Потім є час кодування зображення, це ще одна значною мірою неминуча плата, яку потрібно сплатити, і її потрібно сплатити за кожен кадр або зображення, яке хочемо проаналізувати.Це також мінімізується шляхом передачі зображення з правильною роздільною здатністю.Кожне зображення, яке ми надали Moondream досі, мало розмір 512×512 пікселів або менше. Якщо передамо йому зображення, більше за це, кодування зображення може зайняти від 30 до 45 секунд.Припускаємо, що більші зображення потребують зниження роздільної здатності обробки Moondream (ймовірно, 512×512 пікселів).Тому дуже важливо переконатися, що ми передаємо йому зображення, які вже були зменшені до 512×512 або менше.

Потім у нас є час відповіді. Це те, що можемо найбільше контролювати, пропонуючи Moondream обмежити розмір виводу тексту. Час, який бачили вище, ‒ це найшвидший, який можемо отримати з крихітною відповіддю, такою як yes чи no, або одним числом. Якби ми замість цього поставили йому запитання, яке генерує текст на цілий абзац, то час відповіді міг би зайняти більше 40 секунд.

Варто знати, що після кодування зображення можемо поставити кілька запитань про нього. Якби ми поставили одне запитання yes чи no, загальний час обробки зображення становив би 19,95 секунди (час кодування зображення + час відповіді).Якби ми поставили 5 запитань щодо зображення, це зайняло б близько 25,31 секунди.

Після запуску того ж коду з моделлю 0.5b отримуємо наступний розподіл часу:

  • Час завантаження моделі: 10,68 секунди
  • Час кодування зображення: 8,75 секунди
  • Час відповіді: 0,63 секунди

Як бачимо, модель 0.5b приблизно вдвічі швидша загалом – це варто розглянути, якщо прагнемо чогось трохи швидшого. Але часто різниця між часом обробки 8-9 секунд і часом обробки 20 секунд мінімальна – модель 2b може бути нашою обраною зброєю в більшості випадків.

Обробка живих зображень за допомогою камери

Розглянемо, як можемо обробляти зображення, що надходять безпосередньо з модуля камери, підключеної до Raspberry Pi. Перш за все, переконаємося, що ми підключили кабель камери в правильній орієнтації, інакше може знадобитися трохи більше зусиль. Зображення показує правильний спосіб:

Потім створимо новий скрипт, вставимо наступний код і збережемо його в папці проєкту:

import moondream as md

from PIL import Image

import time

from picamera2 import Picamera2

# Initialize the Picamera2

picam2 = Picamera2()

picam2.configure(picam2.create_still_configuration(main={“size”: (512,512), “format”: “RGB888”}))

picam2.start()

# Load the moondream model

model = md.vl(model=”./moondream-2b-int8.mf”)

while True:

    # Capture image as numpy array

    image_array = picam2.capture_array()

    # Convert numpy array to PIL Image

    image = Image.fromarray(image_array)

    print(“Photo captured. Starting query…”)

    # Encode the image

    encoded_image = model.encode_image(image)

    # Ask questions about the image

    answer = model.query(encoded_image, “Is there a man with a blue jacket in this image?”)[“answer”]

    print(answer)

Цей код практично такий самий, як той, який ми використовували раніше, але замість того, щоб брати зображення з папки проєкту, ми використовуємо камеру. Також код поміщає все це в безкінцевий цикл while true, що означає, що він буде безперервно робити та аналізувати фотографії.

Обмеження для адаптації

 Хоча Moondream пропонує вражаючі можливості, важливо знати про його обмеження:

  • Швидкість обробки: повільніший час обробки робить його непридатним для програм реального часу.
  • Обмеження навчальних даних: модель може мати проблеми з дуже специфічними або незвичайними запитами через прогалини в навчальних даних.
  • Оптимізація запитів: досягнення оптимальних результатів часто вимагає експериментів з запитами та налаштуваннями.

Розуміння цих обмежень допоможе нам адаптувати використання Moondream до сценаріїв, де його сильні сторони можуть бути повністю використані.

Розширені функції для покращеної корисності

Для досвідчених користувачів Moondream пропонує розширені функції, які розширюють його функціональність. Інтегруючи модель з хмарними або локальними серверами, ми можемо значно скоротити час обробки та підтримувати складніші робочі процеси. Конфігурації на основі API дозволяють безперешкодно інтегруватися у більші системи, що дозволяє використовувати Moondream як частину ширшого рішення на основі штучного інтелекту. Ці розширені функції роблять Moondream гнучким та масштабованим інструментом для користувачів, які прагнуть розширити межі можливого з компактним обладнанням, таким як Raspberry Pi.

Реальні застосування в дії

 Потенціал Moondream найкраще демонструється на практичних прикладах. Він може:

  • Виявляти емоції: Визначати посмішки чи інші вирази обличчя на фотографіях.
  • Аналізувати об’єкти: Розпізнавати пакети, контейнери чи інші предмети та відповідати на детальні запитання щодо їхнього розташування чи стану.
  • Контекстне розуміння: Надавати уявлення про вміст зображення, наприклад, перевіряти, чи знаходиться пакет на ганку, або визначати конкретні дії в сцені.

Ці приклади ілюструють, як Moondream поєднує швидкість і точність, що робить його універсальним інструментом як для творчого, так і для практичного застосування.

За матеріалами https://core-electronics.com.au/guides/raspberry-pi/getting-started-with-moondream-on-the-pi-5-human-like-computer-vision/