Table of Contents
- 17/10/2021 - Attributi
- 14/10/2021 - Nuove baselines
- 13/10/2021 - Problema sulla similarità degli embeddings
- 30/09/2021 (x) - Riunione e nuove idee
- 29/09/2021 - Preparazione presentazione: risultati
- 28/09/2021 - Pesare nella loss la freq delle classi
- 24/09/2021 - Max-class concept sim
- 22/09/2021 - Rimossa frase negativa in favore di concept direction
- 20/09/2021 - Proportional concept similarity activation e threshold
- 17/09/2021 - Filtro noun phrases con spacy
- 15/09/2021 - Implementato w2v e lanciati i training
- 14/09/2021 - Cambiare glove con w2v embedding?
- 13/09/2021 - Dottorato e correzione del problema su flickr con aggregazione delle frasi
- 09/09/2021 - Implementata aggregazione delle frasi w2v-max
- 07/09/2021 (x) - Accuracy su referit 25%
- 06/09/2021 - Implementazione similarità classi
- 03/09/2021 - Introduzione delle classi
- 02/09/2021 (x) - Call con i prof
- 01/09/2021 - Problema analisi frequenze
- 31/08/2021 - Classe
__background__
- 30/08/2021 - Studio frequenza classi e altri esperimenti
- 27/08/2021 - Classes frequency
- 23/08/2021 - Slide aggiornamenti e dati raccolti
- 20/08/2021 - Loss + approfondimenti
- 18/08/2021 - Call post Ferragosto
- 15/08/2021 - Analisi impatto del numero di bounding box
- 13/08/2021 (x) - Accuracy sul training/valid crescente!
- 10/08/2021 - Altri problemi evidenziati da Davide
- 06/08/2021 - Sviluppo parallelo di una codebase nuova
- 05/08/2021 - Validazione del modello: ricerca e codice
- 04/08/2021 - Problema della validazione del modello: matching chunk-query
- 03/08/2021 (x) - Riunione per aggiornamenti
- 23/07/2021 - Branch per i training e esecuzione sul cluster (CPU)
- 22/07/2021 - Fix problemi evidenziati nella call
- 21/07/2021 (x) - Review del codice con Davide
- 20/07/2021 - Problema bb attive fixed e padding bb
- 19/07/2021 - Altri problemi di maschere sulla loss
- 18/07/2021 - Problemi di maschere sulle loss?
- 16/07/2021 (x) - Stop ssh torre, fix
get_iou_score
loss - 14-15/07/2021 - Run dei modelli e8, e9, e10
- 13/07/2021 - Problemi di training
- 12/07/2021 - Modifica top-k loss e IndexError
- 09/07/2021 - Studio per utilizzo sentence nel modello
- 08/07/2021 - Minor refactor and problem fixes
- 06/07/2021 - Similarity based attraction
- 05/07/2021 - Top-K repulsion loss
- 02/07/2021 - Test Loss e Masking
- 01/07/2021 - Implementazione loss
- 29/06/2021 - Call con Davide per problemi sulle loss
- 28/06/2021 - Risoluzione problemi referit / ottimizzazione loss
- 22/06/2021 - Inizio adattamento per referit
- 21/06/2021 (x) - Call per aggiornamento con il prof.
- 18/06/2021 - Test Example Procedure
- 17/06/2021 - Learning Unsupervised Visual Grounding Through Semantic Self-Supervision
- 16/06/2021 - Accuracy e Pointing Game Accuracy
- 15/06/2021 - Loss: IoU e accuracy
- 11/06/2021 - Black friday: problema di memoria / problema chunk vuoti
- 10/06/2021 - Input negativi e loss discriminativa
- 09/06/2021 - Modifica funzioni di padding e loss, flickr30k pico, github action
- 08/06/2021 - Modifica dataloader e funzioni di padding
- 07/06/2021 - Progettazione modello Weakly-Supervised
- 04/06/2021 (x) - Discussione sul lavoro da fare sul codice
- 03/06/2021
- 01/06/2021
- 31/05/2021
- 28/05/2021
- 26/05/2021 - 27/05/2021
- 25/05/2021
- 24/05/2021
- 22/05/2021
- 21/05/2021
- 20/05/2021
- 19/05/2021
- 18/05/2021
- 17/05/2021
- 13/05/2021 (*)
- 11/05/2021
- 04/05/2021 - 05/05/2021
- 27/04/2021 - 03/05/2021
- 26/04/2021
- 22/04/2021 (*)
- 21/04/2021
- 20/04/2021
- 19/04/2021
- 30/04/2021 (*)
Concat per similarità
sim(a, b) + sim(c, d) = sim([a, c], [b, d])
sim(a, b) + sim(c, d) = sim([a, b], [c, d])
DA NORMALIZZARE, ALTRIMENTI NON TORNA!!
>>> a = torch.tensor([1, 2, 3], dtype=torch.float32)
>>> b = torch.tensor([4, 5, 6], dtype=torch.float32)
>>> c = torch.tensor([7, 8, 9], dtype=torch.float32)
>>> d = torch.tensor([10, 11, 12], dtype=torch.float32)
>>>
>>> ac = torch.cat((a, c))
>>> ab = torch.cat((a, b))
>>> bd = torch.cat((b, d))
>>> cd = torch.cat((c, d))
>>>
>>> sim_a_b = torch.cosine_similarity(a, b, dim=-1)
>>> sim_c_d = torch.cosine_similarity(c, d, dim=-1)
>>> sim_ac_bd = torch.cosine_similarity(ac, bd, dim=-1)
>>> sim_ab_cd = torch.cosine_similarity(ab, cd, dim=-1)
>>>
>>> print("sim(a, b) + sim(c, d) = sim(ac, bd) ==>", torch.equal(sim_a_b + sim_c_d, sim_ac_bd))
False
>>> print("sim(a, b) + sim(c, d) = sim(ab, cd) ==>", torch.equal(sim_a_b + sim_c_d, sim_ab_cd))
False
Similarità attributo
Il modello applica la similarità come
predictions = lam * predictions + (1 - lam) * sim(classe, concetto)
potremmo aggiungere, in seguito a quanto riportato sopra, questo
predictions = rho * predictions + (1 - rho) * sim(attributo, aggettivo)
-
Se non c'è l'attributo sulla box (i.e., prob attr < 0.2) allora la sim(attributo, aggettivo) è 0.
-
Se non c'è l'aggettivo nella frase (i.e., spacy non trova nulla) allora la sim(attributo, aggettivo) è 0.
In entrambi i casi, l'unico problema è che la "potenza" di predizione del modello viene scalata. (PROBLEMA)
NOTA: in alcuni casi si ottiene nan
per via di divisione per zero o altro
(vedere sezione Problema sotto)
"Direzione" nella loss
Ragionando sull'attrazione/repulsione delle feature, sarebbe utile potenziare l'attrazione nel caso di concetto+attributo corretti e viceversa, attenendosi alla seguente tabella
| concetto | - | - | + | + |
| attributo | - | + | - | + |
| --------- | --- | --- | --- | --- |
| | - | - | + | + |
| | - | | | + |
Il risultato prende la forma di f(x) = arctan x
, con x che si muove sulle 4
combinazioni.
Se x è discretizzata come in tabella allora è possibile simulare l'andamento
risultato modificando f
come f(x) = arctan (x * tan(1) / 2) = 1
. (questo ci
permette di avere f(2) = 1
).
Esempio:
f(2) = 1
f(1) = 0.66
f(0) = 0
f(-1) = -0.66
f(-2) = -1
Altrimenti c'è l'opzione retta che passa per (-2,-1) e (2,1): f(x) = x/2
.
Estrazione attributo
NOTA:
Sul paper bottom-up attention dell'obj detector si legge
To aid the learning of good feature representations, we add an additional training output for predicting attribute classes (in addition to object classes). To predict attributes for region i, we concatenate the mean pooled convolutional feature vi with a learned embedding of the ground-truth object class, and feed this into an additional output layer defining a softmax distribution over each attribute class plus a ‘no attributes’ class
Mi sembra di capire poi, leggendo sotto, che la threshold a 0.2 è utilizzata per altri scopi, non per gli attributi:
"To select salient image regions, a class detection confidence threshold of 0.2 is used, allowing the number of regions per image k to vary with the complexity of the image,"
Controllando l'out dei file per la key "pred_attr_prob" si ha una lista [100, 401], i.e. per ogni bb ci sono 401 attributi (400 + background come per le classi)
>>> x = [...] # Ctrl+C Ctrl+V dei dati della key `pred_attr_prob` del file pickle
>>> len(x)
401
Conclusione: anche per gli attr. c'è la classe background da ignorare. (con il debugger è evidente la sua presenza)
ESTRAZIONE ATTRIBUTO:
- Maschera per ignorare background (ed eventualmente altri)
- Argmax sugli attributi (valutare altre strategie)
Output:
- un attributo per ogni bb dove la maschera è True
- non esiste il caso zero attributi ==> se maschera True faccio argmax e quindi almeno 1 esiste!
IDEA: Si potrebbe valutare di aggregare tutti gli attributi in uno generico, ma non so se ha molto senso...
Estrazione aggettivo
- Per ogni frase, spacy con filtro su POS == ADJ ==> lista di aggettivi (anche vuota!)
- La di aggettivi è joinata e rappresentata come se fosse una frase (problema:
" ".join([]) = ""
)- Si potrebbe effettivamente creare una maschera che mette un flag quando succede questo...
- Attualmente il problema è che quando succede, ottengo un tensore con una
certa dimensione a zero
[2, 1, 0]
dove[b, n_ph, attr_len]
. Ciò funziona fino a quando non si fanno cose tipoattr.sum() / attr_mask.sum()
perché entrambi come risultato della sum restituiscono0
- Da qui in poi è possibile far funzionare tutto come per la concept similarity
(a meno dei problemi evidenziati):
- Calcolo similarità tra tutti gli aggettivi e tutti gli attributi delle box
- Scelgo l'aggettivo con similarità max wrt attributi
- Calcolo cosine sim tra attr e adj
Problema
Quando non ci sono aggettivi, l'aggregatuion strategy con mean non funziona e restituisce nan per via di una divisione per zero.
Si potrebbe provare con
if 0 not in box_attribute.size() and 0 not in adjective.size():
attribute_similarity = compute_attribute_similarity()
else:
attribute_similarity = torch.zeros_like(positive_concept_similarity)
Anche questo però è scomodo secondo me.
Bisogna fare un if e non eseguire nemmeno l'apply della attribute sim con la media? A questo punto mi sembra l'unica soluzione.
Oppure, cosa forse migliore, si utilizza una maschera che copre i casi evidenziati.
Problema pt. 2
Union box potrebbe essere poco discriminativo se aggiungiamo gli attributi.
DOPO CALL
- Evitare il prior nel modello, troppo complicato per ora.
- Aggiungere gli attributi nella loss con la direzione utilizzando la tabella
riportata di seguito. La tabella può essere semplificata tramite una formula
assumendo in input A e B due tensori formati da 0 e 1 per direzione concetto e
direzione attributo, come
(A + B - B*(1-A)) - 1
. - Ignorare la bb indice zero negli attributi, è un errore dell'object detector e considerare gli attributi presenti quando >= 0.2.
Tabella per aggiungere attributi nella loss :
concetto=1, attributo=1 -> avvicina
concetto=1, attributo=0 -> nulla
concetto=0, attributo=1 -> allontana
concetto=0, attributo=0 -> allontana
With prior
Baseline = prior mean, loss orthogonal, full phrase, spell correction
Experiment | Baseline | Outcome | Gain** (%) |
---|---|---|---|
(192) no image projection net (lstm=2053 feat) | 39.4 | 38.4 | -2.5 |
(194) loss othogonal + scale by freq | 39.4 | 41.7 | 5.8 |
(195)* concept sim weight = 0.4 | 39.4 | 39.3 | -0.2 |
(196)* concept sim weight = 0.6 | 39.4 | 39.1 | -0.7 |
(198)* concept sim weight = 0.3 | 39.4 | 38.8 | -1.5 |
(199)* concept sim weight = 0.7 | 39.4 | 39.3 | -0.2 |
Without prior
Baseline = no prior, loss orthogonal, full phrase, spell correction
Experiment | Baseline | Outcome | Gain** (%) |
---|---|---|---|
(191) no image projection net (lstm=2053 feat) | 34.1 | 14.0 | -58.9 |
(193) loss othogonal + scale by freq | 34.1 | 34.7 | 1.7 |
*: pochissime epoche di training
**: Gain = (Outcome - Baseline) / Baseline * 100
TODO: raccogliere baselines e risultati
w2v | glove | |
---|---|---|
sim("skateboarder", "boy") | 0.3863 | 0.2955 |
sim("boy", "woman") | 0.5976 | 0.6260 |
sim("boy", "person") | 0.3373 | 0.4035 |
sim("boy", "people") | 0.2337 | 0.3307 |
sim("man", "woman") | 0.7664 | 0.7402 |
sim("man", "people") | 0.3391 | 0.4899 |
sim("man", "person") | 0.5342 | 0.5557 |
sim("person", "people") | 0.5083 | 0.6294 |
ESPERIMENTI / COSE DA FARE
- Freezare e sistemare tutti gli esperimenti come baseline: dobbiamo avere
no-prior
,no-prior + freq
,prior
,prior + freq
- Aggiungere parametro per spegnere/accedendere l'utilizzo della frequenza
- Implementare la loss per ortogonalità, ovvero
-pos + neg^2
, lanciare run senza freq sia moltiplicando che non - Aggiungere lo spell checker (vedere codice di Davide)
- Verificare lowercase nella net delle parole e rimuovere in caso
-
Cambiare L1 con L2 per testo e immagini - Verificare se c'è L1 su testo
- Fare una media pesata del prior (aggiungere parametro weight) con formula
(prior_w * prior + prediction) / 2
, esperimento su flicrk
PROBLEMA: il parser che estrae le noun phrase sovrascrive la key phrases
nel dizionario del batch e all'LSTM arriva la noun phrase invece della frase
normale, questo potrebbe essere un problema...
IDEA: nella concept similarity possiamo aggiungere informazione:
- noun phrase <--> label
- aggettivi <--> attributi
IDEA: calcolare la similarità sulle 2048 features (escludendo le spaziali) e poi identificare la posizione sulle restanti 5
IDEA: prendere il modello max-class e provare a fare la valutazione generando la union box delle bb con la stessa classe (come paper Training w\o Paired Example) oppure con top-K (più facile).
FREEZE EXPERIMENTS
Flickr30k
Id | Prior | Freq | Acc | P. Acc |
---|---|---|---|---|
159 | product | yes | 39.3 | 73.3 |
161 | product | no | 39.4 | 73.3 |
158 | 1 | yes | 28.5 | 61.4 |
1 | no |
ReferIt
TODO
Titolo tesi
- Leveraging on Concept Similarity for Weakly Supervised Phrase Grounding
- Weakly Supervised Visual-Textual Grounding with Concept Similarity
Struttura
-
Introduction
- Phrase Grounding
- One Stage vs Two Stage
- Fully/Weakly/Self/Un-Supervised
-
Related works
-
Model
- Visual Branch
- Textual Branch
- Concept Branch
- Loss
- Training and Inference
-
Experiments
- Evaluation Metrics
- Datasets (Flickr30k, ReferIt)
- Experiments Setup
- Results (Flickr30k, ReferIt)
-
Conclusion
Dove vanno messe?
- Proposal generator
- Object detector
- Word embedding (GloVe, w2v)
Flickr30k
Approach | Acc. (%) | P. Acc (%) |
---|---|---|
Align2Ground | 11.5 | 71.0 |
KAC Net | 37.7 | - |
Localziation w\o Training Examples | 50.5 | - |
Ours | ||
max-class | 38.4 | 75.6 |
prop | 40.5 | 74.5 |
prop, freq | 42.7 | 75.2 |
ReferIt
Approach | Acc. (%) | P. Acc (%) |
---|---|---|
Align2Ground | - | - |
KAC Net | 15.83 | - |
Localziation w\o Training Examples | 26.48 | - |
Ours | ||
max-class | 31.7 | 58.6 |
prop | 32.0 | 58.5 |
prop, freq | 29.1 | 57.8 |
Mascherati tutti i valori che non sono della classe principale
Word embedding
Analizzando le frequenze delle parole e delle classi abbiamo capito che probabilmente è l'embedding che fa la differenza. Noi non alleniamo nulla, quindi gli errori sono proprio dovuti all'embedding. Il paper seguito usa w2v, proviamo a integrarlo anche noi.
Idee da appunti (anche vecchi)
-
Similarità classe-parola + similarità tra feature bounding box
-
Vedere le classi delle bounidn gbox piccole
-
Scalare gli score per la similarità classe-parola solo nella loss e non nel modello: non è necessaria l'info della classe a tempo di inferenza (si cambia il training drasticamente)
La nuova strategia di aggregazione delle parole tramite max anziché mean performa male su flickr30k. Secondo le nostre aspettative avrebbe dovuto andare meglio per via dell'eliminazione del rumore dalle frasi lunghe di flickr. Invece la strategia va meglio solo per referit.
Abbiamo ipotizzato che il problema possa essere che vengono selezionate parole poco sensate che hanno similarità molto alta con le classi delle bb, oppure che gli embedding delle parole out of vocab inizializzati a random creino problemi.
Ad ogni modo, per indagare entrambi i problemi abbiamo implementato una procedura che trova le frequenze delle parole aggregate con similarità maggiore rispetto alle classi delle bounding box.
Tecnicamente questo ci dovrebbe spiegare il comportamento della nuova strategia: se ci sono molto parole poco sensate significa che la similarità max la ottengono le parole inutili e bisogna pensare a come pesare questa similarità, se invece ci sono molte oov allora l'embedding inizializzato a random va aggiustato.
Nota: ci sono 295 classi out of vocab, ~8300 bounding box con classi out of vocab.
Si veda paper Phrase Localization Without Paired Training Examples.
-
Fixato errore di implementazione del vocabolario delle classi: non veniva passato alla net di embedding
-
Fixata attivazione della funzione di similarità: al posto di
(x + 1) / 2
applichiamo la relu, ovvero threshold sui valori negativi e lasciamo da 0 a 1 i positivi
Un primo training mostra come sul validation, alla prima epoca, l'accuracy raggiunta sia 25.7%, con trend crescente.
Setting valido per ulteriori esperimenti.
Implementata la similarità tra classi delle bounding box e frase.
Roadmap
-
ottenere l'embedding delle classi (eventualmente, processare quelle out of vocabulary - per ora rimpiazziamo la rappresentazione un vettore inizializzato a random)
-
calcolare la similarità tra la classe e la query (relativi embedding)
-
aggiustare le varie dimensioni e pesare gli score
La parte critica è il calcolo di un embedding significativo dalla query: inizialmente possiamo provare la media di tutte le parole, ma la cosa migliore sarebbe trovare "l'head" della query con un parser e usare il suo embedding.
Analisi sulle classi
Ci sono 295 classi out-of-vocabulary.
Nel dataset (training) ci sono 8315 bounding box ground truth etichettate con
classi out-of-vocabulary.
Il modello predice 8445 bounding box etichettate con classi out-of-vocabulary.
La differenza del valore assoluto tra la frequenza delle classi predette e
quella delle ground truth è 2948 su un totale di 427226 query
Classi out-of-vocabulary
alarm clock, ceiling fan, tail fin, birthday cake, stop sign,stopsign,
microwave,microwave oven, skateboard ramp, refrigerator,fridge, knee pads,
tennis court, tea pot, television,tv, garage door, sailboat,sail boat,
racket,racquet, rock wall, headboard,head board, tea kettle, tennis
racket,tennis racquet, train station, tennis player, toilet brush, pepper
shaker, hair dryer, toilet seat, skateboard,skate board, floor lamp, french
fries, christmas tree, living room, teddy bear, baseball field, ski boot, shower
curtain, polar bear, hot dog,hotdog, surfboard,surf board, dirt bike, tail wing,
area rug, bow tie, fire extinguisher, tail feathers, beach chair, fire
hydrant,hydrant, weather vane, soccer ball, head band, bath tub, coffee table,
traffic light, parking meter, wet suit, teddy bears, suitcase,suit case, tank
top, shin guard, wii remote, pizza slice, home plate, ski boots, snow suit,
banana slice, stuffed animals, train platform, tissue box, cutting board,
license plate, ski pole, clock tower, toilet tank, palm trees, skate park,
computer monitor, flip flop, remote control, paper towels, train tracks,
donut,doughnut, soccer player, toilet bowl, lounge chair, sidewalk,side walk,
stove top,stovetop, tomato slice, window sill, toilet lid, "pitchers mound",
palm tree, banana bunch, tennis shoe, giraffe head, baseball player, water
bottle, tennis ball, cell phone, computer mouse, ski pants, clock face, fire
escape, police officer, trash can, front window, office chair, door knob, banana
peel, baseball game, cabinet door, traffic cone, nightstand,night stand, suit
jacket, train engine, wrist band, toilet paper, street sign, computer screen,
wine glass, train car, donuts,doughnuts, tennis match, railroad tracks, stuffed
bear, snow pants, neck tie, baseball bat, safety cone, paper towel, back wheel,
soccer field, throw pillow, oven door, lamp shade, pine tree, lamp
post,lamppost, station wagon, signal light, american flag, baseball cap, front
legs, life jacket, water tank, gas station, entertainment center, stuffed
animal, display case, front wheel, coffee pot, cowboy hat, table cloth, fire
truck,firetruck, game controller, sweat band, coin slot, pillow case, coffee
cup, counter top, baseball uniform, book shelf, facial hair, end table, shin
guards, head light, tennis net, trash bag, ski poles, parking lot, gas tank,
soap dispenser, life vest, train front, exhaust pipe, light fixture, power
lines, roman numerals, picnic table, wine bottle, tree trunk, motor bike,
traffic sign, little girl, passenger car, brake light, roman numeral, shower
head, handle bars, cardboard box, mountain range, eye glasses, salt shaker, knee
pad, shower door, bathing suit, manhole cover, door handle, picture frame, hour
hand, dvd player, ski slope, french fry, landing gear, coffee maker, light
switch, tv stand, air vent, steering wheel, baseball glove, power pole, dirt
road, telephone pole, jet engine, tee shirt, face mask, bathroom sink, laptop
computer, windshield wipers, hill side, tail light,taillight, snow board, stop
light, ball cap, traffic signal, soda can, ski lift, tennis shoes, swim trunks,
butter knife, train cars, pine trees, park bench, second floor, hand towel, flip
flops, back pack, ski tracks, baseball players, stone wall, dress shirt, ski
goggles, power line, train track, air conditioner, baseball mitt, mouse pad,
garbage can, taxi cab, control panel, clock hand, brick wall, grass field,
utility pole, mountain top, hot dogs,hotdogs, bed frame, tail lights, traffic
lights, candle holder, guard rail, tree branches, trash bin, side mirror, light
pole, street lamp, paper plate, fence post, door frame, tshirt,t-shirt,t shirt,
wire fence, side window, table lamp, pony tail, ocean water, flower pot, tree
line, sign post, ski suit, passenger train, "catchers mitt", electrical outlet,
bike rack, windshield wiper, bus stop, police car, name tag, computer keyboard,
glass door, wine glasses, young man, light post, ski jacket, streetlight,street
light, beer bottle, wrist watch, tile floor, tree branch, towel rack
-
Provare a sostituire LSTM con FFNN
-
Problema principale: allineamento tra le due modalità (testo e immagini), bisogna sicuramente utilizzare informazione aggiuntiva
-
Utilizzare le classi come negli altri paper per calcolare un peso e scalare le similarità
Analisi delle frequenze deve comparare le freq delle classi con 100 bb e le freq delle classi senza background. Precedentemente, quest'ultimo era stato implementato facendo in modo di ricavare la classe delle gt e poi rimuovere background.
Rigenerati i grafici di analisi e completate le slide per la riunione del 02/09/2021.
Upperbound accuracy togliendo le bounding box etichettate con classe
__background__
Flickr30k
INFO:root:data_dir=/home/lparolar/Projects/weakvtg/data/flickr30k_raw/preprocessed, remove_background_boxes=True
INFO:root:total_match=[245865, 335812, 368660, 382224, 389094, 393617, 396717, 399087, 401087, 402575]
INFO:root:total_examples=[456140, 456140, 456140, 456140, 456140, 456140, 456140, 456140, 456140, 456140]
INFO:root:total_backgrounds=[3953, 68601, 213937, 391291, 576492, 763107, 950855, 1138431, 1325879, 1512887]
INFO:root:accuracy=[53.9012145393958, 73.6203797079844, 80.82167755513659, 83.79532599640461, 85.30144253957118, 86.29302407155699, 86.97263997895382, 87.49221730170562, 87.93067917744553, 88.25689481299601]
Progress: [---> ] 23 % (7627)
Skipping 2652311904_img.pickle, found 0 caption files.
Progress: [----------> ] 55 % (17655)
Skipping 3923857105_img.pickle, found 0 caption files.
Progress: [-------------> ] 74 % (23534)
Skipping 4797050581_img.pickle, found 0 caption files.
Progress: [------------------> ] 99 % (31782)
Scanned 31783 images for a total of ca queries.
With 10 bounding box the upperbound accuracy is 53.901215 %, on average we removed 1.243747 % background boxes.
With 20 bounding box the upperbound accuracy is 73.620380 %, on average we removed 10.792090 % background boxes.
With 30 bounding box the upperbound accuracy is 80.821678 %, on average we removed 22.437257 % background boxes.
With 40 bounding box the upperbound accuracy is 83.795326 %, on average we removed 30.778325 % background boxes.
With 50 bounding box the upperbound accuracy is 85.301443 %, on average we removed 36.276752 % background boxes.
With 60 bounding box the upperbound accuracy is 86.293024 %, on average we removed 40.016518 % background boxes.
With 70 bounding box the upperbound accuracy is 86.972640 %, on average we removed 42.738706 % background boxes.
With 80 bounding box the upperbound accuracy is 87.492217 %, on average we removed 44.773582 % background boxes.
With 90 bounding box the upperbound accuracy is 87.930679 %, on average we removed 46.351788 % background boxes.
With 100 bounding box the upperbound accuracy is 88.256895 %, on average we removed 47.600510 % background boxes.
Change | Gain |
---|---|
-5.1 | -5.4 |
-5.2 | -5.5 |
-5.2 | -5.6 |
-5.1 | -5.5 |
-4.9 | -5.3 |
-4.5 | -5.0 |
-3.7 | -4.2 |
-2.5 | -3.0 |
-0.9 | -1.2 |
0 | 0 |
MEAN GAIN = -4.10205172145765
MIN GAIN = 0
MAX GAIN = -5.60949298813377 \
ReferIt
INFO:root:data_dir=/home/lparolar/Projects/weakvtg/data/referit_raw/preprocessed, remove_background_boxes=True
INFO:root:total_match=[66238, 89916, 99121, 102680, 104408, 105556, 106403, 107116, 107707, 108193]
INFO:root:total_examples=[130355, 130355, 130355, 130355, 130355, 130355, 130355, 130355, 130355, 130355]
INFO:root:total_backgrounds=[7602, 60068, 158424, 276134, 399607, 524615, 649710, 774619, 898456, 1021602]
INFO:root:accuracy=[50.81354761996087, 68.9777914157493, 76.03927735798396, 78.76951401940853, 80.09512485136742, 80.97579686241417, 81.6255609681255, 82.17252886348817, 82.62590617927967, 82.99873422576809]
Scanned 19995 images for a total of 130355 queries.
With 10 bounding box the upperbound accuracy is 50.813548 %, on average we removed 3.801950 % background boxes.
With 20 bounding box the upperbound accuracy is 68.977791 %, on average we removed 15.020755 % background boxes.
With 30 bounding box the upperbound accuracy is 76.039277 %, on average we removed 26.410603 % background boxes.
With 40 bounding box the upperbound accuracy is 78.769514 %, on average we removed 34.525381 % background boxes.
With 50 bounding box the upperbound accuracy is 80.095125 %, on average we removed 39.970693 % background boxes.
With 60 bounding box the upperbound accuracy is 80.975797 %, on average we removed 43.728849 % background boxes.
With 70 bounding box the upperbound accuracy is 81.625561 %, on average we removed 46.419462 % background boxes.
With 80 bounding box the upperbound accuracy is 82.172529 %, on average we removed 48.425794 % background boxes.
With 90 bounding box the upperbound accuracy is 82.625906 %, on average we removed 49.926704 % background boxes.
With 100 bounding box the upperbound accuracy is 82.998734 %, on average we removed 51.092873 % background boxes.
Change | Gain |
---|---|
8.4 | -9.1 |
8.3 | -9.1 |
8.1 | -8.9 |
7.9 | -8.8 |
7.6 | -8.5 |
6.7 | -7.7 |
5.4 | -6.4 |
3.7 | -4.6 |
1.6 | -2.2 |
0.2 | -0.3 |
MEAN GAIN = -6.61420361289034
MIN GAIN = -0.392156862745104
MAX GAIN = -9.19037199124727 \
Secondo i risultati ottenuti, può valere la pena provare a togliere le bounding
box che fanno rumore (si rimanda ai risultati del 30/08/2021 e alle
slide),
i.e., con classe __background__
.
-
Analisi delle frequenze delle classi, vedere freq_analysis.ipynb e relativa cartella
-
Completate le slide con grafici e dati
-
torch.masked_fill
passa il gradiente? No. Proof: torch_maskedfill_grad.py
Classes frequency
- Handle object-detector class
- Add ground-truth bounding box index in order to retrieve it's class
- Add the "classes-frequency" mode
Results on our model
Dataset | Accuracy | P. Accuracy |
---|---|---|
ReferIt | 12.661 | 46.876 |
Flickr30k | 13.102 | 62.315 |
Matching IoU
??
DEBUG:root:IoU(phrases_2_crd, boxes) = tensor([[0.6571]])
DEBUG:root:IoU(phrases_2_crd, boxes) = tensor([[0.7402]])
DEBUG:root:IoU(phrases_2_crd, boxes) = tensor([[0.7402]])
DEBUG:root:IoU(phrases_2_crd, boxes) = tensor([[0.7205]])
DEBUG:root:IoU(phrases_2_crd, boxes) = tensor([[0.5796]])
DEBUG:root:IoU(phrases_2_crd, boxes) = tensor([[0.7979]])
DEBUG:root:IoU(phrases_2_crd, boxes) = tensor([[0.7372]])
DEBUG:root:IoU(phrases_2_crd, boxes) = tensor([[0.6355]])
DEBUG:root:IoU(phrases_2_crd, boxes) = tensor([[0.8326]])
DEBUG:root:IoU(phrases_2_crd, boxes) = tensor([[0.6038]])
DEBUG:root:IoU(phrases_2_crd, boxes) = tensor([[0.6038]])
DEBUG:root:IoU(phrases_2_crd, boxes) = tensor([[0.2199]])
- descrizione baseline
- problema training decrescente
- risolto, ma performance basse
- espressività del modello
- problema di masking
- problema bounding box
- rumore? 100 vs 70 vs 50 vs 30 vs 20 vs 10
- performance sul test set e alcune considerazioni
- esempi sui dati (iou rispetto al numero di box, nella top-5 ce n'è una con iou >= 0.5, focus su bb molto piccole, errori)
- upperbound accuracy
- raccolta dati sui paper (RoI generator, n box, object detector, settings, input train, input test)
Approfondimenti
Loss
-
Probabilmente
masked_fill
blocca il graduente sugli elementi fillati, me è necessario verificare meglio. -
Aggiunta la media sulle bounding box tenendono conto del padding.
Email validazione agli autori di Align2Ground
Dear S. Datta, K. Sikka, A. Roy, K. Ahuja, D. Parikh, A. Divakaran,
This email is carbon copied to my supervisor, D. Rigoni.
I'm Luca Parolari, a master's degree student in computer science at the University of Padua, Italy.
I'm working on weakly-supervised visual textual grounding for my thesis and I found your awesome paper "Align2Ground: Weakly Supervised Phrase Grounding Guided by Image-Caption Alignment" (https://arxiv.org/pdf/1903.11649v2.pdf).
I would like to ask you a question on how you evaluate the model on the visual-textual grounding task.
In the paper you wrote: "Note that we operate in a weakly supervised regime i.e. during training, we do not assume ground-truth correspondences between image regions and phrases in the caption. During inference, our primary aim is to perform visual grounding. Given a query phrase p and an image I, the learned model identifies the RoI that best matches with the query.".
My question is: during inference, the phrase p you refer to is the one extracted by the parser from the caption c?
If not, this implies that you provide a query to the model, but do you also apply parser on that query?
If yes, then how do you compute the IoU? I mean, the ground truth bounding box refers to a query which could be different with respect to what the parser can extract from the caption. In this case I imagine that the extracted phrase and the query could be linked together by taking into account a sort of similarity measure between the two, for example, the number of words in common.
Thank you.
Best regards, Luca Parolari
TODO
- Prepare email ai paper
- Raccogliere dati sui paper approfonditi
- Preparare slide per meeting di settimana prossima
Problemi evidenziati e nuovi dati da raccogliere
-
Problema del gradiente. Frasi paddate e bounding box paddate, anche se con valori corretti negli score di modo da non influire sui risultati portano il gradiente a fare ottimizzazioni errate. Per le frasi è quindi stato deciso di togliere completamente quelle non paddate dal tensore e fare il calcolo della loss con questo. Per le bounding box si è deciso di lasciarle negli score ma mascherarle a 1 e -1 a seconda se con coppia positiva o negativa, di modo che il gradiente essendo già un esempio giusto non vada a spostare quelle coppia img-frase.
-
Fissare dimnsione semantica a 1000 sia per testo che per immagini. 1 solo layer LSTM.
-
Calcolare upperbound accuracy anche su flickr e scegliere un numbero di bounding box da fissare per il problema. E' stato scelto
n_box = 30
(migliore trade-off). -
Query o chunk? Questo è il dilemma. Bisogna mandare mail ai paper VT-grounding weakly-supervised per capire come si sono mossi.
-
Per ogni lavoro approfondito, raccogliere specifiche del tipo: cosa usa tra query e chunk, object detector, n di box (se esplicitato).
Upperbound accuracy su flickr30k
Per qualche strano motivo tre esempi (indice 2652311904, 3923857105, 4797050581) non sono stati conteggiati nel calcolo per via di un index error. Probabilmente non hanno frasi e/o hanno valori nulli all'interno nel file dati.
Progress: [------> ] 35 % (11271)
Oh god, got IndexError for example with index 2652311904. Continuing...
Progress: [-------------> ] 71 % (22667)
Oh god, got IndexError for example with index 3923857105. Continuing...
Progress: [--------------> ] 76 % (24179)
Oh god, got IndexError for example with index 4797050581. Continuing...
INFO:root:total_match=[246080, 339773, 379790, 399316, 409733, 415953, 419913, 422616, 424690, 426162]
INFO:root:total_examples=[456140, 456140, 456140, 456140, 456140, 456140, 456140, 456140, 456140, 456140]
INFO:root:accuracy=[53.948349191037835, 74.48875345288727, 83.26171789362915, 87.54242118647784, 89.82614986626912, 91.18976629982023, 92.05792081378524, 92.65050203884772, 93.10518700399, 93.42789494453457]
With 10 bounding box the upperbound accuracy is 53.948349
With 20 bounding box the upperbound accuracy is 74.488753
With 30 bounding box the upperbound accuracy is 83.261718
With 40 bounding box the upperbound accuracy is 87.542421
With 50 bounding box the upperbound accuracy is 89.826150
With 60 bounding box the upperbound accuracy is 91.189766
With 70 bounding box the upperbound accuracy is 92.057921
With 80 bounding box the upperbound accuracy is 92.650502
With 90 bounding box the upperbound accuracy is 93.105187
With 100 bounding box the upperbound accuracy is 93.427895
Email di aggiornamento sui progressi di ferragosto
In questa email vorrei racchiudere gli aggiornamenti delle ultime due settimane circa.
All'ultimo aggiornamento la situazione era la seguente: il training del modello andava molto male, nel senso che la loss scendeva ma nel contempo facevano lo stesso sia l'accuracy sul training set, sia l'accuracy sul validation set. Questo di fatto poteva essere sintomo di un bug a livello dell'implementazione oppure di un problema grosso nel modello/dati del problema.
Abbiamo quindi deciso di fare la prova del nove e di escludere il bug a livello di programmazione riscrivendo il codice. Sono state necessarie due riscritture. La prima è stata effettuata partendo dalla codebase di Davide, cercando di effettuare meno modifiche possibili per portare il suo modello da fully a weakly-supervised. Vari test lanciati su questa versione però hanno manifestato lo stesso problema del codice precedente. La seconda riscrittura invece è stata effettuata partendo da zero, ma comunque orientata a introdurre meno punti di rottura possibile e scrivendo i test (di unità) per le funzioni più critiche. 1 Fortunatamente i test su quest'ultima codebase hanno mostrato un training buono: l'accuracy sul training set ha iniziato a salire e di pari passo anche l'accuracy sul validation.
Il processo di training, seppur buono, non ha mostrato risultati eclatanti: si è raggiunto un massimo del ~ 6% e 7% di accuracy rispettivamente su training e validation set sia per flickr che per referit.
In una call con Davide abbiamo provato ragionare su altri problemi legati alle performance così ridotte:
Poca espressività del modello dovuta alla compressione delle feature delle immagini da ~ 2000 a 500 tramite un singolo layer lineare.
Problema di mascheramento. Il modello prende in input sia query con padding che bounding bounding box con padding e al momento del calcolo della loss e della bounding box predetta vanno prese in considerazione e rimosse dal risultato.
Numero di bounding box in uso troppo elevato. Il modello, per eredità dal setting supervised, utilizza 100 bounding box per immagine e questo può creare rumore.
Dagli esperimenti è emerso che aumentare l'espressività del modello non influisce in modo importante sulle performance, mentre il numero di bounding box influisce eccome: l'accuracy più alta per entrambi i dataset sia in training che in validation la si ottiene fissando il numero di bounding box per immagine a 10!
Dato questo fatto, una prima analisi dei dati evidenzia che il modello avendo a disposizione 100 bounding box si focalizza spesso su quelle di dimensione minore nella zona della ground truth, portando così la IoU a essere inferiore a 0.5 con conseguente conteggio come esempio errato per l'accuracy. Questo fenomeno crediamo sia dovuto alla loss che stiamo utilizzando.
Ad ogni modo, non pretendo di essere stato esaustivo, anzi, avremmo altri dati da mostrare (soprattutto in relazione all'ultima parte), alcuni ancora da raccogliere e delle domande da porre. In particolare abbiamo in programma ancora un paio di esperimenti per correggere alcuni problemi legati al punto (2) di cui sopra, e altre prove minori. Per questo motivo vorremmo chiedere se settimana prossima ci fosse la disponibilità di fare una riunione per discutere di tutto questo.
Impatto del numero di bounding box sulle performance
(referit only)
Migliori performance (fino a 13% accuracy) ottenute con un numero di bounding box piccolo (10). Diversi lavori usano 30 bounding box come base, nel nostro caso sembra che 10 sia il migliore, ma dagli esempi si nota che per elementi di contorno, date le poche bounding box, le performance sono basse.
Con più bounding box sembra che il modello tenda a focalizzarsi su bounding box piccole: dovrebbe essere penalizzato tramite la loss. Altre strategie più brutali potrebbero consistere nel prendere la bb più grande tra le prime 3, ad esempio.
Test #1: restore del modello "effortless-armadillo-36" all'epoca 6 (allenato su 10 bounding box per immagine)
n box | loss | accuracy | p. accuracy |
---|---|---|---|
10 | -1.883155 | 12.398951 | 41.613106 |
20 | -3.741860 | 10.248347 | 42.469052 |
30 | -5.610624 | 9.176113 | 42.742096 |
40 | -7.443323 | 8.415272 | 42.762038 |
50 | -9.295891 | 7.813962 | 42.762038 |
60 | -11.177696 | 7.408998 | 42.959918 |
70 | -13.006101 | 7.030112 | 43.015140 |
80 | -14.876513 | 6.761670 | 43.065761 |
90 | -16.714561 | 6.628216 | 43.096440 |
100 | -18.588075 | 6.513169 | 43.292786 |
Test #2": restore del modello "quiet-serenity-23" all'epoca 10 (allenato su 100 bounding box per immagine)
n box | loss | accuracy | p. accuracy |
---|---|---|---|
10 | -2.033332 | 13.843936 | 42.587167 |
20 | -4.050939 | 11.414152 | 43.723827 |
30 | -6.086038 | 10.012118 | 43.835806 |
40 | -8.083521 | 9.143900 | 43.883358 |
50 | -10.110158 | 8.484300 | 43.932445 |
60 | -12.157627 | 8.007240 | 43.976929 |
70 | -14.156891 | 7.530181 | 43.986133 |
80 | -16.188678 | 7.309291 | 44.044423 |
90 | -18.204253 | 7.155896 | 44.047491 |
100 | -20.258124 | 6.931938 | 44.045957 |
Plot delle prediction sullo stesso esempio utilizzando 10 e 100 bounding box, restore del modello effortless-armadillo-36 epoca 6
esempio | 10 | 100 |
---|---|---|
10002_1_0 | ||
10002_2_0 | ||
10002_3_0 | ||
10002_4_0 | ||
10002_4_1 |
Idee
- seguendo il paper Phrase Localization Without Paired Training Examples si potrebbe fare una scrematura delle bounding box (per evitare rumore) tenendo conto della similarità delle stesse con la query. Questo permetterebbe di mantenere bounding box più sensate per la localizzazione che bisogna fare.
TODO
- score negativi praticamente mai < 0, i.e. c'è sempre una similarità abbastanza forte con l'immagine (bias)
- poca espressività (??? da declinare...)
- accuracy di partenza molto bassa, si può lavorare sull'inizializzazione?
- l'emebedding del testo è freezato, ma l'LSTM si muove con i valori o è freezato anch'esso?
- su referit gli attributi (right, top, colori vari...) non sono mai presi in considerazione e anzi, vengono spesso sbagliati
Finalmente funziona!
Dopo aver sistemato alcuni problemi sulla nuova codebase, l'accuracy sul training e sul validation ha iniziato ad aumentare. C'era un bug grosso sul tipo delle bounding box gt, che discrettizzava a 0 o a 1 i valori float (89f7419). Purtroppo l'accuracy ottenuta rimane ancora bassa: ~7/8% su referit, ma finalmente segue curve crescenti e non più oscillanti.
Learning rate
Tramite alcuni test si è evenidenziato il fatto che un learning rate un po' più basso come 0.0001 e 0.00001 rispetto al default 0.001 porta a risultati un po' migliori.
Dimensione embedding semantico (text e img) ~= numero di classi?
Un test sta evidenziando che la dimensione dell'embedding semantico delle immagini (e di conseguenza anche del testo) a circa quella delle classi (1300) non aggiunge altro potere espressivo al network. Accuracy ottenuta è circa del 6% su training e 7% su valid.
Upperbound accucary
E' stato eseguito anche il controlo dell'upperbound accuracy fissando un certo numero di bounding box (da 10 a 100, step di 10). Si evidenzia come il miglior tradeoff tra numero di bounding box e max accuracy ottenibile sia a 30 bounding box. (upperbound_accuracy.py).
INFO:root:total_match=[66504, 91898, 103957, 109773, 113200, 115326, 116711, 117764, 118540, 119125]
INFO:root:total_examples=[130355, 130355, 130355, 130355, 130355, 130355, 130355, 130355, 130355, 130355]
INFO:root:accuracy=[51.01760576886195, 70.49825476583177, 79.74914656131334, 84.21080894480457, 86.83978366767673, 88.4707145870891, 89.53319780599132, 90.34099190671627, 90.93628936366078, 91.38506386406353]
With 10 bounding box the upperbound accuracy is 51.017606
With 20 bounding box the upperbound accuracy is 70.498255
With 30 bounding box the upperbound accuracy is 79.749147
With 40 bounding box the upperbound accuracy is 84.210809
With 50 bounding box the upperbound accuracy is 86.839784
With 60 bounding box the upperbound accuracy is 88.470715
With 70 bounding box the upperbound accuracy is 89.533198
With 80 bounding box the upperbound accuracy is 90.340992
With 90 bounding box the upperbound accuracy is 90.936289
With 100 bounding box the upperbound accuracy is 91.385064
Top-k bounding box predette e visualizzazione esempi
Implementata la visualizzazione delle top-k bounding box predette sugli esempi. Si è notato (sui pochi campioni in locale) che la union box delle 3 top-k predette coincide più spesso con la ground truth. Si potrebbe implementare una strategia di creazione union box tra le top-3 o top-5 bb, attenzion comunque a non esagerare con la dimensione delle box.
Possibili strategie di union box:
- naive (unisco le top-k bb, k=3, k=5)
- union solo con overlap (prendo le top-k bb e unisco solamente quelle che si overlappano con una certa IoU, possibili test IoU > 0, IoU > 0.3, IoU > 0.5, IoU > 0.7 magari scegliendo più "top-k" con valori più stringenti di IoU)
Problema attuale: muro al 6%
Bisognerebbe capire come mai non si riesce a sfondare il muro del 6% accuracy... (vedi TODO!)
-
Mumero di bounding box troppo grande, può creare rumore. Provare con un numero inferiore di bounding box. Attenzione: le bounding box sono ordinate in ordine di rilevanza, quindi è possibile banalmente fare lo slice di una lista per mantenere le top-N bounding box e non server applicare l'algoritmo di no maximum suppresion.
-
Mascheramento di bounding box errato. Di fatto c'è un errore di mascheramento per le bounding box:
Per quanto riguarda il dataloader, credo vada bene così com'è. Per quanto riguarda il modello (model.py) devo "pulire" gli score di output (punti 1, 2, 3 e 4). Per quanto riguarda le loss (losses.py) in input ho gli score dove le frasi paddate contano 0 e le bounding box paddate contano -1 o 1 a seconda che sia score positivi o negativi. Di conseguenza mi basta calcolare la loss come sempre fatto (punto 5). Il calcolo dell'accuracy di suo ignora le bounding box paddate perché non va a prendere quelle con similarità -1 per via dell'argmax, mentre le frasi paddate sono gestite direttamente dalla maschera (punto 6).
Non mi è chiaro invece come gestire il calcolo del gradiente.
—-
(1) annullare il contributo delle bounding box di padding sugli score di similarità positivi (maschero con -1, valore più piccolo di similarità).
(2) annullare il contributo del frasi di padding sugli score di similarità positivi (maschero con 0)
(3) annullare il contributo delle bounding box di padding sugli score negativi anche se meno rilevante (maschero con 1, valore di similarità max)
(4) annullare il contributo delle frasi di padding sugli score di similarità negativi (maschero con 0)
(5) calcolo della loss
loss_attraction = pred_score_positive.sum() / mask.sum() loss_repulsion = pred_score_negative.sum() / negative_mask.sum()
(6) calcolo dell'accuracy
accuracy = torch.sum(accuracy) / mask.sum()
-
Il numero di query positive e negative non è uguale. Questo potrebbe influire sulle prestazione se siamo sfortunati e il caricamento è molto sbilanciato in favore dell'uno o dell'altro. (da vedere successivamente)
-
Modificare l'embedding delle immagini per fare si che non sia così compresso. Una soluzione potrebbe essere mettere l'embedding simile al numero di classi dell'obj detector (o leggermente inferiore dato che non tutte le bb sono utilizzate). Per esempio l'out dell'emebdding potrebbe essere 1300. LSTM deve essere modificato e portato anche lui a 1300 anche se non è la cosa migliore (glove è solo 300).
Inviata email riassuntiva dopo call del 3 agosto.
Buongiorno Prof.,
in copia legge anche Davide.
Sono riuscito a recuperare l'accesso al cluster e visualizzare i risultati dei training.
Allego due screenshot che mostrano i grafici di due training del modello attuale, il primo per flickr30k e l'altro per referit. Riporto anche un terzo screenshot con i grafici dei due esperimenti sovrapposti, per una più facile comparazione.
I grafici riportano loss, accuracy e pointing game accuracy per train e validation, rispettivamente riga in alto e riga in basso.
In entrambi i casi si può notare come la loss sia sul training set che sul validation set (anche se in modo più irregolare) scenda. Lo stesso succede però anche per l'accuracy sia su training (!!) che su validation set.
Confrontando questi risultati con altre run, confermo che l'accuracy migliore sul validation set si ottiene quasi sempre alla prima o alla seconda epoca: in sostanza, il training peggiora le cose.
Lo stesso fenomeno lo si osserva anche su altri training dove cambio parti del modello: ad esempio, ho provato a non utilizzare nessun tipo di embedding per calcolare la similarità tra immagine e query (i.e., # feat immagine = 2053 e # feat lstm = 2053). Idem per il training dove ho potenziato la rete di embedding delle immagini (che pensavamo potesse essere poco espressiva) portando il numero di layer da 1 a 2.
Per risolvere il problema, attualmente sto lavorando sulla validazione del modello che è una fase abbastanza critica e assieme a Davide sto cercando di aggiustare quanto sviluppato. La validazione del modello, ora come ora, è guidata dai chunk: ad ogni chunk associo una query la cui similarità con il chunk è massima (maggior numero di parole in comune) e utilizzo la bounding box associata alla query come ground truth per il calcolo dell'IoU e di conseguenza dell'accuracy.
(Nota: chunk = noun-phrase estratto da ewiser, query = noun-phrase annotata su flickr.)
Ci siamo resi conto che così facendo però si può introdurre un bias: se si trovano meno chunk rispetto al numero di query, le rimanenti query senza match non sono contate come errore e abbiamo pensato quindi far guidare la validazione dalle query: per ogni query associo il chunk con similarità massima e calcolo IoU e accuracy.
Prima di implementare questa modifica abbiamo controllato sui paper di riferimento (quelli che avevo presentato tempo fa) come viene implementata la validazione, ma nessuno di questi specifica esattamente il processo seguito. In particolare, per alcuni paper (https://arxiv.org/pdf/1908.07553.pdf, https://arxiv.org/pdf/1803.03879.pdf) non si capisce se vengono utilizzati i chunk (estratti da un parser) o direttamente le query dalle annotazioni, per altri (https://arxiv.org/pdf/1903.11649v2.pdf) che invece utilizzano il parser non si capisce come calcolano il match tra chunk e query (che serve in quanto chunk e query possono differire) per ottenere la bounding box ground truth.
La nostra idea sarebbe di chiedere tramite email ad almeno due gruppi di autori come affrontano questo problema. In particolare per Align2Ground (https://arxiv.org/pdf/1903.11649v2.pdf) dove dicono esplicitamente di calcolare i chunk tramite il parser, non riusciamo a spiegarci come facciano a fare la valutazione.
Che ne pensa?
Cordiali saluti,
Luca Parolari
Investigato ulteriormente il problema della validazione. Studiato il paper MAF: Multimodal Alignment Framework for Weakly-Supervised Phrase Grounding e il relativo codice: non usano chunk ma direttamente le query. Per gli altri paper non si capisce bene e quelli con il parser che generano chunks non dicono come fanno la validazione.
Lanciato un training su referit utilizzato le frasi (annotazioni) al posto dei chunk (ewiser). Accuracy va meglio ma comunque in downtrend.
Presa la decisione di reimplementare il modello da zero con meno modifiche possibile. Sono state portate sul branch redemption/redemption-active le uniche modifiche che rendono il modello weakly + la repulsione su 3 camptioni e non su tutte e 100 le bounding box.
Lanciati i training per validare i risultati (e bug) sulla vecchia implementazione.
Identificato un piccolo problema sul matching delle query più logico che tecnico. Durante la validazione, dovrebbero essere le query che guidano tutto: se una query non ha chunk associato errore, se ne ha più di uno bene, si sceglie quello migliore. Attualmente viene fatto il contrario: i chunk guidano la validazione e si valutano quelli con le associazioni.
Bisogna capire come fanno gli altri: trovati diversi paper su "papers with code" ma nessuno di questi entra veramente nel dettaglio. Il paper Contrastive Learning for Weakly Supervised Phrase Grounding è l'unico con una buona codebase nell'ambito grounding weakly supervised.
Aggiornamento su stato del lavoro e principali problemi del codice. Risoluzione del problema "accesso a cluster e lab".
- branch no repulsion tensor ** 2
- branch no semantic embedding
- branch two layer image semantic embedding
Fixati i problemi evidenziati nella call del 21/07/2021. Lab tesisti non accessibile.
Peer review del codice riga per riga con il debugger assieme a Davide (2.5h!!).
Problemi emersi:
-
HIGH PRIORITY: loss calcolata male (vedere #49)
-
HIGH PRIORITY:
None
sulle word indicizzate calcolate nel padding (vedere spiegazione di seguito) -
MED PRIORITY: calcolare nel dataloader l'associazione chunk-frase e relativa ground truth (passare direttamente le coordinate della bounding box interessata) di modo da non dover forwardare le frasi e non perdere tempo nella loss per il calcolo di questi match
-
MED PRIORITY: potenziare net immaigini (aggiungere un layer e vedere come va)
-
LOW PRIORITY: mascherare i logits ritornati dal modello con le maschere delle bounding box (escludendo quelle che sono padding). Nella loss questo problema è già risolto con il campionamento a priori degli indici delle BB tra quelle non padding, ma dovremmo restituire anche dei logits con questa logica perché la predizione finale del modello deve tenere conto di ciò
-
LOW PRIORITY: padding enorme e inutile. Tutto (sentence, frasi, chunk, chunk negativi) è paddato alla stessa dimensione, ma questo è inutile e mai utilizzato. Sarebbe meglio ripristinare la versione di Dadive e paddare tutto normalmente.
Analizzati tutti gli esempi del dataset referit per trovare la causa dei None che escono dal tokenizer. Il problema sta nel fatto che il tokenizer si comporta diversamente sulle "sentence" rispetto che sui "chunk" (output ewiser).
Esempio incriminato:
[['the hills', '/cliffs']]
[[[1, 226], [None]]]
Esempio comportamento di spacy:
>>> f = torchtext.data.utils.get_tokenizer("spacy", language="en_core_web_sm")
>>> f("sentence aaa")
['sentence', 'aaa']
>>> f("any of the hills/cliffs")
['any', 'of', 'the', 'hills', '/', 'cliffs']
>>> f("hills/cliffs")
['hills', '/', 'cliffs']
>>> f("/cliffs")
['/cliffs']
/cliffs
non è presente nel vocabolario e questo restituisce None
, quindi
durante il padding idx_data
(ovvero l'indice della parola) è None
.
Esempi affetti da questo problema:
[
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/10443_2_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/11292_7_1.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/12984_2_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/4087_6_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/32840_2_1.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/15679_4_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/35655_4_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/10778_1_4.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/30681_5_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/19182_8_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/1113_1_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/15901_4_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/24108_6_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/2819_4_7.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/1184_5_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/1026_5_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/12521_3_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/4719_10_1.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/7031_6_1.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/15635_9_1.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/9778_3_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/1220_6_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/9872_10_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/11434_3_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/23354_12_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/15341_3_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/20350_4_7.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/37181_3_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/19058_2_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/1348_3_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/30881_4_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/16330_7_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/18121_1_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/7199_1_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/8938_2_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/826_1_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/4495_5_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/11433_4_0.pickle',
'/home/lparolar/Projects/VTKEL-solver/data/referit_raw/preprocessed/30398_3_0.pickle'
]
Aggiustato il problema del campionamento sul padding delle bounding box fissando
gli indici da campionare nel dataloader. Non è stato possibile farlo nella loss
in modo facile perché torch.randint
ha come parametro high un int e non un
tensore di valori diversi. Tra le possibili soluzioni abbiamo valutato il modulo
del'indice con high (biased) e fissare l'high al minimo num di bounding box non
paddate su batch.
Progrmamma bb_checker ci permette di andare a vedere quanti esempi hanno un numero X di bounding box.
Numero di esempi con 66 bounding box = 1
Numero di esempi con 69 bounding box = 1
Numero di esempi con 72 bounding box = 2
Numero di esempi con 73 bounding box = 1
Numero di esempi con 74 bounding box = 3
Numero di esempi con 75 bounding box = 2
Numero di esempi con 76 bounding box = 1
Numero di esempi con 77 bounding box = 1
Numero di esempi con 78 bounding box = 3
Numero di esempi con 80 bounding box = 2
Numero di esempi con 81 bounding box = 3
Numero di esempi con 82 bounding box = 3
Numero di esempi con 83 bounding box = 1
Numero di esempi con 84 bounding box = 3
Numero di esempi con 85 bounding box = 4
Numero di esempi con 86 bounding box = 1
Numero di esempi con 87 bounding box = 4
Numero di esempi con 88 bounding box = 2
Numero di esempi con 89 bounding box = 3
Numero di esempi con 90 bounding box = 6
Numero di esempi con 91 bounding box = 4
Numero di esempi con 92 bounding box = 6
Numero di esempi con 93 bounding box = 7
Numero di esempi con 94 bounding box = 6
Numero di esempi con 95 bounding box = 11
Numero di esempi con 96 bounding box = 8
Numero di esempi con 97 bounding box = 10
Numero di esempi con 98 bounding box = 13
Numero di esempi con 99 bounding box = 8
Numero di esempi con 100 bounding box = 19875
Totale = 19995
lparolar at labsrv8 in ~/storage/VTKEL-solver/referit_raw/preprocessed
$ ls | grep _img | wc
19995 19995 333986
Review del codice, trovato il problema issue #45 e risolto. Nuova maschera da applicare alla validazione.
Discussione delle probabili cause per score negativi non negativi:
DR [19.07.21 16:06]
I motivi già accennati potrebbero essere:
- non abbiamo abbastanza potenza nella rete per cogliere le differenze
- si usano attivazioni come la "relu" che non permette valori negativi. Per questo motivo la similarità è sicuramente sempre >= 0
- Unione dei due punti precedenti
- Bugs vari
Discussione su come fissare le K bounding box prese per attrarre e allontare i chunk:
LP, [19.07.21 17:56]
La prima domanda che mi sorge è se le K bounding box sono fissate su tutti i chunk
oppure se sono K estratte a random per ogni chunk, nel caso, io sto facendo la seconda...
DR, [19.07.21 17:59]
in entrambi i modi non dovrebbe essere sbagliato (anche se ci penso un attimo per
darti la risposta definitiva) in quanto se ragioniamo a valore atteso, dovrebbe essere
uguale. Tuttavia cambia sicuramente il training.
DR, [19.07.21 18:01]
Supponiamo di avere la prima versione in cui fisso le K bounding box per tutti i
chunk. Se inoltre supponiamo di avere un numero di chunk positivi e negativi uguali,
allora:
- se il chunk è sia positivo che negativo (supponiamo formato da solo una parola) allora la ci sarà una loss positiva e una loss negativa che si bilanciano e dunque la rappresentazione dovrebbe rimanere uguale.
- se il chunk appare solo nella frase positivam, allora si avvicina
- viceversa se il chunk appare solo nella frase negativa
DR, [19.07.21 18:02]
se abbiamo du chunk con le stesse parole ripetute nella stessa frase allora la loss
totale sarebbe come moltiplicata per il numero delle occorrenze
DR, [19.07.21 18:03]
il ragionamento vale anche (più o meno) se ci sono più chunk negativi di quelli positivi
e viceversa.
DR, [19.07.21 18:06]
Se invece ragioniamo che per ogni chunk estrai un set K disgiunto dagli altri, allora
lo stesso chunk presente sia nella frase positiva che negativa contribuisce alla
loss in entrambi i casi, per poi in caso essere corretto successivamente quando le
frasi positive e negative si invertono (se avviene questo campionamento, fatto che
in linea teorica se prendiamo tutte le coppie di frasi, dovrebbe accadere). Tuttavia
il training cambia
DR, [19.07.21 18:06]
Per cui io proverei ad implementare la modalità con K fissate per tutte e uguali.
Non solo è più facile da implementare ma anche il training dovrebbe (spero migliorare)
- Abbiamo notato un possibile problema sul "mascheramento" dei valori calcolati
dalla funzione
get_k_similar
inlosses.py
. La funzioneget_k_similar
con strategia random è implementata come segue:
def get_k_random(tensor: torch.Tensor, mask: torch.Tensor, *, k: int, dim: int = -1, device=None):
"""
Returns `k` uniform random sampled values from `tensor` on `dim`, and `mask`. The index tensor is allocated on
`device`.
:return: A tuple of tensors (Tensor, LongTensor)
"""
size = tensor.size()
indices = torch.randint(size[-1], (*size[:-1], k), device=device)
values = torch.gather(tensor, dim, indices)
# noinspection PyTypeChecker
values = torch.masked_fill(values, mask == 0, value=0)
return values, mask
Si pensava ad un problema di mascheramento degli unici 3 (se k=3) valori ritornati. In realtà non succede perchè per ogni chunk estraiamo k indici a caso e poi la maschera è applicata ai chunk sintetici, quindi quelli non sintetici non possono vedersi mascherate le 3 bboxes estratte.
-
Aggiunta maschera per le bboxes gt
-
Aggiunta maschera per le bboxes predette
SSH torre down tutto il giorno.
Fix get_iou_score
bug: vedere
#43 e
#43.
Vedere tabella esperimenti num. 8, 9 e 10.
Il training non viene svolto in modo corretto (accuracy scende invece di aumentare) e abbiamo deciso di investigare il problema.
(1) Avevo un bug nella collatefn tale per cui mandavo avanti _batch_size esempi positivi e 1 esempio negativo, il resto sui negativi diventava padding. Questo problema è già stato risolto.
(2) Sugli score (sia positivi che negativi) il minimo è sempre 0, mentre il massimo è corretto. Dopo aver calcolato la cosine similarity, l'unica cosa che faccio prima della stampa è una masked fill per applicare la maschera. Probabilmente devo controllare di aver fatto correttamente questa operazione, altrimenti non mi spiego quello 0 come minimo.
(3) Non so se è dovuta al punto (2) ma osservando le statistiche per diversi batch ho notato che il modello tente a portare le due medie a valori vicini allo 0, e direi che è il caso peggiore per il modello perché non impara.
(4) La media degli score positivi e negativi è spesso molto vicina (scarto solitamente inferiore a 0.02), soprattutto dopo qualche batch. Mi viene da pensare che le immaigni abbiano più influenza dei chunk positivi e negativi nel calcolo della similarità.
UPDATE 1
Verso gli ultimi batch della prima epoca ho il min che a volte scende sotto lo 0, però di pochissimo: -0.01, -0.006, e così via. Ho anche notato però che il max sia dei positivi che negativi è spesso vicino a 1 (>0.98).
UPDATE 2
Per il punto (2), la masked fill non influenza il min. Sicuramente maschera gran parte del tensore, ma min=0 significa comunque che gli score calcolati erano almeno 0, probabilmente maggiori di 0.
Per i punti (3) e (4) invece, dando un'occhiata al primo batch dell'epoca 2 abbiamo che, per gli score positivi nessuno ha valori molto negativi (< -0.5), non sono pochi invece quelli con valori molto positivi (> 0.5). Considerando solo il primo chunk (il batch era paddato a 5 chunk, ma ho preso in considerazione solo il primo per non fare confusione) su un batch di 128 esempi ne ho contati almeno 60 tali per cui la score è maggiore di 0.5 per 90 o più bounding box.
Sugli esempi negativi, nessuna score ha valori molto negativi, mentre circa 30 esempi hanno una score superiore a 0.5 per 90 o più bounding box, sempre tenendo conto solo del primo chunk.
Secondo me questa cosa implica un bias positivo sulla similarità che calcolo, in qualche modo... La similarità viene calcolata sull'embedding dei chunk e delle immagini effettuato tramite due torch.nn.Linear separati. C'è da contare però che il layer delle immagini fa una riduzione effettiva delle features (da 2053 a 500), quello del testo invece no (da 500 a 500).
UPDATE 3
Controllare leaky relu
Controllare feature bb con anche numeri negativi
UPDATE 4 - Possibili miglioramenti dopo conclusione del training
(1) se la parte delle feature delle bounding box è 2053 e sono tutte positive, serve una rete più potente per dare più espressività e in caso permettere anche valori negativi nelle trasformazioni successive di quelle features. Nel codice l'unica trasformazione è data dalla rete che proietta le features a dimensione 500. Qui c'è anche il problema che le features vengono mappate ad una dimensione molto più piccola, perdendo molto probabilmente informazione
Questi due problemi assieme mi portano a pensare che forse è il caso di ingrandire la potenza della rete. Questo si può fare aggiungendo layers non Lineari con leaky relu oppure anche ingrandendo la dimensione di output.
Il testo invece ha una dimensione di 500 in output dopo la lstm. Questa è la stessa che c'è nel layer che fa la proiezione. Dunque qui non credo ci siano problemi di perdita di informazione
(2) poi ci sarebbe una parte minor su cui si potrebbe concentrarsi. Cioè le features delle bounding box hanno concatenato anche le features spaziali (5 dimensioni). Queste sono molto importanti di solito in quanto dicono dove si trova la bounding box nello spazio dell'immagine
Prova una cosa. Lascia andare il training con la versione random e vedi che risultato dà. Vediamo se ci sono altri errori e in caso vediamo che fare. Altrimenti è come andare alla ceca
Inoltre, nota che la LSTM è veramente molto espressiva e probabilmente se togli l'ultimo layer di proiezione e usi direttamente l'output della rete, va meglio
Per cui metteresti la proiezione solo per le bounding box. Chiamo proiezione la funzione dell'ultimo layer embed_phrases
Ma comunque prima dobbiamo vedere fino ad ora come si comporta. Poi in caso fai delle modifiche, una alla volta, e vedi come si comporta. So che purtroppo è un problema il tempo di training e probabilmente ti viene da fare più modifiche al colpo, ma in pratica è meglio evitare
UPDATE 5
Certo, sono d'accordo e cercherò di spostare quantomeno le modifiche su branch separate così da non fare confusione. In caso le modifiche le provo a tempo perso sui pc del laboratorio.
Per il punto (1) il paper Weakly-supervised Visual Grounding of Phrases with Linguistic Features (quello da cui abbiamo preso la prima versione della loss) ha la dim delle feat testuali (LSTM) = 512, mentre per le feat visive applica un 2-layer perceptron e poi va a matchare la dimensione delle altre tramite batch normalization. Quindi tecnicamente ha una rete più potente di quella che ho implementato, anche se non spiega come è fatta internamente.
Per il punto (2) invece suggeriresti di pesare maggiormente le ultime 5 features?
Per l'embedding dei chunk invece credo di aver assunto tempo fa che "non poteva che migliorare" perché la rete avrebbe potuto apprendere. Invece anche nel paper effettivamente usano direttamente le feat dell'LSTM.
Call con davide per training che scende in termini di accuracy: modificata la strategia top-k per spostare le feature degli esempi più simili in favore di una strategia k-random.
Investigato il problema IndexError ottenuto sul padding dei concetti all'epoca 4. Non si riesce a capire da cosa sia dato.
Lanciato di nuovo il training del modello con 3 pulsioni e attrazioni, era crashato per un index out of bound.
Calcolo della similarità tra il concetto di una frase e la classe predetta della bounding box per poter effettuare l'attrazione delle features scalata con questa similarità. Si veda #30 su GitHub.
-
Alcuni fix nelle loss e calcolo logits
-
Call con Davide per implementazione loss attrattiva-repulsiva presa dal paper Clustering-Oriented Representation Learning with Attractive-Repulsive Loss con cosine similarity
-
Inizio scrittura test funzioni loss
-
I logits sono calcolati prima dell'embedding semantico, che viene utilizzato invece nella loss. Questo può dare problemi perché le rappresentazioni sono diverse e il modello fa fatica ad apprendere
-
I pesi del layer linear che utilizzo come logits non sono mai modificati, i.e., il modello non apprende
-
Selezionare la migliore bounding box non è corretto nel mio caso, non posso assumerla come ground truth perché altrimenti il modello viene ottimizzato per identificare come bb la prima che trova per via dell'inizializzazione causale dei pesi
-
Possibile problema di overflow se si adottano le soluzioni ai problemi sopra riportati
- Troubleshoot dell'eccezione pickle "invalid key \x00"
- Troubleshoot dell'eccezione pickle "memory error"
Il problema è dato dalla generazione dei file pickle durante la fase make dataset. La soluzione è stata analizzare tutti i file e rigenerare quelli corrotti.
Primo training completo di referit iniziato e completato con successo.
Resources
- Semantic Instance Segmentation with a Discriminative Loss Function [paper] [code]
- A friendly introduction to Siamese Networks
Aggiustato la modalità test exaample per i miei requisiti e review di alcune parti di codice seguendo il paper (loss).
Create le slide per il paper "Learning Unsupervised Visual Grounding Through Semantic Self-Supervision" [arxiv], studio del paper in questione e possibili problemi/domande.
- Aggiunto il calcolo dell'accuracy
- Aggiunto il calcolo della pointing game accuracy
- Trovata una soluzione al problema della memoria (i.e., lanciare il training con num_workers=1, prefetch_factor=1)
- Fix phrases_2_crd tutto zeri (problema di tipo)
- Lanciato il primo vero training su lab tesisti
- Fixato il problema del padder discusso nella issue #7
- Altri test sull'utilizzo della memoria. E' emerso che davide con
num_workers=1
eprefetch_factor=1
occupa al massimo 8GB di RAM, quindi il problema proviene da qualche modifica nel mio codice. Da vedere le funzioni di pytorchdetach
eitem
, dovrebbero servire a scollegare le strutture di torch dal grafo delle computazioni e liberare memoria - Investigato il problema della loss negativa, non dovrebbe essere un errore
- Ripristinato il calcolo del gradiente sulla loss calcolata da me
- Aggiunto il codice per il calcolo dell'IoU e dell'accuracy (da terminare)
- Inizio prove con il dataset referit e script per il download dei dataset
- Debug del problema di memoria che fa crashare il trianing: si è scoperto che in totale a quanto pare servono più di 8 GB per il training, soprattutto se nello stesso batch si caricano sia esempio negativo che positivo
- Trovato un esempio con chunk vuoti, da investifare il motivo (vedere issue github)
- Modifica al modello per il supporto all'input negativo
- Embedding per il codice delle varie features di modo da poterle confrontare
- Impiego della loss discriminativa (paper Xiao et al.)
- Prova di esecuzione su lab tesisti, senza successo per via dell'utilizzo della ram sempre crescente
- Alcuni fix
- Correzione del problema di matching forzato tra i chunk e le frasi gt del modello: rigenerazione del nuovo dataset che non forza il matching tra i chunk e le frasi (questo processo deve essere rovesciato in fase di validazione del modello)
- Modifica make_dataset e generazione del nuovo dataset sul cluster
- Integrazione del modulo padder e inizio costruzione della funzione di loss
- Creazione di flickr30k_pico (Google Drive, ~ 80MB), un sottoinsieme di 10 esempi per train, test e validation
- Creazione di una github action che esegue il modello su flickr30k_pico
Resources
- Modifica della funzione
collate_fn
e per il supporto ai chunk (positivi/negativi) di ewiser anzichè le query - Introduzione del modulo
padder
con funzioni di utilità per "paddare" tutto (frasi, chunk positivi/negativi, entità yago) alla stessa lunghezza - Collezione del dataset "flickr30k pico" composto da 10 esempi per train, test e validation
- Plannig dei lavori da fare per il modello weakly-supervised
- Identificazione delle porzioni di codice da modificare
Milestone: incontro per discussione sul lavoro vero e proprio
- Review del codice nuovo del modello e setup ambiene per nuovo repository
- Incontro con Davide per nuovi obiettivi di lavoro (rendere il modello weakly-supervised), si veda resoconto che segue
- Email a Ballan con aggiornamenti ("Aggiornamenti sulla tesi", 04/06/2021 16:46)
Resoconto call con Davide
Dall'incontro è emerso che la parte del KG per le immagini estrae una sola entità (quella correlata alla classe) e per le query estrae una top-k di entità. Per un discorso di efficienza le tutte le entità rilevanti (ovvero quelle nominate nelle query e quelle delle classi delle proposal) sono allineate in fase di preprocessing con le classi e ne viene specificata la relazione (colegate, non collegate, relazione padre figlio...).
Le entità nel modello sono utilizzate solamente tramite gli embedding. Si prende l'embedding della classe della proposal e top-k della query, si fa la concatenezione e si usano assieme al resto del modello.
Per quanto riguarda rendere il modello weakly-supervised si è parlato invece dell'utilizzo dei chunk di ewiser come query assieme alle proposal dell'object detector per fare l'allenamento. Non avendo a disposizione la ground truth diventa difficile da fare anche la valutazione. Per questo motivo la valutazione va fatta collegando i chink alle query in qualche modo (per esempio lasciando stare gli allineamenti di chunk che non hanno query), ovvero, l'algoritmo inverso rispetto a quello che ha fatto Daivde.
In più, per quanto riguarda la loss, bisogna pensare a qualcosa che lavora sulla ricostruzione e che sfrutta la repulsione delle feature nello spazio latente. Per questo motivo bisognerà pensre ad un campionamento di esempi random negativi da includere in fase di training.
Riassunto problemi principali individuati: valutazione del modello e campionamento esempi negativi.
- Implementazione del calcolo della classification e regression loss
Resources
- Implementaizone dell'estrazione delle features per l'immagine
- Fix dello script
pickle_viewer
Resources
- Incontro con Davide per discutere la funzione
apply_lstm_phrases
e più nello specifico del funzionamento ditorch.pack_padded_sequences
,torch.pad_packed_sequences
etorch.gather
.
Resources
- Setup zsh su lab tesisti
- Setup dell'ambiente per lanciare il training su lab tesisti
- Mail a Luca Righi per aggiornamento versione di CUDA 10.1 su lab tesisti così da poter trainare il modello direttamente sul lab
- Approfondimento sulla funzione degli embedding per il testo create_embeddings_network
- Approfondimento su LSTM
- Approfondimento su tokenizer
Resources
- Compiling and installing Zsh without root privileges on Stanford's Sherlock (https://sherlock.stanford.edu) for use in tmux
- text_embeddings.py
- lstm_embeddings.py
- text_tokenizer.py
- Test del modello in locale (dati montati in locale)
- Setup dei symlink su cluster
- Debug di un file
.pickle
- Generazione dei file preprocessed tramite job sul cluster
~/Jobs/vtg-make-dataset-cpu1.job
- Setup dell'ambiente di lavoro parallelo su lab tesisti
- Prima esecuzione del modello (non completa, errore sul vocab)
Resources
- Studio di PyTorch
- Studio del codice di Davide
- Incontro con Davide per paralre del codice
Studio di PyThorch e esperimenti su notebook colab seguendo i loro tutorial.
Aggiunta delle descrizioni ed esempi per i raw data su flickr e referit, più alcune info e riferimenti per i dataset flickr, referit e l'ontologia YAGO.
Resources
- Dataset Cheatsheet
- Generate a deliverable document from the dataset cheatsheet with
pandoc README.md -o README.pdf
.
- Configurazione dell'ambiente sul cluster
- Studio del codice di preprocessing del dataset per capire gli input del modello
Resources
- Lettura paper self-supervised
- Lettura documento utilizzo cluster
Resources
Attivazione account per il cluster e lab tesisti.
Riunione con Davide per discutere del suo paper e organizzarsi per il lavoro sul codice.
Todo
- Mail ai prof per spazio di lavoro sul cluster
- Setup conda, Python e dipendenze codice paper
- Download datasets
- Setup PyCharm
Resources
Lettura e studio del paper di Rigoni. Letturadi un nuovo paper sull'apprendimento self-supervised.
Milestone: presentazione dei paper ai prof
Esposizione dei due paper (Align2Ground e Without Pairs) ai prof. Difficoltà nell'esposizione per via della puntualizzazione sull'aspetto tecnico dei prof.
Domande sui paper a Davide in vista della presentazione con i prof e scelta dei paper da presentare.
Presentazione dei sei paper a Rigoni. Bene in generale ma si è faticato sulla comprensione del modello di alcuni di questi. Due paper dei sei sono stati scartati per essere out-of-scope (Referring Expression Grounding e Linguistic Strucutre)
- Lettura dei paper di riferimento per il dataset e per il task di VT-grounding supervised.
- Preparazione slides sui sei paper dell'ambito wekaly/un-supervised su VT-grounding e studio degli stessi.
Incontro con Rigoni per la definizione del lavoro e nuovi paper sul tema scelto da leggere (email principale).
Milestone: scelta dell'argomento
Lettura paper VT-grounding weakly-supervised e scelta di questo ambito di lavoro.
Colloquio individuale con Rigoni per definire meglio gli obiettivi e il contesto della tesi.
Incontro con Ballan, Sperduti e Rigoni in cui si è discusso dei possibili obiettivi di questa tesi. Tra le proposte (VQA, VT-grounding, VTKEL, software gestione errori modello VT-grounding) si è parlato principalmente di VT-groundin, tema oggetto di studi del dottorando che mi seguirà e più abbordabile in termini di quanto lavoro c'è da fare per una tesi.
Lettura paper e in vista del colloquio con Ballan, Sperduti e Rigoni.
Milestone: inizio
Incontro conoscitivo con Ballan e discussione sugli argomenti di tesi.
Footnotes
-
abbiamo deciso di utilizzare direttamente le query dalla ground truth rispetto ai chunk estratti da ewiser per evitare di fare ulteriori modifiche che potessero creare problemi al training, e di procedere con lo stesso setting anche per test successivi. ↩