9.6 KiB
Laske varasto IoT-laitteellasi - Virtuaalinen IoT-laitteisto ja Raspberry Pi
Ennusteiden ja niiden rajauslaatikoiden yhdistelmää voidaan käyttää laskemaan varastoa kuvasta.
Näytä rajauslaatikot
Hyödyllisenä virheenkorjausvaiheena voit paitsi tulostaa rajauslaatikot, myös piirtää ne kuvaan, joka tallennettiin levylle kuvan kaappaamisen yhteydessä.
Tehtävä - tulosta rajauslaatikot
-
Varmista, että
stock-counter
-projekti on auki VS Codessa ja että virtuaalinen ympäristö on aktivoitu, jos käytät virtuaalista IoT-laitetta. -
Muuta
for
-silmukanprint
-lausetta seuraavasti, jotta rajauslaatikot tulostetaan konsoliin:print(f'{prediction.tag_name}:\t{prediction.probability * 100:.2f}%\t{prediction.bounding_box}')
-
Suorita sovellus niin, että kamera osoittaa hyllyllä olevaan varastoon. Rajauslaatikot tulostetaan konsoliin, ja niissä näkyvät vasen, ylä, leveys ja korkeus arvot välillä 0-1.
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}
Tehtävä - piirrä rajauslaatikot kuvaan
-
Pip-pakettia Pillow voidaan käyttää piirtämiseen kuviin. Asenna se seuraavalla komennolla:
pip3 install pillow
Jos käytät virtuaalista IoT-laitetta, varmista, että suoritat tämän aktivoidussa virtuaalisessa ympäristössä.
-
Lisää seuraava import-lausunto
app.py
-tiedoston alkuun:from PIL import Image, ImageDraw, ImageColor
Tämä tuo mukaan koodin, joka tarvitaan kuvan muokkaamiseen.
-
Lisää seuraava koodi
app.py
-tiedoston loppuun: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')
Tämä koodi avaa aiemmin tallennetun kuvan muokkausta varten. Se käy läpi ennusteet, hakee rajauslaatikot ja laskee oikean alakulman koordinaatit rajauslaatikon arvojen perusteella (0-1). Nämä arvot muunnetaan kuvan koordinaateiksi kertomalla kuvan vastaavalla ulottuvuudella. Esimerkiksi, jos vasen arvo on 0.5 kuvassa, joka on 600 pikseliä leveä, se muunnetaan arvoon 300 (0.5 x 600 = 300).
Jokainen rajauslaatikko piirretään kuvaan punaisella viivalla. Lopuksi muokattu kuva tallennetaan alkuperäisen kuvan päälle.
-
Suorita sovellus niin, että kamera osoittaa hyllyllä olevaan varastoon. Näet
image.jpg
-tiedoston VS Coden tiedostoselaimessa ja voit avata sen nähdäksesi rajauslaatikot.
Laske varasto
Yllä olevassa kuvassa rajauslaatikot ovat hieman päällekkäin. Jos tämä päällekkäisyys olisi paljon suurempi, rajauslaatikot voisivat viitata samaan objektiin. Jotta objektit lasketaan oikein, sinun täytyy jättää huomioimatta laatikot, joissa on merkittävä päällekkäisyys.
Tehtävä - laske varasto huomioimatta päällekkäisyyttä
-
Pip-pakettia Shapely voidaan käyttää leikkauspisteiden laskemiseen. Jos käytät Raspberry Pi:tä, sinun täytyy ensin asentaa kirjastoriippuvuus:
sudo apt install libgeos-dev
-
Asenna Shapely Pip-paketti:
pip3 install shapely
Jos käytät virtuaalista IoT-laitetta, varmista, että suoritat tämän aktivoidussa virtuaalisessa ympäristössä.
-
Lisää seuraava import-lausunto
app.py
-tiedoston alkuun:from shapely.geometry import Polygon
Tämä tuo mukaan koodin, joka tarvitaan monikulmioiden luomiseen päällekkäisyyden laskemiseksi.
-
Lisää seuraava koodi rajauslaatikoiden piirtämistä edeltävään kohtaan:
overlap_threshold = 0.20
Tämä määrittää sallitun päällekkäisyysprosentin, ennen kuin rajauslaatikot katsotaan samaksi objektiksi. 0.20 tarkoittaa 20 %:n päällekkäisyyttä.
-
Jotta Shapelyä voidaan käyttää päällekkäisyyden laskemiseen, rajauslaatikot täytyy muuntaa Shapely-monikulmioiksi. Lisää seuraava funktio tätä varten:
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)])
Tämä luo monikulmion ennusteen rajauslaatikon perusteella.
-
Päällekkäisten objektien poistamisen logiikka sisältää kaikkien rajauslaatikoiden vertailun. Jos mitkä tahansa ennusteparit sisältävät rajauslaatikot, joiden päällekkäisyys ylittää kynnyksen, yksi ennusteista poistetaan. Vertailu tehdään seuraavasti: ennuste 1 verrataan ennusteisiin 2, 3, 4 jne., sitten ennuste 2 verrataan ennusteisiin 3, 4 jne. Seuraava koodi tekee tämän:
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')
Päällekkäisyys lasketaan Shapelyn
Polygon.intersection
-menetelmällä, joka palauttaa päällekkäisyyden muodostaman monikulmion. Tämän monikulmion pinta-ala lasketaan. Päällekkäisyyskynnys ei ole absoluuttinen arvo, vaan sen täytyy olla prosenttiosuus rajauslaatikosta, joten pienin rajauslaatikko etsitään, ja päällekkäisyyskynnystä käytetään laskemaan, kuinka suuri alue päällekkäisyys voi olla ylittämättä pienimmän rajauslaatikon prosenttiosuuskynnystä. Jos päällekkäisyys ylittää tämän, ennuste merkitään poistettavaksi.Kun ennuste on merkitty poistettavaksi, sitä ei tarvitse enää tarkistaa, joten sisempi silmukka keskeytetään ja siirrytään seuraavaan ennusteeseen. Et voi poistaa kohteita listasta sen läpikäynnin aikana, joten rajauslaatikot, joiden päällekkäisyys ylittää kynnyksen, lisätään
to_delete
-listaan ja poistetaan lopuksi.Lopuksi varaston määrä tulostetaan konsoliin. Tämä voitaisiin lähettää IoT-palveluun, joka hälyttää, jos varastotaso on alhainen. Kaikki tämä koodi suoritetaan ennen rajauslaatikoiden piirtämistä, joten näet päällekkäisyydettömät varastoennusteet luoduissa kuvissa.
💁 Tämä on hyvin yksinkertainen tapa poistaa päällekkäisyydet, poistamalla vain ensimmäinen päällekkäisessä parissa. Tuotantokoodissa haluaisit lisätä enemmän logiikkaa, kuten huomioida useiden objektien päällekkäisyydet tai tilanteet, joissa yksi rajauslaatikko sisältyy toiseen.
-
Suorita sovellus niin, että kamera osoittaa hyllyllä olevaan varastoon. Tulosteessa näkyy rajauslaatikoiden määrä, joissa päällekkäisyys ei ylitä kynnystä. Kokeile säätää
overlap_threshold
-arvoa nähdäksesi, miten ennusteita jätetään huomiotta.
💁 Löydät tämän koodin code-count/pi- tai code-count/virtual-iot-device-kansiosta.
😀 Varastonlaskentaohjelmasi oli menestys!
Vastuuvapauslauseke:
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua Co-op Translator. Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.