HW03: Report added
This commit is contained in:
parent
7209681b34
commit
231cc24cea
11
HW03/report/.gitignore
vendored
Normal file
11
HW03/report/.gitignore
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#Tex
|
||||||
|
*.aux
|
||||||
|
*.log
|
||||||
|
*.out
|
||||||
|
*synctex.gz
|
||||||
|
|
||||||
|
|
||||||
|
# minted
|
||||||
|
_minted-report
|
||||||
|
|
||||||
|
|
BIN
HW03/report/img/image_to_graph_plot.png
Normal file
BIN
HW03/report/img/image_to_graph_plot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 348 KiB |
BIN
HW03/report/img/spectral_clustering_plot.png
Normal file
BIN
HW03/report/img/spectral_clustering_plot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
BIN
HW03/report/report.pdf
Normal file
BIN
HW03/report/report.pdf
Normal file
Binary file not shown.
429
HW03/report/report.tex
Normal file
429
HW03/report/report.tex
Normal file
@ -0,0 +1,429 @@
|
|||||||
|
%
|
||||||
|
% !TEX TS-program = xelatex
|
||||||
|
% !TEX encoding = UTF-8 Unicode
|
||||||
|
% !TEX spellcheck = el-GR
|
||||||
|
%
|
||||||
|
% AUTH report template for english
|
||||||
|
%
|
||||||
|
% Requires compilation with pdfLaTeX or XeLaTeX
|
||||||
|
%
|
||||||
|
% authors:
|
||||||
|
% Χρήστος Χουτουρίδης ΑΕΜ 8997
|
||||||
|
% cchoutou@ece.auth.gr
|
||||||
|
|
||||||
|
% Options:
|
||||||
|
%
|
||||||
|
% 1) mainlang=<language>
|
||||||
|
% Default: english
|
||||||
|
% Set the default language of the document which affects hyphenations,
|
||||||
|
% localization (section, dates, etc...)
|
||||||
|
%
|
||||||
|
% example: \documentclass[mainlang=greek]{AUThReport}
|
||||||
|
%
|
||||||
|
% 2) <language>
|
||||||
|
% Add hyphenation and typesetting support for other languages
|
||||||
|
% Currently supports: english, greek, german, frenc
|
||||||
|
%
|
||||||
|
% example: \documentclass[english, greek]{AUThReport}
|
||||||
|
%
|
||||||
|
% 3) short: Requests a shorter title for the document
|
||||||
|
% Default: no short
|
||||||
|
%
|
||||||
|
% example: \documentclass[short]{AUThReport}
|
||||||
|
%
|
||||||
|
\documentclass[a4paper, 11pt, mainlang=greek, english]{AUThReport/AUThReport}
|
||||||
|
|
||||||
|
\CurrentDate{\today}
|
||||||
|
|
||||||
|
% Greek report document setup suggestions
|
||||||
|
%---------------------------------
|
||||||
|
% Document configuration
|
||||||
|
\AuthorName{Χρήστος Χουτουρίδης}
|
||||||
|
\AuthorAEM{8997}
|
||||||
|
\AuthorMail{cchoutou@ece.auth.gr}
|
||||||
|
|
||||||
|
%\CoAuthorName{CoAuthor Name}
|
||||||
|
%\CoAuthorAEM{AEM}
|
||||||
|
%\CoAuthorMail{CoAuthor Mail}
|
||||||
|
|
||||||
|
% \WorkGroup{Ομάδα Χ}
|
||||||
|
|
||||||
|
\DocTitle{Εργασία 3}
|
||||||
|
\DocSubTitle{Image segmentation}
|
||||||
|
|
||||||
|
\Department{Τμήμα ΗΜΜΥ. Τομέας Ηλεκτρονικής}
|
||||||
|
\ClassName{Ψηφιακή Επεξεργασία Εικόνας}
|
||||||
|
|
||||||
|
\InstructorName{Α. Ντελόπουλος}
|
||||||
|
\InstructorMail{antelopo@ece.auth.gr}
|
||||||
|
|
||||||
|
|
||||||
|
\CoInstructorName{Δ. Αλέτρας}
|
||||||
|
\CoInstructorMail{lnmpikas@ece.auth.gr}
|
||||||
|
|
||||||
|
|
||||||
|
% Local package requirements
|
||||||
|
%---------------------------------
|
||||||
|
%\usepackage{tabularx}
|
||||||
|
%\usepackage{array}
|
||||||
|
%\usepackage{commath}
|
||||||
|
|
||||||
|
\usepackage{amsmath, amssymb, amsfonts}
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\usepackage{float}
|
||||||
|
|
||||||
|
% Requires: -shell-escape compile argument
|
||||||
|
\usepackage{minted}
|
||||||
|
\usepackage{xcolor}
|
||||||
|
\usepackage{placeins}
|
||||||
|
|
||||||
|
\newminted{python}{
|
||||||
|
fontsize=\small,
|
||||||
|
breaklines,
|
||||||
|
autogobble,
|
||||||
|
%frame=lines,
|
||||||
|
%framesep=5pt,
|
||||||
|
baselinestretch=1.1,
|
||||||
|
tabsize=2,
|
||||||
|
%bgcolor=LightGray,
|
||||||
|
numbersep=8pt,
|
||||||
|
gobble=0
|
||||||
|
}
|
||||||
|
|
||||||
|
\newcommand{\icode}[1]{\mintinline{python}{#1}}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
% Request a title page or header
|
||||||
|
\InsertTitle
|
||||||
|
|
||||||
|
\section{Εισαγωγή}
|
||||||
|
|
||||||
|
Η παρούσα εργασία αφορά την υλοποίηση και αξιολόγηση τεχνικών τμηματοποίησης εικόνας (\textit{image segmentation}) με βάση φασματικούς αλγορίθμους (\textit{spectral clustering}) και τη μέθοδο \textit{normalized cuts}.
|
||||||
|
Στόχος είναι η κατανόηση και εφαρμογή γραφοκεντρικών μοντέλων στην επεξεργασία εικόνας, μέσω της μετατροπής της εικόνας σε γράφο και της χρήσης των ιδιοδιανυσμάτων του αντίστοιχου γραφικού Λαπλασιανού για την ανάδειξη δομής και περιοχών ενδιαφέροντος.
|
||||||
|
Η εργασία οργανώνεται σε τρία βασικά μέρη: (α) αναπαράσταση εικόνας ως γράφου, (β) φασματικό ομαδοποίηση με spectral clustering, και (γ) τμηματοποίηση εικόνας μέσω της normalized cuts, σε μη αναδρομική και αναδρομική μορφή.
|
||||||
|
\par
|
||||||
|
Η προσέγγιση βασίζεται στην έννοια του \textit{affinity matrix}, όπου κάθε pixel της εικόνας θεωρείται κόμβος γράφου και οι ακμές μεταξύ των κόμβων αποτυπώνουν την ομοιότητά τους.
|
||||||
|
Οι τεχνικές spectral clustering και normalized cuts εκμεταλλεύονται τη φασματική ανάλυση του γραφήματος για να επιτύχουν διαχωρισμό των pixels σε ομάδες, με βάση τη δομή συνδεσιμότητας και τα χαρακτηριστικά της εικόνας.
|
||||||
|
Η εργασία καλύπτει την υλοποίηση αυτών των μεθόδων από το μηδέν, τον πειραματισμό πάνω σε προκαθορισμένα και ρεαλιστικά δεδομένα, και την αξιολόγηση των αποτελεσμάτων μέσα από συγκριτικές απεικονίσεις και σχολιασμό.
|
||||||
|
|
||||||
|
\subsection{Παραδοτέα}
|
||||||
|
Τα παραδοτέα της εργασίας αποτελούνται από:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Την παρούσα αναφορά.
|
||||||
|
\item Τα python αρχεία με τον κώδικα της εργασίας και το αρχείο requirements.txt με τις απαιτήσεις της python στον κατάλογο \textbf{scripts/}.
|
||||||
|
\item Το \href{https://git.hoo2.net/hoo2/DigitalImageProcessing/src/branch/master/HW03}{σύνδεσμο} με το αποθετήριο που περιέχει όλο το project με τον κώδικα σε python της αναφοράς και τα παραδοτέα.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\section{Προγραμματιστική προσέγγιση και οργάνωση κώδικα}
|
||||||
|
|
||||||
|
Πριν προχωρήσουμε στην ανάλυση των αλγορίθμων και στην επίδειξη της λειτουργικότητάς τους, αξίζει να περιγράψουμε συνοπτικά την προγραμματιστική προσέγγιση που ακολουθήθηκε κατά την ανάπτυξη του παρόντος project.
|
||||||
|
Για την υλοποίηση χρησιμοποιήθηκε μια μεθοδολογία κοντά στο \textit{Test-Driven Development (TDD)}, με στόχο την προοδευτική ενσωμάτωση λειτουργικότητας με παράλληλη διατήρηση της σταθερότητας του κώδικα.
|
||||||
|
Κάθε αρχείο Python που περιλαμβάνει την υλοποίηση ενός αλγορίθμου, συνοδεύεται από ενσωματωμένες συναρτήσεις ελέγχου (\textit{test functions}), οι οποίες μπορούν να κληθούν μέσα από το μπλοκ \icode{if __name__ == '__main__'}.
|
||||||
|
Τα tests αυτά συμβάλλουν καθοριστικά στον άμεσο εντοπισμό λαθών, στην απομόνωση δυσλειτουργιών, και γενικότερα στην αξιοπιστία του συστήματος κατά την ανάπτυξη.
|
||||||
|
Επιπλέον, η ύπαρξή τους προσφέρει ένα βασικό επίπεδο επιβεβαίωσης ότι η συμπεριφορά των αλγορίθμων είναι ορθή ως προς τις υποθέσεις της εκφώνησης, και διατηρείται σταθερή κατά την τροποποίηση ή προσθήκη νέου κώδικα.
|
||||||
|
\par
|
||||||
|
Για την οπτική επαλήθευση των αποτελεσμάτων, τα tests παράγουν γραφήματα με χρήση του \texttt{matplotlib}, αξιοποιώντας ως backend το \texttt{TkAgg}.
|
||||||
|
Αν το \texttt{TkAgg} είναι διαθέσιμο στο εκτελούμενο σύστημα, ο χρήστης μπορεί να επιλέξει να δει τα γραφήματα περνώντας ως ορίσμα \icode{True} στη συνάρτηση ελέγχου.
|
||||||
|
Ακολουθεί ενδεικτικό παράδειγμα χρήσης:
|
||||||
|
\begin{minted}{python}
|
||||||
|
# If you have TkAgg you can pass plot=True, otherwise pass False
|
||||||
|
for k in [2, 3, 4]:
|
||||||
|
_test_n_cuts(k, True)
|
||||||
|
\end{minted}
|
||||||
|
Στην εικόνα \ref{fg:ttd_plots} φαίνονται στιγμιότυπα από τέτοια plots.
|
||||||
|
\begin{figure}[!ht]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.45\textwidth]{img/image_to_graph_plot.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.45\textwidth]{img/spectral_clustering_plot.png}
|
||||||
|
\caption{Ενδεικτικά plots από το αρχείο \textit{image\_to\_graph} και το \textit{spectral\_clustering}.}
|
||||||
|
\label{fg:ttd_plots}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
|
\section{Εικόνες ως Γράφοι}
|
||||||
|
|
||||||
|
Το πρώτο βήμα της υλοποίησης αφορά τη μετατροπή μιας εικόνας σε γράφο, έτσι ώστε οι αλγόριθμοι φασματικής ανάλυσης που ακολουθούν να μπορούν να εφαρμοστούν.
|
||||||
|
Η συνάρτηση \textit{image\_to\_graph(img\_array: np.ndarray) -> np.ndarray} λαμβάνει ως είσοδο μια εικόνα διαστάσεων \texttt{[M, N, C]} με τιμές κανονικοποιημένες στο διάστημα \texttt{[0, 1]}, και επιστρέφει τον πλήρως συνδεδεμένο affinity πίνακα του γράφου.
|
||||||
|
Η βασική υπόθεση είναι ότι κάθε εικονοστοιχείο (pixel) αντιστοιχεί σε έναν κόμβο του γράφου και ότι κάθε ζεύγος κόμβων συνδέεται με ακμή βάσει της χρωματικής τους ομοιότητας.
|
||||||
|
Το βάρος της ακμής μεταξύ δύο κόμβων ορίζεται ως:
|
||||||
|
\[
|
||||||
|
A(i, j) = \frac{1}{e^{d(i, j)}}
|
||||||
|
\]
|
||||||
|
όπου \(d(i, j)\) είναι η Ευκλείδεια απόσταση των διανυσμάτων RGB των δύο pixels.
|
||||||
|
Ο μετασχηματισμός αυτός επιλέχθηκε γιατί προσφέρει εκθετική απόσβεση των αποστάσεων, περιορίζοντας την επίδραση απομακρυσμένων κόμβων και διατηρώντας ισχυρότερες τις συσχετίσεις μεταξύ παρόμοιων pixels.
|
||||||
|
Η συνάρτηση περιλαμβάνει ρητό έλεγχο για τον τύπο των τιμών της εικόνας (\textit{np.floating}), ενώ η διαγώνιος του πίνακα μηδενίζεται τεχνητά (\textit{np.fill\_diagonal(distances, 1e-10)}) ώστε να αποφευχθεί αριθμητική αστάθεια κατά την αντιστροφή των αποστάσεων.
|
||||||
|
\par
|
||||||
|
Μέσα στο ίδιο αρχείο \textit{image\_to\_graph.py}, περιλαμβάνονται δύο συναρτήσεις ελέγχου: \textit{\_test\_1()} και \textit{\_test\_2()}.
|
||||||
|
Η \textit{\_test\_1()} δημιουργεί μια τυχαία εικόνα 4x4 με RGB κανάλια, υπολογίζει τον πίνακα affinity και εμφανίζει βασικά χαρακτηριστικά του, όπως το σχήμα, την ελάχιστη/μέγιστη τιμή και τη συμμετρία του.
|
||||||
|
Η \textit{\_test\_2()} εφαρμόζει τη συνάρτηση στην πραγματική εικόνα \textit{d2b} που παρέχεται στο \texttt{.mat} αρχείο και εκτελεί τους ίδιους ελέγχους.
|
||||||
|
Ακολουθεί ενδεικτική έξοδος από την \textit{\_test\_2()}:
|
||||||
|
|
||||||
|
\begin{minted}{text}
|
||||||
|
=== Test 2 ===
|
||||||
|
Input image shape: (50, 50, 3)
|
||||||
|
dtype: float64
|
||||||
|
Affinity matrix shape: (2500, 2500)
|
||||||
|
Is symmetric: True
|
||||||
|
Max value: 1.0
|
||||||
|
Min value: 0.2129168031816433
|
||||||
|
\end{minted}
|
||||||
|
Τα αποτελέσματα επιβεβαιώνουν ότι ο πίνακας είναι τετραγωνικός, συμμετρικός και έχει την αναμενόμενη πυκνή δομή (καθώς κάθε κόμβος συνδέεται με όλους τους υπόλοιπους).
|
||||||
|
|
||||||
|
|
||||||
|
\section{Spectral Clustering}
|
||||||
|
|
||||||
|
Ο αλγόριθμος spectral clustering βασίζεται στην ιδέα ότι η φασματική ανάλυση του Laplacian πίνακα ενός γράφου μπορεί να αποκαλύψει τη δομή των clusters που ενυπάρχουν στα δεδομένα.
|
||||||
|
Δεδομένου ενός affinity matrix $A$, υπολογίζεται ο βαθμωτός πίνακας $D$, με $D(i,i) = \sum_j A(i,j)$.
|
||||||
|
Σε αυτή την υλοποίηση μπήκαμε στην λογική να υλοποιήσουμε και μια έκδοση στην οποία ο Laplacian κανονικοποιείται.
|
||||||
|
Στην unnormalized εκδοχή, ο Laplacian ορίζεται ως $L = D - A$, ενώ στη normalized μορφή ως:
|
||||||
|
\[
|
||||||
|
L_{\text{sym}} = I - D^{-1/2} A D^{-1/2}
|
||||||
|
\]
|
||||||
|
Η ανάλυση βασίζεται στην επίλυση ιδιοτιμών του πίνακα $L$ (ή του $L_{\text{sym}}$) και τη χρήση των $k$ ιδιοδιανυσμάτων που αντιστοιχούν στις μικρότερες ιδιοτιμές, για την αναπαράσταση των κόμβων στον νέο embedding χώρο.
|
||||||
|
\par
|
||||||
|
Στον embedding χώρο εφαρμόζεται ο αλγόριθμος \textit{k-means}, ο οποίος ομαδοποιεί τα σημεία σε $k$ clusters.
|
||||||
|
Η υλοποίηση περιλαμβάνεται στη συνάρτηση \textit{spectral\_clustering(affinity\_mat, k, normalized=False)} και υποστηρίζει τόσο normalized όσο και unnormalized εκδοχή, με χρήση της παραμέτρου \textit{normalized}.
|
||||||
|
Η επιλογή eigenvectors γίνεται με τη χρήση της \textit{scipy.sparse.linalg.eigs}, ώστε να είναι αποδοτική ακόμη και για πίνακες μεγάλης διαστατικότητας.
|
||||||
|
|
||||||
|
\subsection*{Demo 1}
|
||||||
|
Για την επίδειξη της λειτουργίας του αλγορίθμου χρησιμοποιήθηκε ο προκατασκευασμένος affinity πίνακας \textit{d1a}, ο οποίος έχει διαστάσεις $12 \times 12$ και χρησιμοποιείται ως είσοδος για τρεις επαναλήψεις με $k = 2$, $3$, και $4$.
|
||||||
|
Τα αποτελέσματα παρουσιάζονται ως γραφήματα ετικετών κατά node index και παρουσιάζονται στην εικόνα \ref{fg:demo1}
|
||||||
|
\begin{figure}[!ht]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.65\textwidth]{../scripts/plots/demo1_k2.png}
|
||||||
|
\vspace{1em}
|
||||||
|
\includegraphics[width=0.65\textwidth]{../scripts/plots/demo1_k3.png}
|
||||||
|
\vspace{1em}
|
||||||
|
\includegraphics[width=0.65\textwidth]{../scripts/plots/demo1_k4.png}
|
||||||
|
\caption{Ενδεικτικά plots από το demo1.}
|
||||||
|
\label{fg:demo1}
|
||||||
|
\end{figure}
|
||||||
|
Σε όλες τις περιπτώσεις, ο αλγόριθμος εντοπίζει ξεκάθαρες ομάδες, με σχεδόν πλήρη συμφωνία με τη δομή του πίνακα.
|
||||||
|
|
||||||
|
\subsection*{Demo 2}
|
||||||
|
Η συνάρτηση εφαρμόστηκε στις εικόνες \textit{d2a} και \textit{d2b}, αφού πρώτα μετατράπηκαν σε γράφους με τη χρήση της \textit{image\_to\_graph}.
|
||||||
|
Για κάθε εικόνα εφαρμόστηκε τόσο η unnormalized όσο και η normalized εκδοχή του spectral clustering, και για $k = 2$, $3$, $4$.
|
||||||
|
Τα αποτελέσματα της \textbf{μη κανονικοποιημένης} έκδοσης που ζητείται από την εκφώνηση παρουσιάζονται στις εικόνες \ref{fg:demo2_unnormalized_d2a}, \ref{fg:demo2_unnormalized_d2b}
|
||||||
|
\begin{figure}[!ht]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo2_d2a_k2_Unnormalized.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo2_d2a_k3_Unnormalized.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo2_d2a_k4_Unnormalized.png}
|
||||||
|
\caption{Plots της d2a για unnormalized Laplacian.}
|
||||||
|
\label{fg:demo2_unnormalized_d2a}
|
||||||
|
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo2_d2b_k2_Unnormalized.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo2_d2b_k3_Unnormalized.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo2_d2b_k4_Unnormalized.png}
|
||||||
|
\caption{Plots της d2b για unnormalized Laplacian.}
|
||||||
|
\label{fg:demo2_unnormalized_d2b}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Αντίστοιχα τα αποτελέσματα της \textbf{κανονικοποιημένης} έκδοσης παρουσιάζονται στις εικόνες \ref{fg:demo2_normalized_d2a},\ref{fg:demo2_normalized_d2b} και επιβεβαιώνουν την ευαισθησία της μεθόδου στην επιλογή του τύπου Laplacian.
|
||||||
|
\begin{figure}[!ht]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo2_d2a_k2_Normalized.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo2_d2a_k3_Normalized.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo2_d2a_k4_Normalized.png}
|
||||||
|
\caption{Plots της d2a για normalized Laplacian.}
|
||||||
|
\label{fg:demo2_normalized_d2a}
|
||||||
|
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo2_d2b_k2_Normalized.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo2_d2b_k3_Normalized.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo2_d2b_k4_Normalized.png}
|
||||||
|
\caption{Plots της d2b για normalized Laplacian.}
|
||||||
|
\label{fg:demo2_normalized_d2b}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection*{Σύγκριση με scikit-learn}
|
||||||
|
|
||||||
|
Για λόγους επαλήθευσης, συγκρίθηκε η υλοποίηση με την ενσωματωμένη \textit{sklearn.cluster.spectral\_clustering}, η οποία χρησιμοποιεί normalized Laplacian.
|
||||||
|
Για $k = 3$, η συμφωνία μεταξύ των δύο μεθόδων ήταν απόλυτη (Adjusted Rand Index = 1.0000), ενώ για $k = 2$ και $4$ υπήρξαν μικρές αποκλίσεις λόγω διαφορετικής ομαδοποίησης από τον \textit{k-means}.
|
||||||
|
Η συμφωνία υπολογίστηκε με τη μετρική \textit{Adjusted Rand Index (ARI)} και τα αποτελέσματα καταγράφηκαν στην έξοδο της κονσόλας.
|
||||||
|
\par
|
||||||
|
Γενικά παρατηρούμε ότι υπάρχει αρκετή σχέση μεταξύ τους της normalized εκδοσης και της reference υλοποίησης του \texttt{sklearn}.
|
||||||
|
Θεωρούμε πως οι διαφορές μπορεί να οφείλονται στο:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Αν περιλαμβάνεται το trivial eigenvector (π.χ. σταθερή τιμή),
|
||||||
|
\item Αν eigs() δίνει ίδια σειρά ιδιοτιμών σε διαφορετικά runs,
|
||||||
|
\item ή αν το floating point jitter που επηρεάζει το k-means όταν τα σημεία συμπίπτουν.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\FloatBarrier
|
||||||
|
\begin{minted}{text}
|
||||||
|
=== Comparing with sklearn spectral_clustering (k=2) ===
|
||||||
|
Labels (own): [1 1 1 1 0 0 0 0 0 0 0 0]
|
||||||
|
Labels (sklearn): [0 0 0 0 1 1 1 1 0 0 0 0]
|
||||||
|
Adjusted Rand Index (ARI): 0.0294
|
||||||
|
|
||||||
|
=== Comparing with sklearn spectral_clustering (k=3) ===
|
||||||
|
Labels (own): [2 2 2 2 0 0 0 0 1 1 1 1]
|
||||||
|
Labels (sklearn): [0 0 0 0 2 2 2 2 1 1 1 1]
|
||||||
|
Adjusted Rand Index (ARI): 1.0000
|
||||||
|
|
||||||
|
=== Comparing with sklearn spectral_clustering (k=4) ===
|
||||||
|
Labels (own): [2 2 1 1 0 0 0 0 3 3 1 3]
|
||||||
|
Labels (sklearn): [3 3 0 3 2 2 2 2 1 1 1 1]
|
||||||
|
Adjusted Rand Index (ARI): 0.6379
|
||||||
|
\end{minted}
|
||||||
|
|
||||||
|
|
||||||
|
\section{Normalized Cuts}
|
||||||
|
|
||||||
|
Η μέθοδος \textit{normalized cuts} αποτελεί μια εναλλακτική προσέγγιση φασματικής ομαδοποίησης, η οποία διαφέρει από το κλασικό spectral clustering ως προς τη διατύπωση του φασματικού προβλήματος.
|
||||||
|
Σε αυτή την περίπτωση επιλύεται το γενικευμένο ιδιοπρόβλημα $Lx = \lambda Dx$, όπου $L$ είναι ο μη κανονικοποιημένος Laplacian $L = D - A$ και $D$ ο βαθμωτός πίνακας.
|
||||||
|
Η μέθοδος βασίζεται στην υπόθεση ότι ένα «καλό» διαμέρισμα του γράφου μεγιστοποιεί την εσωτερική συνοχή (association) και ελαχιστοποιεί τη διασύνδεση μεταξύ των ομάδων (cut).
|
||||||
|
Η βασική μετρική που υιοθετείται είναι η \textit{Ncut}:
|
||||||
|
\[
|
||||||
|
\text{Ncut}(A, B) = \frac{\text{cut}(A, B)}{\text{assoc}(A, V)} + \frac{\text{cut}(A, B)}{\text{assoc}(B, V)}
|
||||||
|
\]
|
||||||
|
όπου \textit{cut(A, B)} είναι το συνολικό βάρος των ακμών μεταξύ $A$ και $B$, και \textit{assoc(A, V)} το άθροισμα των ακμών που ξεκινούν από το $A$ προς όλους τους κόμβους.
|
||||||
|
Μικρές τιμές της \textit{Ncut} υποδεικνύουν καλή διάσπαση.
|
||||||
|
\par
|
||||||
|
Η συνάρτηση \textit{n\_cuts} επιλύει το παραπάνω πρόβλημα για $k$ ομάδες με φασματική ανάλυση και clustering στο φασματικό embedding με \textit{k-means}.
|
||||||
|
Η αναδρομική της μορφή, \textit{n\_cuts\_recursive}, εφαρμόζει επαναληπτικά διχοτομήσεις, εφόσον πληρούνται κριτήρια μεγέθους ομάδας και κόστους διάσπασης.
|
||||||
|
|
||||||
|
\subsection*{Demo 3a}
|
||||||
|
|
||||||
|
Στο πρώτο μέρος της επίδειξης εφαρμόστηκε η μη αναδρομική έκδοση της \textit{normalized cuts} με \textit{k = 2, 3, 4} για τις εικόνες \textit{d2a} και \textit{d2b}.
|
||||||
|
Τα αποτελέσματα συγκρίθηκαν με εκείνα του spectral clustering, τόσο με την ζητηθείσα έκδοση όσο και με την normalized στον Laplacian.
|
||||||
|
Στις εικόνες \ref{fg:demo3a_d2a_nc},\ref{fg:demo3a_d2a_sc},\ref{fg:demo3a_d2a_scn} παρουσιάζονται στιγμιότυπα των αποτελεσμάτων για την \textit{d2a}, και από τις 3 μεθόδους.
|
||||||
|
Αντίστοιχα στις εικόνες \ref{fg:demo3a_d2b_nc},\ref{fg:demo3a_d2b_sc},\ref{fg:demo3a_d2b_scn} παρουσιάζονται στιγμιότυπα των αποτελεσμάτων για την \textit{d2β}, και από τις 3 μεθόδους.
|
||||||
|
|
||||||
|
\begin{figure}[!ht]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2a_ncuts_k2.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2a_ncuts_k3.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2a_ncuts_k4.png}
|
||||||
|
\caption{Αποτελέσματα μη αναδρομικού normalized cuts για \textit{d2a}.}
|
||||||
|
\label{fg:demo3a_d2a_nc}
|
||||||
|
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2a_spectral_k2.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2a_spectral_k3.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2a_spectral_k4.png}
|
||||||
|
\caption{Αποτελέσματα spectral clustering για \textit{d2a}.}
|
||||||
|
\label{fg:demo3a_d2a_sc}
|
||||||
|
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2a_spectral_k2_norm.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2a_spectral_k3_norm.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2a_spectral_k4_norm.png}
|
||||||
|
\caption{Αποτελέσματα spectral clustering με normalized Laplacian για \textit{d2a}.}
|
||||||
|
\label{fg:demo3a_d2a_scn}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
|
\begin{figure}[!ht]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2b_ncuts_k2.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2b_ncuts_k3.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2b_ncuts_k4.png}
|
||||||
|
\caption{Αποτελέσματα μη αναδρομικού normalized cuts για \textit{d2b}.}
|
||||||
|
\label{fg:demo3a_d2b_nc}
|
||||||
|
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2b_spectral_k2.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2b_spectral_k3.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2b_spectral_k4.png}
|
||||||
|
\caption{Αποτελέσματα spectral clustering για \textit{d2b}.}
|
||||||
|
\label{fg:demo3a_d2b_sc}
|
||||||
|
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2b_spectral_k2_norm.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2b_spectral_k3_norm.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3a_d2b_spectral_k4_norm.png}
|
||||||
|
\caption{Αποτελέσματα spectral clustering με normalized Laplacian για \textit{d2b}.}
|
||||||
|
\label{fg:demo3a_d2b_scn}
|
||||||
|
\end{figure}
|
||||||
|
Από τα γραφήματα γίνεται κατανοητό ότι ενώ η \textit{normalized\_cuts} παρουσιάζει πολύ καλύτερη συμπεριφορά από την αρχική \textit{spectral clustering}, η κανονικοποιημένη έκδοση της \textit{spectral clustering}, έχει αντίστοιχες επιδόσεις.
|
||||||
|
|
||||||
|
\subsection*{Demo 3b}
|
||||||
|
|
||||||
|
Για να αξιολογηθεί η ποιότητα ενός μόνο βήματος διάσπασης, εφαρμόστηκε η \textit{n\_cuts} με $k=2$ και υπολογίστηκε η τιμή της \textit{Ncut} με τη βοήθεια της \textit{calculate\_n\_cut\_value}.
|
||||||
|
Στην εικόνα \ref{fg:demo3b} φαίνεται η διχοτόμηση των \textit{d2a} και \textit{d2a}.
|
||||||
|
|
||||||
|
\begin{figure}[!ht]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.45\textwidth]{../scripts/plots/demo3b_d2a_ncut.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.45\textwidth]{../scripts/plots/demo3b_d2b_ncut.png}
|
||||||
|
\caption{Ένα βήμα normalized cut σε \textit{d2a} και \textit{d2b}.}
|
||||||
|
\label{fg:demo3b}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\FloatBarrier
|
||||||
|
\begin{minted}{text}
|
||||||
|
=== Image d2a ===
|
||||||
|
Ncut value: 0.5092
|
||||||
|
|
||||||
|
=== Image d2b ===
|
||||||
|
Ncut value: 0.7853
|
||||||
|
\end{minted}
|
||||||
|
|
||||||
|
\subsection*{Demo 3c}
|
||||||
|
|
||||||
|
Το τελικό σκέλος της επίδειξης αφορά την αναδρομική εκδοχή του \textit{normalized cuts}.
|
||||||
|
Η συνάρτηση \textit{n\_cuts\_recursive} δέχεται κατώφλια \textit{T1} (ελάχιστο μέγεθος ομάδας) και \textit{T2} (μέγιστη αποδεκτή τιμή Ncut).
|
||||||
|
Τα πειράματα εκτελέστηκαν με \textit{T1 = 5} και τρεις τιμές του \textit{T2}: 0.20, 0.95 και 0.975, καθώς η δοθείσα τιμή 0.2 ήταν πολύ "αυστηρή" στον τερματισμό του αλγορίθμου.
|
||||||
|
Η εικόνες \ref{fg:demo3c_d2a},\ref{fg:demo3c_d2b} παρουσιάζουν τα αποτελέσματα για την εικόνες \textit{d2b} και \textit{d2b} αντίστοιχα.
|
||||||
|
|
||||||
|
\begin{figure}[!ht]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3c_d2a_recursive_T1-5_T2-0.2.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3c_d2a_recursive_T1-5_T2-0.95.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3c_d2a_recursive_T1-5_T2-0.975.png}
|
||||||
|
\caption{Αναδρομικό normalized cuts με διαφορετικά thresholds σε \textit{d2b}.}
|
||||||
|
\label{fg:demo3c_d2a}
|
||||||
|
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3c_d2b_recursive_T1-5_T2-0.2.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3c_d2b_recursive_T1-5_T2-0.95.png}
|
||||||
|
\hspace{1em}
|
||||||
|
\includegraphics[width=0.3\textwidth]{../scripts/plots/demo3c_d2b_recursive_T1-5_T2-0.975.png}
|
||||||
|
\caption{Αναδρομικό normalized cuts με διαφορετικά thresholds σε \textit{d2b}.}
|
||||||
|
\label{fg:demo3c_d2b}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection*{Παρατηρήσεις για τα thresholds}
|
||||||
|
|
||||||
|
Η τιμή του \textit{T2} επηρεάζει άμεσα το πόσο «εύκολα» συνεχίζεται η αναδρομή.
|
||||||
|
Χαμηλές τιμές (π.χ. 0.2) καθιστούν τη μέθοδο αυστηρή, οδηγώντας σε ελάχιστες διασπάσεις.
|
||||||
|
Μεγαλύτερες τιμές όπως 0.95 ή 0.975 παράγουν πιο λεπτομερή διαμερίσματα με περισσότερες ομάδες.
|
||||||
|
Το κατώφλι \textit{T1} ελέγχει την ελάχιστη επιτρεπτή διάσταση ομάδας και αποτρέπει τον υπερκατακερματισμό.
|
||||||
|
Στην πράξη, οι τιμές \textit{T1 = 5} και \textit{T2 = 0.95} έδωσαν αξιόπιστα αποτελέσματα και στις δύο εικόνες.
|
||||||
|
|
||||||
|
\section{Συμπεράσματα}
|
||||||
|
|
||||||
|
Στο πλαίσιο της παρούσας εργασίας υλοποιήθηκαν εξ αρχής και αξιολογήθηκαν δύο τεχνικές φασματικής τμηματοποίησης εικόνας: το spectral clustering και η μέθοδος normalized cuts, τόσο στη βασική όσο και στην αναδρομική της μορφή.
|
||||||
|
Για την εφαρμογή τους αναπτύχθηκε ενδιάμεση αναπαράσταση της εικόνας ως γράφου μέσω affinity matrix, ενώ παράλληλα υλοποιήθηκε διαδικασία φασματικής ανάλυσης με χρήση γενικευμένων ιδιοτιμών και ομαδοποίηση μέσω \textit{k-means}.
|
||||||
|
Η δομή του project υποστήριξε τη σταδιακή ανάπτυξη με έμφαση στον έλεγχο ορθότητας μέσω ενσωματωμένων tests, τα οποία συνοδεύτηκαν από γραφική αποτύπωση των αποτελεσμάτων.
|
||||||
|
\par
|
||||||
|
Από τα πειραματικά αποτελέσματα προκύπτει ότι οι δύο μέθοδοι παρουσιάζουν παρόμοια προσέγγιση, αλλά διαφέρουν στις λεπτομέρειες υλοποίησης και συμπεριφοράς.
|
||||||
|
Το spectral clustering αποδείχθηκε σταθερό και αποδοτικό σε εικόνες με σαφώς διαχωρισμένα clusters, ενώ η μέθοδος normalized cuts προσφέρει επιπλέον έλεγχο μέσω των παραμέτρων \textit{T1} και \textit{T2}, επιτρέποντας πιο προσαρμοστική τμηματοποίηση.
|
||||||
|
Η συμφωνία με τη βιβλιοθήκη \textit{scikit-learn} κρίθηκε ικανοποιητική, ειδικά όταν χρησιμοποιείται normalized Laplacian.
|
||||||
|
Συνολικά, η εργασία ανέδειξε τη δύναμη των φασματικών μεθόδων στην τμηματοποίηση εικόνας, αλλά και τη σημασία του σωστού χειρισμού των παραμέτρων και της ανάλυσης του γράφου.
|
||||||
|
|
||||||
|
|
||||||
|
\end{document}
|
@ -50,6 +50,6 @@ def run_demo1():
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
run_demo1()
|
run_demo1()
|
||||||
# Uncomment to compare with sklearn.cluster.spectral_clustering -- With normalized Laplacian btw!
|
# Uncomment to compare with sklearn.cluster.spectral_clustering -- With normalized Laplacian btw!
|
||||||
#print("")
|
print("")
|
||||||
#for k in [2, 3, 4]:
|
for k in [2, 3, 4]:
|
||||||
# compare_with_sklearn(k, False)
|
compare_with_sklearn(k, False)
|
@ -121,8 +121,8 @@ def _test_2(plot : bool = False):
|
|||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
# If you have TkAgg you can pass True, otherwise pass False
|
# If you have TkAgg you can pass True, otherwise pass False
|
||||||
_test_1(True)
|
_test_1(False)
|
||||||
_test_2(True)
|
_test_2(False)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -201,6 +201,7 @@ def _test_n_cuts_req(plot: bool = False):
|
|||||||
#print("Saved result to: ncuts_recursive_d2b.png")
|
#print("Saved result to: ncuts_recursive_d2b.png")
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
# If you have TkAgg you can pass plot=True, otherwise pass False
|
||||||
for k in [2, 3, 4]:
|
for k in [2, 3, 4]:
|
||||||
_test_n_cuts(k, False)
|
_test_n_cuts(k, False)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user