0 votes
par dans Séquence 7 : TP

Bonjour, 

Dans le cadre de ma thèse je construis un modèle de détection d'objets dans des images en utilisant FasterRCNN en PyTorch. 

Pour les logs j'utilise tensorboard dans lequel j'enregistre les valeurs de loss et d'AP. 

A l'heure actuelle mon code tourne mais il me sort des valeurs de 'map' systématiquement nulles. Pour implémenter les map j'ai utilisé torchmetrics.detection.mean_ap. Connaissez vous cet outil ? 

Je vous transmet ici mon code de train. Est-ce la bonne manière de l'implémenter ? : 

la fonction d'évaluation est la suivante :  

from torchmetrics.detection.mean_ap import MeanAveragePrecision

eval_metric = MeanAveragePrecision()

j'appelle cette fonction pendant l'entraînement après chaque époque : 

def validate(valid_data_loader, model):

109     print('Validating')

110     global val_itr

111     global val_loss_list

112     global epoch

113     # initialize tqdm progress bar

114     prog_bar = tqdm(valid_data_loader, total=len(valid_data_loader))

115 

116     for i, data in enumerate(prog_bar):

117         images, targets = data

118 

119         images = list(image.to(DEVICE) for image in images)

120         targets = [{k: v.to(DEVICE) for k, v in t.items()} for t in targets]

121 

122         with torch.no_grad():

123             loss_dict = model(images, targets)

124 

125         losses_list = [loss for loss in loss_dict.values()]

126         losses = sum(losses_list)

127         loss_value = losses.item()

128 

129         writer.add_scalar("Loss_val/loss", loss_value, val_itr)

130         writer.add_scalar("Loss_val/loss_classifier", losses_list[0], val_itr)

131         writer.add_scalar("Loss_val/loss_box_reg", losses_list[1], val_itr)

132         writer.add_scalar("Loss_val/loss_objectness", losses_list[2], val_itr)

133         writer.add_scalar("Loss_val/loss_rpn_box_reg", losses_list[3], val_itr)

134         

135         # Evaluation part : 

136         model.eval()

137         with torch.no_grad():

138             preds = model(images)

139         # pdb.set_trace()

140         # eval_metric(preds, targets)

141         

142         eval_metric.update(preds, targets)

143         

144         

145         # pdb.set_trace()

146         model.train()

147         

148         val_itr += 1

149         

150         # update the loss value beside the progress bar for each iteration

151         prog_bar.set_description(desc=f"Loss: {loss_value:.4f}")

152         

153     scores = eval_metric.compute()

154     mean_ap = scores['map']

155     mean_ap50 = scores['map_50']

156     mean_ap75 = scores['map_75']

157     mean_ar1 = scores['mar_1']

158     mean_ar10 = scores['mar_10']

159     mean_ar100 = scores['mar_100']

160     

161     writer.add_scalar("Eval/map",mean_ap  ,epoch)

162     writer.add_scalar("Eval/map_50",mean_ap50  ,epoch)

163     writer.add_scalar("Eval/map_75",mean_ap75  ,epoch)

164     writer.add_scalar("Eval/mar_1",mean_ar1  ,epoch)

165     writer.add_scalar("Eval/mar_10",mean_ar10  ,epoch)

166     writer.add_scalar("Eval/mar_100",mean_ar100  ,epoch)

167     return None

pour plus d'information, voici mon mail : leonard.martinez@universite-paris-saclay.fr 

De plus, je ne retrouves plus le notebook de la séquence 7 à ce propos. Pourriez vous m'indiquer lequel il s'agit ?  

Bien cordialement, 

Léo MARTINEZ

2 Réponses

0 votes
par Vétéran du GPU 🐋 (20.4k points)
sélectionné par
 
Meilleure réponse

Bonjour,

Je crois writer.add_scalar attends un float et les valeurs contenus dans scores son des Tensor. Donc peut-être changer `writer.add_scalar("Eval/map",mean_ap  ,epoch)` par `writer.add_scalar("Eval/map",mean_ap.item()  ,epoch)` résoudrait  le problème.

par
J'ai effectué cette modification. Il me semble que ça ne change de rien mais je pense en effet que cela fait plus de sens.

Merci beaucoup
0 votes
par Vétéran du GPU 🐋 (66.1k points)
Dans l'ordre,

Suivant votre problèmatique, un essai avec une architecture YOLO pourrait vous aider.

Vous avez une valeur mAP de 0, avez-vous une confirmation visuelle que votre modèle apprend ?

Votre snippet de code me semble correct. Avez-vous vérifier que ce que vous fournissez à la fonction est correct ?

Normalement, tout est disponible sur le git.
par
Bonjour,

Ma problématique traite de la détection de cratères sur les surfaces planétaires.

J'ai une confirmation visuelle que mon modèle n'apprend pas. En effet la loss chute exponentiellement durant la première époque et oscille autour de 0.5 durant la suite de l'apprentissage.

Je vais continier mes recherches merci pour votre aide.

Léo
...