======Yolo Darknet unload GPU RAM in python script====== * **Ajout de la Libération de la RAM GPU à la fin d'une détection en gardant le script python actif.** * **unload network in python script https://github.com/AlexeyAB/darknet/issues/3467** * Cette modification ne marche qu'avec CUDA. Sur une machine sans CUDA (pour des tests), il ne faut pas modifier darknet.py ====Modifications des fichiers==== * [[https://github.com/AlexeyAB/darknet|des sources de darknet]] * ===./include/darknet.h=== void show_total_time(); // ajout serge pour vider la memoire ligne 904 LIB_API void free_network(network net); #ifdef __cplusplus } #endif // __cplusplus #endif // DARKNET_API ===./src/network.c=== // ajout serge pour vider la memoire ligne 1252 void api_free_network(network *net) { int i; for (i = 0; i < (*net).n; ++i) { free_layer((*net).layers[i]); } free((*net).layers); free((*net).seq_scales); free((*net).scales); free((*net).steps); free((*net).seen); #ifdef GPU if (gpu_index >= 0) cuda_free((*net).workspace); else free((*net).workspace); if ((*net).input_state_gpu) cuda_free((*net).input_state_gpu); if ((*net).input_pinned_cpu) { // CPU if ((*net).input_pinned_cpu_flag) cudaFreeHost((*net).input_pinned_cpu); else free((*net).input_pinned_cpu); } if (*(*net).input_gpu) cuda_free(*(*net).input_gpu); if (*(*net).truth_gpu) cuda_free(*(*net).truth_gpu); if ((*net).input_gpu) free((*net).input_gpu); if ((*net).truth_gpu) free((*net).truth_gpu); if (*(*net).input16_gpu) cuda_free(*(*net).input16_gpu); if (*(*net).output16_gpu) cuda_free(*(*net).output16_gpu); if ((*net).input16_gpu) free((*net).input16_gpu); if ((*net).output16_gpu) free((*net).output16_gpu); if ((*net).max_input16_size) free((*net).max_input16_size); if ((*net).max_output16_size) free((*net).max_output16_size); #else free((*net).workspace); #endif } ===./src/network.h=== void restore_network_recurrent_state(network net); // ajout serge pour vider la memoire ligne 173 void api_free_network(network *net); #ifdef __cplusplus } #endif #endif ===./darknet.py=== ... ... predict_image_letterbox.restype = POINTER(c_float) # ajout serge pour vider la memoire ligne 210 free_network = lib.api_free_network free_network.argtypes = [c_void_p] def array_to_image(arr): import numpy as np : ===Dans votre script personnel qui appelle darknet.py=== **Exemple:** voir le fichier complet [[https://github.com/sergeLabo/darknet-letters/blob/master/letters/play_letters/play_letters.py|play_letters.py]] sur GitHub class YOLO: ... ... def set_darknet(self): ... ... # Définition du network self.netMain = darknet.load_net_custom(configPath.encode("ascii"), weightPath.encode("ascii"), 0, 1) En fin de boucle opencv: # Echap pour finir le script python if cv2.waitKey(1) == 27: os._exit(0) cv2.destroyAllWindows() # Libération de la mémoire GPU self.free_network(self.netMain) ====Fichiers modifiés==== Les fichiers modifiés le 29/11/2019 sont dans le dossier [[https://github.com/sergeLabo/darknet-letters/tree/master/issue_3467|issue_3467]] ====Compilation==== Voir [[yolo_darknet_sur_un_portable_optimus#installation_de_yolo_darknet|Installation de YOLO Darknet]] Dans le dossier darknet, make clean make -j8 Copier les fichiers darknet.py et libdarknet.so dans le dossier avec votre fichier python de détection. {{tag> ia sb bge yolo_darknet}}