HULUGAMES
← All news

Saját AI Raspberry Pi-on – teljes útmutató nullától a működő modellig

Ebben az útmutatóban pontosan ugyanazt a fényállapot-felismerő AI-projektet valósítjuk meg, mint az ESP32-S3-as testvércikkben. A különbség: a Raspberry Pi teljes Linux számítógép, ezért maga is képes a Python-modell tanítására és futtatására.

Raspberry Pi saját AI projekt illusztráció

1. Alkatrészlista

AlkatrészMennyiségFeladat
Raspberry Pi 4 vagy Pi 51 dbAdatgyűjtés, modell tanítása és inferencia
BH1750 I²C fényérzékelő modul1 dbLuxérték mérése
microSD és Raspberry Pi OS1 dbOperációs rendszer
A Pi-hoz megfelelő USB-C táp1 dbStabil működés
Breadboard és 4 jumper kábel1 készletBekötés
Kijelző/billentyűzet vagy SSH elérésopcionálisA terminál eléréséhez

Raspberry Pi Zero 2 W-vel is kipróbálható, de a modell telepítése és a csomagok kezelése lassabb lehet. A BH1750 digitális I²C szenzor, így nincs szükség külön ADC-chipre.

2. Bekötés és biztonság

Áramtalanított Pi-n végezd a bekötést:

  • BH1750 VCC → Raspberry Pi 3V3 (fizikai 1-es pin).
  • BH1750 GND → GND (fizikai 6-os pin).
  • BH1750 SDA → GPIO2 / SDA1 (fizikai 3-as pin).
  • BH1750 SCL → GPIO3 / SCL1 (fizikai 5-ös pin).
Raspberry Pi és BH1750 bekötési rajz

Soha ne köss 5 V-os jelet közvetlenül a Pi 3,3 V-os GPIO-jaira.

3. Raspberry Pi OS beállítása

Telepítsd a Raspberry Pi OS-t a Raspberry Pi Imagerrel, indítsd a Pi-t, majd a terminálban engedélyezd az I²C-t:

sudo raspi-config

Az Interface Options → I2C menüben válaszd az engedélyezést. Ezután:

sudo apt update
sudo apt install -y python3-venv python3-pip i2c-tools
sudo reboot

Újraindítás után ellenőrizd a szenzort:

sudo i2cdetect -y 1

A BH1750 általában 23 címen jelenik meg (esetenként 5c). Ha nincs ott, ellenőrizd a vezetékezést.

4. Python-környezet

mkdir ~/light-ai && cd ~/light-ai
python3 -m venv .venv
source .venv/bin/activate
pip install smbus2 pandas scikit-learn joblib

A virtual environment nem szükséges a Linux működéséhez, de elkülöníti a projekt függőségeit, és elkerüli a rendszer Python-csomagjaival való ütközést.

5. Szenzoradatok gyűjtése

Hozz létre egy collect.py fájlt:

import csv, sys, time
from smbus2 import SMBus

label = int(sys.argv[1])  # 0 = dark; 1 = bright
assert label in (0, 1)
BH1750 = 0x23
MODE = 0x10  # Continuous H-resolution
with SMBus(1) as bus, open(
    "measurements.csv", "a", newline="", encoding="utf-8"
) as file:
    bus.write_byte(BH1750, MODE)
    time.sleep(0.2)
    writer = csv.writer(file)
    if file.tell() == 0:
        writer.writerow(["lux", "label"])
    for _ in range(100):
        data = bus.read_i2c_block_data(BH1750, MODE, 2)
        raw = (data[0] << 8) | data[1]
        lux = raw / 1.2
        writer.writerow([round(lux, 2), label])
        print("lux:", round(lux, 2), "label:", label)
        time.sleep(0.2)

Először helyezd sötétbe a szenzort:

python collect.py 0

Utána világos környezetben:

python collect.py 1

Így legalább 200 címkézett mintát kapsz. Több helyszínen is gyűjts méréseket: például beltéri világítás, nappali fény és félhomály. Ne keverd össze a címkéket, mert akkor a modell rossz kapcsolatot tanul.

6. Taníts saját modellt a Raspberry Pi-on

A train.py fájl:

import pandas as pd
import joblib
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

df = pd.read_csv("measurements.csv")
X = df[["lux"]]
y = df["label"].astype(int)
assert len(df) >= 20 and set(y.unique()) == {0, 1}

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42, stratify=y
)
model = DecisionTreeClassifier(max_depth=1, random_state=42)
model.fit(X_train, y_train)
print(classification_report(y_test, model.predict(X_test),
                            zero_division=0))
joblib.dump(model, "model.joblib")
print("A modell elmentve: model.joblib")

Majd:

python train.py

Itt a Pi maga végzi a tanítást. A tesztadat a CSV egy véletlenszerű része, ezért a végső ellenőrzéshez mérj új mintákat más körülmények között is. A joblib modellfájlt csak saját, megbízható forrásból töltsd be.

7. Futtasd helyben, internet nélkül

Készíts run.py fájlt:

import time, joblib, pandas as pd
from smbus2 import SMBus

model = joblib.load("model.joblib")
BH1750 = 0x23
MODE = 0x10
with SMBus(1) as bus:
    bus.write_byte(BH1750, MODE)
    time.sleep(0.2)
    while True:
        data = bus.read_i2c_block_data(BH1750, MODE, 2)
        lux = ((data[0] << 8) | data[1]) / 1.2
        X = pd.DataFrame({"lux": [lux]})
        prediction = int(model.predict(X)[0])
        print(f"{lux:.1f} lux -> " +
              ("VILÁGOS" if prediction == 1 else "SÖTÉT"))
        time.sleep(0.5)

Futtasd:

python run.py

Most kapcsolgasd a lámpát vagy változtasd a fényt. A Raspberry Pi valós időben olvassa az érzékelőt és a saját betanított modelleddel osztályoz. A futtatáshoz nem kell internet.

8. Hibakeresés

  • OSError: Remote I/O error: hibás I²C bekötés, cím vagy tápellátás.
  • A pip telepítés hibát ad: aktív virtuális környezetben próbáld újra; Pi OS verziótól függően egyes csomagok telepítése időigényes.
  • Mindig ugyanazt a címkét adja: nézd meg a CSV-t és a szenzorértékeket; mérj változatosabb fényviszonyok között.
  • Lassú a modell tanítása: ehhez az egyváltozós fához kevés adat elegendő. Komplexebb modelleknél a Pi 4/5 RAM-ja és CPU-ja korlát lehet.

9. ESP32 vagy Raspberry Pi?

SzempontESP32-S3Raspberry Pi
Teljes LinuxNemIgen
Betanítás a készülékenNem praktikusLehetséges
Kicsi, akkumulátoros eszközElőnyösNagyobb fogyasztás
Komplexebb modellekErősen korlátozottTöbb lehetőség
Az itt bemutatott AIC++ küszöbmodellPython scikit-learn modell

Testvércikk: ESP32-S3 saját AI: alkatrészek, tanítás és telepítés.

Hasznos források