Atviras tiekimas Mūsų realiuoju laiku AAP aptikimo mobilioji programėlė

„Spritle“ programinės įrangos inžinerijos komanda
Darbo sauga nediskutuojama. Tačiau rankinis saugos atitikties stebėjimas yra lėtas, nenuoseklus ir nekeičiamas. Sukūrėme realaus laiko asmeninių apsaugos priemonių (AAP) aptikimo programą, kuri veikia tik jūsų išmaniajame telefone – jokio debesies, brangios aparatinės įrangos, jokių delsų.
Problema, kurią sprendžiame
Kiekvienais metais tūkstančiai nelaimingų atsitikimų darbo vietoje įvyksta dėl to, kad darbuotojai nedėvi tinkamų saugos priemonių. Statybvietėms, gamybos grindims ir pramoninėms patalpoms reikia greito grįžtamojo ryšio, o ne dienos pabaigos audito ataskaitų.
Tradiciniai sprendimai reikalauja:
- Pataisytos CCTV kameros su brangiu debesų apdorojimu
- Interneto ryšys nuotolinėse darbo vietose
- Speciali aparatinė įranga arba serveriai
- Minutės vėluoja prieš įsijungiant įspėjimui
Mes norėjome tai įrodyti sudėtingas kompiuterinis vaizdas gali veikti tik Android telefonesuteikiant tiesioginį grįžtamąjį ryšį tuo metu, kai įvyksta saugos pažeidimas.
Kodėl mes tai atviri
Kai pradėjome šį projektą, darėme tai, ką daro kiekvienas inžinierius – ieškojome jau egzistuojančio atvirojo kodo diegimo.
„GitHub“ radome daug AAP aptikimo projektų. YOLO modeliai, Python scenarijai, Roboflow duomenų rinkiniai, kolbos prietaisų skydeliai. Kompiuterinio matymo pusė buvo gerai uždengta. Tačiau kai ieškojome a pilna, paruošta paleisti „Android“ programa– kažkas, ką galėtum klonuoti, sukurti ir nukreipti telefono kamerą į darbuotoją – to tiesiog nebuvo.
Kiekvienas projektas, kurį radome, turėjo tą pačią problemą. Sukurta Raspberry Pi. Veikia nešiojamajame kompiuteryje su OpenCV. Reikia serverio fone. Priklauso nuo debesies API. Puikios demonstracinės versijos, bet nė viena iš jų neveikė neprisijungus prie telefono kišenėje.
Niekas neperėmė AAP modelio iki vietinės „Android“ programos su realiuoju laiku įrenginyje daroma išvada. Visada trūkdavo paskutinės mylios.
Taigi sukūrėme patys – apmokėme modelį, eksportavome jį į TFLite, prijungėme prie „CameraX“ dujotiekio ir pradėjome veikti 30 FPS greičiu vidutinės klasės „Android“ telefone be interneto.
Ir kadangi mes negalėjome jo rasti tada, kai mums jo reikėjo, mes jį pateikiame, kad kitai komandai nereikėtų ieškoti tos pačios paieškos.
Ką aptinka
Programa realiu laiku aptinka 5 pagrindines AAP klases:
✅ šalmas — darbuotojas dėvi kietą kepurę
⚠️ be šalmo — darbuotojas NEdėvi kietos kepurės ← kritiškiausias
✅ liemenė — darbuotojas dėvi apsauginę liemenę
⚠️ be liemenės — darbuotojas NEdėvi apsauginės liemenės
👤 asmuo – bet kuris asmuo kadre
Klasės be šalmo ir be liemenių yra svarbiausios – jos įjungia saugos įspėjimą.
Visas Tech Stack
Kaip visa tai dera


Gilus nardymas: kiekvienas komponentas
1. Duomenų rinkinys – Roboflow konstrukcijos sauga
Naudojome statybos saugos gsnvb duomenų rinkinį iš Roboflow-100 – kuruojamą atvirojo kodo realių statybvietės vaizdų rinkinį.
Duomenų rinkinys: Construction-safety-gsnvb (Roboflow-100)
Vaizdai: 2 424 tikros statybvietės nuotraukos
Padalijimas: Traukinys / patvirtinimas / testas
Klasės: šalmas, be šalmo, liemenė, be liemenės, asmuo
Licencija: CC BY 4.0 (nemokamas komercinis naudojimas)
Kodėl šis duomenų rinkinys? Nes jame yra realaus pasaulio statybvietės vaizdai su darbuotojais skirtingomis apšvietimo sąlygomis, kampais ir atstumais, o ne studijos nuotraukos.
2. Modelis – YOLOv8s
Mes pasirinkome YOLOv8s (mažas variantas) iš Ultralytics įvertinus tris variantus:


Mes pasirinkome yolov8s – geresnis tikslumas nei nano, vis tiek pakankamai greitas, kad būtų galima daryti išvadas realiuoju laiku.
Treniruočių konfigūracija:
//code
from ultralytics import YOLO
model = YOLO('yolov8s.pt') # pretrained on COCO (transfer learning)
results = model.train(
data="data.yaml",
epochs=100,
imgsz=640,
device=0, # GPU
batch=16,
mosaic=1.0, # augmentation
mixup=0.15,
fliplr=0.5,
degrees=10.0,
)
Kodėl mokymąsi perkelti? Užuot treniruotę nuo nulio, pradėjome nuo yolov8s.pt – modelio, jau apmokyto 80 COCO klasių. Tai reiškia, kad modelis jau supranta formas, briaunas ir žmogaus kūnus. Tiesiog tiksliai sureguliavome, kad atpažintume konkrečiai AAP. Tai sumažina treniruočių laiką nuo dienų iki mažiau nei 30 minučių naudojant nemokamą „Colab“ GPU.
3. Modelių mokymas – „Google Colab“ (nemokamas)
Visas mokymo vamzdis bėgo toliau „Google Colab“ nemokamas T4 GPU – nereikia mokėti jokių skaičiavimų.
Treniruočių aplinka:
Platforma: „Google Colab“ (nemokama pakopa)
GPU: NVIDIA T4 (15 GB VRAM)
Veikimo laikas: ~25-30 minučių 100 epochų
Struktūra: Ultralytics 8.4.33
Python: 3.12
Treniruotės progresas (praradimų mažėjimas = modelio mokymasis):
Epocha 1/100 → praradimas: 3,17 mAP50: 0,14
Epocha 10/100 → praradimas: 1,93 mAP50: 0,36
Epocha 50/100 → praradimas: 1,12 mAP50: 0,71
Epocha 100/100 → praradimas: 0,87 mAP50: 0,92 ✅
4. Eksportuoti vamzdyną – PyTorch į TFLite
Po mokymo modelis egzistuoja kaip .pt (PyTorch) failas. „Android“ negali to paleisti tiesiogiai. Eksportuojame į TensorFlow Liteformatas:


from ultralytics import YOLO
model = YOLO('runs/detect/train/weights/best.pt')
model.export(format="tflite")
# Output: runs/detect/train/weights/best_saved_model/best_float32.tflite
TFLite mums davė:
- ~6MB modelis vietoj 22 MB PyTorch svarmenų
- Veikia visiškai įrenginyje – nereikia interneto
- Aparatinis pagreitis per GPU delegatą suderinamuose telefonuose
- 40-60ms išvada vidutinės klasės Android įrenginiuose
5. Android programėlių architektūra
„Android“ programa parašyta Kotlinasnaudojant KameraX prieigai prie fotoaparato ir TFLite vertėjas modelio paleidimui.
android_app/
├── app/
│ └── src/main/
│ ├── assets/
│ │ ├── model.tflite ← your trained PPE model
│ │ └── labels.txt ← class names
│ └── java/com/ppeapp/yolov8tflite/
│ ├── MainActivity.kt ← camera + UI
│ ├── Detector.kt ← TFLite inference
│ ├── BoundingBox.kt ← box data class
│ └── Constants.kt ← model/label paths
Išvados kilpa:


Kodėl „CameraX“ per „Camera2“?
Kamera 2:
Galingas, bet sudėtingas. 1000+ eilučių katilinės.
Konkrečiam įrenginiui būdingos klaidos. Rankinis gyvavimo ciklo valdymas.
CameraX:
Žinodamas gyvavimo ciklą. Veikia vienodai visuose „Android“ įrenginiuose.
Integruota rėmo analizė. 30+ FPS iš dėžutės.
Pasirinkome CameraX. Po paleidimo nėra jokių konkrečiam įrenginiui būdingų fotoaparato klaidų.
6. Failas labels.txt
Šis mažas failas klasių ID susieja su žmonėms suprantamais pavadinimais. Užsakymas turi tiksliai atitikti jūsų treniruočių duomenis.yaml:
šalmas
be šalmo
be liemenės
asmuo
liemenė
Jei ši tvarka neteisinga, modelis parodys tinkamą langelį, bet netinkamą etiketę – pavyzdžiui, nupieškite dėžutę aplink šalmą ir pavadinsite jį „asmeniu“.
Modelio našumas


Išvados greitis: 40–60 ms vienam kadrui (vidutinės klasės „Android“)
FPS: 15-30 FPS, priklausomai nuo įrenginio
Modelio dydis: ~6MB
Min. Android: API 24 (Android 7.0 ir naujesnės versijos)
Kodėl be šalmo tikslumas yra mažesnis? Nes „nėra šalmo“ yra tik žmogaus galva – ji atrodo kaip bet kuris žmogus. Modelis turi išmokti nebuvimą kietos kepurės, o ne jos buvimą. Tai iš esmės sunkesnė kompiuterio regėjimo problema nei išskirtinio geltono šalmo aptikimas.
Ką mes išmokome
1. Maži duomenų rinkiniai turi tikslumo ribas. Turėdami 2 424 vaizdus, pasiekėme lubas maždaug mAP50 ~ 0,92. Asmeninės klasės balai už be šalmo ir be liemenių. Daugiau duomenų yra vienintelis tikras sprendimas.
2. Mokymasis perkelti yra supergalia. Pradedant nuo COCO iš anksto treniruotų svorių, mūsų treniruotės laikas sutrumpėja nuo valandų iki 25 minučių. Modelis jau žinojo, kaip atrodo žmonės – mes tiesiog išmokėme jį, kaip atrodo AAP.
3. TFLite eksportas yra paprastas. Viena kodo eilutė konvertuoja YOLOv8 modelį į TFLite. „Ultralytics“ tvarko visą grafiko optimizavimą ir formato konvertavimą.
4. CameraX paruošta gamybai. Perjungę iš „Camera2“, neturėjome jokių konkrečiam įrenginiui būdingų klaidų. Labai rekomenduoju bet kokiam darbui su Android fotoaparatu.
5. Įrenginys įveikia debesį saugumo sumetimais. Nulinis delsos laikas. Dirba rūsiuose, tuneliuose, atokiose aikštelėse be signalo. Privatumo išsaugojimas – filmuota medžiaga niekada nepalieka įrenginio.
Darbo pradžia
Run the App
# Clone the repo
git clone https://github.com/AarohiSingla/Object-Detection-Android-App.git
# Add your model files to:
# android_app/android_app/app/src/main/assets/
# ├── model.tflite
# └── labels.txt
# Open android_app/android_app in Android Studio
# Connect Android phone (USB debugging on)
# Click Run ▶
Train Your Own Model
# Step 1 — Install
pip install ultralytics roboflow
# Step 2 — Download PPE dataset
from roboflow import Roboflow
rf = Roboflow(api_key="YOUR_KEY")
project = rf.workspace("roboflow-100").project("construction-safety-gsnvb")
dataset = project.version(1).download("yolov8")
# Step 3 — Train
from ultralytics import YOLO
model = YOLO('yolov8s.pt')
model.train(data="data.yaml", epochs=100, imgsz=640, device=0)
# Step 4 — Export to TFLite
model = YOLO('runs/detect/train/weights/best.pt')
model.export(format="tflite")
Licencija ir kreditai
Išleistas pagal MANO licencija — naudoti jį komerciniais tikslais, modifikuoti, išsiųsti.
Sukūrė inžinierių komanda adresu Spritle programinė įranga.
Dėkojame už atvirojo kodo bendruomenes:
Saugykla: github.com/spritle-software/ppe-detection-app
Padarykime darbo vietas saugesne, po vieną kadrą. 🦺



Post Comment
Tik prisijungę vartotojai gali komentuoti.