Що, якби наш 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/
