You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/hu/5-retail/lessons/2-check-stock-device/single-board-computer-count...

10 KiB

Számold meg a készletet IoT eszközöddel - Virtuális IoT hardver és Raspberry Pi

Az előrejelzések és a hozzájuk tartozó határoló dobozok kombinációja felhasználható a készlet megszámlálására egy képen.

Határoló dobozok megjelenítése

Egy hasznos hibakeresési lépésként nemcsak kiírhatod a határoló dobozokat, hanem rá is rajzolhatod azokat a képre, amelyet a rendszer a kép rögzítésekor mentett el.

Feladat - határoló dobozok kiírása

  1. Győződj meg arról, hogy a stock-counter projekt meg van nyitva a VS Code-ban, és ha virtuális IoT eszközt használsz, a virtuális környezet aktiválva van.

  2. Módosítsd a for ciklusban található print utasítást az alábbira, hogy a határoló dobozokat a konzolra írd ki:

    print(f'{prediction.tag_name}:\t{prediction.probability * 100:.2f}%\t{prediction.bounding_box}')
    
  3. Futtasd az alkalmazást úgy, hogy a kamera egy polcon lévő készletre mutat. A határoló dobozok kiírásra kerülnek a konzolra, a bal, felső, szélesség és magasság értékekkel 0 és 1 között.

    pi@raspberrypi:~/stock-counter $ python3 app.py 
    tomato paste:   33.42%  {'additional_properties': {}, 'left': 0.3455171, 'top': 0.09916268, 'width': 0.14175442, 'height': 0.29405564}
    tomato paste:   34.41%  {'additional_properties': {}, 'left': 0.48283678, 'top': 0.10242918, 'width': 0.11782813, 'height': 0.27467814}
    tomato paste:   31.25%  {'additional_properties': {}, 'left': 0.4923783, 'top': 0.35007596, 'width': 0.13668466, 'height': 0.28304994}
    tomato paste:   31.05%  {'additional_properties': {}, 'left': 0.36416405, 'top': 0.37494493, 'width': 0.14024884, 'height': 0.26880276}
    

Feladat - határoló dobozok rajzolása a képre

  1. A Pillow Pip csomag használható képek szerkesztésére. Telepítsd a következő paranccsal:

    pip3 install pillow
    

    Ha virtuális IoT eszközt használsz, győződj meg róla, hogy ezt az aktivált virtuális környezetben futtatod.

  2. Add hozzá a következő import utasítást az app.py fájl tetejéhez:

    from PIL import Image, ImageDraw, ImageColor
    

    Ez a kód szükséges a kép szerkesztéséhez.

  3. Add hozzá a következő kódot az app.py fájl végéhez:

    with Image.open('image.jpg') as im:
        draw = ImageDraw.Draw(im)
    
        for prediction in predictions:
            scale_left = prediction.bounding_box.left
            scale_top = prediction.bounding_box.top
            scale_right = prediction.bounding_box.left + prediction.bounding_box.width
            scale_bottom = prediction.bounding_box.top + prediction.bounding_box.height
    
            left = scale_left * im.width
            top = scale_top * im.height
            right = scale_right * im.width
            bottom = scale_bottom * im.height
    
            draw.rectangle([left, top, right, bottom], outline=ImageColor.getrgb('red'), width=2)
    
        im.save('image.jpg')
    

    Ez a kód megnyitja a korábban mentett képet szerkesztésre. Ezután végigmegy az előrejelzéseken, lekéri a határoló dobozokat, és kiszámítja az alsó jobb koordinátát a 0-1 közötti határoló doboz értékek alapján. Ezeket az értékeket a kép megfelelő dimenziójával szorozva alakítja át képi koordinátákká. Például, ha a bal érték 0,5 egy 600 pixel széles képen, akkor ez 300-ra alakul (0,5 x 600 = 300).

    Minden határoló doboz piros vonallal kerül a képre. Végül a szerkesztett kép mentésre kerül, felülírva az eredeti képet.

  4. Futtasd az alkalmazást úgy, hogy a kamera egy polcon lévő készletre mutat. A VS Code fájlkezelőjében megjelenik az image.jpg fájl, amelyet kiválasztva láthatod a határoló dobozokat.

    4 paradicsompüré konzerv, mindegyik körül határoló dobozokkal

Készlet megszámlálása

A fent látható képen a határoló dobozok kissé átfedik egymást. Ha ez az átfedés sokkal nagyobb lenne, akkor a határoló dobozok ugyanarra az objektumra utalhatnának. Az objektumok helyes megszámlálásához figyelmen kívül kell hagyni azokat a dobozokat, amelyek jelentős átfedéssel rendelkeznek.

Feladat - készlet megszámlálása átfedések figyelmen kívül hagyásával

  1. A Shapely Pip csomag használható az átfedések kiszámítására. Ha Raspberry Pi-t használsz, először telepítened kell egy könyvtárfüggőséget:

    sudo apt install libgeos-dev
    
  2. Telepítsd a Shapely Pip csomagot:

    pip3 install shapely
    

    Ha virtuális IoT eszközt használsz, győződj meg róla, hogy ezt az aktivált virtuális környezetben futtatod.

  3. Add hozzá a következő import utasítást az app.py fájl tetejéhez:

    from shapely.geometry import Polygon
    

    Ez a kód szükséges a poligonok létrehozásához az átfedések kiszámításához.

  4. Add hozzá a következő kódot a határoló dobozok rajzolása előtti részhez:

    overlap_threshold = 0.20
    

    Ez meghatározza az átfedési százalékot, amelyet a határoló dobozok ugyanazon objektumnak tekintése előtt megengedett. A 0,20 érték 20%-os átfedést jelent.

  5. Az átfedés kiszámításához a Shapely segítségével a határoló dobozokat Shapely poligonokká kell alakítani. Add hozzá a következő függvényt ehhez:

    def create_polygon(prediction):
        scale_left = prediction.bounding_box.left
        scale_top = prediction.bounding_box.top
        scale_right = prediction.bounding_box.left + prediction.bounding_box.width
        scale_bottom = prediction.bounding_box.top + prediction.bounding_box.height
    
        return Polygon([(scale_left, scale_top), (scale_right, scale_top), (scale_right, scale_bottom), (scale_left, scale_bottom)])
    

    Ez egy poligont hoz létre egy előrejelzés határoló dobozából.

  6. Az átfedő objektumok eltávolításának logikája az összes határoló doboz összehasonlítását jelenti. Ha bármelyik előrejelzési pár határoló dobozai az átfedési küszöbértéket meghaladják, az egyik előrejelzést törölni kell. Az összes előrejelzés összehasonlításához az 1. előrejelzést összehasonlítjuk a 2., 3., 4., stb.-vel, majd a 2.-at a 3., 4., stb.-vel. Az alábbi kód ezt végzi el:

    to_delete = []
    
    for i in range(0, len(predictions)):
        polygon_1 = create_polygon(predictions[i])
    
        for j in range(i+1, len(predictions)):
            polygon_2 = create_polygon(predictions[j])
            overlap = polygon_1.intersection(polygon_2).area
    
            smallest_area = min(polygon_1.area, polygon_2.area)
    
            if overlap > (overlap_threshold * smallest_area):
                to_delete.append(predictions[i])
                break
    
    for d in to_delete:
        predictions.remove(d)
    
    print(f'Counted {len(predictions)} stock items')
    

    Az átfedést a Shapely Polygon.intersection metódusa számítja ki, amely visszaad egy poligont, amely az átfedést tartalmazza. Az átfedés területe ezután ebből a poligonból kerül kiszámításra. Ez az átfedési küszöb nem abszolút érték, hanem a határoló doboz százalékában kell kifejezni, ezért a legkisebb határoló doboz kerül meghatározásra, és az átfedési küszöb alapján kiszámítjuk, hogy mekkora terület lehet az átfedés, hogy ne haladja meg a legkisebb határoló doboz százalékos átfedési küszöbét. Ha az átfedés ezt meghaladja, az előrejelzés törlésre kerül.

    Miután egy előrejelzés törlésre került, azt már nem kell újra ellenőrizni, így a belső ciklus kilép, hogy a következő előrejelzést ellenőrizze. Nem lehet elemeket törölni egy listából, miközben azon iterálunk, ezért az átfedési küszöböt meghaladó határoló dobozok hozzáadódnak a to_delete listához, majd a végén törlésre kerülnek.

    Végül a készlet száma kiírásra kerül a konzolra. Ezután ez az adat elküldhető egy IoT szolgáltatásnak, hogy figyelmeztessen, ha a készletszint alacsony. Mindez a kód a határoló dobozok rajzolása előtt van, így a generált képeken az átfedések nélküli készlet-előrejelzéseket fogod látni.

    💁 Ez egy nagyon egyszerű módszer az átfedések eltávolítására, amely egyszerűen eltávolítja az elsőt egy átfedő párból. Produkciós kód esetén érdemes lenne több logikát beépíteni, például figyelembe venni az átfedéseket több objektum között, vagy ha egy határoló doboz egy másikban található.

  7. Futtasd az alkalmazást úgy, hogy a kamera egy polcon lévő készletre mutat. A kimenet jelezni fogja az átfedési küszöböt meghaladó átfedések nélküli határoló dobozok számát. Próbáld meg módosítani az overlap_threshold értékét, hogy lásd, hogyan hagyja figyelmen kívül az előrejelzéseket.

💁 Ezt a kódot megtalálod a code-count/pi vagy a code-count/virtual-iot-device mappában.

😀 A készletszámláló programod sikeres volt!


Felelősség kizárása:
Ez a dokumentum az Co-op Translator AI fordítási szolgáltatás segítségével került lefordításra. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet.