Cascaded-fcn: problème de test de modèle

Créé le 10 avr. 2017  ·  19Commentaires  ·  Source: IBBM/Cascaded-FCN

Salut, j'ai testé votre modèle publié, mon code se réfère à votre cahier. mon code est

`caffe.set_mode_gpu()
caffe.set_device(2)
net_liver = caffe.Net('/home/zhou/zou/Cascaded-FCN/models/cascadedfcn/step1/step1_deploy.prototxt', '/home/zhou/zou/Cascaded-FCN/models/cascadedfcn/step1/step1_weights. caffemodel', caffe.TEST)

img=read_dicom_series("../train_image/3Dircadb1.17/PATIENT_DICOM/")
lbl=read_liver_lesion_masks("../train_image/3Dircadb1.17/MASKS_DICOM/")
S = 90
img_p = step1_preprocess_img_slice(img[...,S])
lbl_p = preprocess_lbl_slice(lbl[...,S])
net_liver.blobs['data'].data[0,0,...] = img_p
pred = net_liver.forward()['prob'][0,1] > 0.5
plt.figure(figsize=(3*5,10))
plt.subplot(1, 3, _1)
plt.title('CT')
plt.imshow(img_p[92:-92,92:-92], 'gris')
plt.subplot(1, 3, 2)
plt.title('GT')
plt.imshow(lbl_p, 'gris')
plt.subplot(1, 3, 3)
plt.title('pred')
plt.imshow(préd, 'gris')`

mais le résultat est très mauvais comme ça
result

Commentaire le plus utile

Je pense que le modèle publié est faux, lorsque je forme moi-même mon propre modèle et que j'utilise le code ci-dessus, cela fonctionne bien et le résultat est bon
3dircadb1 1 68

@RenieWell @mohamed-ezz

Tous les 19 commentaires

Y a-t-il une astuce que j'ai négligée ?

Le résultat semble étrange. Assurez-vous que vous pouvez exécuter le bloc-notes tel quel et obtenir des résultats corrects avant d'apporter des modifications.

Le code est le même que ce que vous montrez dans le cahier, donc je ne peux pas trouver où le code est erroné, pouvez-vous me donner des conseils ? Merci

J'ai rencontré le même problème avec vous, avez-vous découvert? J'apprécierais si vous pouviez partager votre chemin. @manutdzou

Je pense que le modèle publié est faux, lorsque je forme moi-même mon propre modèle et que j'utilise le code ci-dessus, cela fonctionne bien et le résultat est bon
3dircadb1 1 68

@RenieWell @mohamed-ezz

C'est une excellente nouvelle @manutdzou . Vous êtes plus que bienvenu pour écrire une pull request et proposer votre modèle formé au public. Téléchargez simplement votre modèle sur un hébergeur public et modifiez le fichier readme avec le lien et votre nom.

Wow j'ai eu le même résultat étrange que votre premier résultat. Alors je suis sûr que ce modèle sorti n'est pas si bon. Quoi qu'il en soit, je reconstruis U-Net sur TensorFlow, mon résultat de prédiction n'est pas si bon mais pas étrange.

@manutdzou . Salut les gars, pouvez-vous partager votre code?
Merci beaucoup.

Salut tout le monde,
Je viens de mettre à jour le fichier Readme et d'ajouter des images docker, qui exécutent notre code en douceur.
Veuillez consulter le fichier Lisez-moi pour plus de détails sur la façon de démarrer l'image docker.
Le résultat attendu devrait ressembler à cette impression.
Meilleurs vœux,
patrick
cascaded_unet_inference.pdf.pdf

@PatrickChrist Salut Patrick, merci pour l'excellent travail, mais lorsque j'essaie d'utiliser le modèle pré-formé, je trouve que le nvidia-docker est difficile à installer et pourriez-vous s'il vous plaît partager un modèle pré-formé correct sans utiliser nvidia-docker

@zakizhou Je pense que c'est un problème de reproductibilité, Docker est notre meilleur pari pour y parvenir.

nvidia-docker n'est nécessaire que si vous souhaitez traiter les fichiers sur le GPU. Vous pouvez cependant simplement utiliser docker si vous êtes d'accord avec l'exécution sur le processeur.

Si vous utilisez une distribution Linux, quels sont les problèmes que vous rencontrez pour installer nvidia-docker ?

Les modèles sont également partagés dans https://github.com/IBBM/Cascaded-FCN/tree/master/models/cascadedfcn , vous pouvez les utiliser dans votre environnement hôte (sans Docker)

@mohamed-ezz merci pour votre réponse, j'utilise ubuntu sans gpus, en effet j'ai essayé docker au lieu de nvidia-docker mais malheureusement quand j'ai essayé d'importer le modèle caffe préformé, le noyau de jupyter notebook abandonné et je ne comprends pas pourquoi. Comme ce que @manutdzou a dit dans ce numéro, le modèle pré-entraîné ici https://github.com/IBBM/Cascaded-FCN/tree/master/models/cascadedfcn fonctionne mal sur l'exemple d'image. J'ai installé caffe avec conda, pensez-vous que c'est la mauvaise version de caffe qui a causé ce problème ?

Oui, c'est probablement la version caffe. Veuillez utiliser l'image docker.

Le 4 juillet 2017 à 17h45, "Jie Zhou" [email protected] a écrit :

@mohamed-ezz https://github.com/mohamed-ezz merci pour votre réponse, je suis
en utilisant ubuntu sans gpus, en effet j'ai essayé docker au lieu de
nvidia-docker mais malheureusement quand j'ai essayé d'importer un modèle caffe pré-formé,
le noyau de jupyter notebook a été vidé et je ne comprends pas pourquoi. Comme quoi
@manutdzou https://github.com/manutdzou a déclaré dans ce numéro, le
modèle préformé ici https://github.com/IBBM/Cascaded-FCN/tree/master/
models/cascadedfcn fonctionne mal sur l'exemple d'image. j'ai installé café
avec conda, pensez-vous que c'est la mauvaise version de caffe qui a causé cela
problème?


Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/IBBM/Cascaded-FCN/issues/13#issuecomment-312908109 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/ADqENQMhAJvhyvV1SZ5ApQelMqNhBlTMks5sKl39gaJpZM4M4ckQ
.

@mohamed-ezz OK, j'essaierais le modèle sur un serveur avec gpu, merci encore !

Pas besoin de gpu, utilisez simplement docker avec l'image dans le README.md, à la place
de nvidia docker.

Le 4 juillet 2017 à 18h59, "Jie Zhou" [email protected] a écrit :

@mohamed-ezz https://github.com/mohamed-ezz OK, j'essaierais le modèle sur un
serveur avec gpu, merci encore !


Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/IBBM/Cascaded-FCN/issues/13#issuecomment-312919887 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/ADqENQh6pIiGyQYTbKSOx_2reMDlja3Cks5sKm-GgaJpZM4M4ckQ
.

J'ai publié une version du modèle de foie droit et de lésion dans Baidu peut utiliser ce modèle comme celui-ci

`importer sys,os
sys.path.insert(0, '/home/zhou/zou/caffe_ws/python')
sys.path.insert(0,'/home/zhou/zou/Cascaded-FCN/lib')
importer numpy en tant que np
de matplotlib importer pyplot en tant que plt
café d'importation

result_path = "/home/zhou/zou/Cascaded-FCN/code/result/"
sinon os.path.exists(result_path):
os.makedirs(result_path)

im_list = open('test_lesion_list.txt', 'r').read().splitlines()

caffe.set_mode_gpu()
café.set_device(0)
net_liver = caffe.Net('deploy.prototxt', 'liver.caffemodel', caffe.TEST)
net_lesion = caffe.Net('deploy.prototxt', 'lesion.caffemodel', caffe.TEST)

foie = 1
lésion = 2
pour je dans la plage (0, len (im_list)):
im = np.load(im_list[i].split(' ')[0])
masque = np.load(im_list[i].split(' ')[1])
in_ = np.array(im, dtype=np.float32)
in_expand = in_[np.newaxis, ...]
blob = in_expand[np.newaxis, :, :, :]

net_liver.blobs['data'].reshape(*blob.shape)
net_liver.blobs['data'].data[...] = blob
net_liver.forward()
output_liver = net_liver.blobs['prob'].data[0].argmax(axis=0)

net_lesion.blobs['data'].reshape(*blob.shape)
net_lesion.blobs['data'].data[...] = blob
net_lesion.forward()
output_lesion = net_lesion.blobs['prob'].data[0].argmax(axis=0)

output = output_liver
ind_1 = np.where(output_liver ==0)
output_lesion[ind_1] = 255
ind_2 = np.where(output_lesion ==0)
output[ind_2] = 2

plt.figure(figsize=(3*5,10))
plt.subplot(1, 3, 1)
plt.title('CT')
plt.imshow(im[92:-92,92:-92], 'gray')
plt.subplot(1, 3, 2)
plt.title('GT')
plt.imshow(mask, 'gray')
plt.subplot(1, 3, 3)
plt.title('pred')
plt.imshow(output, 'gray')
path = result_path + im_list[i].split(' ')[0].split('/')[-1][0:-3] +'jpg'
plt.savefig(path)
plt.close()

`
un résultat est affiché

3dircadb1 17 85
3dircadb1 17 80
@mohamed-ezz @RenieWell @mjiansun @PatrickChrist @PiaoLiangHXD

couche {
nom : "données"
tapez : "Entrée"
en haut : "données"
input_param { forme : { dim : 1 dim : 1 dim : 572 dim : 572 } }
}

couche {
nom : "conv_d0a-b"
tapez : "Convolution"
en bas : "données"
haut : "d0b"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
nombre_sortie : 64
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}

couche {
nom : "relu_d0b"
type : "ReLU"
en bas : "d0b"
haut : "d0b"
}
couche {
nom : "conv_d0b-c"
tapez : "Convolution"
en bas : "d0b"
haut : "d0c"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
nombre_sortie : 64
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}

couche {
nom : "relu_d0c"
type : "ReLU"
en bas : "d0c"
haut : "d0c"
}
couche {
nom : "pool_d0c-1a"
type : "Mise en commun"
en bas : "d0c"
haut : "d1a"
pooling_param {
piscine : MAX
taille_noyau : 2
foulée : 2
}
}
couche {
nom : "conv_d1a-b"
tapez : "Convolution"
en bas : "d1a"
haut : "d1b"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 128
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}

couche {
nom : "relu_d1b"
type : "ReLU"
en bas : "d1b"
haut : "d1b"
}
couche {
nom : "conv_d1b-c"
tapez : "Convolution"
en bas : "d1b"
haut : "d1c"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 128
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}

couche {
nom : "relu_d1c"
type : "ReLU"
en bas : "d1c"
haut : "d1c"
}
couche {
nom : "pool_d1c-2a"
type : "Mise en commun"
en bas : "d1c"
haut : "d2a"
pooling_param {
piscine : MAX
taille_noyau : 2
foulée : 2
}
}
couche {
nom : "conv_d2a-b"
tapez : "Convolution"
en bas : "d2a"
haut : "d2b"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 256
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}

couche {
nom : "relu_d2b"
type : "ReLU"
en bas : "d2b"
haut : "d2b"
}
couche {
nom : "conv_d2b-c"
tapez : "Convolution"
en bas : "d2b"
haut : "d2c"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 256
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}

couche {
nom : "relu_d2c"
type : "ReLU"
en bas : "d2c"
haut : "d2c"
}
couche {
nom : "pool_d2c-3a"
type : "Mise en commun"
en bas : "d2c"
haut : "d3a"
pooling_param {
piscine : MAX
taille_noyau : 2
foulée : 2
}
}
couche {
nom : "conv_d3a-b"
tapez : "Convolution"
en bas : "d3a"
haut : "d3b"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 512
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}

couche {
nom : "relu_d3b"
type : "ReLU"
en bas : "d3b"
haut : "d3b"
}
couche {
nom : "conv_d3b-c"
tapez : "Convolution"
en bas : "d3b"
haut : "d3c"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 512
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}

couche {
nom : "relu_d3c"
type : "ReLU"
en bas : "d3c"
haut : "d3c"
}

couche {
nom : "pool_d3c-4a"
type : "Mise en commun"
en bas : "d3c"
haut : "d4a"
pooling_param {
piscine : MAX
taille_noyau : 2
foulée : 2
}
}
couche {
nom : "conv_d4a-b"
tapez : "Convolution"
en bas : "d4a"
haut : "d4b"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 1024
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}

couche {
nom : "relu_d4b"
type : "ReLU"
en bas : "d4b"
haut : "d4b"
}
couche {
nom : "conv_d4b-c"
tapez : "Convolution"
en bas : "d4b"
haut : "d4c"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 1024
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}

couche {
nom : "relu_d4c"
type : "ReLU"
en bas : "d4c"
haut : "d4c"
}

couche {
nom : "upconv_d4c_u3a"
type : "Déconvolution"
en bas : "d4c"
haut : "u3a"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 512
tampon : 0
taille_noyau : 2
foulée : 2
poids_filler {
taper : "xavier"
}
}
}

couche {
nom : "relu_u3a"
type : "ReLU"
en bas : "u3a"
haut : "u3a"
}
couche {
nom : "crop_d3c-d3cc"
tapez : "Recadrer"
en bas : "d3c"
en bas : "u3a"
haut : "d3cc"

}
couche {
nom : "concat_d3cc_u3a-b"
tapez : "Concat"
en bas : "u3a"
en bas : "d3cc"
haut : "u3b"
}
couche {
nom : "conv_u3b-c"
tapez : "Convolution"
en bas : "u3b"
haut : "u3c"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 512
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}
couche {
nom : "relu_u3c"
type : "ReLU"
en bas : "u3c"
haut : "u3c"
}
couche {
nom : "conv_u3c-d"
tapez : "Convolution"
en bas : "u3c"
haut : "u3d"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 512
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}
couche {
nom : "relu_u3d"
type : "ReLU"
en bas : "u3d"
haut : "u3d"
}
couche {
nom : "upconv_u3d_u2a"
type : "Déconvolution"
en bas : "u3d"
haut : "u2a"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 256
tampon : 0
taille_noyau : 2
foulée : 2
poids_filler {
taper : "xavier"
}
}
}
couche {
nom : "relu_u2a"
type : "ReLU"
en bas : "u2a"
haut : "u2a"
}
couche {
nom : "crop_d2c-d2cc"
tapez : "Recadrer"
en bas : "d2c"
en bas : "u2a"
haut : "d2cc"

}
couche {
nom : "concat_d2cc_u2a-b"
tapez : "Concat"
en bas : "u2a"
en bas : "d2cc"
haut : "u2b"
}
couche {
nom : "conv_u2b-c"
tapez : "Convolution"
en bas : "u2b"
haut : "u2c"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 256
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}
couche {
nom : "relu_u2c"
type : "ReLU"
en bas : "u2c"
haut : "u2c"
}
couche {
nom : "conv_u2c-d"
tapez : "Convolution"
en bas : "u2c"
haut : "u2d"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 256
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}
couche {
nom : "relu_u2d"
type : "ReLU"
en bas : "u2d"
haut : "u2d"
}
couche {
nom : "upconv_u2d_u1a"
type : "Déconvolution"
en bas : "u2d"
haut : "u1a"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 128
tampon : 0
taille_noyau : 2
foulée : 2
poids_filler {
taper : "xavier"
}
}
}
couche {
nom : "relu_u1a"
type : "ReLU"
en bas : "u1a"
haut : "u1a"
}
couche {
nom : "crop_d1c-d1cc"
tapez : "Recadrer"
en bas : "d1c"
en bas : "u1a"
haut : "d1cc"

}
couche {
nom : "concat_d1cc_u1a-b"
tapez : "Concat"
en bas : "u1a"
en bas : "d1cc"
haut : "u1b"
}
couche {
nom : "conv_u1b-c"
tapez : "Convolution"
en bas : "u1b"
haut : "u1c"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 128
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}
couche {
nom : "relu_u1c"
type : "ReLU"
en bas : "u1c"
haut : "u1c"
}
couche {
nom : "conv_u1c-d"
tapez : "Convolution"
en bas : "u1c"
haut : "u1d"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 128
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}
couche {
nom : "relu_u1d"
type : "ReLU"
en bas : "u1d"
haut : "u1d"
}
couche {
nom : "upconv_u1d_u0a_NEW"
type : "Déconvolution"
en bas : "u1d"
haut : "u0a"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
nombre_sortie : 64
tampon : 0
taille_noyau : 2
foulée : 2
poids_filler {
taper : "xavier"
}
}
}
couche {
nom : "relu_u0a"
type : "ReLU"
en bas : "u0a"
haut : "u0a"
}
couche {
nom : "crop_d0c-d0cc"
tapez : "Recadrer"
en bas : "d0c"
en bas : "u0a"
haut : "d0cc"

}
couche {
nom : "concat_d0cc_u0a-b"
tapez : "Concat"
en bas : "u0a"
en bas : "d0cc"
haut : "u0b"
}
couche {
nom : "conv_u0b-c_New"
tapez : "Convolution"
en bas : "u0b"
haut : "u0c"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
nombre_sortie : 64
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}
couche {
nom : "relu_u0c"
type : "ReLU"
en bas : "u0c"
haut : "u0c"
}
couche {
nom : "conv_u0c-d_New"
tapez : "Convolution"
en bas : "u0c"
haut : "u0d"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
nombre_sortie : 64
tampon : 0
taille_noyau : 3
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}
couche {
nom : "relu_u0d"
type : "ReLU"
en bas : "u0d"
haut : "u0d"
}
couche {
nom : "conv_u0d-score_New"
tapez : "Convolution"
en bas : "u0d"
meilleur score"
paramètre {
lr_multi : 1
déclin_mult : 1
}
paramètre {
lr_multi : 2
déclin_mult : 0
}
convolution_param {
num_sortie : 2
tampon : 0
taille_noyau : 1
poids_filler {
taper : "xavier"
}
moteur : CAFÉ
}
}

couche {
nom : "problème"
type : "Softmax"
en bas : "score"
haut : "prob"
}

Super travail @manutdzou
Merci pour votre aide. Cela vous dérangerait-il de valider votre travail dans ce référentiel ?
On pourrait avoir un dossier model-zoo/manutdzou dans lequel tu posteras ton code sous forme de notebook et ton prototxt et les liens vers baidu sous forme de fichier texte ? Les autres utilisateurs apprécieront certainement. Si vous avez un article sur votre travail, nous pouvons également l'ajouter.

Ok, si mon code et mon modèle fonctionnent bien, je serai ravi de m'engager dans ce dépôt !

发自网易邮箱大师
Le 07/07/2017 17:33, Patrick Christ a écrit :

Super travail @manutdzou
Merci pour votre aide. Cela vous dérangerait-il de valider votre travail dans ce référentiel ?
On pourrait avoir un dossier model-zoo/manutdzou dans lequel tu posteras ton code sous forme de notebook et ton prototxt et les liens vers baidu sous forme de fichier texte ? Les autres utilisateurs apprécieront certainement. Si vous avez un article sur votre travail, nous pouvons également l'ajouter.


Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, consultez-le sur GitHub ou désactivez le fil de discussion.

Cette page vous a été utile?
0 / 5 - 0 notes