Skip to content

ROS_YOLO_MODEL Wiki

Attila Ötvös edited this page Nov 27, 2024 · 27 revisions

Áttekintés

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.

Működése

1. teach_node

  • Célja:

    • YOLOv5 modell feltanítása egyedi adatkészlet alapján
  • Működése:

    • 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ó)
  • Főbb funkciók:

    • Node inicializálás
    • Tanítási folyamat
    • Hibaellenőrzés
  • Használat:

    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

2. detector_node

  • Célja:

    • 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.
  • Működése:

    • 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 vagy camera_ip: Annak fügvényében kell megadni a megfelelő paramétert, hogy mit adtunk meg source_type-nak
      • save_results: Az eredmény mentésének helye. Amennyiben false, nem lehet publikálni a deteceted_objects topic-ra
      • save_dir: Ha a save_results paraméter true, 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 vagy false)
    • 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 ) a usbipd 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.
  • Főbb funkciók:

    • 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án std_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.


  • Használat:

    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 run 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

3. video_publisher_node

  • Célja:

    • 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.
  • Működése:

    • 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.
  • Főbb funkciók:

    • 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
    • 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
    • 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
  • Használat:

    Ez automatikusan hívódik meg, amennyiben a detector_node-ban a source_type paraméter camera értéket kap

4. card_gen_node

  • Célja:

    • Dummy hallgatói- és alkalmazotti kártyák generálása
  • Működése:

    • 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
    • Attribútumok pozicionálása és megjelenítése: A cv::Mat és a cv::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
    • 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
  • Főbb funkciók:

    • 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
  • Használat:

    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

5. card_augmenter_node

  • Célja:

    • Egy automatizált rendszer kialakítása, amely kártyaképeket kombinál véletlenszerű háttérképekkel
  • Fő feladatai:

    • 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
  • Osztály fő elemei:

    • Konstruktor:

      • Paraméterek: cards_dir (kártyaképek mappa) és output_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
    • getter és setter 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
  • Több kártya kezelése:

    • 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
  • Főprogram:

    • Az input mappák érvényességének és létezésének ellenőrzése
    • Az ROS2 node létrehozása és a processAllCards függvény meghívása
    • Generált képek mentése az output mappába
  • Hibakezelés:

    • Az üres képek vagy hibás útvonalak esetén figyelmeztetések kiírása az RCLCPP_ERROR vagy RCLCPP_WARN segítségével
    • Bármelyik szükséges mappa üressége esetén a program leállítása
  • Használat:

    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

6. get_package_path

  • Célja:

    • 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
  • Működése:

    • Az ament_index_cpp könyvtár get_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.
  • Használat:

    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

Tanítási eredmények, tapasztalatok

Dataset

Clone this wiki locally