Težavnost
Vaš najboljši rezultat
N/A
O cameră experimentală de observare a faunei comprimă imaginile cu texturi folosind transformare wavelet Haar înainte de a le transmite prin radio. Emițătorul ei se defectează: benzi întregi de frecvență, sau porțiuni dreptunghiulare ale acestor benzi, ajung la receptor ca zerouri. Clasifică fiecare transmisie deteriorată ca fiind una dintre texturile horizontal, vertical, diagonal, checker sau rings.
Un wavelet este o funcție mică, oscilantă și localizată. Spre deosebire de o undă sinusoidală, care se întinde la infinit, un wavelet trăiește doar pe un interval scurt, astfel încât poate descrie atât frecvența, cât și poziția unui detaliu. Transformata wavelet descompune un semnal într-o sumă de astfel de funcții, la mai multe scări (niveluri).
Transformata Haar este cel mai simplu wavelet. La un nivel, grupează eșantioanele în perechi și înlocuiește fiecare pereche cu două valori: media și diferența.
Media păstrează partea netedă a semnalului (frecvență joasă), iar diferența păstrează detaliul (frecvență înaltă). Transformata este ortogonală și inversabilă, deci valorile inițiale se recuperează exact:
La fiecare nivel, transformarea se aplică doar pe aproximarea obținută la nivelul anterior, producând astfel coeficienți la scări din ce în ce mai grosiere.
Pentru o imagine, transformarea Haar se aplică întâi pe rânduri, apoi pe coloane. Fiecare nivel produce patru benzi: aproximarea (media pe ambele axe), detaliul orizontal, detaliul vertical și detaliul diagonal.
Codul de mai jos implementează un nivel de transformare Haar pentru un semnal unidimensional:
def haar_encode(x): x = np.asarray(x, float) low = (x[0::2] + x[1::2]) / np.sqrt(2) high = (x[0::2] - x[1::2]) / np.sqrt(2) return np.concatenate([low, high])def haar_decode(c): n = len(c) // 2 low, high = c[:n], c[n:] y = np.empty(2 * n) y[0::2] = (low + high) / np.sqrt(2) y[1::2] = (low - high) / np.sqrt(2) return yPentru imagini 2D, se aplică întâi transformarea pe rânduri, apoi pe coloane. După un nivel, stânga-sus conține aproximarea, dreapta-sus conține detaliile rezultate din diferențe între coloane, stânga-jos detaliile rezultate din diferențe între rânduri, iar dreapta-jos detaliile diagonale.
def haar2_encode(img): rows = np.concatenate( ((img[:, 0::2] + img[:, 1::2]) / np.sqrt(2), (img[:, 0::2] - img[:, 1::2]) / np.sqrt(2)), axis=1 ) return np.concatenate( ((rows[0::2] + rows[1::2]) / np.sqrt(2), (rows[0::2] - rows[1::2]) / np.sqrt(2)), axis=0 )def haar2_decode(c): h = c.shape[0] // 2 w = c.shape[1] // 2 rows = np.empty_like(c) rows[0::2] = (c[:h] + c[h:]) / np.sqrt(2) rows[1::2] = (c[:h] - c[h:]) / np.sqrt(2) img = np.empty_like(c) img[:, 0::2] = (rows[:, :w] + rows[:, w:]) / np.sqrt(2) img[:, 1::2] = (rows[:, :w] - rows[:, w:]) / np.sqrt(2) return imgRepetând procedeul pe aproximare, se obțin coeficienți la mai multe scări.
train.csv conține coloanele id, path și label pentru 1.200 de exemple etichetate.test.csv conține id și path pentru 500 de exemple de clasificat.path indică un fișier NumPy .npy ce conține o matrice de coeficienți Haar 32 x 32 în virgulă mobilă.sample_submission.csv demonstrează formatul cerut pentru răspuns.Predicțiile sunt evaluate prin acuratețe de clasificare. Scorul afișat este . Aproximativ 30% din rândurile de test formează split-ul public și 70% split-ul privat; se raportează și un scor general.
Trimite un fișier CSV cu exact două coloane, id și label, și exact un rând pentru fiecare ID din test. Etichetele trebuie să fie exact una dintre: horizontal, vertical, diagonal, checker sau rings.
id,label1200,horizontal1201,rings