# 2021L-ZZSN - projekty

## Prowadzone grupy

* grupa 101
* grupa 102
* grupa 103
* grupa 104

## Organizacja zajęć

Część projektowa zajęć z *Zaawansowanych zagadnień sieci neuronowych* polega na implementacji zaawansowanych modeli sieci neuronowych nawiązujących do tematów omawianych na wykładzie.

Projekty realizowane są w zespołach dwuosobowych. Celem projektu jest rozwiązanie problemu o charakterze użytkowym lub badawczym i jednoczesne zrozumienie danego zagadnienia przez zespół. Oznacza to, że przy realizacji można się posiłkować publicznymi implementacjami, ale nie zwalnia to zespołu z przygotowania się do dokładnego wytłumaczenia zasady działania prezentowanego rozwiązania.

Projekty powinny być realizowane w języku *Python 3.8+* z wykorzystaniem biblioteki *PyTorch,* ewentualnie *TensorFlow*. Sugerowanym podejściem do ustrukturyzowania kodu jest wykorzystanie biblioteki *PyTorch Lightning*. Szkielet takiego rozwiązania dostępny jest w repozytorium [2021L-ZZSN/template](https://github.com/2021L-ZZSN/template/).

Dodatkowe informacje udostępniane będą na bieżąco w zespole MS Teams przedmiotu.

### Zasady oceniania

Za część projektową można uzyskać łącznie 35 punktów:

* dokumentacja wstępna - 5 punktów,&#x20;
* implementacja modelu - 15 punktów,
* dokumentacja końcowa i prezentacja projektu - 15 punktów.

Dokumentacja wstępna powinna zawierać opis zadania, przewidywany sposób rozwiązania problemu i wyjaśnienie poczynionych założeń (typ modelu, wybrane zbiory danych, narzędzia, zakładana funkcjonalność itp.).

W ramach implementacji, poza zrealizowaną funkcjonalnością i zakresem eksperymentów, oceniana jest przede wszystkim jakość i czytelność wygenerowanego kodu. Kod powinien dać się uruchomić po postawieniu środowiska *conda* według pliku *environment.yml* z repozytorium (w wyjątkowych przypadkach obraz z *Dockerfile*). Mile widziane są adnotacje typowania statycznego i podstawowy zakres testów adekwatny do specyfiki testowania projektów machine learningowych, ale elementy te nie są wymagane do uzyskania maksymalnej liczby punktów, jeżeli nie ma żadnych innych zastrzeżeń.

W dokumentacji końcowej należy zawrzeć opis rozwiązania ze zwięzłym wyjaśnieniem kontekstu danego zagadnienia lub zasady działania modelu, wyniki eksperymentów i wnioski po realizacji projektu.

Dokumentację i kod źródłowy należy umieścić w repozytorium *git* dedykowanym dla zespołu (dokładne informacje na kanale MS Teams).

Niejasności można wyjaśniać poprzez MS Teams lub na konsultacjach (po [zapisaniu się](https://calendly.com/karolpiczak/)).

### Harmonogram

Wyszczególnione daty oznaczają termin na koniec dnia (23:59). Przez dostarczenie materiałów rozumiany jest *commit* w udostępnionym przeze mnie repozytorium dedykowanym dla projektu.

| Data                                                                                                    | Etap realizacji                                                                                                    |
| ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| 19.03.2021 (piątek)                                                                                     | <p>Zgłoszenie składów zespołów wraz z preferencjami tematów<br>(proszę dołączyć loginy na GitHubie)</p>            |
| 22.03.2021 (poniedziałek)                                                                               | Przydział tematów do zespołów                                                                                      |
| **16.04.2021 (piątek)**                                                                                 | Dostarczenie dokumentacji wstępnej                                                                                 |
| <p><del><em><strong>2.06.2021 (środa)</strong></em></del></p><p><strong>8.06.2021 (wtorek)</strong></p> | Dostarczenie kodu źródłowego i dokumentacji końcowej                                                               |
| <p><del><em>7-11.06.2021</em></del></p><p>9-11.06.2021</p>                                              | Prezentacje i ocena projektów                                                                                      |
| <p><del><em>16.06.2021 (środa)</em></del></p><p>18.06.2021 (piątek)</p>                                 | <p>Ostateczny termin na oddanie projektu z karą -10 punktów</p><p>(po tym terminie projekty nie będą oceniane)</p> |

## Tematy projektów

| Lp. | Temat                                                                                                            |
| --- | ---------------------------------------------------------------------------------------------------------------- |
| 1   | **Zmiana pogody na zdjęciach za pomocą transferu stylu**                                                         |
| 2   | **Generowanie twarzy postaci z filmów animowanych za pomocą sieci GAN**                                          |
| 3   | **Detekcja maseczek ochronnych na zdjęciach z wykorzystaniem detektora YOLO**                                    |
| 4   | **Usuwanie tła za pomocą sieci typu U-Net**                                                                      |
| 5   | **Segmentacja zdjęć lotniczych za pomocą sieci typu U-Net**                                                      |
| 6   | **Wykorzystanie sieci impulsowej do klasyfikacji dźwięku**                                                       |
| 7   | **Przeciwstawne uczenie ciągłe klasyfikatorów dźwiękowych**                                                      |
| 8   | **Rezydualne uczenie ciągłe klasyfikatorów obrazowych**                                                          |
| 9   | **Wyszukiwanie efektywnych podsieci w klasyfikatorze danych dźwiękowych**                                        |
| 10  | **Wykorzystanie sieci kapsułkowych do klasyfikacji chmur punktów**                                               |
| 11  | **Predykcja liczby zachorowań na COVID-19 za pomocą grafowych sieci czasowo-przestrzennych**                     |
| 12  | **Analiza wydźwięku depesz giełdowych za pomocą modelu typu BERT**                                               |
| 13  | **Wykorzystanie architektury typu&#x20;*****Music Transformer*****&#x20;do generowania dzwonków telefonicznych** |
| 14  | **Wykorzystanie uczenia samonadzorowanego do poprawy klasyfikacji dźwięku**                                      |
| 15  | **Uczenie klasyfikatorów dźwiękowych niewielką liczbą przykładów z wykorzystaniem sieci prototypowych**          |
| ?   | *Możliwe tematy własne po konsultacji*                                                                           |

### **Omówienie tematów**

#### **1. Zmiana pogody na zdjęciach za pomocą transferu stylu**

{% hint style="info" %}
Celem projektu jest stworzenie narzędzia do konwersji zdjęcia z pochmurną pogodą na zdjęcie ze słoneczną pogodą.

**Schemat sugerowanego rozwiązania:**

* Pobranie obrazków z kamer internetowych (np. [*webcamgalore.com*](https://www.webcamgalore.com/)) z różnych momentów w czasie (*timelapse*).
* Wykorzystanie gotowego klasyfikatora pogody do oznaczenia zdjęcia jako pochmurne/słoneczne (ewentualnie adnotacja ręczna).
* Stworzenie sieci GAN do transferu stylu pochmurnie → słonecznie.
* Porównanie z uczeniem na zdjęciach, które nie pochodzą z tego samego ujęcia (np. [Two-Class Weather Classification](http://www.cse.cuhk.edu.hk/leojia/projects/weatherclassify/index.htm)).

{% endhint %}

**2. Generowanie twarzy postaci z filmów animowanych za pomocą sieci GAN**

{% hint style="info" %}
Celem projektu jest stworzenie narzędzia do generowania twarzy postaci kreskówkowych przy wykorzystaniu sieci GAN.

**Przykładowy zbiór danych:** [**iCartoonFace**](https://github.com/luxiangju-PersonAI/iCartoonFace)**,** ewentualnie [**Cartoon Set**](https://google.github.io/cartoonset/index.html)

Minimalny zakres to generowanie bezwarunkowe (dowolna twarz), ciekawsze rozwiązanie powinno uwzględniać możliwość sterowania charakterem generowanego obrazu.
{% endhint %}

**3. Detekcja maseczek ochronnych na zdjęciach z wykorzystaniem detektora YOLO**

{% hint style="info" %}
Celem projektu jest stworzenie detektora działającego w trybie real-time, który na zdjęciu z kamery oznaczy osoby z maseczkami ochronnymi i bez maseczek.

**Przykładowe zbiory danych:** [**Kaggle**](https://www.kaggle.com/datasets?search=face+mask)

W ramach podsumowania proszę przetestować działanie detektora na własnym filmie z kamery internetowej (ewentualnie zdjęciach z telefonu) albo na wybranym streamie dostępnym publicznie.
{% endhint %}

**4. Usuwanie tła za pomocą sieci typu U-Net**

{% hint style="info" %}
Celem projektu jest stworzenie narzędzia do usuwania/podmiany tła na zdjęciu twarzy.

**Przykładowy zbiór danych:** [**Matting Human Datasets**](https://www.kaggle.com/laurentmih/aisegmentcom-matting-human-datasets)

W ramach podsumowania proszę przetestować działanie narzędzia na własnych zdjęciach z telefonu lub filmie z kamery internetowej i porównać np. z rozmyciem dostępnym w MS Teams, Google Meet.

Do rozwiązania można też wykorzystać inne podejście niż wykorzystanie sieci U-Net.
{% endhint %}

**5. Segmentacja zdjęć lotniczych za pomocą sieci typu U-Net**

{% hint style="info" %}
Celem projektu jest stworzenie narzędzia do segmentacji zdjęć lotniczych wykorzystującego sieć typu U-Net.

**Przykładowy zbiór danych:** [**Aerial Semantic Segmentation Drone Dataset**](https://www.kaggle.com/bulentsiyah/semantic-drone-dataset)

W ramach podsumowania proszę przetestować działanie narzędzia na [mapach lotniczych Warszawy](http://mapa.um.warszawa.pl/mapaApp1/mapa?service=mapa).
{% endhint %}

**6. Wykorzystanie sieci impulsowej do klasyfikacji dźwięku**

{% hint style="info" %}
Celem projektu jest implementacja kilku wariantów prostych architektur sieci impulsowej i porównanie ich działania na zbiorze wizyjnym [*MNIST*](http://yann.lecun.com/exdb/mnist/) oraz zbiorze dźwiękowym [*ESC-50/ESC-10.*](https://github.com/karolpiczak/ESC-50)

**Sugerowany framework do implementacji:** [**BindsNET**](https://github.com/BindsNET/bindsnet)

Ze względu na eksperymentalny charakter zagadnienia osiągnięta dokładność klasyfikacji nie jest kryterium oceny jakości projektu, liczy się poprawność implementacji.
{% endhint %}

**7. Przeciwstawne uczenie ciągłe klasyfikatorów dźwiękowych**

{% hint style="info" %}
Celem projektu jest implementacja metody uczenia ciągłego określanej jako [*adversarial continual learning*](https://arxiv.org/pdf/2003.09553.pdf) i weryfikacja jej działania w kontekście klasyfikacji dźwięku (np. na [ESC-50](https://github.com/karolpiczak/ESC-50), [UrbanSound8K](https://urbansounddataset.weebly.com/urbansound8k.html) lub [FSD50K](https://zenodo.org/record/4060432#.YEo4u2hKiMo)).

W ramach podsumowania proszę porównać efektywność tego podejścia z wybraną metodą typu regularyzacyjnego i metodą typu *replay*.
{% endhint %}

**8. Rezydualne uczenie ciągłe klasyfikatorów obrazowych**

{% hint style="info" %}
Celem projektu jest implementacja metody uczenia ciągłego określanej jako [*residual continual learning*](https://arxiv.org/pdf/2002.06774.pdf) i weryfikacja jej działania w kontekście klasyfikacji obrazów (np. na CIFAR-10/CIFAR-100).

W ramach podsumowania proszę porównać efektywność tego podejścia z wybraną metodą typu regularyzacyjnego i metodą typu *replay*.
{% endhint %}

**9. Wyszukiwanie efektywnych podsieci w klasyfikatorze danych dźwiękowych**

{% hint style="info" %}
Celem projektu jest przebadanie działania metody [*early bird tickets*](https://github.com/RICE-EIC/Early-Bird-Tickets) do szybkiego wyszukiwania efektywnych podsieci w klasyfikatorach dźwiękowych (np. o architekturze zbliżonej do OpenL3).

W ramach podsumowania proszę zweryfikować dokładność działania modelu bazowego i podsieci typu *lottery ticket* na wybranych zbiorach z zakresu klasyfikacji dźwięku (np. [ESC-50](https://github.com/karolpiczak/ESC-50), [UrbanSound8K](https://urbansounddataset.weebly.com/urbansound8k.html), [FSD50K](https://zenodo.org/record/4060432#.YEo4u2hKiMo) lub [innych](http://dcase.community/)).
{% endhint %}

**10. Wykorzystanie sieci kapsułkowych do klasyfikacji chmur punktów**

{% hint style="info" %}
Celem projektu jest zastosowanie sieci kapsułkowych do klasyfikacji chmur punktów.

W ramach zadania wstępnego proszę sprawdzić działanie sieci kapsułkowej na zbiorze obrazowym (np. CIFAR-10).

W ramach podsumowania proszę porównać działanie sieci kapsułkowej z innym modelem (np. [PointNet++](http://stanford.edu/~rqi/pointnet2/)) w zadaniu klasyfikacji chmur punktów (np. [ShapeNetCore](https://shapenet.org/)).
{% endhint %}

**11. Predykcja liczby zachorowań na COVID-19 za pomocą grafowych sieci czasowo-przestrzennych**

{% hint style="info" %}
Celem projektu jest zastosowanie [czasowo-przestrzennej grafowej splotowej sieci neuronowej](https://arxiv.org/pdf/1709.04875.pdf) do predykcji liczby zachorowań na COVID-19 dla [danych ze Stanów Zjednoczonych](https://github.com/nytimes/covid-19-data) (podział na hrabstwa).

W ramach podsumowania proszę porównać działanie modelu z predykcjami prostych lokalnych modeli autoregresyjnych oraz zweryfikować poprawność implementacji na [zbiorze benchmarkowym zachorowań na ospę](https://pytorch-geometric-temporal.readthedocs.io/en/latest/modules/dataset.html#torch_geometric_temporal.data.dataset.chickenpox.ChickenpoxDatasetLoader).

Do implementacji zalecane jest wykorzystanie biblioteki [PyTorch Geometric Temporal](https://github.com/benedekrozemberczki/pytorch_geometric_temporal).

W przypadku tego projektu bardzo pożądanym elementem jest wizualizacja predykcji na mapie, np. za pomocą [Streamlit](https://docs.streamlit.io/en/stable/api.html#streamlit.map).
{% endhint %}

**12. Analiza wydźwięku depesz giełdowych za pomocą modelu typu BERT**

{% hint style="info" %}
Celem projektu jest wykorzystanie polskiego modelu typu BERT (np. [Herbert](https://huggingface.co/allegro/herbert-large-cased) albo [Polbert](https://huggingface.co/dkleczek/bert-base-polish-cased-v1)) do oceny wydźwięku (*negatywny/neutralny/pozytywny*) depesz na polskiej Giełdzie Papierów Wartościowych.

**Schemat sugerowanego rozwiązania:**

* Wykorzystanie modelu wstępnie trenowanego na korpusie języka polskiego do zadania analizy wydźwięku, np. na zbiorze [PolEmo2.0-IN](https://klejbenchmark.com/tasks/#polemo2.0-in). Porównanie działania modelu przy zmianie dziedziny ([PolEmo2.0-OUT](https://klejbenchmark.com/tasks/#polemo2.0-out)).
* Stworzenie bazy danych z [raportów systemu ESPI](http://infostrefa.com/infostrefa/pl/raporty/espi/biezace,0,0,0,1). Adnotacją wydźwięku generowaną syntetycznie może być następująca po komunikacie nadmiarowa zmiana [kursu akcji spółki](https://www.quandl.com/data/WSE-Warsaw-Stock-Exchange-GPW) w stosunku do zmiany szerokiego rynku.
* Weryfikacja działania modelu bez uczenia na danych z dziedziny finansowej i po wykorzystaniu raportów do dotrenowywania.
  {% endhint %}

**13. Wykorzystanie architektury typu&#x20;*****Music Transformer*****&#x20;do generowania dzwonków telefonicznych**

{% hint style="info" %}
Celem projektu jest stworzenie modelu o architekturze [*Music Transformer*](https://magenta.tensorflow.org/music-transformer), którego zadaniem jest generowanie krótkich fragmentów muzycznych o charakterze dzwonka telefonicznego.

**Schemat sugerowanego rozwiązania:**

* Przygotowanie zbioru [plików MIDI](https://github.com/albertmeronyo/awesome-midi-sources) o charakterze adekwatnym dla potencjalnego zastosowania.
* Wyuczenie modelu na przygotowanym zbiorze danych pod kątem bezwarunkowego generowania sekwencji MIDI i warunkowanego krótkim fragmentem początkowym.
* Przetworzenie wygenerowanych sekwencji do postaci dźwiękowej za pomocą syntezy offline (np. [NSynth](https://magenta.tensorflow.org/datasets/nsynth)), wybranego odtwarzacza MIDI w JavaScript albo wykorzystania wybranego [syntezatora VSTi](https://www.kvraudio.com/plugins/instruments/windows/macosx/linux/vst-plugins/free/most-popular) (np. przez [RenderMan](https://github.com/fedden/RenderMan)).
  {% endhint %}

**14. Wykorzystanie uczenia samonadzorowanego do poprawy klasyfikacji dźwięku**

{% hint style="info" %}
Celem projektu jest wyuczenie modelu rozumienia dźwięku w sposób samonadzorowany na zbiorze danych nieetykietowanych, np. wzorując się na podejściu [SimCLR](https://github.com/google-research/simclr) lub [MoCo](https://github.com/facebookresearch/moco). Tak wyuczony model należy następnie wykorzystać do klasyfikacji spektrogramów z mniejszego zbioru etykietowanego i porównać dokładność klasyfikacji z modelem uczonym w standardowy sposób (w pełni nadzorowany, tylko na zbiorze etykietowanym), ewentualnie przeanalizować odporność obydwu modeli na złośliwe modyfikacje typu *adversarial attacks*.

**Przykładowe zbiory danych:** [**ESC-US**](https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/YDEPUT) i [**ESC-50**](https://github.com/karolpiczak/ESC-50)

Ze względu na większą złożoność obliczeniową technik samonadzorowanych wyniki podsumowania można oprzeć na modelu wyuczonym częściowo. Jeżeli sama implementacja i wytłumaczenie zespołu będzie bez zastrzeżeń, to nie wpływa to na końcową ocenę. W takim wypadku zalecałbym sprawdzenie implementacji na zbiorze CIFAR-10.
{% endhint %}

**15. Uczenie klasyfikatorów dźwiękowych niewielką liczbą przykładów z wykorzystaniem sieci prototypowych**

{% hint style="info" %}
Celem projektu jest stworzenie modelu [sieci protytypowej](https://arxiv.org/pdf/1703.05175.pdf) do uczenia klasyfikatorów dźwiękowych niewielką liczbą przykładów (*few-shot learning*).

**Schemat sugerowanego rozwiązania:**

* Stworzenie standardowego klasyfikatora dźwiękowego (np. na podstawie architektury [OpenL3](https://openl3.readthedocs.io/)) i wyuczenie go na zbiorze danych [FSD50K](https://annotator.freesound.org/fsd/release/FSD50K/).
* Sprawdzenie dokładności klasyfikacji przy standardowym uczeniu (bez ograniczeń na liczbę przykładów per klasa).
* Ocena tego samego modelu w uczeniu z ograniczoną liczbą przykładów (np. połowa klas dostępna normalnie, połowa tylko po $$K=5$$ przykładów uczących).
* Porównanie z działaniem modelu sieci prototypowej dla różnych wartości $$K$$ .
  {% endhint %}

## Zalecenia zbiorcze

Poza raportem końcowym dobrze byłoby, gdyby w ramach rozwiązania można zrozumieć i sprawdzić działanie modelu na przykładach, najlepiej w sposób interaktywny.

Sugerowanym narzędziem do tego typu prostych podsumowań jest [Streamlit](https://www.streamlit.io/), ewentualnie [Dash](http://dash.plotly.com/) lub inne rozwiązania tego typu.

### Zasoby obliczeniowe

Do realizacji projektów można wykorzystać darmowe zasoby obliczeniowe:

* [Google Colab](https://colab.research.google.com/)
* [Kaggle Code](https://www.kaggle.com/code)
* [Azure for Students](https://azure.microsoft.com/pl-pl/free/students/)
* [gradient](https://docs.paperspace.com/gradient/instances/instance-types/free-instances)

Jeżeli uda się pozyskać grant edukacyjny na przedmiot, to dostępne będą dodatkowo kupony do wykorzystania w *Google Cloud*.

W szczególnych przypadkach (np. uczenie samonadzorowane) możliwe jest też przydzielenie zasobów z puli uczelnianej.

{% hint style="warning" %}
W zależności od wymagań projektu i dostępnych mocy obliczeniowych uczenie modeli może zająć dłuższy czas (liczony w dniach). Proszę uwzględnić ten fakt przy rozplanowywaniu harmonogramu prac.
{% endhint %}
