\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{graphicx}
\usepackage{float}
\usepackage{amsmath, amssymb}
\usepackage{hyperref}
\usepackage{geometry}
\geometry{margin=2.5cm}

\title{Rapport d’avancement -- Développement d’un modèle YOLO personnalisé}
\author{Reihan Mazouz}
\date{\today}

\begin{document}

\maketitle

\tableofcontents
\newpage

\section{Architecture du code}

Le code du projet \texttt{yolo\_perso} est structuré de façon modulaire, facilitant son évolution et sa maintenance. Voici un aperçu des principaux répertoires et de leur rôle :

\vspace{0.5cm}

\noindent \textbf{Structure générale :}
\begin{itemize}
    \item \texttt{models/} : contient les définitions des modèles YOLO. On y trouve notamment :
    \begin{itemize}
        \item \texttt{yolov11.py} : architecture personnalisée du modèle YOLOv11.
        \item \texttt{base.py} : classe de base pour les architectures compatibles.
    \end{itemize}
    
    \item \texttt{nn/} : regroupe les blocs fondamentaux de l'architecture réseau :
    \begin{itemize}
        \item \texttt{blocks.py} : blocs composés (ex. : CSP, C3K2 ...).
        \item \texttt{convs.py} : blocs de convolutions standardisés.
    \end{itemize}
    
    \item \texttt{utils/} : ensemble d’utilitaires et de modules fonctionnels :
    \begin{itemize}
        \item \texttt{dataset.py} : gestion de l'import des données depuis le dossier spécifié.
        \item \texttt{loss.py} : fonctions de perte.
        \item \texttt{tal.py} : implémentation du \textit{Task Aligned Assigner} et de quelques fonctions annexes.
        \item \texttt{metrics.py} : calcul des métriques de performance (mAP, recall, etc.).
        \item \texttt{post\_process.py} : post-traitements avec notamment le NMS.
        \item \texttt{training\_functions.py} : fonctions annexes utilisées durant l'entrainement.
        \item \texttt{display\_outputs.py} et \texttt{divers.py} : outils de visualisation et fonctions diverses.
    \end{itemize}
    
    \item \texttt{test/} : contient des scripts de test pour l'entraînement et l'inférence du modèle.
    
    \item \texttt{readme.ipynb} : notebook de présentation du projet.

    \item \texttt{requirements.txt}
\end{itemize}

\vspace{0.5cm}


\section{L’architecture du modèle (cf: yolov11n.py)}

Le modèle \texttt{YOLOv11n} est une réimplémentation manuelle, codée à partir de zéro, en s'inspirant du modèle du même nom développé par \textit{Ultralytics}~\cite{ultralytics2023}. Notre version explicite chaque couche et chaque connexion, ce qui permet une compréhension fine, une plus grande flexibilité expérimentale et une intégration facilitée de composants personnalisés. 

Une différence fondamentale concerne la tête de détection : dans notre version, les sorties de classification et de régression sont séparées, alors qu’elles sont concaténées dans un unique tenseur chez \textit{Ultralytics}. Ce choix permet de mieux de préserver un aspect multi-branches du modèle.

L’architecture s’articule autour de trois modules principaux : le \textbf{backbone}, le \textbf{FPN (Feature Pyramid Network)}~\cite{lin2017feature}, et la \textbf{tête de détection}.

\begin{figure}[H]
    \centering
    \includegraphics[width=0.85\textwidth]{assets/yolo11.png}
    \caption{Architecture globale du modèle YOLOv11n.}
    \label{fig:yolov11n_arch}
\end{figure}


\vspace{0.5cm}

\subsection{Backbone}

Le backbone extrait des caractéristiques multi-échelles à partir de l’image d’entrée. Il est constitué de :
\begin{itemize}
    \item Convolutions hiérarchiques (\texttt{Conv}) pour réduire progressivement la résolution.
    \item Blocs \texttt{C3k2}~\cite{khanam2024yolov11}, qui combinent des chemins parallèles avec ou sans skip connections pour un compromis entre expressivité et vitesse.
    \item Un module \texttt{SPPF} (Spatial Pyramid Pooling - Fast)~\cite{he2015spatial}, introduit dans Yolov5, permettant d’agréger de l’information contextuelle à large échelle.
    \item Une attention spatiale \texttt{C2PSA} (Cross-Context Pyramid Self-Attention)~\cite{xu2022vitaev2}, permettant de renforcer les régions discriminantes.
\end{itemize}

Le backbone produit trois cartes de caractéristiques \( P_3, P_4, P_5 \), correspondant à des résolutions réduites par des facteurs 8, 16 et 32 respectivement.

\begin{figure}[H]
    \centering
    \includegraphics[width=0.6\textwidth]{assets/C3K2.png}
    \caption{Structure du bloc \texttt{C3k2}.}
    \label{fig:c3k2}
\end{figure}


\begin{figure}[H]
    \centering
    \includegraphics[width=0.6\textwidth]{assets/SPPF.jpg}
    \caption{Structure du module \texttt{SPPF} (Spatial Pyramid Pooling - Fast)}
    \label{fig:sppf}
\end{figure}

\begin{figure}[H]
    \centering
    \includegraphics[width=0.6\textwidth]{assets/C2PSA.png}
    \caption{Illustration du module \texttt{C2PSA} (Cross-Context Pyramid Self-Attention)}
    \label{fig:c2psa}
\end{figure}


\vspace{0.5cm}

\subsection{Neck}

Le \textit{Feature Pyramid Network}~\cite{lin2017feature} reconstruit une hiérarchie multi-échelle ascendante et descendante en fusionnant les niveaux \( P_5 \rightarrow P_4 \rightarrow P_3 \), via :
\begin{itemize}
    \item des interpolations (\texttt{Upsample}) suivies de concaténation ;
    \item des blocs \texttt{C3k2} pour réapprentissage des représentations fusionnées ;
    \item des convolutions descendantes (\texttt{Downsample}) pour réinjecter l’information vers les résolutions plus basses.
\end{itemize}

Les sorties du FPN sont notées \( p_3, p_4, p_5 \), et sont transmises à la tête de détection.

\vspace{0.5cm}

\subsection{Tête}

La tête de détection se compose de deux branches :
\begin{itemize}
    \item une branche de régression, qui prédit des distributions discrètes sur chaque côté de la boîte;
    \item une branche de classification qui prédit les probabilités par classe.
\end{itemize}

Les sorties sont :
\begin{itemize}
    \item \texttt{dist\_outputs} : distributions de régression (format \texttt{reg\_max} bins par côté) ;
    \item \texttt{clsobj\_outputs} : scores de classification (sigmoïdes).
\end{itemize}

Une initialisation spécifique des biais est appliquée dans chaque branche pour faciliter la convergence en début d'entraînement.

\vspace{0.5cm}

\subsection{Post-traitement}

Le post-traitement suit les étapes suivantes :
\begin{enumerate}
    \item concaténation des prédictions issues des trois niveaux de détection ;
    \item application de la projection DFL pour reconstruire les boîtes ;
    \item transformation des distances en coordonnées absolues avec \texttt{dist2bbox} ;
    \item application de la Non Max Suppression (NMS) multi-labels.
\end{enumerate}

\begin{figure}[H]
    \centering
    \includegraphics[width=0.48\textwidth]{assets/post_process_1.png}
    \hfill
    \includegraphics[width=0.48\textwidth]{assets/post_process_2.png}
    \caption{Illustration du post-traitement : à gauche, prédictions brutes avant NMS ; à droite, détections finales après application du filtrage.}
    \label{fig:postprocess_nms}
\end{figure}

\vspace{0.5cm}


\section{Task aligner et fonction de coût (tal.py / loss.py)}

Dans notre implémentation, nous avons conservé les modules de \textit{Task Aligned Assigner} et la fonction de coût \texttt{YOLODetectionLoss} proposés dans l’implémentation officielle d’Ultralytics~\cite{ultralytics2023}, sans y apporter de modification.

\vspace{0.3cm}

\subsection{Task Aligned Assigner}

Le \textit{Task Aligned Assigner}~\cite{feng2021tood} est un algorithme d'appariement dynamique introduit pour YOLOv8. Il sélectionne les boîtes d’ancrage positives en tenant compte à la fois de la proximité spatiale (via l'IoU) et de la confiance du classifieur. Cela permet de mieux aligner la supervision avec les prédictions les plus prometteuses à chaque itération.

\begin{figure}[H]
    \centering
    \includegraphics[width=0.48\textwidth]{assets/tal_1.png}
    \hfill
    \includegraphics[width=0.48\textwidth]{assets/tal_2.png}
    \caption{Illustration du fonctionnement du \textit{Task Aligned Assigner}. 
    \textbf{Gauche} : boîtes sélectionnées comme positives avant entraînement (basées principalement sur l’IoU). 
    \textbf{Droite} : boîtes sélectionnées après quelques epochs, intégrant à la fois la localisation et la confiance de classification.}
    \label{fig:task_aligner}
\end{figure}


\vspace{0.3cm}

\subsection{Fonction de coût}

La fonction de coût utilisée est \texttt{YOLODetectionLoss}, qui combine :
\begin{itemize}
    \item une perte de localisation, basée sur la \textbf{Distribution Focal Loss (DFL)}~\cite{chen2022distribution} ;
    \item une perte de classification, formulée comme une \texttt{Binary Cross-Entropy} indépendante pour chaque classe ;
    \item une perte liée à l'IoU ou CIoU ~\cite{zheng2020diou}. 
\end{itemize}

La loss globale est une combinaison linéaire de ces loss spécifiques.


\section{L’entraînement et la prédiction (base.py)}

Le processus d'entraînement est encapsulé dans la classe \texttt{BaseModel}, qui fournit deux méthodes distinctes : \texttt{fit} et \texttt{fit\_optim}. Ces deux méthodes ont été conçues pour couvrir respectivement les cas d’expérimentation simple et de pipeline complet de type production tel que réalisé dans \textit{ultralytics}.

\vspace{0.3cm}

\subsection{Méthode \texttt{fit}}

La méthode \texttt{fit} constitue une version minimaliste destinée à des tests rapides, notamment pour le debuggage du fonctionnement intrasèque du modèle. Elle repose sur :
\begin{itemize}
    \item un taux d’apprentissage constant défini manuellement ;
    \item l’optimiseur \texttt{Adam}, adapté pour des convergences rapides ;
    \item une boucle d’entraînement standard sans warmup ni régularisation explicite ;
    \item une évaluation périodique sur un jeu de validation.
\end{itemize}

Cette méthode est utile pour des démonstrations, des débogages, ou l’exploration rapide de jeux de données.

\vspace{0.3cm}

\subsection{Méthode \texttt{fit\_optim}}

La méthode \texttt{fit\_optim} constitue la version "de production" comparable à ce qui est réalisé dans \textit{ultralytics}. Elle inclut :

\begin{itemize}
    \item \textbf{Scheduler de taux d’apprentissage avec warmup} : un scheduler de type \texttt{CosineAnnealingLR} ou \texttt{MultiStepLR}, accompagné d’une phase de \textbf{warmup linéaire} sur les premières itérations, pour éviter les explosions de gradients et faciliter la stabilisation initiale du modèle.
    
    \item \textbf{Accumulation de gradients} : permet d’utiliser un batch effectif plus grand que la mémoire GPU disponible, en cumulant les gradients sur plusieurs mini-batchs avant une mise à jour de l’optimiseur.
    
    \item \textbf{Gestion du mixed precision} avec \texttt{torch.cuda.amp} : permet un entraînement plus rapide et moins gourmand en mémoire via les calculs en précision mixte (FP16 + FP32), tout en conservant la stabilité numérique grâce au \textit{GradScaler}.
    
    \item \textbf{EMA (Exponential Moving Average)} des poids du modèle : une version lissée du modèle est maintenue à part, et utilisée pour l’évaluation. Cette technique améliore la robustesse des prédictions et stabilise les performances en validation.

    \item \textbf{Logs et debbugs} : A chaque epoch sont enregistrés les pertes d'entraînement et de validation. En mode debug, l'affichage d'un batch d'images avec boîtes sélectionnées par le task-aligner, les outputs sans post-process puis les outputs après post process sont enregistrés dans un dossier de logs. On enregistre aussi les meilleurs poids du modèle obtenues sur l'ensemble de validation, ainsi que les poids du modèle obtenu lors de la dernière epoch.   
    
\end{itemize}

\vspace{0.3cm}


\subsection{La méthode \texttt{predict}}
La prédiction utilise un pipeline simple :
\begin{itemize}
    \item chargement des poids entraînés ;
    \item traitement d’images et prédiction par le modèle ;
    \item suppression des redondances avec NMS ;
    \item visualisation ou export des résultats.
\end{itemize}

\begin{figure}[H]
    \centering
    \includegraphics[width=0.5\textwidth]{assets/predict.png}
    \caption{Pipeline de prédiction simplifié du modèle \texttt{YOLOv11n}, depuis l’image d’entrée jusqu’à la visualisation finale, en passant par la prédiction brute et le post-traitement par NMS.}
    \label{fig:prediction_simple}
\end{figure}


\section{Les métriques (metrics.py)}
Les performances du modèle sont évaluées selon :
\begin{itemize}
    \item \textbf{mAP} (mean Average Precision) à différents seuils d’IoU ;
    \item \textbf{Recall} et \textbf{Precision} ;
    \item Analyse des \textbf{fausses détections} et des \textbf{ratés}.
\end{itemize}




\begin{thebibliography}{9}
\bibitem{ultralytics2023}
Ultralytics, \url{https://github.com/ultralytics/ultralytics/}

\bibitem{lin2017feature}
T.-Y. Lin, P. Dollár, R. Girshick, K. He, B. Hariharan, and S. Belongie,
\textit{Feature Pyramid Networks for Object Detection}, 
in \textit{CVPR}, 2017.
\url{https://arxiv.org/abs/1612.03144}

\bibitem{khanam2024yolov11}
R. Khanam and M. Hussain,
\textit{YOLOv11: An Overview of the Key Architectural Enhancements},
arXiv preprint arXiv:2410.17725, 2024.
\url{https://arxiv.org/abs/2410.17725}

\bibitem{he2015spatial}
K. He, X. Zhang, S. Ren, and J. Sun,
\textit{Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition},
in \textit{European Conference on Computer Vision (ECCV)}, 2014.
\url{https://arxiv.org/abs/1406.4729}


\bibitem{xu2022vitaev2}
X. Xu, X. Zhang, S. Zhang, et al.,
\textit{ViTAEv2: Vision Transformer Advanced by Exploring Inductive Bias for Image Recognition and Beyond},
in \textit{Advances in Neural Information Processing Systems (NeurIPS)}, 2022.
\url{https://arxiv.org/abs/2202.10108}

\bibitem{feng2021tood}
C. Feng, Y. Zhong, Y. Gao, M. R. Scott, and W. Huang,\\
\textit{TOOD: Task-aligned One-stage Object Detection},\\
Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV), 2021.\\
\url{https://arxiv.org/abs/2108.07755}


\bibitem{chen2022distribution}
Z. Chen, Y. Luo, L. Zhu, et al.,
\textit{Distribution Focal Loss for General One-stage Object Detection},
in \textit{CVPR}, 2022.
\url{https://arxiv.org/abs/2206.09339}

\bibitem{zheng2020diou}
Z. Zheng, P. Wang, W. Liu, J. Li, R. Ye, and D. Ren,\\
\textit{Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression},\\
Proceedings of the AAAI Conference on Artificial Intelligence, vol. 34, no. 7, pp. 12993–13000, 2020.\\
\url{https://arxiv.org/abs/1911.08287}



\end{document}
