Codice Classroom: plekvnp
Codice OPIS: -
Il corso si propone di aiutare gli studenti a sviluppare alcune capacità fondamentali per l'applicazione del metodo scientifico all'ambito dell'ingegneria informatica, in particolare la parte relativa all'apprendimento automatico dai dati.
Essere un buon ingegnere, data scientist e un buon scienziato richiede di addestrare gradualmente la capacità di porre domande rilevanti sull'ambito di conoscenza che si sta esplorando, di pianificare i passi necessari per rispondere a quelle domande in maniera sistematica, spesso tramite prototipi, esperimenti e test, e essere in grado di interpretare i risultati ottenuti da questi esperimenti per poter trarre delle conclusioni, oppure raffinare le domande iniziali.
In questo corso cerchiamo di sviluppare queste capacità attraverso lo studio di alcune tematiche di intelligenza artificiale e utilizzando come filo conduttore la visione computazionale (Computer Vision). Nella prima parte del corso lavoreremo sui concetti di base della computer vision e applicheremo tecniche di test e sperimentazione a semplici esercizi che verranno proposti in laboratorio. Nella seconda parte useremo l'apprendimento automatico (Machine Learning) come pretesto per approfondire le capacità di analisi dei dati e di sviluppo di modelli predittivi e inferenziali. Questo ci permetterà anche di costruire e consolidare molti concetti fondamentali e best practices utilizzati largamente nella pratica di chi lavora con dati di ogni genere, non solo immagini.
Gli strumenti metodologici sono principalmente quelli della geometria proiettiva e dell'algebra lineare, mentre quelli tecnologici sono il linguaggio C++, python, pytorch (per le reti neurali) e opencv.
Gli obiettivi formativi principali sono:
Sviluppare le capacità di analisi di un problema di design e di sintesi dei passi per sviluppare una soluzione, in particolare tramite la metodologia di Test Driven Development (TDD).
Sviluppare la conoscenza teorica e pratica dei fondamenti della Computer Vision.
Sviluppare la capacità di implementare algoritmi fondamentali di Computer Vision in C++ e Python.
Sviluppare la capacità di analizzare raccolte di dati per trarne intuizioni iniziali.
Sviluppare le competenze di base per lavorare con dati e con l'apprendimento computazionale.
Sviluppare la capacità di valutare i risultati ottenuti rispetto a quanto pianificato nell'ambito della progettazione di sistemi predittivi e inferenziali.
Il corso tratterà diversi temi di visone computazionale (Computer Vision) e apprendimento automatico (Machine Learning), ma senza la pretesa di richiedere una comprensione approfondita di tutto. Alcuni elementi del programma sono ovviamente fondamentali per comprenderne altri (e.g. il pinhole camera model è necessario per capire la calibrazione della telecamera, o la geometria epipolare), mentre altri potranno essere considerati specialistici.
La prova di esame è composta da una prova di teoria, che potrà essere scritta o orale, a seconda delle condizioni e del numero degli studenti in ciascun appello e dalla presentazione di un progetto di laboratorio basato sui temi trattati nel corso.
Le esercitazioni di laboratorio saranno inizialmente degli esercizi di completamento di codice, in cui scrivere alcune funzioni e testarle con un input e output standard, per poi diventare più aperte man mano che si avanza nel semestre, fino a diventare descrizioni algoritmiche che presentano un problema e danno alcuni suggerimenti, ma lasciano campo libero per l'implementazione. Se il numero degli studenti è molto alto, faremo dei turni. Il docente e i teaching assistants saranno in aula per aiutare tutti nello svolgimento, che avverrà al passo che ciascuno potrà tenere. Non ci saranno votazioni sulle esercitazioni intermedie, ma si potrà discutere insieme gli approcci, ove sia di interesse per la classe. Le soluzioni degli esercizi verranno proposte dopo una o due settimane dall'esercitazione in presenza, per dare a tutti il tempo di terminarla.
Il progetto finale richiederà allo studente di utilizzare le capacità acquisite dimostrando nella pratica di aver compreso soprattutto la metodologia di lavoro. Il progetto potrà essere discusso con il docente o gli assistenti, che non daranno soluzioni "precotte", ma potranno consigliare sugli approcci.
La valutazione del progetto verrà fatta durante le prove di appello, in presenza. La discussione del progetto non richiede una relazione scritta, o una presentazione formale (power point), ma richiede di mostrare il funzionamento dell’applicazione, o algoritmo, e di discutere il codice sorgente. Durante la discussione del progetto i docenti faranno domande per approfondire la comprensione degli argomenti del corso da parte dell'esaminando. Se il progetto viene considerato sufficiente, il candidato passerà l'esame, altrimenti potranno essere richieste delle integrazioni, ripresentandolo dopo qualche giorno. In rari casi il candidato potrebbe essere giudicato insufficiente ed essere rimandato ad un appello successivo.
Il progetto finale, oltre a consentire di superare il corso, può essere utilizzato come base di partenza per un progetto di tesi di laurea triennale, così come previsto dall'ordinamento didattico vigente.
Il progetto va concordato con il docente almeno 3 settimane prima dell'appello a cui si intende presentarlo. Il progetto dovrà essere collegato ad un repository git che dovrà essere aggiornato man mano che il progetto avanza (non con un solo commit alla fine), pena la non ammissione all'esame.
Ovviamente, sarà necessario iscriversi anche all'appello su infostud per poter essere verbalizzati.
Una lista di progetti di esempio dell'anno 2022/23 può essere trovata su questo documento.
È sempre possibile proporre un progetto originale, che dovrà poi essere raffinato e approvato dal docente.
Lo strumento di informazione frontale principale sono le lezioni e questo sito. In particolare su questo sito troverete i materiali didattici (slides e esercitazioni) che via via verranno trattati in classe.
Per avere un canale di interazione online rapido, utilizzeremo google classroom (cod corso: plekvnp).
Rimane possibile contattare il docente e gli assistenti tramite email. Vi chiedo di utilizzare il tag [AI-Lab-24] (comprese le parentesi quadre) all'inizio dell'oggetto per facilitare il filtraggio delle emails. L'indirizzo email del docente è ciarfuglia@diag.uniroma1.it. Quelli degli assistenti verranno comunicati a lezione.
Nel corso del semestre verranno fornite le slides delle lezioni e il codice delle esercitazioni. Oltre a questo, il testo fondamentale che useremo è il Szelinski:
Computer Vision: Algorithms and Applications, 2nd ed.
che può essere recuperato in formato digitale gratuitamente al link fornito qui sopra. Questo testo è molto ampio e propone gli argomenti in modo da privilegiare l'implementazione e l’approfondimento aggiuntivo, piuttosto che essere esaustivo. È uno stile che si adatta bene a questo corso di laboratorio. Oltre a questo, altri testi che possono essere utili, ma che non sono necessari, sono:
Wieringa, R.L. (2014). Design Science Methodology. Springer, New York, NY.
Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer, New York, NY.
Glassner, A. (2018). Deep Learning: From Basics to Practice. The Imaginary Institute.
Hartley, R. I. and Zisserman, A. (2004). Multiple View Geometry. Cambridge University Press, Cambridge, UK, 2nd edition.
K. P. Murphy (2022). Probabilistic Machine Learning: An Introduction, MIT Press.
K. P. Murphy (2023). Probabilistic Machine Learning: Advanced Topics, MIT Press.