Computer vision-on és machine-learning-en alapuló image classification project

Ez a projekt egy olyan képfeldolgozáson alapuló automatikus osztályozó rendszer megvalósítását célozza, amely képes megkülönböztetni a hibátlan és hibás termékeket. A rendszer lelke egy EfficientNetB0 alapú, TensorFlow Lite (TFLite) formátumú neurális hálózat, amelyet transfer learning és fine-tuning technikákkal képeztünk ki a feladatra. A modell bináris osztályozóként működik, a kimeneti réteg sigmoid aktivációt használ a két osztály – hibás és hibátlan – szétválasztásához. A fine-tuning során a hálózat utolsó 10 rétege került újratanításra, hogy a modell jobban alkalmazkodjon a konkrét feladathoz.

A képi adatok forrását maga az eszköz szolgáltatja, amely élőben készít képeket a termékekről. Ez azt jelenti, hogy a modell ugyanazon környezeti és technikai feltételek mellett rögzített képeken tanul, mint amelyeket élesben osztályoznia kell. Ez a megközelítés jelentősen csökkenti az adatdisztribúcióbeli eltérések kockázatát, és lehetővé teszi, hogy a modell az „életszerű” mintákhoz optimalizálódjon. Ilyen esetben az overfitting nem tekinthető negatív jelenségnek, sőt, kifejezetten előnyös lehet, hiszen a cél az adott eszköz adott környezetében való minél pontosabb felismerés.

Javaslat a képadatok előkészítésére:

  1. Képformátum és felbontás: Egységes, lehetőleg RGB formátum, a modell input méretéhez (224×224 px) igazítva.
  2. Adatgyűjtés: Minden osztályból (hibás, hibátlan) több száz kép rögzítése különböző terméktípusokból, fényviszonyok és pozíciók mellett.
  3. Augmentáció (opcionális): Kis mértékű forgatás, fényerőváltoztatás, eltolás vagy zoomolás növelheti a robusztusságot, de mivel a cél az adott kameraállás szerinti pontos felismerés, ez csak óvatosan alkalmazandó.
  4. Adatok szétválasztása: A képek egy része kerüljön validációs halmazba (pl. 80–20% arány), a tanítási hatékonyság ellenőrzésére.

Ez a megközelítés egy célirányosan optimalizált, gyors és megbízható beágyazott rendszert eredményez, amely valós időben képes az ipari folyamatokba integrálódni.


Eltérésfelismerés megvalósítása TensorFlow, Keras és EfficientNetB0 segítségével

A bináris osztályozás (binary classification) egy gyakori gépi tanulási feladat, amikor két kategóriát kell megkülönböztetni. Ilyen például, amikor egy gyártósori kamera által készített képek alapján szeretnénk eldönteni, hogy egy termék hibás vagy hibátlan.

Ebben a cikkben bemutatjuk:

  • a képgyűjtés és előfeldolgozás lépéseit,
  • a transfer learning módszerét az EfficientNetB0 modellel,
  • a tanítási folyamatot,
  • a modell kiértékelését és használatát új képekre.

1. Követelmények

Telepítendő csomagok:

pip install tensorflow matplotlib scikit-learn

2. Mappa struktúra és adatok

A képek a következő struktúrában helyezkednek el:

bashMásolásSzerkesztésdataset/
│
├── train/
│   ├── good/
│   └── bad/
│
├── val/
│   ├── good/
│   └── bad/
│
└── test/
    ├── good/
    └── bad/
  • good/ – hibátlan termék képei
  • bad/ – hibás termék képei

3. Adatok betöltése és előfeldolgozása

import tensorflow as tf
from tensorflow.keras.preprocessing import image_dataset_from_directory

img_size = (224, 224)
batch_size = 32

train_ds = image_dataset_from_directory(
"dataset/train",
labels="inferred",
label_mode="binary",
image_size=img_size,
batch_size=batch_size
)

val_ds = image_dataset_from_directory(
"dataset/val",
labels="inferred",
label_mode="binary",
image_size=img_size,
batch_size=batch_size
)

test_ds = image_dataset_from_directory(
"dataset/test",
labels="inferred",
label_mode="binary",
image_size=img_size,
batch_size=batch_size
)

# Teljesítmény optimalizálás
AUTOTUNE = tf.data.AUTOTUNE
train_ds = train_ds.prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.prefetch(buffer_size=AUTOTUNE)
test_ds = test_ds.prefetch(buffer_size=AUTOTUNE)

4. Modell létrehozása – EfficientNetB0 + kimeneti rétegek

from tensorflow.keras import layers, models
from tensorflow.keras.applications import EfficientNetB0

base_model = EfficientNetB0(include_top=False, input_shape=(224, 224, 3), weights='imagenet')
base_model.trainable = False # Fagyasztjuk a rétegeket

model = models.Sequential([
base_model,
layers.GlobalAveragePooling2D(),
layers.Dropout(0.2),
layers.Dense(1, activation='sigmoid') # Bináris kimenet
])

5. Modell fordítása és tanítása

model.compile(
optimizer=tf.keras.optimizers.Adam(),
loss='binary_crossentropy',
metrics=['accuracy']
)

history = model.fit(
train_ds,
validation_data=val_ds,
epochs=10
)

6. Fine-tuning (haladó lépés)

base_model.trainable = True  # Most már finomhangolhatjuk is

model.compile(
optimizer=tf.keras.optimizers.Adam(1e-5),
loss='binary_crossentropy',
metrics=['accuracy']
)

history_fine = model.fit(
train_ds,
validation_data=val_ds,
epochs=5
)

7. Modell mentése

model.save("defect_classifier_model.h5")

8. Új kép osztályozása

import numpy as np
from tensorflow.keras.preprocessing import image

img_path = "sample.jpg"
img = image.load_img(img_path, target_size=(224, 224))
img_array = image.img_to_array(img)
img_array = tf.expand_dims(img_array, 0) # Batch dimenzió

predictions = model.predict(img_array)
score = predictions[0][0]

if score > 0.5:
print("Rossz (hibás termék)")
else:
print("Jó (hibátlan termék)")

9. Tanítási eredmények megjelenítése

import matplotlib.pyplot as plt

plt.plot(history.history['accuracy'], label='Train acc')
plt.plot(history.history['val_accuracy'], label='Val acc')
plt.legend()
plt.title('Pontosság alakulása')
plt.xlabel('Epoch')
plt.ylabel('Pontosság')
plt.show()

10. Modell konvertálása TFLite formátumba

Hasznos lehet beágyazott rendszereknél:

converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

with open('model.tflite', 'wb') as f:
f.write(tflite_model)

Összefoglalás

  • A EfficientNetB0 kiváló választás kis méretű és hatékony bináris osztályozókhoz.
  • A transfer learning gyorsítja a betanítást és jó eredményeket hoz kevés adat mellett is.
  • A modell beágyazható TFLite formátumban akár Raspberry Pi-re, Coral-ra vagy Jetsonra.
  • A megoldás kiterjeszthető: GUI frontendtel, élő kameraképpel, vagy integrálható ipari rendszerekbe is.
en_USEnglish