21/03/2025
În lumea în continuă evoluție a inteligenței artificiale și a viziunii computerizate, detectarea obiectelor joacă un rol crucial. YOLOv5 (You Only Look Once, versiunea 5) este unul dintre cele mai populare și eficiente cadre pentru această sarcină, oferind o viteză și o precizie remarcabile. Dar ce faci atunci când vrei să detectezi obiecte specifice, care nu sunt incluse în seturile de date preexistente? Răspunsul este antrenarea unui model YOLOv5 pe propriul set de date personalizat. Acest ghid detaliat te va însoți pas cu pas prin întregul proces, de la pregătirea datelor până la evaluarea performanței modelului tău, oferindu-ți instrumentele necesare pentru a-ți construi propriul detector de obiecte personalizat.

- Pregătirea Inițială: Clonați Depozitul și Instalați Dependențele
- Antrenarea pe Date Personalizate: Un Proces Iterativ
- Pasul 1: Crearea Setului de Date Personalizat
- Pasul 2: Selectarea unui Model Pre-antrenat
- Pasul 3: Antrenarea Modelului YOLOv5
- Pasul 4: Vizualizarea și Monitorizarea Rezultatelor
- Următorii Pași după Antrenare
- Medii de Rulare Suportate
- Întrebări Frecvente (FAQ)
Pregătirea Inițială: Clonați Depozitul și Instalați Dependențele
Înainte de a te aventura în antrenarea propriului model YOLOv5, este esențial să pregătești mediul de lucru. Primul pas este clonarea depozitului oficial YOLOv5 de pe GitHub, care conține codul sursă necesar și scripturile de antrenare. Asigură-te că ai instalat Python versiunea 3.7.0 sau o versiune mai nouă, împreună cu PyTorch versiunea 1.7 sau o versiune ulterioară. Acestea sunt cerințe fundamentale pentru buna funcționare a modelului, asigurând compatibilitatea și accesul la cele mai recente optimizări.
git clone https://github.com/ultralytics/yolov5 # clonează depozitul cd yolov5 # intră în director pip install -r requirements.txt # instalează dependențeleAceastă comandă va descărca automat modelele și seturile de date necesare din cea mai recentă versiune YOLOv5, simplificând considerabil procesul de configurare inițială și permițându-ți să te concentrezi pe aspectele specifice ale proiectului tău.
Antrenarea pe Date Personalizate: Un Proces Iterativ
Crearea unui model personalizat capabil să detecteze obiectele tale de interes este un proces iterativ și dinamic. Nu este o acțiune unică, ci o succesiune de pași care se repetă și se îmbunătățesc continuu. Acest ciclu include colectarea și organizarea imaginilor, etichetarea obiectelor de interes, antrenarea modelului, implementarea acestuia pentru a face predicții și, ulterior, utilizarea modelului implementat pentru a colecta exemple de cazuri limită sau de erori. Aceste noi date sunt apoi adăugate la setul de date existent, iar procesul se repetă pentru a îmbunătăți performanța și robustețea modelului în timp. Această abordare iterativă este cheia pentru a construi un model de detectare a obiectelor cu adevărat eficient și adaptabil.
Pasul 1: Crearea Setului de Date Personalizat
Modelele YOLOv5 necesită date etichetate pentru a învăța clasele de obiecte din acele date. Acesta este, probabil, cel mai important și consumator de timp pas, deoarece calitatea și cantitatea datelor tale vor influența direct performanța finală a modelului. Există două abordări principale pentru crearea setului tău de date înainte de a începe antrenarea:
Opțiunea 1: Utilizarea Roboflow pentru Crearea Setului de Date în Format YOLO (Recomandat)
Roboflow este o platformă puternică și ușor de utilizat, care simplifică semnificativ procesul de creare, gestionare și preprocesare a seturilor de date pentru viziune computerizată. Este o soluție excelentă, mai ales pentru proiecte complexe sau echipe care necesită un flux de lucru eficient.
1.1 Colectarea Imaginilor
Modelul tău va învăța prin exemplu. Prin urmare, antrenarea pe imagini similare cu cele pe care le va întâlni în mediul real este de o importanță capitală. Calitatea și diversitatea imaginilor din setul tău de date sunt factori critici. În mod ideal, ar trebui să colectezi o varietate largă de imagini din aceeași configurație (cameră, unghi, iluminare, fundal, condiții meteorologice etc.) în care vei implementa în cele din urmă proiectul. Dacă acest lucru nu este posibil imediat (de exemplu, nu ai încă acces la mediul de implementare), poți începe cu un set de date public pentru a antrena modelul inițial și apoi să eșantionezi imagini din mediul real în timpul inferenței pentru a-ți îmbunătăți iterativ setul de date și modelul. Asigură-te că imaginile tale acoperă toate cazurile posibile pe care modelul le va întâlni.
1.2 Crearea Etichetelor
Odată ce ai colectat imaginile, va trebui să adnotezi obiectele de interes pentru a crea o 'realitate de bază' (ground truth) pe care modelul tău să o învețe. Această etapă implică desenarea unor casete de delimitare în jurul fiecărui obiect și atribuirea unei clase. Roboflow Annotate este un instrument web simplu și eficient pentru gestionarea și etichetarea imaginilor tale, permițând colaborarea în echipă și exportul în formatul de adnotare specific YOLOv5, care este esențial pentru antrenare.

1.3 Pregătirea Setului de Date pentru YOLOv5
Indiferent dacă etichetezi imaginile cu Roboflow sau nu, poți folosi platforma pentru a-ți converti setul de date în format YOLO, a crea un fișier de configurare YAML pentru YOLOv5 și a-l găzdui pentru import în scriptul tău de antrenare. Acest lucru simplifică mult procesul de pregătire a datelor. Creează un cont gratuit Roboflow și încarcă-ți setul de date într-un spațiu de lucru public, etichetează orice imagini neadnotate, apoi generează și exportă o versiune a setului tău de date în format YOLOv5 PyTorch.
Notă importantă: YOLOv5 realizează augmentare online în timpul antrenării, așa că nu este recomandat să aplici pași de augmentare în Roboflow pentru antrenarea cu YOLOv5. În schimb, se recomandă aplicarea următoarelor pași de preprocesare:
- Auto-Orient: Pentru a elimina orientarea EXIF din imagini, asigurându-te că imaginile sunt corect orientate.
- Redimensionare (Stretch): La dimensiunea pătrată de intrare a modelului tău (640x640 este implicitul YOLOv5). Această redimensionare uniformă este crucială pentru consistența datelor de intrare.
Generarea unei versiuni îți va oferi o imagine la un moment dat a setului tău de date, astfel încât să poți oricând să te întorci și să compari rulările viitoare de antrenare ale modelului cu aceasta, chiar dacă adaugi mai multe imagini sau îi modifici configurația ulterior. Exportă în format YOLOv5 PyTorch, apoi copiază fragmentul de cod în scriptul sau notebook-ul tău de antrenare pentru a descărca setul de date direct în mediul tău de lucru.
Opțiunea 2: Pregătirea Manuală a Setului de Date
Dacă preferi o abordare manuală sau ai deja datele într-un format compatibil, poți pregăti setul de date direct, având control complet asupra fiecărui aspect.
1.1 Crearea fișierului dataset.yaml
Acest fișier de configurare a setului de date este esențial și definește căile către directoarele de imagini pentru antrenare, validare și testare, precum și un dicționar cu numele claselor. Un exemplu clasic este data/coco128.yaml, care definește structura pentru un set de date tutorial mic. Asigură-te că adaptezi aceste căi și nume de clase la propriul set de date, reflectând structura exactă a fișierelor tale.
# Seturi de antrenare/validare/testare ca 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, sau 3) list: [path/to/imgs1, path/to/imgs2, ..] path: ../datasets/coco128 # directorul rădăcină al setului de date train: images/train2017 # imagini de antrenare (relative la 'path') 128 imagini val: images/train2017 # imagini de validare (relative la 'path') 128 imagini test: # imagini de test (opțional) # Clase (80 clase COCO) names: 0: person 1: bicycle 2: car # ... (lista completă de clase) 77: teddy bear 78: hair drier 79: toothbrush1.2 Crearea Etichetelor
După utilizarea unui instrument de adnotare (cum ar fi LabelImg sau propriile scripturi) pentru a eticheta imaginile, exportă etichetele în format YOLO. Aceasta înseamnă un fișier .txt pentru fiecare imagine (dacă nu există obiecte în imagine, nu este necesar un fișier .txt). Specificațiile fișierului .txt sunt:
- Un rând pentru fiecare obiect detectat.
- Fiecare rând este în formatul
clasă x_centru y_centru lățime înălțime. - Coordonatele casetei trebuie să fie în format xywh normalizat (de la 0 la 1). Aceasta înseamnă că valorile sunt proporționale cu dimensiunea imaginii. Dacă casetele tale sunt în pixeli, împarte
x_centrușilățimela lățimea imaginii, iary_centrușiînălțimela înălțimea imaginii. - Numerele claselor sunt indexate de la zero (încep de la 0), corespunzând ordinii din fișierul
dataset.yaml.
1.3 Organizarea Directorilor
Organizează imaginile și etichetele de antrenare și validare conform structurii așteptate de YOLOv5. De obicei, YOLOv5 presupune că directorul setului tău de date (de exemplu, /coco128) se află într-un director /datasets lângă directorul /yolov5. YOLOv5 localizează etichetele automat pentru fiecare imagine, înlocuind ultima instanță a /images/ din fiecare cale a imaginii cu /labels/. De exemplu:
../datasets/nume_set_date/images/imagine001.jpg # imagine ../datasets/nume_set_date/labels/imagine001.txt # etichetă corespondentăRespectarea acestei structuri este crucială pentru ca scriptul de antrenare să găsească corect datele și să le asocieze corespunzător.
| Aspect | Roboflow (Recomandat) | Pregătire Manuală |
|---|---|---|
| Complexitate | Simplificat, cu interfață web intuitivă | Necesită mai multe cunoștințe tehnice și organizare meticuloasă |
| Etichetare | Instrument web dedicat, colaborare eficientă | Necesită instrumente externe, proces manual laborios |
| Format Date | Export direct în format YOLOv5 PyTorch | Conversie și verificare manuală a formatului YOLO |
| Preprocesare | Auto-Orient, Redimensionare automată | Necesită scripturi personalizate și multă atenție |
| Găzduire | Găzduire în cloud și acces ușor la setul de date | Gestionare locală, fără capabilități de găzduire integrate |
| Recomandat pentru | Proiecte noi, echipe, rapiditate și eficiență | Utilizatori avansați, control complet, date sensibile |
Pasul 2: Selectarea unui Model Pre-antrenat
Pentru a începe antrenarea, este recomandat să selectezi un model pre-antrenat. Aceste modele au fost deja antrenate pe seturi de date mari, cum ar fi COCO (Common Objects in Context), și pot servi ca un excelent punct de plecare (transfer learning), accelerând convergența și îmbunătățind semnificativ performanța pe setul tău de date personalizat. Prin transfer learning, modelul beneficiază de cunoștințele vaste dobândite din seturi de date mari, aplicându-le la sarcina ta specifică.
De exemplu, poți selecta YOLOv5s, care este unul dintre cele mai mici și mai rapide modele disponibile, ideal pentru a începe, mai ales dacă ai resurse limitate sau necesiți o inferență rapidă. Există o gamă variată de modele YOLOv5 (nano, small, medium, large, xlarge), fiecare cu compromisuri diferite între viteză și precizie. Alegerea depinde de cerințele specifice ale proiectului tău, cum ar fi latența dorită și precizia necesară.

Pasul 3: Antrenarea Modelului YOLOv5
Odată ce setul de date este pregătit și ai ales un model, ești gata să inițiezi procesul de antrenare. Acest lucru se face prin rularea scriptului train.py din directorul YOLOv5, specificând anumiți parametri care definesc comportamentul antrenării.
Comanda de Antrenare
Pentru a antrena un model YOLOv5, de exemplu YOLOv5s, pe setul tău de date (să presupunem că ai un fișier nume_set_date.yaml configurat conform Pasului 1), vei folosi o comandă similară cu aceasta:
python train.py --img 640 --batch 16 --epochs 300 --data nume_set_date.yaml --weights yolov5s.ptSă detaliem argumentele cheie pentru a înțelege semnificația fiecăruia:
--img 640: Specificați dimensiunea imaginilor de intrare pentru antrenare (de exemplu, 640x640 pixeli). Aceasta este o dimensiune implicită și eficientă pentru YOLOv5, optimizată pentru performanță.--batch 16: Definește dimensiunea lotului (batch size), adică numărul de imagini procesate simultan de model în fiecare pas al antrenării. O dimensiune mai mare a lotului poate accelera antrenarea și poate duce la o convergență mai stabilă, dar necesită mai multă memorie GPU. Ajustează această valoare în funcție de resursele tale hardware.--epochs 300: Setează numărul de epoci (treceri complete prin întregul set de date) pentru antrenare. Un număr mai mare de epoci duce la o antrenare mai aprofundată, permițând modelului să învețe mai bine, dar poate crește riscul de supraînvățare (overfitting) dacă nu este monitorizat corespunzător.--data nume_set_date.yaml: Specifică calea către fișierul de configurare YAML al setului tău de date, creat la Pasul 1. Acest fișier indică unde se găsesc imaginile și etichetele, precum și numele claselor.--weights yolov5s.pt: Indică utilizarea ponderilor pre-antrenate ale modelului YOLOv5s. Aceasta este abordarea recomandată (transfer learning) pentru a beneficia de învățarea anterioară a modelului pe seturi de date mari, ceea ce accelerează antrenarea și îmbunătățește performanța. Alternativ, poți începe cu ponderi aleatorii folosind--weights '' --cfg yolov5s.yaml, dar acest lucru nu este recomandat, deoarece antrenarea de la zero este mult mai lentă și mai dificilă, necesitând un set de date mult mai mare și mai mult timp.
Sfaturi Pro pentru Antrenare
Pentru a optimiza procesul de antrenare și a reduce timpul necesar, ia în considerare următoarele sfaturi:
- Adaugă
--cache ramsau--cache diskpentru a accelera antrenarea. Acest lucru stochează imaginile în memorie RAM sau pe disc, reducând timpul de citire I/O de pe unitatea de stocare, dar necesită resurse semnificative de memorie sau spațiu pe disc. - Antrenează întotdeauna de pe un set de date local. Unitățile montate sau de rețea, cum ar fi Google Drive, vor fi extrem de lente și vor încetini considerabil procesul de încărcare a datelor, afectând performanța antrenării.
Toate rezultatele antrenării sunt salvate în directorul runs/train/, cu directoare de rulare incrementale pentru fiecare experiment, de exemplu runs/train/exp2, runs/train/exp3 etc. Fiecare director expX va conține log-urile detaliate, ponderile modelului (inclusiv best.pt și last.pt) și vizualizările rezultatelor, permițându-ți să urmărești progresul și să analizezi performanța.
Pasul 4: Vizualizarea și Monitorizarea Rezultatelor
Monitorizarea progresului antrenării și analiza rezultatelor sunt esențiale pentru a înțelege performanța modelului tău, pentru a identifica zonele de îmbunătățire și pentru a lua decizii informate cu privire la ajustările necesare.
Jurnalizare și Vizualizare Locală
Rezultatele antrenării sunt înregistrate automat cu Tensorboard și loggers CSV în directorul runs/train. Un nou director de experiment este creat pentru fiecare antrenare nouă, cum ar fi runs/train/exp2, runs/train/exp3, etc. Această structură organizată te ajută să urmărești și să compari diferite experimente.
Acest director conține statistici detaliate de antrenare și validare, mozaicuri (imagini combinate din setul de date), etichete, predicții și mozaicuri augmentate, precum și metrici și grafice esențiale, inclusiv curbele precizie-rechemare (PR) și matricile de confuzie. Aceste vizualizări sunt instrumente puternice pentru a înțelege comportamentul modelului.
Fișierul results.csv este actualizat după fiecare epocă, conținând metricile numerice ale antrenării. După finalizarea antrenării, aceste date sunt plotate automat într-o imagine numită results.png, oferind o privire de ansamblu rapidă asupra progresului. Poți, de asemenea, să plotezi manual orice fișier results.csv folosind codul:
from utils.plots import plot_results plot_results('cale/catre/results.csv') # plotează 'results.csv' ca 'results.png'Jurnalizare și Vizualizare Avansată (Comet & ClearML)
Pentru o monitorizare mai avansată, colaborare în echipă și gestionare a experimentelor la scară largă, YOLOv5 este integrat cu platforme puternice precum Comet și ClearML.
Comet Logging și Vizualizare
Comet este acum complet integrat cu YOLOv5, oferind o experiență de urmărire a experimentelor de ultimă generație. Poți urmări și vizualiza metricile modelului în timp real, poți salva hiperparametrii, seturile de date și punctele de control ale modelului, și poți vizualiza predicțiile modelului cu panouri personalizate. Comet te asigură că nu pierzi niciodată evidența muncii tale și facilitează partajarea rezultatelor și colaborarea în echipe de orice dimensiune. Pentru a începe, instalează biblioteca și configurează-ți cheia API:
pip install comet_ml # 1. instalează export COMET_API_KEY=<Cheia Ta API> # 2. inserează cheia API python train.py --img 640 --epochs 3 --data coco128.yaml --weights yolov5s.pt # 3. antreneazăClearML Logging și Automatizare
ClearML este de asemenea integrat complet în YOLOv5 pentru a urmări experimentele, a gestiona versiunile seturilor de date și chiar a executa de la distanță rulări de antrenare. Acest lucru este extrem de util pentru automatizarea fluxurilor de lucru și pentru asigurarea reproductibilității experimentelor. Pentru a activa ClearML, instalează biblioteca și inițializează-o:
pip install clearmlRulează clearml-init pentru a te conecta la un server ClearML (poți implementa propriul server open-source sau utiliza serverul lor găzduit gratuit). Vei obține toate funcționalitățile așteptate de la un manager de experimente: actualizări în direct, încărcare model, comparație de experimente. ClearML urmărește, de asemenea, modificările necomise și pachetele instalate, ceea ce face ca sarcinile ClearML să fie reproductibile pe diferite mașini. Cu o singură linie suplimentară, poți programa o sarcină de antrenare YOLOv5 într-o coadă pentru a fi executată de orice număr de agenți ClearML, transformând antrenarea într-un proces scalabil și eficient.

Următorii Pași după Antrenare
Odată ce modelul tău este antrenat și ai obținut cel mai bun punct de control (de obicei fișierul best.pt salvat în directorul de rezultate), poți folosi acest model pentru o varietate de sarcini și pentru a continua ciclul de îmbunătățire:
- Rularea Inferenței: Aplică modelul pe imagini și videoclipuri noi, fie prin interfața de linie de comandă (CLI), fie prin scripturi Python, pentru a obține predicții în timp real sau offline. Aceasta este etapa în care modelul tău detectează obiectele în datele nevăzute.
- Validarea Preciziei: Evaluează acuratețea finală a modelului pe seturile de date de antrenare, validare și testare. Această etapă este crucială pentru a înțelege performanța sa pe date nevăzute și pentru a identifica eventualele probleme de supraînvățare sau subînvățare.
- Exportul Modelului: Convertește modelul în diverse formate optimizate pentru implementare, cum ar fi TensorFlow, Keras, ONNX, TFlite, TF.js, CoreML și TensorRT. Acest lucru îți permite să implementezi modelul pe o gamă largă de dispozitive și platforme, de la servere cloud la dispozitive edge.
- Evoluția Hiperparametrilor: Ajustează hiperparametrii antrenării (cum ar fi rata de învățare, dimensiunea lotului, optimizatorul, strategiile de augmentare) pentru a îmbunătăți și mai mult performanța modelului. Acest proces poate fi automatizat folosind tehnici de optimizare a hiperparametrilor.
- Îmbunătățirea Iterativă: Colectează exemple de imagini din lumea reală pe care modelul le-a prezis greșit sau le-a ratat, adaugă-le la setul tău de date existent, adnotează-le și reantrenează modelul. Acest ciclu continuu de feedback este esențial pentru a construi un model robust, capabil să gestioneze o varietate de scenarii și condiții din mediul real.
Medii de Rulare Suportate
YOLOv5 poate fi rulat eficient în oricare dintre următoarele medii verificate și actualizate, care includ toate dependențele necesare, cum ar fi CUDA/CUDNN (pentru accelerare GPU), Python și PyTorch preinstalate. Asigură-te că mediul tău de dezvoltare respectă aceste cerințe pentru a evita probleme de compatibilitate și a beneficia de performanța optimă, în special dacă utilizezi accelerare GPU, care este esențială pentru antrenarea eficientă a modelelor de deep learning. Verifică periodic compatibilitatea cu cele mai recente versiuni ale acestor biblioteci pentru a te asigura că beneficiezi de cele mai noi optimizări și funcționalități.
Întrebări Frecvente (FAQ)
Ce este YOLOv5 și de ce ar trebui să-l folosesc?
YOLOv5 este o familie de modele de detectare a obiectelor în timp real, dezvoltată de Ultralytics. Este renumit pentru echilibrul său excelent între viteză și precizie, făcându-l ideal pentru aplicații care necesită inferență rapidă, cum ar fi vehicule autonome, sisteme de supraveghere video, robotică sau analize de imagini medicale. Este, de asemenea, relativ ușor de utilizat și de personalizat, având o comunitate activă și o documentație bogată.
De ce este important să antrenez pe un set de date personalizat?
Antrenarea pe un set de date personalizat îți permite să adaptezi modelul YOLOv5 pentru a detecta obiecte specifice, relevante pentru cazul tău de utilizare, care ar putea să nu fie prezente sau să nu fie suficient de bine reprezentate în seturile de date publice mari. Modelele pre-antrenate sunt excelente pentru sarcini generale, dar pentru a obține o precizie ridicată pe obiecte nișă, în condiții specifice (cum ar fi iluminare slabă, unghiuri neobișnuite) sau pentru a diferenția subtil între obiecte similare, este esențială adaptarea modelului cu date proprii, specifice domeniului tău.
Ce înseamnă formatul YOLO pentru etichete și de ce este important?
Formatul YOLO pentru etichete este un standard simplu și eficient pentru descrierea casetelor de delimitare (bounding boxes) în imagini. Fiecare fișier text corespunde unei imagini și conține pe fiecare rând clasa obiectului (un număr întreg indexat de la zero), urmată de coordonatele normalizate ale centrului (x, y) și dimensiunile (lățime, înălțime) ale casetei. Acest format este crucial deoarece modelul YOLOv5 este proiectat să învețe direct din aceste reprezentări numerice, permițând o antrenare rapidă și eficientă. Normalizarea coordonatelor face ca etichetele să fie independente de dimensiunea imaginii, facilitând redimensionarea și augmentarea.
Cât timp durează antrenarea unui model YOLOv5?
Durata antrenării variază considerabil în funcție de mai mulți factori: dimensiunea și complexitatea setului de date (numărul de imagini, numărul și densitatea obiectelor, numărul de clase), numărul de epoci specificate, dimensiunea lotului (batch size), modelul ales (YOLOv5s, YOLOv5m, YOLOv5x etc.) și, cel mai important, resursele hardware disponibile (CPU vs. GPU, tipul și cantitatea de memorie VRAM a GPU-ului). O antrenare pe un GPU modern (de exemplu, NVIDIA Tesla T4 sau A100) poate dura de la câteva ore la câteva zile, în timp ce pe un CPU, același proces poate dura săptămâni sau chiar luni, făcând GPU-ul indispensabil pentru antrenarea eficientă.
Cum interpretez rezultatele antrenării (metrici, grafice)?
Rezultatele antrenării sunt cruciale pentru a evalua performanța modelului. Metricile cheie includ:
mAP (mean Average Precision): O măsură agregată a preciziei modelului pe toate clasele și la diferite praguri de intersecție-peste-uniune (IoU).[email protected]este mAP la un prag IoU de 0.5 (considerat adesea pragul standard pentru detectarea obiectelor), iar[email protected]:0.95este media mAP-urilor calculate la diferite praguri IoU (de la 0.5 la 0.95, cu pași de 0.05), oferind o evaluare mai robustă a preciziei.Precision: Proporția de predicții pozitive corecte din totalul predicțiilor pozitive efectuate de model. O precizie ridicată înseamnă puține alarme false.Recall: Proporția de obiecte reale detectate corect din totalul obiectelor reale prezente în setul de date. Un recall ridicat înseamnă că modelul nu ratează multe obiecte.
Graficele precum curbele PR (Precision-Recall), matricele de confuzie și graficele de pierdere (loss) oferă o vizualizare detaliată a modului în care modelul învață și performează pe parcursul antrenării, ajutându-te să detectezi supraînvățarea sau subînvățarea.
Dacă vrei să descoperi și alte articole similare cu Antrenare YOLOv5: Ghid Pas cu Pas pentru Date Custom, poți vizita categoria Fitness.
