PiRO — Projekt 2 (deskryptor obrazu)


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):

  1. def extract(image, keypoints)
    Funkcja oblicza deskryptory obrazu dla wszystkich wskazanych punktów.
    Parametry:

    • image : 2D tablica numpy (typ numpy.uint8) z obrazem
      Obraz jest jednokanałowy o wymiarach minimum 64×64, wartości punktów z zakresu 0-255
    • keypoints: tablica o wymiarach (N, 2) z zapisanymi współrzędnymi N punktów dla których należy wyliczyć deskryptory.
      W każdym wierszu zapisana jest para (nr_wiersza, nr_kolumny) w obrazie image (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.

  2. 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

  1. Dla obrazów zostaną wybrane/wylosowane odpowiadające sobie punkty.
  2. Dla wszystkich punktów zostaną wyliczone deskryptory przy użyciu funkcji extract.
  3. Dla każdego deskryptora zostanie obliczona odległość do wszystkich pozostałych.
  4. 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:

  1. Wyników na zbiorach danych.
  2. Czasu działania (m.in. metoda distance powinna być szybka!)
  3. 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:

  1. 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)
  2. descriptor.py (program zawierający obie wymagane funkcje: extract i distance)
  3. 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.