======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}}