LucaCatalano13 / UAQA

Urban Air Quality Assessment project for the Applied Data Science Project course @ poliTO
1 stars 0 forks source link

Resize degli input implementato a blocchi anziché usando interpolazione #2

Open lorenzoinnocenti opened 11 months ago

lorenzoinnocenti commented 11 months ago

Nella resize dividete l'array di input in blocchi e fate la media, questo dà problemi se la risoluzione di input e quella di output non sono molto diverse.

Esempio: Usando current_shape = (571, 632) e new_shape = (296, 312) Versione "original", sub_height = 1 e sub_width = 1, quindi viene creato un pixel out ogni pixel in fino a 296, poi l'ultimo è la media degli ultimi 275. Versione "hybrid", sub_height = 2 e sub_width = 2, quindi viene creato un pixel in out ogni quattro input fino a 296*2, poi l'ultimo è la media degli ultimi 275, riutilizzando questi ultimi due volte nel calcolo dell'output.

Il problema non si presenta se current_shape è un multiplo, o quasi, di new_shape, usando "original", mentre con "hybrid" non si ha la certezza che l'output sia corretto. Secondo me sarebbe meglio utilizzare qualche forma di interpolazione, come cv2.resize, che è anche molto più veloce.

Se comunque volete usare la media vi consiglio di escludere dal calcolo i valori nan e quelli che nella maschera sono segnati come non validi.

jackyjack00 commented 11 months ago

Sono abbastanza sicuro che non riutilizzi mai i dati, ci avevamo pensato attentamente, la funzione ha un verbose che si può utilizzare per controllare i blocchi che genera durante la procedura di resize. I valori nan sono quelli della maschera per definizione della mask da quello che abbiamo capito, di conseguenza abbiamo scelto di essere conservativi propagando i valori nan piuttosto che fare la average degli altri (topic se ricordo bene concordato con voi nelle primissime settimane di lavoro). Tuttavia un'implementazione in cui facciamo la media di tutti i pixel non nan è possibile ma bisogna stabilire una threshold di numero di nan accettabile per resized pixel.

lorenzoinnocenti commented 11 months ago

Capisco, sono scelte implementative, il problema principale è comunque il comportamento strano per valori bassi di sub_height e sub_width, e le performance migliori di resize usando cv2. Comunque, se a voi non risulta questo comportamento perché nel vostro caso la risoluzione di output viene divisa più equamente in blocchi, continuate pure così.

lorenzoinnocenti commented 11 months ago

Non siamo sicuri che i valori nan nei dati siano tutti e soli i valori segnati come non validi nella mask, vi direi di considerare più quest'ultima.

Oltre a questo, su sentinel 5 ci sono dei valori che nella mask risultano validi mentre invece contengono valori che non hanno senso. In questo caso, i controlli da fare sono:

SO2 < 0 HCHO < 0 AER_AI_340_380 < -1 AER_AI_354_388 < -1

SO2 e HCHO sono concentrazioni per cui se sono negative è errato, mentre per gli indici di AEROSOL la documentazione stessa dice che il minimo è -1.

jackyjack00 commented 11 months ago

applicheremo i controlli applicando la hard mask anche a quei valori, essendo un controllo così specifico direi che lo controlleremo durante la creazione dei dataset dei singoli satelliti