-
Notifications
You must be signed in to change notification settings - Fork 1
ROS_YOLO_MODEL Wiki
A ros_yolo_model
egy ROS 2 csomag, amely az AJR (GKNB_AUTM078)
tárgyra, egy a DDC által kiadott feladat alapján készült. A projekt célja az, hogy megismerkedjünk a YOLO
architektúra, azon belül is a Yolov5
működésével és használatával.
A YOLOv5 (You Only Look Once, Version 5) egy valós idejű objektumdetektáló algoritmus, amely a számítógépes látás területén kiemelkedő teljesítményt nyújt sebességben és pontosságban. A YOLO család ötödik generációjaként került kifejlesztésre, és a PyTorch keretrendszeren alapul. Gyorsaságát és hatékonyságát a könnyű súlyú architektúrájának és optimalizált kódstruktúrájának köszönheti.
Az alábbi alfeladatokat igyekeztünk teljesíteni:
- Node készítése, amellyel a YOLO modell feltanítható saját képek felismerésére az alap objektumok mellett.
- Node készítése, amely egy saját
.pt
állományt használva képes egy bemeneti képen vagy videón objektumok felismerésére. Az is beállítható, hogy a deketálás eredményét szeretnénk-e menteni. - YOLO modell feltanítása, ami képes felismerni az egyetemi hallgatói és alkalmazotti kártyákat, és az ehhez szükséges adathalmaz elkészítése.
- A tanítást úgy elvégezni, hogy meg is különböztesse az említett kártyákat. Script írása "dummy kártyák" generálására, illetve azok véletlenszerű elhelyezésére képeken, valamint ezekből adathalmaz készítése.
A feladatunk alapjául a https://github.com/ultralytics/yolov5
szolgált.
-
- YOLOv5 modell feltanítása egyedi adatkészlet alapján
-
-
Paraméterek:
-
dataset_path
: Az adatkészlet elérési útja, ami tartalmazza a YOLOv5 által megkövetelt data.yaml fájlt is. -
model_output_path
: Az eredményként kapott modell kimeneti útvonala, ahol a súlyokat és a tanítás eredményeit tárolja.
-
-
A YOLO modell tanítása:
- A YOLOv5 hivatalos
train.py
scriptjét egy rendszerszintű parancs (std::system
) segítségével hívja meg. - Ezt a parancsot az alábbiak szerint paraméterezi fel:
- Kép méret:
640px
széles képek használata alapértelmezetten - Batch-méret:
16
kép egyidejű feldolgozása (hardver és cél függően módosítandó) - Epoch-ok száma:
100
iteráció az optimális modell eléréséhez (hardver és cél függően módosítandó) - Korábbi súlyok használata: Kiindulási pontként a
fifth_train[cards]
(vagy amelyiket éppen szeretnénk) előzőleg betanított modell súlyait használja - Hiperparaméterek: egyedi
hyp.yaml
fájl segítségével további finomhangolás végzése (hardver és cél függően módosítandó)
- Kép méret:
- A YOLOv5 hivatalos
-
-
- Node inicializálás
- Tanítási folyamat
- Hibaellenőrzés
-
Feltételezzük, hogy a workspace
~/ros2_ws/
.cd ~/ros2_ws colcon build --packages-select ros_yolo_model --symlink-install
Környezet source-olása a futtatás előtt!
source ~/ros2_ws/install/setup.bash
A node indítása:
ros2 run ros_yolo_model teach_node <dataset_path> <model_output_path>
Példa:
ros2 run ros_yolo_model teach_node /home/ajr/ros2_ws/src/ros_yolo_model/dataset /home/ajr/ros2_ws/src/ros_yolo_model/output
-
- A node célja, hogy különböző forrásokból (kamera, kép, videó) objektumokat detektáljon egy YOLOv5 modell segítségével, és a detektált eredményeket ROS 2 topikon publikálja vagy fájlokba mentse további felhasználásra.
-
-
Paraméterek:
-
weights_path
: A detektáláshoz használt modell elérési útvonala -
source_type
: A forrás típusa (image, video, camera) -
image_path
,video_path
,camera_id
vagycamera_ip
: Annak fügvényében kell megadni a megfelelő paramétert, hogy mit adtunk megsource_type
-nak -
save_results
: Az eredmény mentésének helye. Amennyibenfalse
, nem lehet publikálni adeteceted_objects
topic-ra -
save_dir
: Ha asave_results
paramétertrue
, akkor itt adhatjuk meg a mentés helyét, alapértelmezett értéke a/det_results
-
view_img
: Eredmények közvetlen megjelenítése (true
vagyfalse
)
-
-
Források támogatása:
- Kamera: Lokális vagy IP alapú kamera adatainak feldolgozása.
- Kép: Egy adott kép gyors elemzése.
- Videó: Folyamatos feldolgozás előre rögzített videók esetén.
WSL-ben
device id
beállítása (pl.: /dev/video0 ) ausbipd
package segítségével valósulhat meg, natív Linux rendszereken erre nincs szükség. A package elérhetősége: https://github.com/dorssel/usbipd-win/wiki/WSL-support -
Objektumdetektálás:
- A node a YOLOv5
detect.py
scriptjét hívja meg a háttérben, miközben több szálon kezeli az adatfeldolgozást.
- A node a YOLOv5
-
-
-
Objektumok detektálása:
- Kép elemzése: Egy kép elemzése során elmenti az ideiglenes képet, majd meghívja a detektálási parancsot.
- Videó elemzése: A teljes videót forrásként használja a YOLO detektáláshoz.
- Kameraképek feldolgozása: Az
Image
üzenetek fogadása során egy feldolgozó hurok kerül végrehajtásra.
-
Aszinkron feldolgozás: A képkockákat és adatokat aszinkron módon kezeli, miközben biztosítja, hogy a jelenleg futó folyamat ne akadjon el.
-
Eredmények kezelése és publikálása: A detektálási eredményeket
.txt
fájlokból olvassa ki, amelyeket azutánstd_msgs::msg::String
formájában publikál a/detected_objects
topikon. -
Kimeneti struktúra: Az eredményeket a mentett
exp
mappák alapján dolgozza fel, és azonosítja a legutóbb frissített eredményeket.
-
-
Feltételezzük, hogy a workspace
~/ros2_ws/
.cd ~/ros2_ws colcon build --packages-select ros_yolo_model --symlink-install
Környezet source-olása a futtatás előtt!
source ~/ros2_ws/install/setup.bash
A node indítása:
ros2 launch ros_yolo_model detector.launch.py <weights_path> <source_type> <image_path/video_path/camera_ip/camera_id> <save_results> <save_dir> <view_img>
Példa:
ros2 launch ros_yolo_model detector.launch.py weights_path:=/home/ajr/ros2_ws/src/ros_yolo_model/model/fifth_train[cards]/weights/best.pt source_type:=camera camera_ip:=https://192.168.0.168:4747 save_results:=true save_dir:=/home/ajr/ros2_ws/src/ros_yolo_model/det_results view_img:=true
-
- Egy helyi vagy IP-alapú kamera által biztosított videófolyamot olvas be, és az egyes képkockákat ROS 2 topikon keresztül publikálja
sensor_msgs::msg::Image
(bgr8) formátumban.
- Egy helyi vagy IP-alapú kamera által biztosított videófolyamot olvas be, és az egyes képkockákat ROS 2 topikon keresztül publikálja
-
- Paraméterek:
-
use_camera
: Meghatározza, hogy használjon-e a node kamerát -
camera_id
: A helyi kamera azonosítója -
camera_ip
: Egy IP-alapú kamera elérési útja -
fps
: A publikálás gyakorisága képkockák/másodpercben.
-
- Paraméterek:
-
-
Node inicializálása:
- A node betölti a fent említett paramétereket
- Ha a
use_camera
hamis, a csomópont leáll
-
Forrás kiválasztás:
- Ha a
camera_ip
paraméter meg van adva, akkor IP-alapú kamera lesz a forrás. - Ha az
camera_ip
üres, akkor helyi kamerát használ
- Ha a
-
Kapcsolódás a kamerához:
- A node megpróbálja megnyitni a megadott forrást. Ha nem sikerül, a node logüzenetet küld, majd leáll
-
Időzített publikálás:
- A node egy időzítőt állít be az fps alapján, amely rendszeresen meghívja a
publishFrame()
metódust
- A node egy időzítőt állít be az fps alapján, amely rendszeresen meghívja a
-
Képkocka publikálása:
- A kamerától érkező képkockákat
OpenCV
segítségével dolgozza fel - A képkockát ROS formátumú üzenetté alakítja a
cv_bridge
könyvtárral - A képkockát publikálja az
image
nevű topikra
- A kamerától érkező képkockákat
-
-
Ez automatikusan hívódik meg, amennyiben a
detector_node
-ban asource_type
paramétercamera
értéket kap
-
- Dummy hallgatói- és alkalmazotti kártyák generálása
-
-
Bemeneti adatok és sablonok kezelése: A node indulásakor betölti a szükséges adatokat és fájlokat, például:
- Kártyák sablonjai (hallgatói- és alkalmazotti sablonok)
- Igazolvénykép és vonalkód képek
- Attribútumok, mint nevek, ID-k és egyedi kódok
A fájlok és útvonalak kezelése a
package_path()
függvénnyel történik, ami dinamikusan meghatározza a csomagon belüli relatív elérési útvonalat
-
Kombinációk generálása:
- A node nem használ hagyományos beágyazott ciklusokat, hanem a kombinációk számítását indexelési logika alapján oldja meg. Ez lehetővé teszi:
- Az összes lehetséges kombináció gyors generálását a sablonok és attribútumok között
- A kód egyszerűsítését és a skálázhatóság növelését
- A node nem használ hagyományos beágyazott ciklusokat, hanem a kombinációk számítását indexelési logika alapján oldja meg. Ez lehetővé teszi:
-
Attribútumok pozicionálása és megjelenítése: A
cv::Mat
és acv::freetype
könyvtárak segítségével a következő elemek kerülnek megjelenítésre a kártyákon:- Név: A megfelelő helyen jelenik meg a sablon típusától függően
- Kártya- és ID-szám: Egyedi azonosítók a sablon típusához igazított pozíciókban
- Igazolványkép: A sablon típusának megfelelő elhelyezéssel hallgatói- vagy alkalmazotti kártyákon
- Vonalkód: Előre generált vonalkód képek pozicionálva
A sablon és attribútum típusának ellenőrzése feltételes logikával történik, például a
find("student")
metódus segítségével -
Kimenet mentése: A generált kártyákat a megadott kimeneti könyvtárba menti:
- A kártyák neve
card<number>.png
formátumban kerül elmentésre, ahol<number>
egy növekvő index - A kimeneti könyvtárat a rendszer automatikusan létrehozza, ha az nem létezik
- A kártyák neve
-
Felhasználói értesítések: A node folyamatosan tájékoztatja a felhasználót a következőkről:
- A generálás állapota és hibák (például hiányzó fájlok)
- A generált kártyák elérési útjai
-
-
-
Dinamikus kombinációkezelés:
- Egyedi algoritmus gondoskodik arról, hogy minden lehetséges attribútumkombináció kártyára kerüljön
-
Sablonok kezelése:
- Külön diák- és dolgozói kártya elrendezések támogatottak
-
Skálázhatóság:
- Új attribútumok vagy sablonok hozzáadása könnyedén bővíti a generált kártyák számát
-
Hibakezelés:
- Hiányzó fájlok esetén a rendszer értesíti a felhasználót, és megakadályozza az érvénytelen kártyák generálását
-
-
Feltételezzük, hogy a workspace
~/ros2_ws/
.cd ~/ros2_ws colcon build --packages-select ros_yolo_model --symlink-install
Környezet source-olása a futtatás előtt!
source ~/ros2_ws/install/setup.bash
A node indítása:
ros2 run ros_yolo_model card_gen_node
-
- Egy automatizált rendszer kialakítása, amely kártyaképeket kombinál véletlenszerű háttérképekkel
-
- Kártyaképek és háttérképek betöltése adott mappákból (A használt hátterek az
img/background_samples
mappában találhatóak.) - Kártyák átméretezése, elforgatása és véletlenszerű elhelyezése a háttéren
- Az eredmény mentése új képfájlokba
- Kártyaképek és háttérképek betöltése adott mappákból (A használt hátterek az
-
-
Konstruktor:
-
Paraméterek:
cards_dir
(kártyaképek mappa) ésoutput_dir
(kimeneti mappa) - A kártya- és háttérképek betöltése a megadott mappákból
- Input mappa ürességének ellenőrzése
-
Paraméterek:
-
getter
éssetter
metódusok:- Getterek a kártyák, hátterek és az output mappa eléréséhez.
-
setCardsDir
: Kártyaképek újr betöltése, átalakítása RGBA formátumba, ha szükséges. -
setOutputDir
: Az output mappa frissítése.
-
Augmentáció:
-
augmentCard
: Egy kártyakép véletlenszerű átméretezése, elforgatása, és egy háttérkép véletlenszerű pontjára helyezése.- Átlátszósági csatornával dolgozik, így csak a nem átlátszó pixelek kerülnek rá a háttérre
- A kártyák és hátterek arányainak dinamikus kezelése, hogy minden generált kép egyedi legyen
-
-
Mentés:
-
saveGeneratedImage
: A generált képeket JPEG formátumban történe mentése az output mappába,generated_image_new_X.jpg
formátumú névvel
-
-
-
- A kártya augmentálása kiterjesztve: minden háttérre véletlenszerűen két kártya elhelyezése (csak egy is lehetséges)
- A második kártya véletlenszerű kiválasztása a kártyák listájából
-
- Az input mappák érvényességének és létezésének ellenőrzése
- Az
ROS2
node létrehozása és aprocessAllCards
függvény meghívása - Generált képek mentése az
output
mappába
-
- Az üres képek vagy hibás útvonalak esetén figyelmeztetések kiírása az
RCLCPP_ERROR
vagyRCLCPP_WARN
segítségével - Bármelyik szükséges mappa üressége esetén a program leállítása
- Az üres képek vagy hibás útvonalak esetén figyelmeztetések kiírása az
-
Feltételezzük, hogy a workspace
~/ros2_ws/
.cd ~/ros2_ws colcon build --packages-select ros_yolo_model --symlink-install
Környezet source-olása a futtatás előtt!
source ~/ros2_ws/install/setup.bash
A node indítása:
ros2 run ros_yolo_model card_augmenter_node <input_cards> <output_images>
Példa:
ros2 run ros_yolo_model card_augmenter_node /home/ajr/ros2_ws/src/ros_yolo_model/generated_cards /home/ajr/ros2_ws/src/ros_yolo_model/final_cards
-
- Egy olyan kiegészítő függvény, melynek segítségével a többi node-ban - ahol szükséges - megkaphatjuk a
package
-ünk elérési útvonalát
- Egy olyan kiegészítő függvény, melynek segítségével a többi node-ban - ahol szükséges - megkaphatjuk a
-
- Az
ament_index_cpp
könyvtárget_package_share_directory()
függvényével megkapjuk a csomagunk megosztott elérési útját. Fájlrendszer navigációs parancsok segítségével innen eljutunk a csomagunk tényleges mappájába. Ezt az útvonalat adja vissza a függvény.
- Az
-
Ez nem egy tényleges
node
, hanem egy függvény, amely a többi node funkcióinak kibővítése miatt szükséges
A roboflow segítségével történt a labeling, az alaposztályok a PASCAL VOC 2012
dataset-ből származnak, a többi képet is ezek segítségével generáltuk és raktuk rá a kártyákat. Tanítástól függően ~13.000-14.000 kép nagyságú datasetet használtunk, ettől csak pár esetben tértünk el tesztelés céljából. A főbb tanítások, amiket részletezni fogunk, 70% train és 30% valid splittel történtek, test set-et nem alkalmaztunk. A nagyon sikertelen tanításokat nem részletezzük, maximum említés szintjén, ha az tanulságos volt és hasznos információkat tudtunk meg belőlük.
Az alapobjektumokra irányuló első tanítás célja az volt, hogy jobban megértsük a tanítás menetét, a YOLOv5 modellel való munkát, valamint az egyedi hiperparaméterek beállításainak hatásait. Ezen kívül az optimális batch és epoch számok meghatározása, valamint az eredmények értékelésének elsajátítása is fontos része volt a folyamatnak. A tanítás során különös figyelmet fordítottunk az objektumok közötti megkülönböztetés finomhangolására. Itt még nem voltak se hallgatói, se alkalmazotti kártyák a datasetben.
- Confusion matrix: A mátrix alapján az alapobjektumok (pl. aeroplane, train) relatív pontossága kiemelkedő volt, ugyanakkor néhány osztály esetében, mint például a "chair" vagy "bottle", alacsonyabb felismerési pontosságot tapasztaltunk.
- Precision-Recall görbe: Az egyes osztályok felismerése között eltérő teljesítmény mutatkozott meg. A Train osztály magas precízióval és recall értékkel rendelkezett, míg például a Chair alacsonyabb teljesítményt mutatott.
- Tanulási görbék: Az opt.yaml és a hyp.yaml beállítások alapján gyors konvergenciát figyeltünk meg, ami arra utal, hogy a tanítás során a modell gyorsan alkalmazkodott az adatokhoz.
Ebben a tanítási lépésben az első modell további finomhangolására összpontosítottunk, kizárólag az alapobjektumokkal. Az új hiperparaméterek célja az volt, hogy javítsuk az általános teljesítményt és az osztályok közötti különbségtételt, különösen az alacsonyabb pontosságot mutató osztályok esetében.
Batch méret: 16 Epoch: 20 Tanulási ráta: lr0: 0.001, lrf: 0.01 Momentum: 0.937 Weight decay: 0.0005 IOU threshold: iou_t: 0.2Mosaic: 1.0 Flip horizontálisan (fliplr): 0.5 Eltolás (translate): 0.1 Skálázás (scale): 0.5
Pontosság ([email protected]): 0.656 az összes osztályra Kiválasztott objektumok felismerési metrikái: Aeroplane: 0.779 Bird: 0.664 TV Monitor: 0.671 Train: 0.894 Sheep: 0.728- Confusion Matrix: A mátrix alapján több osztályban tapasztaltunk előrelépést az első tanításhoz képest. Az "Aeroplane" és "Train" osztályok továbbra is magas teljesítményt mutattak, azonban a "Chair" és "Bottle" osztályok felismerése még mindig fejlesztést igényel.
- Precision-Recall görbe: A PR-görbén jól látható, hogy bizonyos osztályok, például a "Train" és "Aeroplane", magas precízióval és recall értékekkel rendelkeztek, míg a "Chair" és "Sofa" osztályok teljesítménye alacsonyabb volt.
- Tanulási görbék: Az opt.yaml és hyp.yaml beállítások módosítása után gyorsabb konvergencia figyelhető meg, jelezve a modell jobb alkalmazkodását az adatokhoz. Az augmentációk (mosaic és fliplr) jelentős hatást gyakoroltak a modell teljesítményére.
A harmadik tanítási lépés során tovább finomhangoltuk az első modellünket. A cél az volt, hogy javítsuk az általános felismerési teljesítményt az alacsonyabb pontosságot mutató osztályok esetében, valamint tovább csökkentsük a különböző objektumosztályok közötti összetévesztést. Ehhez módosítottunk néhány hiperparamétert és augmentációt, valamint növeltük az epoch számot a hosszabb tanítás érdekében.
Batch méret: 16 Epoch: 50 Tanulási ráta: lr0: 0.001 lrf: 0.01 Momentum: 0.937 Weight decay: 0.0005 IOU threshold: iou_t: 0.2 Mosaic: 1.0 Flip horizontálisan (fliplr): 0.5 Eltolás (translate): 0.1 Skálázás (scale): 0.5 Pontosság ([email protected]): 0.655 az összes osztályra Aeroplane: 0.73 Bird: 0.64 TV Monitor: 0.65 Train: 0.78 Sheep: 0.72- Confusion Matrix: A mátrix alapján jelentős fejlődést tapasztaltunk néhány osztály teljesítményében, például az Aeroplane és Train osztályokban, azonban néhány osztály, mint a Chair vagy Sofa, továbbra is fejlesztést igényel. Az osztályok közötti összetévesztések száma csökkent.
- Precision-Recall görbe: A PR-görbén látható, hogy az osztályok teljesítménye változó. Az Aeroplane és Train osztályok továbbra is kiemelkedően teljesítenek, míg például a Bottle és Chair osztályok teljesítménye alacsonyabb maradt.
- Tanulási görbék: Az opt.yaml és hyp.yaml módosítások után a tanulási görbék azt mutatják, hogy a modell konvergenciája javult. Az augmentációk, mint például a Mosaic és a Fliplr, pozitívan befolyásolták a tanítási folyamatot.