{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":25563,"databundleVersionId":2094376,"sourceType":"competition"},{"sourceId":7290951,"sourceType":"datasetVersion","datasetId":4228560},{"sourceId":7507272,"sourceType":"datasetVersion","datasetId":4372137},{"sourceId":7507275,"sourceType":"datasetVersion","datasetId":4372138},{"sourceId":7507299,"sourceType":"datasetVersion","datasetId":4372159},{"sourceId":7507302,"sourceType":"datasetVersion","datasetId":4372162},{"sourceId":7507307,"sourceType":"datasetVersion","datasetId":4372167},{"sourceId":7508803,"sourceType":"datasetVersion","datasetId":4373168},{"sourceId":7655932,"sourceType":"datasetVersion","datasetId":4463608}],"dockerImageVersionId":30558,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in filenames:\n#         print(os.path.join(dirname, filename))\n    print(dirname)\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-22T14:27:02.986864Z","iopub.execute_input":"2024-03-22T14:27:02.987145Z","iopub.status.idle":"2024-03-22T14:27:31.755691Z","shell.execute_reply.started":"2024-03-22T14:27:02.987119Z","shell.execute_reply":"2024-03-22T14:27:31.754754Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !python -m pip install pyyaml==5.1\n# import sys, os, distutils.core\n# Note: This is a faster way to install detectron2 in Colab, but it does not include all functionalities (e.g. compiled operators).\n# See https://detectron2.readthedocs.io/tutorials/install.html for full installation instructions\n# !git clone 'https://github.com/facebookresearch/detectron2'\n# dist = distutils.core.run_setup(\"./detectron2/setup.py\")\n# !python -m pip install {' '.join([f\"'{x}'\" for x in dist.install_requires])}\n# sys.path.insert(0, os.path.abspath('./detectron2'))\n\n# Properly install detectron2. (Please do not install twice in both ways)\n!python -m pip install 'git+https://github.com/facebookresearch/detectron2.git'","metadata":{"execution":{"iopub.status.busy":"2024-03-22T14:27:40.507108Z","iopub.execute_input":"2024-03-22T14:27:40.507588Z","iopub.status.idle":"2024-03-22T14:29:37.613924Z","shell.execute_reply.started":"2024-03-22T14:27:40.507557Z","shell.execute_reply":"2024-03-22T14:29:37.612952Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch, detectron2\n!nvcc --version\nTORCH_VERSION = \".\".join(torch.__version__.split(\".\")[:2])\nCUDA_VERSION = torch.__version__.split(\"+\")[-1]\nprint(\"torch: \", TORCH_VERSION, \"; cuda: \", CUDA_VERSION)\nprint(\"detectron2:\", detectron2.__version__)","metadata":{"execution":{"iopub.status.busy":"2024-02-23T09:31:24.902393Z","iopub.execute_input":"2024-02-23T09:31:24.903180Z","iopub.status.idle":"2024-02-23T09:31:27.330373Z","shell.execute_reply.started":"2024-02-23T09:31:24.903141Z","shell.execute_reply":"2024-02-23T09:31:27.329140Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Some basic setup:\n# Setup detectron2 logger\nimport detectron2\nfrom detectron2.utils.logger import setup_logger\nsetup_logger()\n\n# import some common libraries\nimport numpy as np\nimport os, json, cv2, random\n\n# import some common detectron2 utilities\nfrom detectron2 import model_zoo\nfrom detectron2.engine import DefaultPredictor\nfrom detectron2.config import get_cfg\nfrom detectron2.utils.visualizer import Visualizer\nfrom detectron2.data import MetadataCatalog, DatasetCatalog","metadata":{"execution":{"iopub.status.busy":"2024-03-22T14:29:39.961395Z","iopub.execute_input":"2024-03-22T14:29:39.962216Z","iopub.status.idle":"2024-03-22T14:29:39.968140Z","shell.execute_reply.started":"2024-03-22T14:29:39.962157Z","shell.execute_reply":"2024-03-22T14:29:39.967150Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# REMOVE OS DATASET\n\n# DatasetCatalog.remove('scab_train')\n# DatasetCatalog.remove('scab_test')\n# MetadataCatalog.clear()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# IMPORTA AS ANOTAÇÕES DO JSON\n\n# from detectron2.structures import BoxMode\n\n# def get_balloon_dicts(img_dir, json_file):\n#     with open(json_file) as f:\n#         imgs_anns = json.load(f)\n#     dataset_dicts = []\n#     pomax = 0\n#     for idx, v in enumerate(imgs_anns.values()):\n#         record = {}\n#         filename = os.path.join(img_dir, v[\"filename\"])\n#         height, width = cv2.imread(filename).shape[:2]\n#         record[\"file_name\"] = filename\n#         record[\"image_id\"] = idx\n#         record[\"height\"] = height\n#         record[\"width\"] = width\n#         annos = v[\"regions\"]\n#         objs = []\n#         for anno in annos:\n#             shape = anno[\"shape_attributes\"]\n#             px = shape[\"all_points_x\"]\n#             py = shape[\"all_points_y\"]\n#             poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)]\n#             poly = [p for x in poly for p in x]\n#             obj = {\n#                 \"bbox\": [np.min(px), np.min(py), np.max(px), np.max(py)],\n#                 \"bbox_mode\": BoxMode.XYXY_ABS,\n#                 \"segmentation\": [poly],\n#                 \"category_id\": 0,\n#             }\n#             objs.append(obj)\n#         record[\"annotations\"] = objs\n#         dataset_dicts.append(record)\n#     return dataset_dicts\n\n\n# path = \"/kaggle/input/plant-pathology-2021-fgvc8/train_images/\"\n# DatasetCatalog.register(\"scab_train\", lambda img_dir=path, json_path=\"/kaggle/input/labels-1/output1.json\": get_balloon_dicts(img_dir, json_path))\n# DatasetCatalog.register(\"scab_test\", lambda img_dir=path, json_path=\"/kaggle/input/labels-1/output2.json\": get_balloon_dicts(img_dir, json_path))\n# MetadataCatalog.get(\"scab_train\").set(thing_classes=['scab'])\n# MetadataCatalog.get(\"scab_test\").set(thing_classes=['scab'])\n\n# DatasetCatalog.register(\"healthy_train\", lambda img_dir=path, json_path=\"/kaggle/input/labels-2/output1.json\": get_balloon_dicts(img_dir, json_path))\n# DatasetCatalog.register(\"healthy_test\", lambda img_dir=path, json_path=\"/kaggle/input/labels-2/output2.json\": get_balloon_dicts(img_dir, json_path))\n# MetadataCatalog.get(\"healthy_train\").set(thing_classes=['healthy'])\n# MetadataCatalog.get(\"healthy_test\").set(thing_classes=['healthy'])\n\n# DatasetCatalog.register(\"complex_train\", lambda img_dir=path, json_path=\"/kaggle/input/labels-3/output1.json\": get_balloon_dicts(img_dir, json_path))\n# DatasetCatalog.register(\"complex_test\", lambda img_dir=path, json_path=\"/kaggle/input/labels-3/output2.json\": get_balloon_dicts(img_dir, json_path))\n# MetadataCatalog.get(\"complex_train\").set(thing_classes=['complex'])\n# MetadataCatalog.get(\"complex_test\").set(thing_classes=['complex'])\n\n# DatasetCatalog.register(\"frog_train\", lambda img_dir=path, json_path=\"/kaggle/input/labels-5/output1.json\": get_balloon_dicts(img_dir, json_path))\n# DatasetCatalog.register(\"frog_test\", lambda img_dir=path, json_path=\"/kaggle/input/labels-5/output2.json\": get_balloon_dicts(img_dir, json_path))\n# MetadataCatalog.get(\"frog_train\").set(thing_classes=['frog eye leaf spot'])\n# MetadataCatalog.get(\"frog_test\").set(thing_classes=['frog eye leaf spot'])\n\n# DatasetCatalog.register(\"powdery_train\", lambda img_dir=path, json_path=\"/kaggle/input/labels-6/output1.json\": get_balloon_dicts(img_dir, json_path))\n# DatasetCatalog.register(\"powdery_test\", lambda img_dir=path, json_path=\"/kaggle/input/labels-6/output2.json\": get_balloon_dicts(img_dir, json_path))\n# MetadataCatalog.get(\"powdery_train\").set(thing_classes=['powdery mildew'])\n# MetadataCatalog.get(\"powdery_test\").set(thing_classes=['powdery mildew'])\n\n# DatasetCatalog.register(\"rust_train\", lambda img_dir=path, json_path=\"/kaggle/input/labels-12/output1.json\": get_balloon_dicts(img_dir, json_path))\n# DatasetCatalog.register(\"rust_test\", lambda img_dir=path, json_path=\"/kaggle/input/labels-12/output2.json\": get_balloon_dicts(img_dir, json_path))\n# MetadataCatalog.get(\"rust_train\").set(thing_classes=['rust'])\n# MetadataCatalog.get(\"rust_test\").set(thing_classes=['rust'])","metadata":{"execution":{"iopub.status.busy":"2024-02-23T09:32:29.585140Z","iopub.execute_input":"2024-02-23T09:32:29.585579Z","iopub.status.idle":"2024-02-23T09:32:29.612772Z","shell.execute_reply.started":"2024-02-23T09:32:29.585547Z","shell.execute_reply":"2024-02-23T09:32:29.611782Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# EXPORTA OS DATASET DO JSON PARA O COCO\n\n# from detectron2.data.datasets.coco import convert_to_coco_json\n# convert_to_coco_json('scab_train', '/kaggle/working/outputs/scab_train_coco.json', allow_cached=False)\n# convert_to_coco_json('scab_test', '/kaggle/working/outputs/scab_test_coco.json', allow_cached=False)\n\n# convert_to_coco_json('healthy_train', '/kaggle/working/outputs/healthy_train_coco.json', allow_cached=False)\n# convert_to_coco_json('healthy_test', '/kaggle/working/outputs/healthy_test_coco.json', allow_cached=False)\n\n# convert_to_coco_json('complex_train', '/kaggle/working/outputs/complex_train_coco.json', allow_cached=False)\n# convert_to_coco_json('complex_test', '/kaggle/working/outputs/complex_test_coco.json', allow_cached=False)\n\n# convert_to_coco_json('frog_train', '/kaggle/working/outputs/frog_train_coco.json', allow_cached=False)\n# convert_to_coco_json('frog_test', '/kaggle/working/outputs/frog_test_coco.json', allow_cached=False)\n\n# convert_to_coco_json('powdery_train', '/kaggle/working/outputs/powdery_train_coco.json', allow_cached=False)\n# convert_to_coco_json('powdery_test', '/kaggle/working/outputs/powdery_test_coco.json', allow_cached=False)\n\n# convert_to_coco_json('rust_train', '/kaggle/working/outputs/rust_train_coco.json', allow_cached=False)\n# convert_to_coco_json('rust_test', '/kaggle/working/outputs/rust_test_coco.json', allow_cached=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from detectron2.data.datasets import register_coco_instances\nregister_coco_instances(\"scab_train\", {}, \"/kaggle/input/labels-coco/scab_train_coco.json\", \"/kaggle/input/plant-pathology-2021-fgvc8/train_images\")\nregister_coco_instances(\"scab_test\", {}, \"/kaggle/input/labels-coco/scab_test_coco.json\", \"/kaggle/input/plant-pathology-2021-fgvc8/train_images\")\n\nregister_coco_instances(\"healthy_train\", {}, \"/kaggle/input/labels-coco/healthy_train_coco.json\", \"/kaggle/input/plant-pathology-2021-fgvc8/train_images\")\nregister_coco_instances(\"healthy_test\", {}, \"/kaggle/input/labels-coco/healthy_test_coco.json\", \"/kaggle/input/plant-pathology-2021-fgvc8/train_images\")\n\nregister_coco_instances(\"complex_train\", {}, \"/kaggle/input/labels-coco/complex_train_coco.json\", \"/kaggle/input/plant-pathology-2021-fgvc8/train_images\")\nregister_coco_instances(\"complex_test\", {}, \"/kaggle/input/labels-coco/complex_test_coco.json\", \"/kaggle/input/plant-pathology-2021-fgvc8/train_images\")\n\nregister_coco_instances(\"frog_train\", {}, \"/kaggle/input/labels-coco/frog_train_coco.json\", \"/kaggle/input/plant-pathology-2021-fgvc8/train_images\")\nregister_coco_instances(\"frog_test\", {}, \"/kaggle/input/labels-coco/frog_test_coco.json\", \"/kaggle/input/plant-pathology-2021-fgvc8/train_images\")\n\nregister_coco_instances(\"powdery_train\", {}, \"/kaggle/input/labels-coco/powdery_train_coco.json\", \"/kaggle/input/plant-pathology-2021-fgvc8/train_images\")\nregister_coco_instances(\"powdery_test\", {}, \"/kaggle/input/labels-coco/powdery_test_coco.json\", \"/kaggle/input/plant-pathology-2021-fgvc8/train_images\")\n\nregister_coco_instances(\"rust_train\", {}, \"/kaggle/input/labels-coco/rust_train_coco.json\", \"/kaggle/input/plant-pathology-2021-fgvc8/train_images\")\nregister_coco_instances(\"rust_test\", {}, \"/kaggle/input/labels-coco/rust_test_coco.json\", \"/kaggle/input/plant-pathology-2021-fgvc8/train_images\")","metadata":{"execution":{"iopub.status.busy":"2024-03-22T14:32:13.118340Z","iopub.execute_input":"2024-03-22T14:32:13.119289Z","iopub.status.idle":"2024-03-22T14:32:13.130445Z","shell.execute_reply.started":"2024-03-22T14:32:13.119243Z","shell.execute_reply":"2024-03-22T14:32:13.129424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ZIPA OS DATASET EXPORTADOS EM COCO\n\n# !find /kaggle/working/outputs -type f ! -name \"*.lock\" -exec zip /kaggle/working/output/nome-do-arquivo.zip {} +","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from detectron2.engine import DefaultTrainer\nmodels = ['scab', 'rust', 'complex', 'frog', 'powdery', 'healthy']\ncfgs = []\ntrainers = []\nfor idx, modelo in enumerate(models):\n    cfg = get_cfg()\n    cfgs.append(cfg)\n    cfgs[idx].merge_from_file(model_zoo.get_config_file(\"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml\"))\n    cfgs[idx].DATASETS.TRAIN = (modelo + \"_train\")\n    cfgs[idx].DATASETS.TEST = ()\n    cfgs[idx].DATALOADER.NUM_WORKERS = 1\n    cfgs[idx].MODEL.WEIGHTS = model_zoo.get_checkpoint_url(\"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml\")\n    cfgs[idx].SOLVER.IMS_PER_BATCH = 1\n    cfgs[idx].SOLVER.BASE_LR = 0.001\n    cfgs[idx].SOLVER.MAX_ITER = 900\n    cfgs[idx].SOLVER.STEPS = []\n    cfgs[idx].MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128\n    cfgs[idx].MODEL.ROI_HEADS.NUM_CLASSES = 1\n    cfgs[idx].OUTPUT_DIR = './' + modelo\n\n#     os.makedirs(cfgs[idx].OUTPUT_DIR, exist_ok=True)\n#     trainer = DefaultTrainer(cfgs[idx])\n#     trainers.append(trainer)\n#     trainers[idx].resume_or_load(resume=False)\n#     trainers[idx].train()","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-03-22T14:32:20.232795Z","iopub.execute_input":"2024-03-22T14:32:20.233640Z","iopub.status.idle":"2024-03-22T14:32:20.332801Z","shell.execute_reply.started":"2024-03-22T14:32:20.233603Z","shell.execute_reply":"2024-03-22T14:32:20.331801Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# IMPORTA SÓ 1 DATASET\n\n# cfg = get_cfg()\n# cfg.merge_from_file(model_zoo.get_config_file(\"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml\"))\n# cfg.DATASETS.TRAIN = (\"healthy_train\")\n# cfg.DATASETS.TEST = ()\n# cfg.DATALOADER.NUM_WORKERS = 1\n# cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(\"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml\")\n# cfg.SOLVER.IMS_PER_BATCH = 1\n# cfg.SOLVER.BASE_LR = 0.001\n# cfg.SOLVER.MAX_ITER = 900\n# cfg.SOLVER.STEPS = []\n# cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128\n# cfg.MODEL.ROI_HEADS.NUM_CLASSES = 1\n\n# os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)\n# trainer = DefaultTrainer(cfg) \n# trainer.resume_or_load(resume=False)\n# trainer.train()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!mkdir ./checks","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from detectron2.checkpoint import DetectionCheckpointer, Checkpointer\nfor trainer, model in zip(trainers, models):\n    torch.save(trainer.model.state_dict(), os.path.join(\"./checks\", model + \".pth\"))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from detectron2.checkpoint import DetectionCheckpointer, Checkpointer\nfor modelo in models:\n    trainers.append(torch.load(os.path.join(\"/kaggle/input/models/checks\", modelo + \".pth\")))","metadata":{"execution":{"iopub.status.busy":"2024-02-23T09:32:45.876905Z","iopub.execute_input":"2024-02-23T09:32:45.877614Z","iopub.status.idle":"2024-02-23T09:32:47.112367Z","shell.execute_reply.started":"2024-02-23T09:32:45.877578Z","shell.execute_reply":"2024-02-23T09:32:47.111485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Inference should use the config with parameters that are used in training\n# # cfg now already contains everything we've set previously. We changed it a little bit for inference:\n# cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, \"model_final.pth\")  # path to the model we just trained\n# cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7   # set a custom testing threshold\n# predictor = DefaultPredictor(cfg)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictors = []\nfor cfg, modelo in zip(cfgs, models):\n    cfg.MODEL.WEIGHTS = os.path.join(\"/kaggle/input/models/checks\", modelo + \".pth\")  # path to the model we just trained\n    cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.2   # set a custom testing threshold\n    predictor = DefaultPredictor(cfg)\n    predictors.append(predictor)","metadata":{"execution":{"iopub.status.busy":"2024-03-22T14:32:51.076625Z","iopub.execute_input":"2024-03-22T14:32:51.077028Z","iopub.status.idle":"2024-03-22T14:33:05.280035Z","shell.execute_reply.started":"2024-03-22T14:32:51.076997Z","shell.execute_reply":"2024-03-22T14:33:05.279232Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import cv2\nimport time\nfrom detectron2.utils.visualizer import ColorMode\nfor i, modelo in enumerate(models):\n    if modelo != \"powdery\":\n        continue\n    dataset = DatasetCatalog.get(modelo + '_test')\n    metadata = MetadataCatalog.get(modelo + '_test')\n    predictor = predictors[i]\n    for j, sample in enumerate(dataset[:10]):\n        start_time = time.time()\n        im = cv2.imread(sample['file_name'])\n        outputs = predictor(im)\n        v = Visualizer(im[:, :, ::-1],\n                   metadata=metadata,\n                   scale=0.5,\n                   instance_mode=ColorMode.IMAGE_BW   # remove the colors of unsegmented pixels. This option is only available for segmentation models\n        )\n        out = v.draw_instance_predictions(outputs[\"instances\"].to(\"cpu\"))\n        cv2.imwrite('/kaggle/working/' + str(i) + '' + str(j) + '.jpeg',out.get_image()[:, :, ::-1])\n        end_time = time.time()\n        print(end_time - start_time)","metadata":{"execution":{"iopub.status.busy":"2024-03-22T14:37:38.103840Z","iopub.execute_input":"2024-03-22T14:37:38.104220Z","iopub.status.idle":"2024-03-22T14:38:06.553159Z","shell.execute_reply.started":"2024-03-22T14:37:38.104169Z","shell.execute_reply":"2024-03-22T14:38:06.552243Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from detectron2.evaluation import COCOEvaluator, inference_on_dataset\nfrom detectron2.data import build_detection_test_loader\nevaluator = COCOEvaluator(\"healthy_test\", output_dir=\"./outputs\", allow_cached_coco=False)\nval_loader = build_detection_test_loader(cfg, \"healthy_test\")\nprint(inference_on_dataset(predictor.model, val_loader, evaluator))","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}