{"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":"import os\nimport json\nimport numpy as np\nimport pandas as pd\nfrom PIL import Image\nfrom tensorflow.keras.models import load_model\nfrom tensorflow.keras.preprocessing.sequence import pad_sequences\nimport gc\n\ndef preprocess_new_sequences(json_path, start, end):\n    with open(json_path, 'r') as f:\n        data = json.load(f)\n\n    base_folder = '/kaggle/input/iwildcam2022-fgvc9/test/test'\n    sequences = {}\n\n    for image_info in data['images'][start:end]:\n        seq_id = image_info['seq_id']\n        file_name = image_info['file_name']\n        seq_frame_num = image_info['seq_frame_num']\n\n        img_path = os.path.join(base_folder, file_name)\n        try:\n            img = Image.open(img_path).resize((224, 224))\n            img_arr = np.array(img) / 255.0\n        except OSError as e:\n            print(f\"Error processing image {img_path}: {e}\")\n            continue\n\n        if seq_id not in sequences:\n            sequences[seq_id] = {}\n\n        sequences[seq_id][seq_frame_num] = img_arr\n\n    sequence_ids = sorted(list(sequences.keys()))\n    sorted_sequences = [list(sequences[seq_id].values()) for seq_id in sequence_ids]\n\n    return sequence_ids, sorted_sequences\n\nmodel = load_model('/kaggle/input/modelv2-alpha/trained_modelV2.h5')\n\njson_path = '/kaggle/input/iwildcam2022-fgvc9/metadata/metadata/iwildcam2022_test_information.json'\n\n# Process sequences in smaller batches to manage memory usage\nbatch_size = 100\nwith open(json_path, 'r') as f:\n    data = json.load(f)\ntotal_images = len(data['images'])\n\nfor start in range(0, total_images, batch_size):\n    end = min(start + batch_size, total_images)\n    print(f\"Processing sequences {start+1}-{end} of {total_images}\")\n    sequence_ids, new_sequences = preprocess_new_sequences(json_path, start, end)\n    print(f\"Preprocessing completed for sequences {start+1}-{end}\")\n    \n    new_sequences_padded = pad_sequences(new_sequences, dtype='float32', padding='post')\n    print(f\"Padding completed for sequences {start+1}-{end}\")\n    \n    partial_predictions = model.predict(new_sequences_padded)\n    #partial_predicted_counts = np.round(partial_predictions).astype(int)\n    print(f\"Prediction completed for sequences {start+1}-{end}\")\n\n    partial_output_df = pd.DataFrame({'Id': sequence_ids, 'Predicted': partial_predictions.flatten()})\n    \n    if start == 0:\n        output_df = partial_output_df\n    else:\n        output_df = output_df.append(partial_output_df, ignore_index=True)\n    \n    # Clear memory\n    del sequence_ids\n    del new_sequences\n    del new_sequences_padded\n    del partial_predictions\n    #del partial_predicted_counts\n    del partial_output_df\n    gc.collect()\n\n# Save the predictions to a CSV file\noutput_df = output_df.drop_duplicates(subset='Id', keep='first')\noutput_df.to_csv('predictions.csv', index=False)\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-04-21T08:33:01.694293Z","iopub.execute_input":"2023-04-21T08:33:01.694761Z","iopub.status.idle":"2023-04-21T09:45:35.185829Z","shell.execute_reply.started":"2023-04-21T08:33:01.694726Z","shell.execute_reply":"2023-04-21T09:45:35.184734Z"},"trusted":true},"execution_count":null,"outputs":[]}]}