{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install git+https://github.com/qubvel/efficientnet","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\nimport collections\nimport multiprocessing\nfrom numpy.random import seed\nfrom datetime import datetime as dt\nimport json\nimport os\nimport gc\nimport glob\nimport random\nimport cv2\nimport seaborn as sns \nfrom matplotlib import pyplot as plt\nimport plotly.express as px\nfrom PIL import Image,ImageDraw,ImageFile, ImageFont\nimport numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import KFold\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom copy import deepcopy\nfrom PIL import Image\nimport efficientnet.keras as efn \nimport keras\nimport keras.backend as K\nfrom tensorflow.keras.optimizers import Adam\nfrom keras.layers import Dense, Flatten, Activation, Dropout, GlobalAveragePooling2D\nfrom keras import optimizers, applications\nfrom keras.models import Model, load_model\nimport tensorflow as tf\nfrom keras.callbacks import Callback, ModelCheckpoint, LearningRateScheduler, TensorBoard, EarlyStopping\nfrom tensorflow.keras.utils import Sequence\nfrom sklearn.metrics import precision_recall_curve, auc\nfrom sklearn.model_selection import train_test_split\nfrom tqdm import tqdm_notebook as tqdm\n%matplotlib inline","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:02:57.427057Z","iopub.execute_input":"2022-07-17T12:02:57.428048Z","iopub.status.idle":"2022-07-17T12:02:57.446500Z","shell.execute_reply.started":"2022-07-17T12:02:57.428006Z","shell.execute_reply":"2022-07-17T12:02:57.445537Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Les pièges à caméra (ou Wild Cams) permettent la collecte automatique de grandes quantités de données d'images. Les biologistes du monde entier utilisent les pièges à caméra pour surveiller la biodiversité et la densité de population des espèces animales.","metadata":{}},{"cell_type":"markdown","source":"Le but de ce notebook est de catégoriser les espèces et de compter le nombre d'individus à travers les images du piège à caméra.","metadata":{}},{"cell_type":"markdown","source":"### Explication pour les fichier image","metadata":{}},{"cell_type":"markdown","source":"Tout d'abord, voyons quels types d'images sont disponibles.","metadata":{}},{"cell_type":"code","source":"TRAIN_DATA_PATH = '../input/iwildcam-2020-fgvc7/train/'\nTEST_DATA_PATH = '../input/iwildcam-2020-fgvc7/test/'\n\ntrain_jpeg = glob.glob(TRAIN_DATA_PATH + '*')\ntest_jpeg = glob.glob(TEST_DATA_PATH + '*')\n\nprint(\"number of train jpeg data:\", len(train_jpeg))\nprint(\"number of test jpeg data:\", len(test_jpeg))","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:05:01.927514Z","iopub.execute_input":"2022-07-17T12:05:01.928033Z","iopub.status.idle":"2022-07-17T12:05:08.160250Z","shell.execute_reply.started":"2022-07-17T12:05:01.927973Z","shell.execute_reply":"2022-07-17T12:05:08.159134Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### données d'entrainement","metadata":{}},{"cell_type":"code","source":"fig = plt.figure(figsize=(25, 16))\nfor i,im_path in enumerate(train_jpeg[:16]):\n    ax = fig.add_subplot(4, 4, i+1, xticks=[], yticks=[])\n    im = Image.open(im_path)\n    im = im.resize((480,270))\n    plt.imshow(im)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:05:11.304948Z","iopub.execute_input":"2022-07-17T12:05:11.306506Z","iopub.status.idle":"2022-07-17T12:05:13.872435Z","shell.execute_reply.started":"2022-07-17T12:05:11.306465Z","shell.execute_reply":"2022-07-17T12:05:13.871461Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### données de test :","metadata":{}},{"cell_type":"code","source":"fig = plt.figure(figsize=(25, 16))\nfor i,im_path in enumerate(test_jpeg[:16]):\n    ax = fig.add_subplot(4, 4, i+1, xticks=[], yticks=[])\n    im = Image.open(im_path)\n    im = im.resize((480,270))\n    plt.imshow(im)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:05:13.874485Z","iopub.execute_input":"2022-07-17T12:05:13.875034Z","iopub.status.idle":"2022-07-17T12:05:16.181121Z","shell.execute_reply.started":"2022-07-17T12:05:13.874999Z","shell.execute_reply":"2022-07-17T12:05:16.180149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Dans les pièges à caméra, les images sont prises en continu car elles sont capturées en rafales déclenchées par le mouvement. Par conséquent, le jeu de données contient également des séries d'images, et en plus des ID de l'image, les ID de la séquence sont attribués.nous utiliserons les ID de l'image pour charger l'image.\nDe plus, nous remarquerons que certaines des images sont en couleur et d'autres en noir et blanc. Cela est dû au fait que les images ont été prises de jour ou de nuit.","metadata":{}},{"cell_type":"markdown","source":"### Explication pour le fichier de métadonnées","metadata":{}},{"cell_type":"markdown","source":"Vérification de iwildcam2021_train_annotations.json\nLes données d'annotation pour les données de formation nous sont fournies sous le nom de \"iwildcam2021_train_annotations.json\". Ce json suit le format COCO-CameraTraps avec des champs supplémentaires.\n\nSi nous chargeons le json, nous pouvons constater qu'il contient trois valeurs clés.","metadata":{}},{"cell_type":"code","source":"with open('../input/iwildcam-2020-fgvc7/iwildcam2020_train_annotations.json', encoding='utf-8') as json_file:\n    train_annotations =json.load(json_file)\n    \ntrain_annotations.keys()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:05:16.182594Z","iopub.execute_input":"2022-07-17T12:05:16.183273Z","iopub.status.idle":"2022-07-17T12:05:17.944143Z","shell.execute_reply.started":"2022-07-17T12:05:16.183225Z","shell.execute_reply":"2022-07-17T12:05:17.943070Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Dans la valeur des images, nous pouvons obtenir des données pour chaque image du wildcan. Wildcam prendra plusieurs images à la suite. La valeur de la clé 'seq_num_frames' est le nombre d'images, 'id' est l'identifiant de l'image, et 'seq_id' est l'identifiant associé à l'image prise séquentiellement. Ce 'seq_id' est le même que le 'Id' dans le fichier de soumission.\n\nExtrayons les données correspondant au cliché de seq_id:302ad820-7d42-11eb-8fb5-0242ac1c0002.","metadata":{}},{"cell_type":"code","source":"train_annotations_seq = train_annotations[\"images\"][94:104]\ntrain_annotations_seq","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:05:17.946431Z","iopub.execute_input":"2022-07-17T12:05:17.946875Z","iopub.status.idle":"2022-07-17T12:05:17.957682Z","shell.execute_reply.started":"2022-07-17T12:05:17.946840Z","shell.execute_reply":"2022-07-17T12:05:17.956766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Si nous voyons les images, nous pouvons constater qu'il s'agit d'une série d'images.","metadata":{}},{"cell_type":"code","source":"train_images_seq = [(TRAIN_DATA_PATH+item[\"id\"]+'.jpg') for item in train_annotations_seq]\nimg_array = []\nsize = (480,270)\n\nfig = plt.figure(figsize=(25, 16))\nfor i,im_path in enumerate(train_images_seq):\n    ax = fig.add_subplot(4, 3, i+1, xticks=[], yticks=[])\n    im = Image.open(im_path)\n    im = im.resize(size)\n    plt.imshow(im)\n    \n    img_array.append(im)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:05:17.958860Z","iopub.execute_input":"2022-07-17T12:05:17.959467Z","iopub.status.idle":"2022-07-17T12:05:21.096257Z","shell.execute_reply.started":"2022-07-17T12:05:17.959432Z","shell.execute_reply":"2022-07-17T12:05:21.095149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"La valeur de la clé categories contient une liste d'espèces animales annotées. id 0 est vide. L'id va jusqu'à 571. ","metadata":{}},{"cell_type":"code","source":"df_categories = pd.DataFrame.from_records(train_annotations[\"categories\"])\ndf_categories","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:05:35.128822Z","iopub.execute_input":"2022-07-17T12:05:35.129200Z","iopub.status.idle":"2022-07-17T12:05:35.152508Z","shell.execute_reply.started":"2022-07-17T12:05:35.129168Z","shell.execute_reply":"2022-07-17T12:05:35.151538Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Chaque image d'entrainement a au moins une annotation associée. Les annotated category_ids sont dans la valeur de la clé \"annotations\".","metadata":{}},{"cell_type":"code","source":"train_annotations[\"annotations\"][:10]","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:05:53.798331Z","iopub.execute_input":"2022-07-17T12:05:53.798718Z","iopub.status.idle":"2022-07-17T12:05:53.807555Z","shell.execute_reply.started":"2022-07-17T12:05:53.798670Z","shell.execute_reply":"2022-07-17T12:05:53.806401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_annotated_category = set([ annotation[\"category_id\"] for annotation in train_annotations[\"annotations\"]])\nlen(train_annotated_category)","metadata":{"execution":{"iopub.status.busy":"2022-07-16T16:16:22.961006Z","iopub.execute_input":"2022-07-16T16:16:22.961605Z","iopub.status.idle":"2022-07-16T16:16:22.998122Z","shell.execute_reply.started":"2022-07-16T16:16:22.961570Z","shell.execute_reply":"2022-07-16T16:16:22.997131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Vérification de iwildcam2021_test_information.json¶\nInformations pour le jeu de données de test. Le format est similaire à iwildcam2021_train_annotations.json avec seulement la clé des images.","metadata":{}},{"cell_type":"code","source":"with open('../input/iwildcam-2020-fgvc7/iwildcam2020_test_information.json', encoding='utf-8') as json_file:\n    test_information =json.load(json_file)\n    \ntest_information.keys()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:05:56.866017Z","iopub.execute_input":"2022-07-17T12:05:56.866393Z","iopub.status.idle":"2022-07-17T12:05:57.215055Z","shell.execute_reply.started":"2022-07-17T12:05:56.866364Z","shell.execute_reply":"2022-07-17T12:05:57.214157Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_information['images'][:2]","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:05:58.845131Z","iopub.execute_input":"2022-07-17T12:05:58.845695Z","iopub.status.idle":"2022-07-17T12:05:58.852825Z","shell.execute_reply.started":"2022-07-17T12:05:58.845658Z","shell.execute_reply":"2022-07-17T12:05:58.851827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Vérification de iwildcam2021_megadetector_results.json","metadata":{}},{"cell_type":"markdown","source":"Nous pouvons également utiliser le modèle MegaDetector de Microsoft AI for Earth. Ce modèle est entraîné à détecter les animaux, les personnes et les véhicules dans les images de caméras-pièges à l'aide de centaines de milliers de boîtes englobantes provenant de divers écosystèmes. Le modèle n'identifie pas les animaux, il ne fait que les trouver.\n\nDes exemples de résultats de détection nous sont fournis dans \"iwildcam2021_megadetector_results.json\".","metadata":{}},{"cell_type":"code","source":"with open('../input/iwildcam-2020-fgvc7/iwildcam2020_megadetector_results.json', encoding='utf-8') as json_file:\n    megadetector_results =json.load(json_file)\n    \nmegadetector_results.keys()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:06:01.885073Z","iopub.execute_input":"2022-07-17T12:06:01.885742Z","iopub.status.idle":"2022-07-17T12:06:05.164745Z","shell.execute_reply.started":"2022-07-17T12:06:01.885706Z","shell.execute_reply":"2022-07-17T12:06:05.163783Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Il y a trois données clé-valeur dans json.\n\nLe résultat détecté est dans la valeur des images.","metadata":{}},{"cell_type":"code","source":"megadetector_results_df = pd.DataFrame(megadetector_results[\"images\"])\nmegadetector_results_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:06:05.166529Z","iopub.execute_input":"2022-07-17T12:06:05.167133Z","iopub.status.idle":"2022-07-17T12:06:05.457053Z","shell.execute_reply.started":"2022-07-17T12:06:05.167077Z","shell.execute_reply":"2022-07-17T12:06:05.456025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_data(x):\n    if x == []:\n        return 0\n    return len(x)\n\nmegadetector_results_df[\"detected_num\"] = megadetector_results_df.loc[:, \"detections\"].map(get_data)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:27:00.904668Z","iopub.execute_input":"2022-07-17T12:27:00.905043Z","iopub.status.idle":"2022-07-17T12:27:01.160901Z","shell.execute_reply.started":"2022-07-17T12:27:00.905014Z","shell.execute_reply":"2022-07-17T12:27:01.159912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f\"There are {len(megadetector_results_df)} detection data.\")","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:06:07.873830Z","iopub.execute_input":"2022-07-17T12:06:07.874210Z","iopub.status.idle":"2022-07-17T12:06:07.882503Z","shell.execute_reply.started":"2022-07-17T12:06:07.874178Z","shell.execute_reply":"2022-07-17T12:06:07.878494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"megadetector_results_df.iloc[100][\"detections\"]","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:06:10.423728Z","iopub.execute_input":"2022-07-17T12:06:10.424261Z","iopub.status.idle":"2022-07-17T12:06:10.436198Z","shell.execute_reply.started":"2022-07-17T12:06:10.424227Z","shell.execute_reply":"2022-07-17T12:06:10.435060Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Nous pouvons voir le résultat.","metadata":{}},{"cell_type":"code","source":"def draw_bboxs(detections_list, im):\n    \"\"\"\n    detections_list: list of set includes bbox.\n    im: image read by Pillow.\n    \"\"\"\n    \n    for detection in detections_list:\n        x1, y1,w_box, h_box = detection[\"bbox\"]\n        ymin,xmin,ymax, xmax=y1, x1, y1 + h_box, x1 + w_box\n        draw = ImageDraw.Draw(im)\n        \n        imageWidth=im.size[0]\n        imageHeight= im.size[1]\n        (left, right, top, bottom) = (xmin * imageWidth, xmax * imageWidth,\n                                      ymin * imageHeight, ymax * imageHeight)\n        \n        draw.line([(left, top), (left, bottom), (right, bottom),\n               (right, top), (left, top)], width=4, fill='Red')","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:06:13.608032Z","iopub.execute_input":"2022-07-17T12:06:13.608724Z","iopub.status.idle":"2022-07-17T12:06:13.616781Z","shell.execute_reply.started":"2022-07-17T12:06:13.608686Z","shell.execute_reply":"2022-07-17T12:06:13.615523Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Voyons la 80ème donnée de l'ensemble de données de formation.\ndata_index = 80\n\n# chargement de la centième image\nim = Image.open(\"../input/iwildcam-2020-fgvc7/train/\" + megadetector_results_df.loc[data_index]['id'] + \".jpg\")\nim = im.resize((480,270))\n\n# Écraser bbox\ndraw_bboxs(megadetector_results_df.loc[data_index]['detections'], im)\n\n# affichage\nplt.imshow(im)\nplt.title(f\"image {data_index} with bbox\")","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:06:26.351641Z","iopub.execute_input":"2022-07-17T12:06:26.351978Z","iopub.status.idle":"2022-07-17T12:06:26.660525Z","shell.execute_reply.started":"2022-07-17T12:06:26.351949Z","shell.execute_reply":"2022-07-17T12:06:26.659451Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"megadetector_results_df.loc[data_index]['detections'][0][\"bbox\"]","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:06:29.350471Z","iopub.execute_input":"2022-07-17T12:06:29.351794Z","iopub.status.idle":"2022-07-17T12:06:29.362270Z","shell.execute_reply.started":"2022-07-17T12:06:29.351731Z","shell.execute_reply":"2022-07-17T12:06:29.359158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Il est également possible de recadrer la zone détectée comme ceci. Nous allons dans la suite enregistrer les images recadrées pour créer un jeu de données.","metadata":{}},{"cell_type":"code","source":"def get_crop_area(bbox, image_size):\n    x1, y1,w_box, h_box = bbox\n    ymin,xmin,ymax, xmax = y1, x1, y1 + h_box, x1 + w_box\n    area = (xmin * image_size[0], ymin * image_size[1], \n            xmax * image_size[0], ymax * image_size[1])\n    return area\n\ncrop_area = get_crop_area(megadetector_results_df.loc[data_index]['detections'][0][\"bbox\"], im.size)\nim_croped = im.crop(crop_area)\nplt.imshow(im_croped)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:06:31.960503Z","iopub.execute_input":"2022-07-17T12:06:31.960941Z","iopub.status.idle":"2022-07-17T12:06:32.123189Z","shell.execute_reply.started":"2022-07-17T12:06:31.960903Z","shell.execute_reply":"2022-07-17T12:06:32.122050Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"megadetector_results[\"info\"]","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:06:38.532071Z","iopub.execute_input":"2022-07-17T12:06:38.532446Z","iopub.status.idle":"2022-07-17T12:06:38.539465Z","shell.execute_reply.started":"2022-07-17T12:06:38.532416Z","shell.execute_reply":"2022-07-17T12:06:38.538407Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"megadetector_results[\"detection_categories\"]","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:06:40.572154Z","iopub.execute_input":"2022-07-17T12:06:40.573347Z","iopub.status.idle":"2022-07-17T12:06:40.580555Z","shell.execute_reply.started":"2022-07-17T12:06:40.573299Z","shell.execute_reply":"2022-07-17T12:06:40.579599Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_data(x):\n    if x == []:\n        return 0\n    return len(x)\n\nmegadetector_results_df[\"detected_num\"] = megadetector_results_df.loc[:, \"detections\"].map(get_data)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:07:54.039397Z","iopub.execute_input":"2022-07-17T12:07:54.039771Z","iopub.status.idle":"2022-07-17T12:07:54.335862Z","shell.execute_reply.started":"2022-07-17T12:07:54.039740Z","shell.execute_reply":"2022-07-17T12:07:54.334758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Nous pouvons sélectionner les données d'entraînement en fonction du nombre d'animaux dans l'image.","metadata":{}},{"cell_type":"code","source":"megadetector_results_df = megadetector_results_df[megadetector_results_df['detected_num'] < 2]\nmegadetector_results_df = megadetector_results_df.rename(columns={'id': 'image_id'})\nmegadetector_results_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:30:41.390007Z","iopub.execute_input":"2022-07-17T12:30:41.390509Z","iopub.status.idle":"2022-07-17T12:30:41.478878Z","shell.execute_reply.started":"2022-07-17T12:30:41.390462Z","shell.execute_reply":"2022-07-17T12:30:41.477189Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open('../input/iwildcam-2020-fgvc7/iwildcam2020_train_annotations.json') as json_file:\n    train_annotations_json = json.load(json_file)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:30:45.820172Z","iopub.execute_input":"2022-07-17T12:30:45.820560Z","iopub.status.idle":"2022-07-17T12:30:47.009047Z","shell.execute_reply.started":"2022-07-17T12:30:45.820529Z","shell.execute_reply":"2022-07-17T12:30:47.007937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_annotations_json.keys()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:30:50.580756Z","iopub.execute_input":"2022-07-17T12:30:50.581462Z","iopub.status.idle":"2022-07-17T12:30:50.588587Z","shell.execute_reply.started":"2022-07-17T12:30:50.581419Z","shell.execute_reply":"2022-07-17T12:30:50.587619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_annotations = pd.DataFrame(train_annotations_json[\"annotations\"])\ndf_annotations.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:30:52.195849Z","iopub.execute_input":"2022-07-17T12:30:52.196242Z","iopub.status.idle":"2022-07-17T12:30:52.660831Z","shell.execute_reply.started":"2022-07-17T12:30:52.196203Z","shell.execute_reply":"2022-07-17T12:30:52.659555Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_images = pd.DataFrame(train_annotations_json[\"images\"])\ndf_images.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:30:57.626452Z","iopub.execute_input":"2022-07-17T12:30:57.626795Z","iopub.status.idle":"2022-07-17T12:30:58.256228Z","shell.execute_reply.started":"2022-07-17T12:30:57.626768Z","shell.execute_reply":"2022-07-17T12:30:58.255323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_categories = pd.DataFrame(train_annotations_json[\"categories\"])\ndf_categories.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:01.290911Z","iopub.execute_input":"2022-07-17T12:31:01.291277Z","iopub.status.idle":"2022-07-17T12:31:01.304235Z","shell.execute_reply.started":"2022-07-17T12:31:01.291246Z","shell.execute_reply":"2022-07-17T12:31:01.301383Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open('../input/iwildcam-2020-fgvc7//iwildcam2020_test_information.json') as json_file:\n    test_information_json = json.load(json_file)\ntest_information_json.keys()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:03.629710Z","iopub.execute_input":"2022-07-17T12:31:03.630286Z","iopub.status.idle":"2022-07-17T12:31:03.886942Z","shell.execute_reply.started":"2022-07-17T12:31:03.630243Z","shell.execute_reply":"2022-07-17T12:31:03.885986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_images_test = pd.DataFrame(test_information_json[\"images\"])\ndf_images_test.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:06.262642Z","iopub.execute_input":"2022-07-17T12:31:06.263042Z","iopub.status.idle":"2022-07-17T12:31:06.449015Z","shell.execute_reply.started":"2022-07-17T12:31:06.263009Z","shell.execute_reply":"2022-07-17T12:31:06.448066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_categories_test = pd.DataFrame(test_information_json[\"categories\"])\ndf_categories_test.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:09.754167Z","iopub.execute_input":"2022-07-17T12:31:09.754985Z","iopub.status.idle":"2022-07-17T12:31:09.765581Z","shell.execute_reply.started":"2022-07-17T12:31:09.754948Z","shell.execute_reply":"2022-07-17T12:31:09.764380Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### DATA ANALYSIS","metadata":{}},{"cell_type":"markdown","source":"#### Distribution des données","metadata":{}},{"cell_type":"markdown","source":"On trace les données d'entrainement et de test dans la perspective suivante :\n\n- Moment\n\n- ID de la catégorie\n\n- Emplacement","metadata":{}},{"cell_type":"markdown","source":"Quand les données ont-elles été prises ?\n\nComme les animaux peuvent modifier leur activité de temps en temps, nous voulons comprendre comment les données sont réparties dans le temps.","metadata":{}},{"cell_type":"markdown","source":"#### Aperçu mensuel","metadata":{}},{"cell_type":"code","source":"month_year = df_images['datetime'].map(lambda str: str[2:7])\nlabels_month_year = sorted(list(set(month_year)))\n\nmonth_year_test = df_images_test['datetime'].map(lambda str: str[2:7])","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:11.906598Z","iopub.execute_input":"2022-07-17T12:31:11.907205Z","iopub.status.idle":"2022-07-17T12:31:12.039702Z","shell.execute_reply.started":"2022-07-17T12:31:11.907169Z","shell.execute_reply":"2022-07-17T12:31:12.038727Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(1,2, figsize=(30,7))\nax = plt.subplot(1,2,1)\nax = plt.title('Count of train data per month & year')\nax = sns.countplot(x=month_year, order=labels_month_year)\nax.set(xlabel='YY-mm', ylabel='count')\nax.set(ylim=(0,50000))\n\nax = plt.subplot(1,2,2)\nax = plt.title('Count of test data per month & year')\n\nax = sns.countplot(x=month_year_test, order=labels_month_year)\nax.set(xlabel='YY-mm', ylabel='count')\nax.set(ylim=(0,50000))","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:14.495752Z","iopub.execute_input":"2022-07-17T12:31:14.496962Z","iopub.status.idle":"2022-07-17T12:31:15.244969Z","shell.execute_reply.started":"2022-07-17T12:31:14.496916Z","shell.execute_reply":"2022-07-17T12:31:15.244043Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Les données commencent en 2013-01 mais il semble y avoir quelques manques. Par exemple, les données d'entrainement entre 2013-11 et 2014-02 sont manquantes.\n\nNous pouvons également constater que les données d'entrainement entre 2013-01 et 2013-07 sont plus riches que les autres points de temps.\n\nLes données d'entrainement couvrent les données de test dans la perspective du point de temps.","metadata":{}},{"cell_type":"code","source":"labels_month = sorted(list(set(df_images['datetime'].map(lambda str: str[5:7]))))","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:17.169692Z","iopub.execute_input":"2022-07-17T12:31:17.170040Z","iopub.status.idle":"2022-07-17T12:31:17.278418Z","shell.execute_reply.started":"2022-07-17T12:31:17.170012Z","shell.execute_reply":"2022-07-17T12:31:17.277472Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(1,2, figsize=(20,7))\nax = plt.subplot(1,2,1)\nplt.title('Count of train data per month')\nax = sns.countplot(x=df_images['datetime'].map(lambda str: str[5:7] ), order=labels_month)\nax.set(xlabel='mm', ylabel='count')\nax.set(ylim=(0,55000))\n\nax = plt.subplot(1,2,2)\nplt.title('Count of test data per month')\nax = sns.countplot(x=df_images_test['datetime'].map(lambda str: str[5:7] ), order=labels_month)\nax.set(xlabel='mm', ylabel='count')\nax.set(ylim=(0,55000))","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:19.270137Z","iopub.execute_input":"2022-07-17T12:31:19.270498Z","iopub.status.idle":"2022-07-17T12:31:19.884255Z","shell.execute_reply.started":"2022-07-17T12:31:19.270467Z","shell.execute_reply":"2022-07-17T12:31:19.883292Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Les données du train sont biaisées. En février, mars, juin et juillet, les données sont plus riches que les autres mois.\n\nLes données d'entrainement couvrent les données de test dans la perspective du mois.\n\nLes données pour novembre et décembre sont manquantes. L'hibernation des animaux pourrait en être la raison.","metadata":{}},{"cell_type":"markdown","source":"#### Aperçu par heure","metadata":{}},{"cell_type":"code","source":"train_taken_hour = df_images['datetime'].map(lambda x: dt.strptime(x, '%Y-%m-%d %H:%M:%S.%f').hour)\ntest_taken_hour = df_images_test['datetime'].map(lambda x: dt.strptime(x, '%Y-%m-%d %H:%M:%S.%f').hour)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:23.196038Z","iopub.execute_input":"2022-07-17T12:31:23.196711Z","iopub.status.idle":"2022-07-17T12:31:27.512323Z","shell.execute_reply.started":"2022-07-17T12:31:23.196675Z","shell.execute_reply":"2022-07-17T12:31:27.511154Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(1,2, figsize=(20,7))\nax = plt.subplot(1,2,1)\nplt.title('Count of train data per hour')\nax = sns.countplot(x=train_taken_hour)\nax.set(xlabel='hour', ylabel='count')\nax.set(ylim=(0,20000))\n\nax = plt.subplot(1,2,2)\nplt.title('Count of test data per hour')\nax = sns.countplot(x=test_taken_hour)\nax.set(xlabel='hour', ylabel='count')\nax.set(ylim=(0,20000))","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:28.004532Z","iopub.execute_input":"2022-07-17T12:31:28.005359Z","iopub.status.idle":"2022-07-17T12:31:28.504240Z","shell.execute_reply.started":"2022-07-17T12:31:28.005318Z","shell.execute_reply":"2022-07-17T12:31:28.503169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Si nous décidons arbitrairement de la période diurne et nocturne, nous pouvons également calculer le nombre de données diurnes et nocturnes.\n\nPar exemple, nous définissons \"le jour\" comme étant 6-17 heures et \"la nuit\" comme étant 18-5 heures.","metadata":{}},{"cell_type":"code","source":"train_taken_phase = train_taken_hour.map(lambda x: \"daytime\" if x >= 6 and x < 18 else \"night\")\ntest_taken_phase = test_taken_hour.map(lambda x: \"daytime\" if x >= 6 and x < 18 else \"night\")","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:31.418991Z","iopub.execute_input":"2022-07-17T12:31:31.419688Z","iopub.status.idle":"2022-07-17T12:31:31.498310Z","shell.execute_reply.started":"2022-07-17T12:31:31.419650Z","shell.execute_reply":"2022-07-17T12:31:31.497419Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(1,2, figsize=(20,7))\nax = plt.subplot(1,2,1)\nplt.title('Count of train data per phase')\nax = sns.countplot(x=train_taken_phase, order=[\"daytime\", \"night\"])\nax.set(xlabel='phase', ylabel='count')\nax.set(ylim=(0,200000))\n\nax = plt.subplot(1,2,2)\nplt.title('Count of test data per phase')\nax = sns.countplot(x=test_taken_phase, order=[\"daytime\", \"night\"])\nax.set(xlabel='phase', ylabel='count')\nax.set(ylim=(0,200000))","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:33.703755Z","iopub.execute_input":"2022-07-17T12:31:33.704132Z","iopub.status.idle":"2022-07-17T12:31:34.149997Z","shell.execute_reply.started":"2022-07-17T12:31:33.704081Z","shell.execute_reply":"2022-07-17T12:31:34.149011Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Memory savings\ndel train_taken_phase\ndel test_taken_phase\ndel train_taken_hour\ndel test_taken_hour\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:37.230872Z","iopub.execute_input":"2022-07-17T12:31:37.231250Z","iopub.status.idle":"2022-07-17T12:31:37.946228Z","shell.execute_reply.started":"2022-07-17T12:31:37.231215Z","shell.execute_reply":"2022-07-17T12:31:37.944933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Combien de données y a-t-il par catégorie d'animal Id ?","metadata":{}},{"cell_type":"code","source":"fig = plt.figure(figsize=(30, 4))\nlabels_id = sorted(list(set(df_categories[\"id\"])))\nax = sns.barplot(x=\"id\", y=\"count\",data=df_categories, order=labels_id)\nax.set(ylabel='count')\nax.set(ylim=(0,80000))\nplt.title('distribution of count per id in train')","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:39.850299Z","iopub.execute_input":"2022-07-17T12:31:39.850634Z","iopub.status.idle":"2022-07-17T12:31:43.132090Z","shell.execute_reply.started":"2022-07-17T12:31:39.850607Z","shell.execute_reply":"2022-07-17T12:31:43.130673Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = plt.figure(figsize=(30, 4))\nlabels_id = sorted(list(set(df_categories[\"id\"])))\nax = sns.barplot(x=\"id\", y=\"count\",data=df_categories_test, order=labels_id)\nax.set(ylabel='count')\nax.set(ylim=(0,80000))\nplt.title('distribution of count per id in test')","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:43.134307Z","iopub.execute_input":"2022-07-17T12:31:43.135341Z","iopub.status.idle":"2022-07-17T12:31:46.457751Z","shell.execute_reply.started":"2022-07-17T12:31:43.135299Z","shell.execute_reply":"2022-07-17T12:31:46.456592Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"La fréquence des données dans chaque identifiant est similaire pour les données d'entrainement et de test.","metadata":{}},{"cell_type":"code","source":"fig = plt.figure(figsize=(15, 9))\nax = sns.distplot(x=df_categories['count'][1:])\nax.set(ylim=(0,0.00005))\nax.set(xlabel='count')\nplt.title('distribution of number of data per id zoomed')","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:46.459863Z","iopub.execute_input":"2022-07-17T12:31:46.460532Z","iopub.status.idle":"2022-07-17T12:31:46.865038Z","shell.execute_reply.started":"2022-07-17T12:31:46.460495Z","shell.execute_reply":"2022-07-17T12:31:46.864042Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"La plupart des données sont inférieures à 5000 images.\n\nMais nous pouvons constater que le nombre d'identifiants spécifiques est très important et que les données sont biaisées.","metadata":{}},{"cell_type":"markdown","source":"#### Combien de données par emplacement ?","metadata":{}},{"cell_type":"markdown","source":"Nous sommes tenus de détecter les photographies prises à différents endroits, mais comment distribuer les données en fonction de l'endroit ?","metadata":{}},{"cell_type":"code","source":"labels_location_train = sorted(list(set(df_images['location'])))\nlabels_location_test = sorted(list(set(df_images_test['location'])))\nlabels_location = labels_location_train + labels_location_test","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:47.406997Z","iopub.execute_input":"2022-07-17T12:31:47.408056Z","iopub.status.idle":"2022-07-17T12:31:47.473176Z","shell.execute_reply.started":"2022-07-17T12:31:47.408008Z","shell.execute_reply":"2022-07-17T12:31:47.471648Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = plt.figure(figsize=(30, 4))\nax = sns.countplot(x=df_images['location'], order=labels_location)\nax.set(xlabel='location', ylabel='count')\nplt.title('Count of train data per location')","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:50.306522Z","iopub.execute_input":"2022-07-17T12:31:50.306859Z","iopub.status.idle":"2022-07-17T12:31:54.341907Z","shell.execute_reply.started":"2022-07-17T12:31:50.306830Z","shell.execute_reply":"2022-07-17T12:31:54.340678Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = plt.figure(figsize=(30, 4))\nax = sns.countplot(x=df_images_test['location'], order=labels_location)\nax.set(xlabel='location', ylabel='count')\nplt.title('Count of test data per location')","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:54.345666Z","iopub.execute_input":"2022-07-17T12:31:54.348934Z","iopub.status.idle":"2022-07-17T12:31:57.993025Z","shell.execute_reply.started":"2022-07-17T12:31:54.348886Z","shell.execute_reply":"2022-07-17T12:31:57.992029Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Les données d'entrainement et les données de test semblent avoir été prises à des endroits différents.\n\nLe nombre de photos est très différent selon le lieu","metadata":{}},{"cell_type":"markdown","source":"#### Les différents types d'animaux sont-ils photographiés dans des endroits différents ?","metadata":{}},{"cell_type":"markdown","source":"Nous disposons de données relatives aux lieux et aux catégories d'animaux, ce qui nous permet d'étudier si différents types d'animaux sont photographiés à différents endroits.","metadata":{}},{"cell_type":"code","source":"loc_cat_df_test = pd.merge(df_images, df_annotations, left_on='id', right_on='image_id', how = \"inner\").loc[:,[\"location\", \"category_id\", \"image_id\"]]\nloc_cat_df_test.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:57.995219Z","iopub.execute_input":"2022-07-17T12:31:57.995588Z","iopub.status.idle":"2022-07-17T12:31:58.427761Z","shell.execute_reply.started":"2022-07-17T12:31:57.995550Z","shell.execute_reply":"2022-07-17T12:31:58.426770Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"loc_cat_dict = {}\nfor loc in set(loc_cat_df_test[\"location\"]):\n    loc_cat_dict[loc] = list(set(loc_cat_df_test[loc_cat_df_test[\"location\"] == loc][\"category_id\"]))   \nloc_cat_matrix = np.zeros([loc_cat_df_test[\"location\"].max()+1, loc_cat_df_test[\"category_id\"].max()+1])\nloc_cat_matrix.shape","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:58.433220Z","iopub.execute_input":"2022-07-17T12:31:58.433559Z","iopub.status.idle":"2022-07-17T12:31:58.825537Z","shell.execute_reply.started":"2022-07-17T12:31:58.433526Z","shell.execute_reply":"2022-07-17T12:31:58.824608Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for loc in loc_cat_dict.keys():\n    for cat in loc_cat_dict[loc]:\n        loc_cat_matrix[loc, cat] = 1","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:31:58.843178Z","iopub.execute_input":"2022-07-17T12:31:58.843533Z","iopub.status.idle":"2022-07-17T12:31:58.855015Z","shell.execute_reply.started":"2022-07-17T12:31:58.843501Z","shell.execute_reply":"2022-07-17T12:31:58.853943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = plt.figure(figsize=(15, 15))\nax = sns.heatmap(loc_cat_matrix)\nax.set(xlabel='category', ylabel='location')\nplt.title('Relation between animal categories and locations')","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:01.061840Z","iopub.execute_input":"2022-07-17T12:32:01.062211Z","iopub.status.idle":"2022-07-17T12:32:02.947919Z","shell.execute_reply.started":"2022-07-17T12:32:01.062182Z","shell.execute_reply":"2022-07-17T12:32:02.947004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"C'est un peu difficile à voir, mais les colonnes sont les catégories d'animaux et les rangées sont les lieux. Comme des motifs similaires apparaissent dans le sens vertical, il semble que des espèces similaires puissent apparaître même dans des endroits différents.","metadata":{}},{"cell_type":"markdown","source":"#### Combien d'animaux dans chaque séquence de photos ?","metadata":{}},{"cell_type":"markdown","source":"Nous pouvons savoir combien d'animaux chaque séquence photographique par la valeur des annotations de train_annotations_json. La clé Count semble représenter le nombre d'animaux apparaissant dans chaque séquence photographique.","metadata":{}},{"cell_type":"code","source":"df_annotations[2429:2440]","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:04.553950Z","iopub.execute_input":"2022-07-17T12:32:04.554515Z","iopub.status.idle":"2022-07-17T12:32:04.566686Z","shell.execute_reply.started":"2022-07-17T12:32:04.554478Z","shell.execute_reply":"2022-07-17T12:32:04.565758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = plt.figure(figsize=(25, 16))\n#for i,im_path in enumerate(df_annotations[df_annotations.loc[:,\"count\"] == 3].loc[:,\"image_id\"][2429:2440]):\nfor i,im_path in enumerate(df_annotations.loc[:,\"image_id\"][2429:2440]):\n    ax = fig.add_subplot(4, 4, i+1, xticks=[], yticks=[])\n    im = Image.open(\"../input/iwildcam-2020-fgvc7/train/\" + im_path + \".jpg\")\n    im = im.resize((480,270))\n    plt.imshow(im)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:07.328362Z","iopub.execute_input":"2022-07-17T12:32:07.328706Z","iopub.status.idle":"2022-07-17T12:32:09.021712Z","shell.execute_reply.started":"2022-07-17T12:32:07.328675Z","shell.execute_reply":"2022-07-17T12:32:09.020843Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Le nombre d'individus qui apparaissent en même temps varie-t-il selon l'espèce animale ?","metadata":{}},{"cell_type":"code","source":"c = collections.Counter(df_annotations.loc[:,\"count\"])\nanimals_in_pict = list(c.keys())\nfreq = list(c.values())\nk = zip(animals_in_pict,freq)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:10.131737Z","iopub.execute_input":"2022-07-17T12:32:10.132175Z","iopub.status.idle":"2022-07-17T12:32:10.171931Z","shell.execute_reply.started":"2022-07-17T12:32:10.132141Z","shell.execute_reply":"2022-07-17T12:32:10.170856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"animals_in_pict_df = pd.DataFrame(sorted(k),columns=['num_of_animals','freq'])","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:15.955690Z","iopub.execute_input":"2022-07-17T12:32:15.956056Z","iopub.status.idle":"2022-07-17T12:32:15.962394Z","shell.execute_reply.started":"2022-07-17T12:32:15.956026Z","shell.execute_reply":"2022-07-17T12:32:15.961084Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"animals_in_pict_df","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:18.288297Z","iopub.execute_input":"2022-07-17T12:32:18.288646Z","iopub.status.idle":"2022-07-17T12:32:18.299815Z","shell.execute_reply.started":"2022-07-17T12:32:18.288618Z","shell.execute_reply":"2022-07-17T12:32:18.298632Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Seul un nombre limité d'animaux est regroupé. 266 espèces sont prises en compte dans le jeu d'entraînement, mais seules 14 espèces ont été photographiées, avec plus de 10 animaux à la fois. Il s'avère qu'il existe une relation entre l'espèce animale et le nombre d'individus reflétés.","metadata":{}},{"cell_type":"code","source":"species_morethan_10 = list(set(df_annotations[df_annotations.loc[:,\"count\"] >= 10].loc[:,\"category_id\"]))\ndf_categories[df_categories.loc[:,\"id\"].isin(species_morethan_10)].loc[:,[\"id\", \"name\"]]","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:22.472875Z","iopub.execute_input":"2022-07-17T12:32:22.473253Z","iopub.status.idle":"2022-07-17T12:32:22.490696Z","shell.execute_reply.started":"2022-07-17T12:32:22.473215Z","shell.execute_reply":"2022-07-17T12:32:22.489728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Une espèce qui montre plus de 30 individus à la fois sur une photo est seulement une vache et un sanglier.","metadata":{}},{"cell_type":"code","source":"species_morethan_30 = list(set(df_annotations[df_annotations.loc[:,\"count\"] >= 30].loc[:,\"category_id\"]))\ndf_categories[df_categories.loc[:,\"id\"].isin(species_morethan_30)].loc[:,[\"id\", \"name\"]]","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:33.969863Z","iopub.execute_input":"2022-07-17T12:32:33.970245Z","iopub.status.idle":"2022-07-17T12:32:33.984462Z","shell.execute_reply.started":"2022-07-17T12:32:33.970207Z","shell.execute_reply":"2022-07-17T12:32:33.983417Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_annotations[(df_annotations.loc[:,\"category_id\"] == 2) & (df_annotations.loc[:,\"count\"] >= 30)].head()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:36.264540Z","iopub.execute_input":"2022-07-17T12:32:36.264891Z","iopub.status.idle":"2022-07-17T12:32:36.280947Z","shell.execute_reply.started":"2022-07-17T12:32:36.264863Z","shell.execute_reply":"2022-07-17T12:32:36.279930Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = plt.figure(figsize=(25, 16))\n#for i,im_path in enumerate(df_annotations[df_annotations.loc[:,\"count\"] == 3].loc[:,\"image_id\"][2429:2440]):\nfor i,im_path in enumerate(df_annotations.loc[:,\"image_id\"][149674:149678]):\n    ax = fig.add_subplot(4, 4, i+1, xticks=[], yticks=[])\n    im = Image.open(\"../input/iwildcam-2020-fgvc7/train/\" + im_path + \".jpg\")\n    im = im.resize((480,270))\n    plt.imshow(im)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:39.126396Z","iopub.execute_input":"2022-07-17T12:32:39.126742Z","iopub.status.idle":"2022-07-17T12:32:39.710805Z","shell.execute_reply.started":"2022-07-17T12:32:39.126713Z","shell.execute_reply":"2022-07-17T12:32:39.709845Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_annotations[(df_annotations.loc[:,\"category_id\"] == 71) & (df_annotations.loc[:,\"count\"] >= 30)].head()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:41.815640Z","iopub.execute_input":"2022-07-17T12:32:41.815984Z","iopub.status.idle":"2022-07-17T12:32:41.831980Z","shell.execute_reply.started":"2022-07-17T12:32:41.815956Z","shell.execute_reply":"2022-07-17T12:32:41.830971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"jpeg ='../input/iwildcam-2020-fgvc7/train/8897a9f8-21bc-11ea-a13a-137349068a90.jpg'\nim = Image.open(jpeg)\nim = im.resize((480,270))\nplt.imshow(im)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:45.189866Z","iopub.execute_input":"2022-07-17T12:32:45.190238Z","iopub.status.idle":"2022-07-17T12:32:45.452464Z","shell.execute_reply.started":"2022-07-17T12:32:45.190203Z","shell.execute_reply":"2022-07-17T12:32:45.451601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Préparation des données et du modèle :","metadata":{}},{"cell_type":"code","source":"fig = plt.figure(figsize=(15, 4))\nax = sns.countplot(x=\"detected_num\", data=megadetector_results_df)\nax.set(ylabel='count')\n#ax.set(ylim=(0,80000))\nplt.title('distribution of count per animals each data of train')","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:48.406070Z","iopub.execute_input":"2022-07-17T12:32:48.406753Z","iopub.status.idle":"2022-07-17T12:32:48.580746Z","shell.execute_reply.started":"2022-07-17T12:32:48.406716Z","shell.execute_reply":"2022-07-17T12:32:48.579630Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f\"On a {len(df_categories) - 1} spèces\")","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:32:53.516539Z","iopub.execute_input":"2022-07-17T12:32:53.516966Z","iopub.status.idle":"2022-07-17T12:32:53.526683Z","shell.execute_reply.started":"2022-07-17T12:32:53.516928Z","shell.execute_reply":"2022-07-17T12:32:53.525651Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_annotations.to_csv(\"train_annotations.csv\", index=False)\ndf_images.to_csv(\"train_annotations_images.csv\", index=False)\ndf_categories.to_csv(\"train_annotations_categories.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:33:01.134259Z","iopub.execute_input":"2022-07-17T12:33:01.134600Z","iopub.status.idle":"2022-07-17T12:33:03.930983Z","shell.execute_reply.started":"2022-07-17T12:33:01.134573Z","shell.execute_reply":"2022-07-17T12:33:03.929902Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_images_test.to_csv(\"annotations_images_test.csv\", index=False)\ndf_categories_test.to_csv(\"annotations_categories_test.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:33:03.933217Z","iopub.execute_input":"2022-07-17T12:33:03.933587Z","iopub.status.idle":"2022-07-17T12:33:04.483517Z","shell.execute_reply.started":"2022-07-17T12:33:03.933548Z","shell.execute_reply":"2022-07-17T12:33:04.481321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### on utilise comme modèle source efficientnet","metadata":{}},{"cell_type":"code","source":"train_anns_df = df_annotations[['image_id','category_id']]\ntrain_img_df = df_images[['id', 'file_name']].rename(columns={'id':'image_id'})\ndf_train_file_cat = pd.merge(train_img_df, train_anns_df, on='image_id')\ndf_train_file_cat['category_id']=df_train_file_cat['category_id'].astype(str)\ndf_train_file_cat.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:33:04.488688Z","iopub.execute_input":"2022-07-17T12:33:04.491903Z","iopub.status.idle":"2022-07-17T12:33:05.131980Z","shell.execute_reply.started":"2022-07-17T12:33:04.491859Z","shell.execute_reply":"2022-07-17T12:33:05.130917Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_file_cat = pd.merge(megadetector_results_df, df_train_file_cat, on='image_id', how='inner')\n\nfig = plt.figure(figsize=(15, 4))\nax = sns.countplot(x=\"detected_num\", data=megadetector_results_df)\nax.set(ylabel='count')\n#ax.set(ylim=(0,80000))\nplt.title('distribution of count per animals each data of train')","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:33:08.493765Z","iopub.execute_input":"2022-07-17T12:33:08.494129Z","iopub.status.idle":"2022-07-17T12:33:08.898703Z","shell.execute_reply.started":"2022-07-17T12:33:08.494079Z","shell.execute_reply":"2022-07-17T12:33:08.897607Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#on se concentre que sur les espèces suivantes\nespecies_of_interest=[\"\",\"\",\"\"]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"a=df_categories[df_categories[\"name\"]==\"tayassu pecari\"]\na","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_annotations[df_annotations[\"category_id\"]==a.id[1]]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Parameters\n\nbatch_size = 256\nimg_size = 96\nlr = 0.001 \nnb_classes = 267\nnb_epochs = 6","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:35:32.151521Z","iopub.execute_input":"2022-07-17T12:35:32.151867Z","iopub.status.idle":"2022-07-17T12:35:32.156549Z","shell.execute_reply.started":"2022-07-17T12:35:32.151839Z","shell.execute_reply":"2022-07-17T12:35:32.155554Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n\ntrain_datagen=ImageDataGenerator(rescale=1./255, \n    validation_split=0.25,\n    horizontal_flip = True,    \n    zoom_range = 0.3,\n    width_shift_range = 0.3,\n    height_shift_range=0.3\n    )\n\ntrain_generator=train_datagen.flow_from_dataframe(    \n    validate_filenames=False,\n    dataframe=df_train_file_cat[:50000],    \n    directory=\"./data/cropped-images/croped_images_train\",\n    x_col=\"file_name\",\n    y_col=\"category_id\",\n    batch_size=batch_size,\n    shuffle=True,\n    classes = [ str(i) for i in range(nb_classes)],\n    class_mode=\"categorical\",    \n    target_size=(img_size,img_size))\n\ntest_datagen = ImageDataGenerator(rescale=1./255)\n\nvalid_generator=test_datagen.flow_from_dataframe(  \n    validate_filenames=False,\n    dataframe=df_train_file_cat[50000:],    \n    directory=\"./data/cropped-images/croped_images_train\",\n    x_col=\"file_name\",\n    y_col=\"category_id\",\n    batch_size=batch_size,\n    shuffle=True,\n    classes = [ str(i) for i in range(nb_classes)],\n    class_mode=\"categorical\",  \n    target_size=(img_size,img_size))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model():\n    K.clear_session()\n    tf.random.set_seed(2022)\n    base_model =  efn.EfficientNetB3(weights='imagenet', include_top=False, pooling='avg', input_shape=(img_size, img_size, 3))\n    x = base_model.output\n    predictions = Dense(nb_classes, activation=\"softmax\")(x)\n    return Model(inputs=base_model.input, outputs=predictions)\n\nmodel = get_model()\nmodel.compile(optimizers.Adam(learning_rate=lr, decay=1e-6),loss='categorical_crossentropy',metrics=['accuracy'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"early = EarlyStopping(monitor='val_loss', min_delta=0, patience=3, verbose=1, mode='auto')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nhistory = model.fit_generator(generator=train_generator,  \n                                    steps_per_epoch=5,\n                                    validation_data=valid_generator, \n                                    validation_steps=2,\n                                    epochs=nb_epochs,\n                                    callbacks = [early],\n                                    verbose=2)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Téléchargement des données :","metadata":{}},{"cell_type":"code","source":"!ls","metadata":{"execution":{"iopub.status.busy":"2022-07-17T12:04:45.633900Z","iopub.execute_input":"2022-07-17T12:04:45.634507Z","iopub.status.idle":"2022-07-17T12:04:46.315636Z","shell.execute_reply.started":"2022-07-17T12:04:45.634468Z","shell.execute_reply":"2022-07-17T12:04:46.314519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from IPython.display import FileLink\nFileLink(r'__notebook_source__.ipynb')","metadata":{"execution":{"iopub.status.busy":"2022-07-16T19:04:57.312457Z","iopub.execute_input":"2022-07-16T19:04:57.312775Z","iopub.status.idle":"2022-07-16T19:04:57.320001Z","shell.execute_reply.started":"2022-07-16T19:04:57.312748Z","shell.execute_reply":"2022-07-16T19:04:57.318513Z"},"trusted":true},"execution_count":null,"outputs":[]}]}