Projekt 2 – deskryptor obrazu ∞
Celem jest opracowanie i przetestowanie własnego deskryptora obrazu.
Liczyć się będzie nie tylko jego jakość i czas działania ale również sposób jego skonstruowania/uczenia/optymalizacji.
Należy napisać dwie funkcje w pythonie3 (wszystkie programy będą uruchamiane tylko i wyłącznie w pythonie w wersji 3):
-
def extract(image, keypoints)
Funkcja oblicza deskryptory obrazu dla wszystkich wskazanych punktów.
Parametry:image
: 2D tablica numpy (typnumpy.uint8
) z obrazem
Obraz jest jednokanałowy o wymiarach minimum 64×64, wartości punktów z zakresu0-255
keypoints
: tablica o wymiarach(N, 2)
z zapisanymi współrzędnymiN
punktów dla których należy wyliczyć deskryptory.
W każdym wierszu zapisana jest para (nr_wiersza, nr_kolumny) w obrazieimage
(uwaga: pierwsza współrzędna to nr wiersza!)
Żaden punkt nie będzie bliżej brzegu obrazu niż 32 piksele.
Zwracana wartość:
- lista N deskryptorów
Każdy deskryptor może być dowolnym obiektem.
Funkcja do wyliczenie pojedynczego deskryptora nie powinna używać okna większego niż 64×64 wycentrowanego na interesującym nas punkcie.
-
def distance(descriptor1, descriptor2)
Funkcja oblicza odległość pomiędzy dwoma deskryptorami.
Parametery:descriptor1
: jeden z deskryptorów zwróconych przez funkcjęextract
descriptor2
: jeden z deskryptorów zwróconych przez funkcjęextract
Zwracana wartość:
-
nieujemną wartość typu
float
oznaczająca różnicę pomiędzy dwoma deskryptorami.
Dla dwóch identycznych deskryptorów funkcja powinna zwracać 0 (zero).
Zbiory danych ∞
Programy będą testowane (głównie) na obrazach: http://www.robots.ox.ac.uk/~vgg/data/data-aff.html
Aby przetransformować punkty z jednego obrazka do drugiego przy podanej macierzy można wykorzystać kod:
1 2 3 |
trans = skimage.transform.ProjectiveTransform(h) # h - macierz wczytana z pliku points_out = trans(points_in) points_out = trans.inverse(points_in) # lub transformacja odwrotna (jeśli zamieniamy w drugą stronę) |
Programy będą testowane dla różnych przekształceń osobno, tzn. dla każdego zbioru obrazów z powyższej bazy będzie niezależnie wyliczany ranking deskryptorów.
Dodatkowo można łatwo wygenerować sobie pary obrazów np. z coraz większym obrotem w lewo/prawo, ze zmienną skalą itd. itp. — czyli z parametrami przekształceń które można samodzielnie kontrolować i badać odporność zaproponowanego rozwiązania np. na obroty, rozmycie, zmianę skali itd.
Procedura testowania ∞
- Dla obrazów zostaną wybrane/wylosowane odpowiadające sobie punkty.
- Dla wszystkich punktów zostaną wyliczone deskryptory przy użyciu funkcji
extract
. - Dla każdego deskryptora zostanie obliczona odległość do wszystkich pozostałych.
-
Następnie zostanie obliczone pole pod krzywą ROC, czyli tzw. Area Under ROC Curve (AUC):
- AUC = 1 — klasyfikator idealny
- AUC = 0.5 — klasyfikator losowy
- AUC < 0.5 --- klasyfikator gorszy niż losowy (niepoprawny!)
Wartość AUC można wyliczyć m.in. przy przy użyciu funkcji
sklearn.metrics.roc_auc_score
, np.:1 2 3 4 5
import numpy as np from sklearn.metrics import roc_auc_score y_true = [0, 0, 1, 1] # 0 dla odpowiadających sobie punktów, 1 dla różnych y_scores = [0.1, 0.4, 0.35, 0.8] # odległości zwrócone przez funkcję distance roc_auc_score(y_true, y_scores)
Zaliczenie projektu ∞
Projekt powinien być wykonany w zespole maksymalnie dwuosobowym.
Nieprzekraczalny termin: niedziela 20 maja
Projekt oceniany będzie na podstawie:
- Wyników na zbiorach danych.
- Czasu działania (m.in. metoda
distance
powinna być szybka!) -
Opisu metody, sposobu uczenia/optymalizacji oraz prezentacji wyników działania (“naukowe podejście” do tematu i prezentacji)
Wymagania dotyczące przysyłanego programu ∞
Proszę źródła każdego projektu przysłać w postaci archiwum zip o nazwie nazwisko1_nrindeksu1_nazwisko2_nrindeksu2.zip (bez znaków diakrytycznych) zawierającego następujące, wymagane pliki:
autorzy.txt
(dla każdego autora po jednej linijce tekstu zawierającą imię, nazwisko oraz nr indeksu; kodowanie znaków: UTF-8; można też nie używać znaków diakrytycznych)descriptor.py
(program zawierający obie wymagane funkcje:extract
idistance
)-
dodatkowe wymagane pliki
Pliki autorzy.txt
oraz descriptor.py
muszą znajdować się bezpośrednio w archiwum zip (a nie w jakimś podkatalogu).
Proszę upewnić się czy przysłany plik spełnia powyższe wymagania.
Programy będą sprawdzane na komputerze w laboratorium 1.6.21 i mogą wykorzystywać biblioteki tam dostępne. Proszę się upewnić, że tam działa zaliczany program.