Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 95 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
95
Dung lượng
8,02 MB
Nội dung
UNIVERSITÉ NATIONALE DU VIETNAM, HANOÏ INSTITUT FRANCOPHONE INTERNATIONAL Djahlin Hervé NIKUE AMASSAH Analyse d’émotions animales MÉMOIRE DE FIN D’ÉTUDES DU MASTER INFORMATIQUE HANOÏ - 2020 UNIVERSITÉ NATIONALE DU VIETNAM, HANOÏ INSTITUT FRANCOPHONE INTERNATIONAL Djahlin Hervé NIKUE AMASSAH Analyse d’émotions animales Spécialité : Systèmes Intelligents et Multimédia Code : Programme pilote MÉMOIRE DE FIN D’ÉTUDES DU MASTER INFORMATIQUE Sous la direction de : M Bruno EMILE (Directeur de l’IUT de l’Indre, Mtre de conférence - HDR) HANỌ - 2020 Attestation sur l’honneur J’atteste sur l’honneur que ce mémoire a été réalisé par moi-même et que les données et les résultats qui y sont présentés sont exacts et n’ont jamais été publiés ailleurs La source des informations citées dans ce mémoire a bien été précisée Signature de l’étudiant Djahlin Hervé NIKUE AMASSAH Dédicaces ♥ A mes très chers parents Pour leur soutien, leur amour, leur patience et leur encouragement durant tout mon parcours scolaire Que DIEU le tout puissant vous préserve, vous accorde santé, bonheur, quiétude de l’esprit et vous protège de tout mal ♥ A tous mes professeurs C’est une grande fierté pour moi d’être votre étudiant En témoignage de mon respect et de ma grande affection ♥ A mes encadrants de stage Je voudrais vous adresser ma gratitude, mes sincères reconnaissances pour tout ce que vous aviez fait pour moi durant mon stage Votre patience, votre disponibilité et surtout la confiance que vous avez porté mon égard m’a beaucoup aidé dans l’avancement de mes travaux ♥ A tous mes amis J’ai l’honneur d’avoir des amis, surtout de la promotion 23 SIM de l’IFI, si gentils, fidèles, sincères et qui n’ont jamais hésité de partager avec moi mes soucis, mon malheur et mon bonheur Remerciements Je remercie Dieu le tout Puissant, très Miséricordieux, qui m’a donné la santé, le courage et la persévérance durant ces deux années C’est avec une certaine émotion et une grande reconnaissance que je remercie l’Université Nationale du Vietnam travers l’Institut Francophone International et toute son équipe pédagogique Je remercie les professeurs pour les valeurs et méthodes inculquées durant le cursus : la curiosité, le goût du travail, de l’effort, le sens de la persévérance, la volonté de se remettre en question etc Autant de trésors qui me seront, sans nul doute, utiles toute ma vie Je tiens adresser mes profonds remerciements tous mes encadrants du laboratoire PRISME l’IUT de l’Indre, très chaleureusement Mlle Helène LAURENT, M Bruno EMILE, M Xavier DESQUESNES qui m’ont beaucoup aidés lors de ce stage ; leurs conseils et leur coaching m’ont permis de cibler et de m’orienter tout au long de ce stage Ils m’ont donné envie de persévérer dans ce métier pour lequel ils ont le plus grand respect, la recherche et l’innovation Un grand merci mon père M Amoni NIKUE AMASSAH , ma mère Mme Ayaba NIKUE AMASSAH, mes soeurs et mon frère pour leurs conseils ainsi que pour leur soutien inconditionnel Je voudrais profiter de cet espace pour leur exprimer toute ma gratitude et ma reconnaissance Grâce vous, j’aborde une nouvelle étape de ma vie avec confiance et dynamisme Djahlin Hervé NIKUE AMASSAH Résumé Le sujet de ce stage s’inscrit dans le contexte de l’analyse automatique des vidéos pour la détection d’émotions chez les animaux, qui est l’un des axes de recherche de l’INRA En effet, des travaux sont menés, depuis quelques années, sur des animaux d’élevages mais également sur des animaux en captivité De récentes études ont réussi mettre en évidence des émotions positives chez les oiseaux, travers des rougissements et des modifications du plumage au niveau de la tête Ces modifications ont été observées dans le cadre d’interactions entre les animaux et les animaliers Pour arriver ces résultats, les chercheurs sont amenés traiter, manuellement, de nombreuses vidéos Le travail de ce stage a été réalisé dans le but d’aider ces chercheurs en mettant en place un système d’analyse automatique des vidéos permettant la reconnaissance d’émotions chez les oiseaux, plus précisément chez les perroquets L’ensemble du travail a été scindé en deux grandes parties Dans la première partie, nous avons détecté et isolé, dans les vidéos, la zone d’intérêt (la tête de l’oiseau) où se manifeste l’émotion Nous avons retenu la méthode yolo v3 (une méthode base de réseau de neurone convolutif) pour effectuer la détection de la tête de l’oiseau Dans la seconde partie, nous avons extrait, sur la tête de l’oiseau, les caractéristiques permettant de détecter les émotions positives chez l’oiseau Ces caractéristiques sont principalement : le redressement des plumes sur la tête et les rougissements au niveau de la joue, autour des yeux et des narines de l’oiseau Pour extraire les caractéristiques liées au redressement des plumes, nous avons d’abord segmenté la zone de redressement des plumes par une méthode de détection de couleur et ensuite utilisé les descripteurs de forme, de textures et les descripteurs HOG comme caractéristiques liées cette zone Une fois les caractéristiques extraites, nous avons formé un classificateur afin d’effectuer, dans un premier temps, une détection d’émotion basée sur le redressement des plumes Pour cela, nous avons implémenté et testé plusieurs classificateurs savoir : la machine vecteur de support, la forêt aléatoire et le deep learning (ResNet 50 et VGG 16) Pour extraire les caractéristiques liées au rougissement, nous avons d’abord segmenté la zone de rougissement par la méthode de segmentation sémantique U-Net Une fois cette zone segmentée, nous avons extrait les caractéristiques de couleurs en utilisant l’histogramme de couleur des composant Teinte et Saturation de l’espace de couleur Teinte Saturation Valeur et le masque de segmentation Avec ces caractéristiques, nous avons formé et testé deux classificateurs (la machine vecteur de support et la forêt aléatoire) afin d’effectuer une seconde détection d’émotion basée sur le rougissement Toutes les méthodes implémentées ont été testées, avec une technique de validation croisée, sur des bases d’images de vérité de terrain, afin d’évaluer leur performance Nous avons obtenu de très bonnes précisions pour la détection d’émotions basée sur le redressement des plumes ainsi que sur le rougissement Mots clés : détection d’objets, détection d’émotions, deep learning, segmentation sémantique Abstract The subject of this internship is in the context of automatic video analysis for the detection of emotions in animals, which is one of the axes of research at INRA Indeed, work has been carried out for several years on farm animals but also on animals in captivity Recent studies have shown positive emotions in birds through the reddening and plumage changes on the head These changes have been observed in interactions between animals and animal handlers To achieve these results, the researchers had to manually process a large number of videos The work of this internship was carried out with the aim of helping these researchers by setting up an automatic video analysis system allowing the recognition of emotions in birds, more precisely in parrots The entire work was divided into two (2) major parts In the first part, we have detected and isolated, in the videos, the region of interest (the head of the bird) where the emotion manifests itself We used the yolo v3 method (a Convolutional Neural Network-based method) to perform the detection of the bird’s head In the second part, we extracted, on the bird’s head, the characteristics that allow us to detect positive emotions in the bird These features are mainly : the raising of the feathers on the head and the reddening of the cheeks, around the eyes and nose of the bird To extract the features related to feather straightening, we first segmented the feather straightening area using a color detection method and then used shape, texture and HOG descriptors as features related to this area Once the features were extracted, we trained a classifier to perform, in a first step, an emotion detection based on feather raising For this, we implemented and tested several classifiers, namely : the support vector machine, the random forest and deep learning (ResNet 50 and VGG 16) In order to extract the features related to reddening, we first segmented the reddening area using the U-Net semantic segmentation method Once this area was segmented, we extracted the color features using the color histogram of the Hue and Saturation components of the Hue Saturation Value color space and the segmentation mask With these features, we trained and tested two (2) classifiers (the support vector machine and the random forest) in order to perform a second emotion detection based on reddening All the implemented methods have been tested, with a cross-validation technique, on ground truth image databases, in order to evaluate their performance We obtained very good accuracy for the detection of emotions based on feather raising as well as reddening Keywords : objects detection, emotion detection, deep learning, semantic segmentation Table des matières Liste des figures vi Liste des tableaux vii Introduction générale 1 Présentation du cadre d’étude et du projet de stage 1.1 Introduction 1.2 Présentation du cadre d’étude : IFI 1.2.1 Objectifs 1.2.2 Conditions d’accès et mode de recrutement 1.2.3 Organigramme de l’IFI 1.2.4 Formation 1.2.4.1 Parcours systèmes intelligents et multimédia 1.2.4.2 Parcours systèmes et réseaux communicants 1.2.4.3 Master en Banque, Finance et Fintech 1.2.4.4 Master en Information - Communication, Spécialité Communication digitale et éditoriale 1.3 Structure d’accueil 1.4 Contexte et problématique du projet 1.5 Objectifs du stage 10 1.6 Conclusion 10 Etat de l’art 2.1 Introduction 2.2 Détection de la tête de l’oiseau 2.2.1 Yolo v3 : méthode de détection d’objets [10] [11] 2.2.2 Localisation et détection des parties locales par un apprentissage fortement supervisé : annotation de parties [6] 2.2.3 Localisation et détection des parties locales avec Masque CNN [8] 2.3 Segmentation d’images i 11 11 11 11 13 14 15 TABLE DES MATIÈRES 2.3.1 Segmentation par détection de couleur 2.3.2 Segmentation de couleur avec K-means Clusturing 2.3.3 Segmentation sémantique base de deep learning 2.3.3.1 U-Net 2.3.3.2 Réseau convolutif entièrement connecté (FCN) 2.3.3.3 FastFCN [20] 2.4 Extraction de caractéristiques 2.4.1 Descripteurs de textures 2.4.1.1 Gray Level Cooccurrence Matrix (GLCM) [22] 2.4.1.2 Les descripteurs LBP (Local Binary Patterns) 2.4.2 Descripteurs de formes [23] 2.4.3 Descripteurs HOG [24] 2.4.4 Descripteurs de couleurs [25] 2.5 Méthodes de classification 2.5.1 Machine vecteur de Support (SVM) [26] 2.5.2 Forêt aléatoire [28] 2.5.3 Perceptron multi couche [30] 2.5.4 Réseaux de neurones convolutifs [31] 2.5.4.1 La convolution [31] 2.5.4.2 La fonction d’activation ou de la non-linéarité [31] 2.5.4.3 La mise en commun ou regroupement (pooling) [31] 2.5.4.4 Couche entièrement connectée [31] 2.5.4.5 Quelques exemples d’architectures de réseaux de neurones convolutifs 2.5.5 Réseaux de neurones récurents 2.6 Conclusion Proposition de solution 3.1 Introduction 3.2 Détection de la tête de l’oiseau 3.3 Segmentation des zones d’intérêts 3.3.1 Segmentation de la zone de redressement des plumes 3.3.2 Segmentation de la zone de rougissement 3.4 Extraction de caractéristiques 3.5 Classification de l’émotion 3.6 Conclusion Implémentation et analyse des résultats 4.1 Introduction 4.2 Détection de la tête de l’oiseau avec yolo v3 4.2.1 Préparation des données 4.2.2 Formation du modèle 4.2.3 Résultat ii 15 16 16 16 18 18 19 19 19 20 20 21 21 21 22 22 23 26 27 27 28 29 29 33 33 34 34 35 36 36 37 38 38 39 40 40 40 40 41 42 BIBLIOGRAPHIE [14] H P Ng, S H Ong, K W C Foong, P S Goh, W L Nowinski (2006), "Medical Image Segmentation Using K-Means Clustering and Improved Watershed Algorithm", IEEE Southwest Symposium on Image Analysis and Interpretation, pp 61-65 [15] https://fr.wikipedia.org/wiki/Segmentationd %27i mag e [16] https://heartbeat.fritz.ai/a-2019-guide-to-semantic-segmentation-ca8242f5a7fc [17] O Ronneberge, P Fischer, T Brox (2015), "U-Net: Convolutional Networks for BiomedicalImage Segmentation", arXiv:1505.04597v1, pp [18] A Silburt, M Ali-Dib, C Zhu, A Jackson, D Valencia, Y Kissin, D Tamay, K Menou (2018), "Lunar Crater Identification via Deep Learning", arXiv:1803.02192v1, pp 45 [19] E Shelhamer, J Long, T Darrell (2016), "Fully Convolutional Networksfor Semantic Segmentation", arXiv:1605.06211v1, pp 12 [20] H Wu, J Zhang, K Huang (2019), "FastFCN: Rethinking Dilated Convolution in the Backbone for SemanticSegmentation", arXiv:1903.11816v1, pp 15 [21] https://fr.wikipedia.org/wiki/Motifb i nai r e l oc al [22] C Désir, C Petitjean, L Heutte, L Thiberville, M Salaün (2012), "An SVM-based distal lung image classification using texture descriptors", Computerized Medical Imaging and Graphics, pp 267-270 [23] E Sokic, S Konjicija (2016), "Phase preserving Fourier descriptor for shape-basedimage retrieval", Signal Processing:Image Communication 40, pp 82-96 [24] https://www.analyticsvidhya.com/blog/2019/09/feature-engineering-imagesintroduction-hog-feature-descriptor/ [25] M Poorani, T Prathiba, G Ravindran (2013), "Integrated Feature Extraction for Image Retrieval ", IJCSMC, Vol 2, Issue 2, pp 28 – 35 [26] https://towardsdatascience.com/support-vector-machine-introduction-tomachine-learning-algorithms-934a444fca47 [27] https://towardsdatascience.com/introduction-to-machine-learning-algorithmslinear-regression-14c4e325882a [28] N Horning (2010), "Random Forests : An algorithm for image classification and generation ofcontinuous fields data sets", International Conference on Geoinformatics for Spatial Infrastructure Development in Earth and Allied Sciences, pp [29] https://www.kaggle.com/saadzarook/random-forest-classifer-on-iris-df 65 BIBLIOGRAPHIE [30] https://openclassrooms.com/fr/courses/4470406-utilisez-des-modelessupervises-non-lineaires/4730716-entrainez-un-reseau-de-neurones-simple [31] https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/ [32] https://towardsdatascience.com/activation-functions-neural-networks1cbd9f8d91d6 [33] https://towardsdatascience.com/neural-network-architectures-156e5bad51ba [34] A Pedraza, J Gallego, S Lopez, L Gonzalez, A Laurinavicius, G Bueno (2017), "Glomerulus classification with ConvolutionalNeural Networks", Communications in Computer and Information Science, pp 12 [35] M Loukadakis, J Cano, M O’Boyle (2018), "Accelerating Deep Neural Networks on LowPower Heterogeneous Architectures", Institute for Computing Systems ArchitectureSchool of Informatics, University of Edinburgh, pp 15 [36] K Simonyan, A Zisserman (2015), "VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION", arXiv:1409.1556v6, pp 14 [37] C Szegedy, W Liu, Y Jia, P Sermanet, S Reed, D Anguelov, D Erhan, V Vanhoucke, A Rabinovich (2014), "Going deeper with convolutions", arXiv:1409.4842v1, pp 12 [38] K He, X Zhang, S Ren, J Sun (2015), "Deep Residual Learning for Image Recognition", arXiv:1512.03385v1, pp 12 [39] https://www.cntk.ai/pythondocs/CNTK2 04S equence T o S equence.ht ml [40] J L Elman (1991), "Distributed Representations, Simple Recurrent Networks, and Grammatical Structure", Machine Learning,7, pp 195-225 [41] https://towardsdatascience.com/understanding-rnn-and-lstm-f7cdf6dfc14e [42] https://towardsdatascience.com/review-yolov3-you-only-look-once-objectdetection-eab75d7a1ba6 [43] S Gharsalli, B Emile, H Laurent, X Desquesnes (2016), "Feature Selection for Emotion Recognition based on Random Forest", Proceedings of the 11th Joint Conference on Computer Vision, Imaging and Computer Graphics Theory and Applications, 4, pp 610-617 [44] J Jayalekshmi, T Mathew (2017), "Facial Expression Recognition and Emotion Classification System for Sentiment Analysis", International Conference on Networks Advances in Computational Technologies (NetACT), pp 66 BIBLIOGRAPHIE [45] W Liu, D Anguelov, D Erhan, C Szegedy, S Reed, C Fu, A C Berg (2016), "SSD: Single Shot MultiBox Detector", arXiv:1512.02325v5, pp 17 [46] https://towardsdatascience.com/metrics-to-evaluate-your-semanticsegmentation-model-6bcb99639aa2 67 Annexe A Quelques fonctions Détection de la tête de l’oiseau dans une image # Importation de quelques librairies import numpy as np import time import cv2 import os from google.colab.patches import cv2_imshow # Chargement du fichier label contenant le nom de notre classe (bird_head) labelsPath = ’/mydrive/obj.names’ LABELS = open(labelsPath).read().strip().split("\n") # Initialisation d’une liste de couleurs pour dessiner la bote englobante autour de l’objet np.random.seed(42) COLORS = np.random.randint(0, 255, size=(len(LABELS), 3), dtype="uint8") # Dfinition du chemain vers le fichier des poids du modle weightsPath = ’/mydrive/yolov3_custom2_last.weights’ # Dfinition du chemain vers le fichier de configuration du modle configPath = ’/mydrive/yolov3_custom2.cfg’ # Chargement du modle depuis le rpertoire google drive print("[INFO] loading YOLO ") net = cv2.dnn.readNetFromDarknet(configPath, weightsPath) # Lecture de l’image de test depuis le rpertoire google drive image = cv2.imread(’/mydrive/test_data/img359.jpg’) # Rcupration de la hauteur et de la largeur de l’image de test (H, W) = image.shape[:2] # Pour rcuprer juste les couches de sorties de notre modle yolo ln = net.getLayerNames() 68 ANNEXE A QUELQUES FONCTIONS ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()] # Quelques Pretraitements de l’image de test avant son passage dans le modle : normalisation # des pixels de l’image pour avoir une valeur entre et (1/255.0) # redimensionnement de la taille de l’image (416x416) blob = cv2.dnn.blobFromImage(image, / 255.0, (416, 416), swapRB=True, crop=False) # Passage de l’image l’ entre du modle net.setInput(blob) # Rcupration du temps de dbut du traitement start = time.time() # Rcupration de la sortie produit par notre modle (les prdictions) layerOutputs = net.forward(ln) # Rcupration du temps de fin du traitement end = time.time() # Affichage de la dure totale du traitement print("[INFO] YOLO took {:.6f} seconds".format(end - start)) # Initialisation des listes pour contenir respectivement les botes englobantes, # les scores de confiance (probabilit de la classe) et les ID des classes (ici nous n’avons qu’une seule classe, # donc une seule ID) boxes = [] confidences = [] classIDs = [] # Seuil pour la probabilit de la classe On peut faire varier cette valeur # afin de voir comment a affecte notre dtection seuil_propabilite = 0.5 # Parcourir toutes les couches de sortie du modle for output in layerOutputs: # Parcourir toutes les dtections for detection in output: # extraire l’ID de la classe et la confiance (probalit) de # l’objet courant dtect scores = detection[5:] # rcupration du score de probabilit de la classe classID = np.argmax(scores) # rcupration de l’ID du score maximum confidence = scores[classID] # rcupration de la probabilit de la classe # Filtrer les dtection pour rcuprer juste celles dont la probalit # suprieure la probabilit minimum if confidence > seuil_propabilite: # mettre l’ chelle les coordonnes de la bote englobante par 69 ANNEXE A QUELQUES FONCTIONS rapport la taille de l’image, tout en sachant # que yolo renvoie en fait les coordonnes du centre (x, y) de la bote englobante, # suivies de la largeur et de la hauteur des botes box = detection[0:4] * np.array([W, H, W, H]) (centerX, centerY, width, height) = box.astype("int") # utilisation des coordonnes du centre (centerX, centerY) pour obtenir les coordonnes (x,y) du coin suprieur # gauche de la bote englobante x = int(centerX - (width / 2)) y = int(centerY - (height / 2)) # Mise jour de notre liste de bote englobante, de score de confiance et de l’ID de la classe boxes.append([x, y, int(width), int(height)]) confidences.append(float(confidence)) classIDs.append(classID) # appliquer une suppression non maximale pour supprimer les botes # englobantes faibles et qui se chevauchent idxs = cv2.dnn.NMSBoxes(boxes, confidences, seuil_propabilite, 0.3) # D’abord, on s’assure qu’il y a au moins une dtection if len(idxs) > 0: # Parcourir les dtections retenues for i in idxs.flatten(): # Extraire les coordonnes de la bote englobante (x, y) = (boxes[i][0], boxes[i][1]) (w, h) = (boxes[i][2], boxes[i][3]) # dessiner la bote englobante et afficher la classe avec sa propabilit sur l’image color = [int(c) for c in COLORS[classIDs[i]]] cv2.rectangle(image, (x, y), (x + w, y + h), color, 2) text = "{}: {:.4f}".format(LABELS[classIDs[i]], confidences[i]) cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) # Afficher l’image de sortie cv2_imshow(image) cv2.waitKey(0) Modèle ResNet 50 # Download the architecture of ResNet50 with ImageNet weights base_model = ResNet50(include_top=False, weights=’imagenet’, input_shape=(299, 299, 3)) base_model.trainable = False # Taking the output of the last convolution block in ResNet50 x = base_model.output 70 ANNEXE A QUELQUES FONCTIONS # Adding a Global Average Pooling layer x = GlobalAveragePooling2D()(x) # Adding a fully connected layer having 1024 neurons x = Dense(1024, activation=’relu’)(x) # Adding a fully connected layer having neurons which will # give the probability of image having either dog or cat predictions = Dense(2, activation=’softmax’)(x) # Model to be trained model = Model(inputs=base_model.input, outputs=predictions) Modèle U-Net from tensorflow.keras.models import Model, load_model from tensorflow.keras.layers import Conv2D, Input, MaxPooling2D, concatenate, Dropout,\ Lambda, Conv2DTranspose, Add from tensorflow.keras import backend as K from tensorflow.keras.optimizers import Adam import numpy as np import tensorflow as tf import os def preprocess_input(x): x /= 255 x -= 0.5 x *= return x def dice(y_true, y_pred, smooth=1.): y_true_f = K.flatten(y_true) y_pred_f = K.flatten(y_pred) intersection = K.sum(y_true_f * y_pred_f) return (2 * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth) def unet(pretrained=False, base=4): if pretrained: 71 ANNEXE A QUELQUES FONCTIONS path = os.path.join(’models’, model_name+’.model’) if os.path.exists(path): model = load_model(path, custom_objects={’dice’: dice}) model.summary() return model else: print(’Failed to load existing model at: {}’.format(path)) if n_classes == 1: loss = ’binary_crossentropy’ final_act = ’sigmoid’ elif n_classes > 1: loss = ’categorical_crossentropy’ final_act = ’softmax’ b = base i = Input((imshape[0], imshape[1], imshape[2])) s = Lambda(lambda x: preprocess_input(x)) (i) c1 = Conv2D(2**b, (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (s) c1 = Dropout(0.1) (c1) c1 = Conv2D(2**b, (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (c1) p1 = MaxPooling2D((2, 2)) (c1) c2 = Conv2D(2**(b+1), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (p1) c2 = Dropout(0.1) (c2) c2 = Conv2D(2**(b+1), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (c2) p2 = MaxPooling2D((2, 2)) (c2) c3 = Conv2D(2**(b+2), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (p2) c3 = Dropout(0.2) (c3) c3 = Conv2D(2**(b+2), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (c3) p3 = MaxPooling2D((2, 2)) (c3) c4 = Conv2D(2**(b+3), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (p3) c4 = Dropout(0.2) (c4) c4 = Conv2D(2**(b+3), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (c4) p4 = MaxPooling2D(pool_size=(2, 2)) (c4) 72 ANNEXE A QUELQUES FONCTIONS c5 = Conv2D(2**(b+4), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (p4) c5 = Dropout(0.3) (c5) c5 = Conv2D(2**(b+4), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (c5) u6 = Conv2DTranspose(2**(b+3), (2, 2), strides=(2, 2), padding=’same’) (c5) u6 = concatenate([u6, c4]) c6 = Conv2D(2**(b+3), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (u6) c6 = Dropout(0.2) (c6) c6 = Conv2D(2**(b+3), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (c6) u7 = Conv2DTranspose(2**(b+2), (2, 2), strides=(2, 2), padding=’same’) (c6) u7 = concatenate([u7, c3]) c7 = Conv2D(2**(b+2), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (u7) c7 = Dropout(0.2) (c7) c7 = Conv2D(2**(b+2), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (c7) u8 = Conv2DTranspose(2**(b+1), (2, 2), strides=(2, 2), padding=’same’) (c7) u8 = concatenate([u8, c2]) c8 = Conv2D(2**(b+1), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (u8) c8 = Dropout(0.1) (c8) c8 = Conv2D(2**(b+1), (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (c8) u9 = Conv2DTranspose(2**b, (2, 2), strides=(2, 2), padding=’same’) (c8) u9 = concatenate([u9, c1], axis=3) c9 = Conv2D(2**b, (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (u9) c9 = Dropout(0.1) (c9) c9 = Conv2D(2**b, (3, 3), activation=’elu’, kernel_initializer=’he_normal’, padding=’same’) (c9) o = Conv2D(n_classes, (1, 1), activation=final_act) (c9) model = Model(inputs=i, outputs=o, name=model_name) 73 ANNEXE A QUELQUES FONCTIONS model.compile(optimizer=Adam(1e-4), loss=loss, metrics=[dice]) model.summary() return model Détection de l’émotion basée sur le redressement des plumes et le rougissement dans une vidéo # Importation de quelques librairies from imutils.video import FPS import numpy as np import time import cv2 import os from google.colab.patches import cv2_imshow import imutils from matplotlib import pyplot as plt # Chargement du fichier label contenant le nom de notre classe (bird_head) labelsPath = ’/mydrive/obj.names’ LABELS = open(labelsPath).read().strip().split("\n") # Initialisation d’une liste de couleurs pour dessiner la bote englobante autour de l’objet np.random.seed(42) COLORS = np.random.randint(0, 255, size=(len(LABELS), 3), dtype="uint8") # Dfinition du chemain vers le fichier des poids du modle # Dfinition du chemain vers le fichier de configuration du modle weightsPath = ’/mydrive/yolov3_custom2_last.weights’ configPath = ’/mydrive/yolov3_custom2.cfg’ # Chargement du modle depuis le rpertoire google drive print("[INFO] loading YOLO from disk ") net = cv2.dnn.readNetFromDarknet(configPath, weightsPath) ln = net.getLayerNames() ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()] # Lecture de la video de test depuis le rpertoire google drive vs = cv2.VideoCapture(’/mydrive/Clip0017_x264.mp4’) writer = None (W, H) = (None, None) fps = FPS().start() # dterminer le nombre total de frame traiter 74 ANNEXE A QUELQUES FONCTIONS try: prop = cv2.cv.CV_CAP_PROP_FRAME_COUNT if imutils.is_cv2() \ else cv2.CAP_PROP_FRAME_COUNT total = int(vs.get(prop)) print("[INFO] {} total frames in video".format(total)) except: print("[INFO] could not determine # of frames in video") print("[INFO] no approx completion time can be provided") total = -1 # parcourir les frames de la video while True: # lire la prochaine frame (grabbed, frame) = vs.read() # si aucune frame n’est lu alors on est if not grabbed: break # rcuprer les dimensions de la frame if W is None or H is None: (H, W) = frame.shape[:2] la fin de la video # Quelques Prtraitements de l’image de test avant son passage dans le modle : normalisation # des pixels de l’image pour avoir une valeur entre et (1/255.0) # redimensionnement de la taille de l’image (416x416) blob = cv2.dnn.blobFromImage(frame, / 255.0, (416, 416), swapRB=True, crop=False) net.setInput(blob) start = time.time() layerOutputs = net.forward(ln) end = time.time() # Initialisation des listes pour contenir respectivement les botes englobantes, # les scores de confiance (probabilit de la classe) et les ID des classes (ici # nous n’avons qu’une seule classe, donc une seule ID) boxes = [] confidences = [] classIDs = [] # Parcourir toutes les couches de sortie du modle for output in layerOutputs: # Parcourir toutes les dtections for detection in output: # extraire l’ID de la classe et la confiance (probalit) de # l’objet courant dtect 75 ANNEXE A QUELQUES FONCTIONS scores = detection[5:] classID = np.argmax(scores) confidence = scores[classID] # Filtrer les dtection pour rcuprer juste celles dont la probalit # suprieure la probabilit minimum if confidence > 0.5: # mettre l’ chelle les coordonnes de la bote englobante par rapport la taille de l’image, tout en sachant # que yolo renvoie en fait les coordonnes du centre (x, y) de la bote englobante, # suivies de la largeur et de la hauteur des botes box = detection[0:4] * np.array([W, H, W, H]) (centerX, centerY, width, height) = box.astype("int") # utilisation des coordonnes du centre (centerX, centerY) pour obtenir les coordonnes (x,y) du coin suprieur # gauche de la bote englobante x = int(centerX - (width / 2)) y = int(centerY - (height / 2)) # Mise jour de notre liste de bote englobante, de score de confiance et de l’ID de la classe boxes.append([x, y, int(width), int(height)]) confidences.append(float(confidence)) classIDs.append(classID) # appliquer une suppression non maximale pour supprimer les botes # englobantes faibles et qui se chevauchent idxs = cv2.dnn.NMSBoxes(boxes, confidences, 0.5,0.3) image = frame.copy() # D’abord, on s’assure qu’il y a au moins une dtection if len(idxs) > 0: # Parcourir les dtections retenues for i in idxs.flatten(): # Extraire les coordonnes de la bote englobante (x, y) = (boxes[i][0], boxes[i][1]) (w, h) = (boxes[i][2], boxes[i][3]) # dessiner la bote englobante et afficher la classe avec sa propabilit sur l’image color = [int(c) for c in COLORS[classIDs[i]]] cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2) text = "{}: {:.4f}".format(LABELS[classIDs[i]], confidences[i]) cv2.putText(frame, text, (x, y - 5),cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) img_new = image[y:y + h, x:x + w] 76 ANNEXE A QUELQUES FONCTIONS if(img_new.size != 0): #Dtecttion de redressement img = load(img_new) proba = model_resnet.predict(img, verbose=1)[0] classe_name = classes[list(proba).index(max(proba))] text2 = "{}: {:.2f} %".format(classe_name, max(proba)*100) cv2.putText(frame, text2, (30, 100), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 2) # Dtection du rougissement image_test = cv2.resize(img_new, (256, 256), interpolation = cv2.INTER_AREA) im = np.expand_dims(image_test, axis=0) im_softmax = unet_model.predict(im) im_pred = np.squeeze(im_softmax) * 255.0 im_pred = im_pred.astype(np.uint8) hsv = cv2.cvtColor(image_test,cv2.COLOR_BGR2HSV) hist = cv2.calcHist( [hsv], [0, 1], im_pred, [180, 256], [0, 180, 0, 256] ) fd = hist.reshape(1, -1) classe2 = load_model.predict(fd)[0] prob2 = max(load_model.predict_proba(fd)[0]) text3 = "{}: {:.2f} %".format(classe2, prob2*100) cv2.putText(frame, text3, (30, 250), cv2.FONT_HERSHEY_SIMPLEX, 2, (10, 200, 205), 2) if writer is None: # initialiser la video de sortie fourcc = cv2.VideoWriter_fourcc(*"MJPG") writer = cv2.VideoWriter(’/mydrive/video_out4.avi’, fourcc, 30, (frame.shape[1], frame.shape[0]), True) # rcuprer les informations sur la dure totale du traitement if total > 0: elap = (end - start) print("[INFO] single frame took {:.4f} seconds".format(elap)) print("[INFO] estimated total time to finish: {:.4f}".format(elap * total)) # crire le fichier de sortie sur le disque dur writer.write(frame) # mettre jour le nombre de frame par seconde fps.update() fps.stop() 77 ANNEXE A QUELQUES FONCTIONS print("[INFO] cleaning up ") print("[INFO] elasped time: {:.2f}".format(fps.elapsed())) print("[INFO] approx FPS: {:.2f}".format(fps.fps())) writer.release() vs.release() cv2.destroyAllWindows() 78 ANNEXE A QUELQUES FONCTIONS 79 ... NATIONALE DU VIETNAM, HANOÏ INSTITUT FRANCOPHONE INTERNATIONAL Djahlin Hervé NIKUE AMASSAH Analyse d’émotions animales Spécialité : Systèmes Intelligents et Multimédia Code : Programme pilote MÉMOIRE... dans leur analyse Ce stage a été réalisé afin de proposer une solution basée sur la vision par ordinateur permettant l? ?analyse automatique de ces vidéos Cette solution permettra d’analyser automatiquement... Capture d’une vidéo analyser L? ?analyse des vidéos se faisant manuellement, cela devenait couteux en temps et en personnel et pouvait entrner des erreurs dans les résultats d? ?analyse C’est ainsi