{"metadata":{"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"},{"sourceId":8727685,"sourceType":"datasetVersion","datasetId":5236783},{"sourceId":8728463,"sourceType":"datasetVersion","datasetId":5238658},{"sourceId":8761420,"sourceType":"datasetVersion","datasetId":5264030},{"sourceId":9222129,"sourceType":"datasetVersion","datasetId":5577143},{"sourceId":9231709,"sourceType":"datasetVersion","datasetId":5583775},{"sourceId":9235934,"sourceType":"datasetVersion","datasetId":5586514},{"sourceId":9238129,"sourceType":"datasetVersion","datasetId":5587999},{"sourceId":9238150,"sourceType":"datasetVersion","datasetId":5588015},{"sourceId":9273089,"sourceType":"datasetVersion","datasetId":5611997},{"sourceId":9306154,"sourceType":"datasetVersion","datasetId":5635376},{"sourceId":9365806,"sourceType":"datasetVersion","datasetId":5679443},{"sourceId":184402550,"sourceType":"kernelVersion"},{"sourceId":192715298,"sourceType":"kernelVersion"},{"sourceId":193161758,"sourceType":"kernelVersion"},{"sourceId":193298353,"sourceType":"kernelVersion"},{"sourceId":193335312,"sourceType":"kernelVersion"},{"sourceId":193338638,"sourceType":"kernelVersion"},{"sourceId":193417638,"sourceType":"kernelVersion"},{"sourceId":100132,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":64905,"modelId":89293},{"sourceId":111113,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":85952,"modelId":84065}],"dockerImageVersionId":30762,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true},"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.14"},"papermill":{"default_parameters":{},"duration":257.079445,"end_time":"2024-09-12T22:42:10.494572","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2024-09-12T22:37:53.415127","version":"2.6.0"},"widgets":{"application/vnd.jupyter.widget-state+json":{"state":{"0577292f27e44bd8abfa322146a5a2b9":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"103efd84d829431394e2f49c2a465e50":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_c5f641b0612a48d2bade68e19f26ab76","placeholder":"​","style":"IPY_MODEL_1cb9c8d6f2264c70af51052340159b8c","value":" 97/97 [00:00&lt;00:00, 117.04it/s]"}},"1a14ba0739f64ddeb629accb6f4b0a63":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_59c3b9ce9ca74944b8c3e8b270a51d04","IPY_MODEL_23356b5ce3694c0c9635654a137b5cea","IPY_MODEL_568da1a68afb4bb98cb4342c3062b65a"],"layout":"IPY_MODEL_6e537fcf83f64f2b8dbb0f3368aad8eb"}},"1cb9c8d6f2264c70af51052340159b8c":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"1da015cf061c4285976dbee669248354":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"229c78b305f14001b0ae3f680fb800e2":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"22e64f3d553345aea18907822942a4a9":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"23356b5ce3694c0c9635654a137b5cea":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_598ed572bc2f486d96a488e69e87d294","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_6f451d07bd6b403091bb49d921f2965a","value":1}},"2e02ccfe2adb49e7902830fc58b32822":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_427db9dd687c461b8409d20b91817828","placeholder":"​","style":"IPY_MODEL_229c78b305f14001b0ae3f680fb800e2","value":"100%"}},"2f24b1d5d85d4c8eb532232547733b66":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_dc78ee42956c42b19e5ffd53214e5728","placeholder":"​","style":"IPY_MODEL_d29da02a3fba43f1a3658bed03a65cce","value":" 1/1 [00:02&lt;00:00,  2.63s/it]"}},"427db9dd687c461b8409d20b91817828":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4649344d6cbd4f01abc6566a258d22d9":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"568da1a68afb4bb98cb4342c3062b65a":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_c41a7a683a3442708c32fb6058dc5b47","placeholder":"​","style":"IPY_MODEL_b21669c1e5a84ef6ae56fd4cdd6b2776","value":" 1/1 [00:01&lt;00:00,  1.39s/it]"}},"57c578c60f644255a3c1306d91044f14":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"598ed572bc2f486d96a488e69e87d294":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"59c3b9ce9ca74944b8c3e8b270a51d04":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_0577292f27e44bd8abfa322146a5a2b9","placeholder":"​","style":"IPY_MODEL_1da015cf061c4285976dbee669248354","value":"100%"}},"61d05f574d4e4e8fb2e1564678436901":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"6e537fcf83f64f2b8dbb0f3368aad8eb":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6f451d07bd6b403091bb49d921f2965a":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"8839820352a14dbe9349e7997818fc4b":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_bb99507ef9664560b1d21f178484eb6e","placeholder":"​","style":"IPY_MODEL_eca44ff78ebe461c9632a1ddf0b79d5c","value":" 1/1 [00:02&lt;00:00,  2.02s/it]"}},"9c986e39b0cf424fa15b6a9b91912503":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"a35dc813314647b7862ec9d0b7c62945":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"a6cf10e720da40d7ae15c54d2973263c":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a74f60fb766e494aa2b9da0388a0020f":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_2e02ccfe2adb49e7902830fc58b32822","IPY_MODEL_c1dbdb716e0c4d2dbcaf31b67c2bc0ab","IPY_MODEL_8839820352a14dbe9349e7997818fc4b"],"layout":"IPY_MODEL_4649344d6cbd4f01abc6566a258d22d9"}},"a85dca494a8c460cb455fbb551e28501":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"b151422bc67b4499873650165abccca0":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_bb83cd35d1fa4d76b4a0d5d47ca8d09f","placeholder":"​","style":"IPY_MODEL_22e64f3d553345aea18907822942a4a9","value":"100%"}},"b21669c1e5a84ef6ae56fd4cdd6b2776":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"b84adca9e5cd4d838fd55304b46a8fdb":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ba125f5c4b4a4abbbfc4128597931a0d":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"bb83cd35d1fa4d76b4a0d5d47ca8d09f":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"bb99507ef9664560b1d21f178484eb6e":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"bce7716da90c4629895506e2b6744706":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_d269502714bf4d6f89cac17c22a534e4","IPY_MODEL_f2724ece3ada4ffa906f12c510b4b14a","IPY_MODEL_2f24b1d5d85d4c8eb532232547733b66"],"layout":"IPY_MODEL_57c578c60f644255a3c1306d91044f14"}},"c1dbdb716e0c4d2dbcaf31b67c2bc0ab":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_a6cf10e720da40d7ae15c54d2973263c","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_9c986e39b0cf424fa15b6a9b91912503","value":1}},"c41a7a683a3442708c32fb6058dc5b47":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"c5f641b0612a48d2bade68e19f26ab76":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"c92aaa0ab56043019e37cb2967289f69":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d269502714bf4d6f89cac17c22a534e4":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_b84adca9e5cd4d838fd55304b46a8fdb","placeholder":"​","style":"IPY_MODEL_61d05f574d4e4e8fb2e1564678436901","value":"100%"}},"d29da02a3fba43f1a3658bed03a65cce":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"d7bd8145c16d401b81a98d86711684bd":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_c92aaa0ab56043019e37cb2967289f69","max":97,"min":0,"orientation":"horizontal","style":"IPY_MODEL_a35dc813314647b7862ec9d0b7c62945","value":97}},"dc78ee42956c42b19e5ffd53214e5728":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e47457000d944df5b1b925d1fa63604a":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_b151422bc67b4499873650165abccca0","IPY_MODEL_d7bd8145c16d401b81a98d86711684bd","IPY_MODEL_103efd84d829431394e2f49c2a465e50"],"layout":"IPY_MODEL_ba125f5c4b4a4abbbfc4128597931a0d"}},"eca44ff78ebe461c9632a1ddf0b79d5c":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"f2724ece3ada4ffa906f12c510b4b14a":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_f9641017f3a64fd0abdb5113433711ce","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_a85dca494a8c460cb455fbb551e28501","value":1}},"f9641017f3a64fd0abdb5113433711ce":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}}},"version_major":2,"version_minor":0}}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"LAUNCH_VARIANT = 'option 12'","metadata":{"papermill":{"duration":0.058358,"end_time":"2024-09-12T22:37:56.434844","exception":false,"start_time":"2024-09-12T22:37:56.376486","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:07.177554Z","iopub.execute_input":"2024-09-13T03:14:07.178337Z","iopub.status.idle":"2024-09-13T03:14:07.187587Z","shell.execute_reply.started":"2024-09-13T03:14:07.178292Z","shell.execute_reply":"2024-09-13T03:14:07.186714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"![Lumbar](http://drleespine.com.au/wp-content/uploads/2019/07/Degenerative-Disc-Disease-1.png)","metadata":{}},{"cell_type":"markdown","source":"---","metadata":{"papermill":{"duration":0.050962,"end_time":"2024-09-12T22:38:10.322810","exception":false,"start_time":"2024-09-12T22:38:10.271848","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"## Germany [LSDC Yolo Approach](https://www.kaggle.com/code/namgalielei/lsdc-yolo-approach)\n### [Liam Nguyen](https://www.kaggle.com/namgalielei)","metadata":{"papermill":{"duration":0.05081,"end_time":"2024-09-12T22:38:11.074936","exception":false,"start_time":"2024-09-12T22:38:11.024126","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!pip install -q --no-index --find-links /kaggle/input/ultralytics ultralytics","metadata":{"_kg_hide-input":true,"papermill":{"duration":14.845854,"end_time":"2024-09-12T22:38:25.982141","exception":false,"start_time":"2024-09-12T22:38:11.136287","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:11.352769Z","iopub.execute_input":"2024-09-13T03:14:11.353858Z","iopub.status.idle":"2024-09-13T03:14:25.797196Z","shell.execute_reply.started":"2024-09-13T03:14:11.353799Z","shell.execute_reply":"2024-09-13T03:14:25.795898Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport pydicom\nfrom PIL import Image\nimport numpy as np\nfrom multiprocessing import Pool, cpu_count\n\nimport sklearn.metrics\nimport torch\nimport cv2\nimport numpy as np \nimport pandas as pd \nfrom tqdm.auto import tqdm","metadata":{"_kg_hide-input":true,"papermill":{"duration":5.908322,"end_time":"2024-09-12T22:38:31.939980","exception":false,"start_time":"2024-09-12T22:38:26.031658","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:25.799224Z","iopub.execute_input":"2024-09-13T03:14:25.799572Z","iopub.status.idle":"2024-09-13T03:14:31.262746Z","shell.execute_reply.started":"2024-09-13T03:14:25.799535Z","shell.execute_reply":"2024-09-13T03:14:31.261935Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"EVAL = False # Change to True to compute the validation score\nIMG_DIR = '/images'\nFOLD = 0\nSAMPLE = False # True for quick debugging\nSEVERITIES = ['Normal/Mild', 'Moderate', 'Severe']\nLEVELS = ['l1_l2', 'l2_l3', 'l3_l4', 'l4_l5', 'l5_s1']\n\nSCS_WEIGHTS = ['/kaggle/input/lsdc-train-yolo-scs/lsdc_yolov8/train/weights/best.pt']\n\nSS_WEIGHTS = ['/kaggle/input/lsdc-train-yolo-ss/lsdc_yolov8/train/weights/best.pt',\n             '/kaggle/input/lsdc-yolo-ssv3/best.pt']\n\nNFN_WEIGHTS = ['/kaggle/input/lsdc-train-yolo-nfn/lsdc_yolov8/train/weights/best.pt',\n              '/kaggle/input/lsdc-yolo-nfnv3/best.pt']","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.058146,"end_time":"2024-09-12T22:38:32.247010","exception":false,"start_time":"2024-09-12T22:38:32.188864","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:31.263855Z","iopub.execute_input":"2024-09-13T03:14:31.264299Z","iopub.status.idle":"2024-09-13T03:14:31.270248Z","shell.execute_reply.started":"2024-09-13T03:14:31.264257Z","shell.execute_reply":"2024-09-13T03:14:31.269116Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if EVAL:\n    import sys\n    sys.path.append('/kaggle/input/lsdc-utils')\n    from metrics import score as lsdc_scoring","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.056955,"end_time":"2024-09-12T22:38:32.353926","exception":false,"start_time":"2024-09-12T22:38:32.296971","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:31.272367Z","iopub.execute_input":"2024-09-13T03:14:31.272669Z","iopub.status.idle":"2024-09-13T03:14:31.289481Z","shell.execute_reply.started":"2024-09-13T03:14:31.272637Z","shell.execute_reply":"2024-09-13T03:14:31.288611Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_val_df = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train.csv')","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.086003,"end_time":"2024-09-12T22:38:32.489062","exception":false,"start_time":"2024-09-12T22:38:32.403059","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:31.290481Z","iopub.execute_input":"2024-09-13T03:14:31.290779Z","iopub.status.idle":"2024-09-13T03:14:31.328895Z","shell.execute_reply.started":"2024-09-13T03:14:31.290748Z","shell.execute_reply":"2024-09-13T03:14:31.328128Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if EVAL:\n    train_xy = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_label_coordinates.csv')\n    des = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_series_descriptions.csv')\nelse:    \n    des = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_series_descriptions.csv')","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.062198,"end_time":"2024-09-12T22:38:32.602053","exception":false,"start_time":"2024-09-12T22:38:32.539855","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:31.329950Z","iopub.execute_input":"2024-09-13T03:14:31.330349Z","iopub.status.idle":"2024-09-13T03:14:31.338749Z","shell.execute_reply.started":"2024-09-13T03:14:31.330315Z","shell.execute_reply":"2024-09-13T03:14:31.337733Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.049186,"end_time":"2024-09-12T22:38:32.702989","exception":false,"start_time":"2024-09-12T22:38:32.653803","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_dcm(src_path):\n    dicom_data = pydicom.dcmread(src_path)\n    image = dicom_data.pixel_array\n    image = (image - image.min()) / (image.max() - image.min() +1e-6) * 255\n    return image\n\ndef convert_dcm_to_jpg(file_path):\n    try:\n        # Read the DICOM file\n        image_array = read_dcm(file_path)\n        \n        # Define the output path\n        relative_path = os.path.relpath(file_path, start=input_directory)\n        output_path = os.path.join(output_directory, relative_path)\n        output_path = output_path.replace('.dcm', '.jpg')\n                \n        # Create the output directory if it doesn't exist\n        os.makedirs(os.path.dirname(output_path), exist_ok=True)\n        \n        # Save the image as a JPEG file\n        cv2.imwrite(output_path, image_array)\n        \n        return output_path\n    except Exception as e:\n        print(f\"Error processing file {file_path}: {e}\")\n        return None\n\ndef process_files(dcm_files):\n    with Pool(cpu_count()) as pool:\n        # Wrap pool.map with tqdm to show the progress bar\n        list(tqdm(pool.imap(convert_dcm_to_jpg, dcm_files), total=len(dcm_files)))\n\ndef get_dcm_files(directory):\n    dcm_files = []\n    for root, dirs, files in os.walk(directory):\n        for file in files:\n            if file.endswith('.dcm'):\n                dcm_files.append(os.path.join(root, file))\n    return dcm_files    ","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.065905,"end_time":"2024-09-12T22:38:32.818768","exception":false,"start_time":"2024-09-12T22:38:32.752863","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:31.339905Z","iopub.execute_input":"2024-09-13T03:14:31.340305Z","iopub.status.idle":"2024-09-13T03:14:31.352205Z","shell.execute_reply.started":"2024-09-13T03:14:31.340245Z","shell.execute_reply":"2024-09-13T03:14:31.351207Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Replace these with your input and output directories\nif not EVAL:\n    input_directory = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_images'\n\n    output_directory = IMG_DIR\n\n    # Get all .dcm files in the input directory\n    dcm_files = get_dcm_files(input_directory)\n\n    # Process the files using multiprocessing\n    process_files(dcm_files)\n\n    print(f\"Conversion completed. Images saved to {output_directory}\")\nelse:\n    if not os.path.exists(IMG_DIR):\n        print('Unziping data..')\n        !unzip -q -d / /kaggle/input/lsdc-get-all-images/images.zip\n        print('Done unziping data')","metadata":{"_kg_hide-input":true,"papermill":{"duration":1.089031,"end_time":"2024-09-12T22:38:33.958211","exception":false,"start_time":"2024-09-12T22:38:32.869180","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:31.353782Z","iopub.execute_input":"2024-09-13T03:14:31.354058Z","iopub.status.idle":"2024-09-13T03:14:32.429395Z","shell.execute_reply.started":"2024-09-13T03:14:31.354028Z","shell.execute_reply":"2024-09-13T03:14:32.428258Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if EVAL:\n    fold_df = pd.read_csv('/kaggle/input/lsdc-fold-split/5folds.csv')\n    test_df = fold_df[fold_df.fold == FOLD]\n    \nelse:\n    test_df = os.listdir('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_images')\n    test_df = pd.DataFrame(test_df, columns=['study_id'])\n    test_df['study_id'] = test_df['study_id'].astype(int)\n    \ntest_df = test_df.merge(des, on=['study_id'])","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.076754,"end_time":"2024-09-12T22:38:34.086012","exception":false,"start_time":"2024-09-12T22:38:34.009258","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:32.430774Z","iopub.execute_input":"2024-09-13T03:14:32.431134Z","iopub.status.idle":"2024-09-13T03:14:32.456876Z","shell.execute_reply.started":"2024-09-13T03:14:32.431070Z","shell.execute_reply":"2024-09-13T03:14:32.456094Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def gen_label_map(CONDITIONS):\n    label2id = {}\n    id2label = {}\n    i = 0\n    for cond in CONDITIONS:\n        for level in LEVELS:\n            for severity in SEVERITIES:\n                cls_ = f\"{cond.lower().replace(' ', '_')}_{level}_{severity.lower()}\"\n                label2id[cls_] = i\n                id2label[i] = cls_\n                i+=1\n    return label2id, id2label\n                \nscs_label2id, scs_id2label = gen_label_map(['Spinal Canal Stenosis'])\nss_label2id, ss_id2label = gen_label_map(['Left Subarticular Stenosis', 'Right Subarticular Stenosis'])\nnfn_label2id, nfn_id2label = gen_label_map(['Left Neural Foraminal Narrowing', 'Right Neural Foraminal Narrowing'])","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.060684,"end_time":"2024-09-12T22:38:34.198918","exception":false,"start_time":"2024-09-12T22:38:34.138234","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:32.460763Z","iopub.execute_input":"2024-09-13T03:14:32.461165Z","iopub.status.idle":"2024-09-13T03:14:32.472672Z","shell.execute_reply.started":"2024-09-13T03:14:32.461131Z","shell.execute_reply":"2024-09-13T03:14:32.471899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from ultralytics import YOLO\n\n# Load YOLO Model\nscs_models = []\nfor weight in SCS_WEIGHTS:\n    scs_models.append(YOLO(weight))\n    \nss_models = []\nfor weight in SS_WEIGHTS:\n    ss_models.append(YOLO(weight))\n    \nnfn_models = []\nfor weight in NFN_WEIGHTS:\n    nfn_models.append(YOLO(weight))","metadata":{"_kg_hide-input":true,"papermill":{"duration":4.756313,"end_time":"2024-09-12T22:38:39.005662","exception":false,"start_time":"2024-09-12T22:38:34.249349","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:32.473686Z","iopub.execute_input":"2024-09-13T03:14:32.474001Z","iopub.status.idle":"2024-09-13T03:14:37.206179Z","shell.execute_reply.started":"2024-09-13T03:14:32.473969Z","shell.execute_reply":"2024-09-13T03:14:37.205139Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_label_set = train_val_df.iloc[0, 1:].index.tolist()\nscs_label_set = all_label_set[:5]\nnfn_label_set = all_label_set[5:15]\nss_label_set = all_label_set[15:]","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.060179,"end_time":"2024-09-12T22:38:39.116861","exception":false,"start_time":"2024-09-12T22:38:39.056682","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:37.207777Z","iopub.execute_input":"2024-09-13T03:14:37.208458Z","iopub.status.idle":"2024-09-13T03:14:37.215200Z","shell.execute_reply.started":"2024-09-13T03:14:37.208409Z","shell.execute_reply":"2024-09-13T03:14:37.214059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"settings = [\n    ( 'Sagittal T2/STIR', scs_models, scs_id2label, scs_label_set, 0.01),\n    ( 'Axial T2', ss_models, ss_id2label, ss_label_set, 0.01),\n    ( 'Sagittal T1', nfn_models, nfn_id2label, nfn_label_set, 0.1)\n]","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.059133,"end_time":"2024-09-12T22:38:39.231358","exception":false,"start_time":"2024-09-12T22:38:39.172225","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:37.216741Z","iopub.execute_input":"2024-09-13T03:14:37.217492Z","iopub.status.idle":"2024-09-13T03:14:37.233246Z","shell.execute_reply.started":"2024-09-13T03:14:37.217431Z","shell.execute_reply":"2024-09-13T03:14:37.232319Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from collections import defaultdict","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.0585,"end_time":"2024-09-12T22:38:39.340679","exception":false,"start_time":"2024-09-12T22:38:39.282179","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:37.234768Z","iopub.execute_input":"2024-09-13T03:14:37.235342Z","iopub.status.idle":"2024-09-13T03:14:37.242023Z","shell.execute_reply.started":"2024-09-13T03:14:37.235270Z","shell.execute_reply":"2024-09-13T03:14:37.241127Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_rows = []\n\nfor modality, models, id2label, label_set, thresh in settings:\n    mod_df = test_df[test_df.series_description == modality]\n    \n    if SAMPLE:\n        mod_df = mod_df.sample(20, random_state=610)\n    \n    # for each study, at each level and condition, get the maximum probability score\n    for study_id, group in tqdm(mod_df.groupby('study_id')):\n        predictions = defaultdict(list)\n        for i, row in group.iterrows():\n            # predict on all images from all the series\n            series_dir = os.path.join(IMG_DIR, str(row['study_id']), str(row['series_id']))\n            for model in models:\n                results = model(series_dir, conf=thresh, verbose=False)\n                for res in results:\n                    for pred_class, conf in zip(res.boxes.cls, res.boxes.conf):\n                        pred_class = pred_class.item()\n                        conf = conf.item()\n                        _class = id2label[pred_class]\n                        predictions[_class].append(conf)\n        \n        # aggregate the result on images to obtain study-level prediction\n        for condition in label_set:\n            res_dict = {'row_id': f'{study_id}_{condition}' }\n\n            score_vec = []\n            for severity in SEVERITIES:\n                severity = severity.lower()\n                key = f'{condition}_{severity}'\n                if len(predictions[key]) > 0:\n                    score = np.max(predictions[key])\n                else:\n                    score = thresh\n                score_vec.append(score)\n                \n            # normalize score to sum to 1\n            score_vec = torch.tensor(score_vec)\n            score_vec = score_vec / score_vec.sum()\n\n            for idx, severity in enumerate(SEVERITIES):\n                res_dict[severity.replace('/', '_').lower()] = score_vec[idx].item()\n\n            pred_rows.append(res_dict)\n","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"papermill":{"duration":6.124672,"end_time":"2024-09-12T22:38:45.517430","exception":false,"start_time":"2024-09-12T22:38:39.392758","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:37.243615Z","iopub.execute_input":"2024-09-13T03:14:37.244002Z","iopub.status.idle":"2024-09-13T03:14:43.335409Z","shell.execute_reply.started":"2024-09-13T03:14:37.243964Z","shell.execute_reply":"2024-09-13T03:14:43.334266Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_df = pd.DataFrame(pred_rows)\npred_df","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"papermill":{"duration":0.0772,"end_time":"2024-09-12T22:38:45.649936","exception":false,"start_time":"2024-09-12T22:38:45.572736","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:43.336845Z","iopub.execute_input":"2024-09-13T03:14:43.337432Z","iopub.status.idle":"2024-09-13T03:14:43.361435Z","shell.execute_reply.started":"2024-09-13T03:14:43.337387Z","shell.execute_reply":"2024-09-13T03:14:43.360460Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_df.to_csv('submission_7.csv', index=False)","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"papermill":{"duration":0.06705,"end_time":"2024-09-12T22:38:45.770691","exception":false,"start_time":"2024-09-12T22:38:45.703641","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:43.362729Z","iopub.execute_input":"2024-09-13T03:14:43.363096Z","iopub.status.idle":"2024-09-13T03:14:43.374993Z","shell.execute_reply.started":"2024-09-13T03:14:43.363043Z","shell.execute_reply":"2024-09-13T03:14:43.373975Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def sample_weight(row):\n    if row['normal_mild'] == 1:\n        return 1\n    if row['moderate'] == 1:\n        return 2\n    if row['severe'] == 1:\n        return 4\n    raise ValueError('No such value')\n    \ndef get_class(row):\n    return np.argmax([row['normal_mild'], row['moderate'], row['severe']])","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"papermill":{"duration":0.061362,"end_time":"2024-09-12T22:38:45.884512","exception":false,"start_time":"2024-09-12T22:38:45.823150","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:43.376231Z","iopub.execute_input":"2024-09-13T03:14:43.377111Z","iopub.status.idle":"2024-09-13T03:14:43.383163Z","shell.execute_reply.started":"2024-09-13T03:14:43.377043Z","shell.execute_reply":"2024-09-13T03:14:43.382182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if EVAL:\n    gt_df = train_val_df.dropna().melt(id_vars=['study_id'], value_vars=all_label_set)\n    gt_df['row_id'] = gt_df['study_id'].astype(str) + '_' + gt_df['variable']\n    gt_df= gt_df[['row_id', 'value']]\n    gt_df = pd.get_dummies(gt_df, columns=['value'], dtype=int)\n    gt_df.columns = ['row_id', 'moderate', 'normal_mild', 'severe']\n    gt_df = gt_df[['row_id', 'normal_mild', 'moderate', 'severe']]\n    gt_df['sample_weight'] = gt_df.apply(sample_weight, axis=1)\n\n    gt_df1 = gt_df.merge(pred_df['row_id'], how='inner', on='row_id').sort_values('row_id').reset_index(drop=True)\n    pred_df1 = pred_df.merge(gt_df1['row_id'], how='inner', on='row_id').sort_values('row_id').reset_index(drop=True)\n    gt_df1['pred_cls'] = gt_df1.apply(get_class, axis=1)\n    pred_df1['pred_cls'] = pred_df1.apply(get_class, axis=1)\n\n    gt_df1[(gt_df1['pred_cls'] != pred_df1['pred_cls'])]\n    pred_df1[(gt_df1['pred_cls'] != pred_df1['pred_cls'])]\n    print('Label count:\\n', gt_df1['pred_cls'].value_counts(normalize=True))\n    print('Prediction accuracy:', (gt_df1['pred_cls'] == pred_df1['pred_cls']).mean())\n    print()\n\n    target_levels = ['normal_mild', 'moderate', 'severe']\n    loss = lsdc_scoring(gt_df1.drop(['pred_cls'], axis=1), pred_df1.drop(['pred_cls'], axis=1), row_id_column_name='row_id', any_severe_scalar=1)\n    print('Total weighted log loss:', loss)","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"papermill":{"duration":0.066368,"end_time":"2024-09-12T22:38:46.003237","exception":false,"start_time":"2024-09-12T22:38:45.936869","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:43.384458Z","iopub.execute_input":"2024-09-13T03:14:43.384781Z","iopub.status.idle":"2024-09-13T03:14:43.397342Z","shell.execute_reply.started":"2024-09-13T03:14:43.384735Z","shell.execute_reply":"2024-09-13T03:14:43.396411Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ls","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"papermill":{"duration":1.07562,"end_time":"2024-09-12T22:38:47.131024","exception":false,"start_time":"2024-09-12T22:38:46.055404","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:43.398443Z","iopub.execute_input":"2024-09-13T03:14:43.398736Z","iopub.status.idle":"2024-09-13T03:14:44.426539Z","shell.execute_reply.started":"2024-09-13T03:14:43.398706Z","shell.execute_reply":"2024-09-13T03:14:44.425481Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Japan [LB0.55 | Inference by tempature0.9 | RSNA2024](https://www.kaggle.com/code/taikimori/lb0-55-inference-by-tempature0-9-rsna2024)\n### [Taimo](https://www.kaggle.com/taikimori)","metadata":{"papermill":{"duration":0.052935,"end_time":"2024-09-12T22:38:47.242082","exception":false,"start_time":"2024-09-12T22:38:47.189147","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"### Training Setting\n\n* model: timm/efficientnet_b5.sw_in12k_ft_in1k\n* tempature: 0.9\n* training code: I borrowed [the notebook](https://www.kaggle.com/code/itsuki9180/rsna2024-lsdc-training-baseline) for training ","metadata":{"papermill":{"duration":0.052709,"end_time":"2024-09-12T22:38:47.347881","exception":false,"start_time":"2024-09-12T22:38:47.295172","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"## USA [3D Vision Transformer Single-Stage (Inference)](https://www.kaggle.com/code/vsahin/3d-vision-transformer-single-stage-inference)\n### [Victor S](https://www.kaggle.com/vsahin)","metadata":{"papermill":{"duration":0.054739,"end_time":"2024-09-12T22:38:50.562955","exception":false,"start_time":"2024-09-12T22:38:50.508216","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"### Dependencies\n#### timm_3d\nTimm models adapted for 3D data\n#### torchio\nMedical imaging focused library. Used for 3D augmentations here\n#### spacecutter\nOrdinal regression layer and related loss and callback functions i.e. `LogisticCumulativeLink`\n#### open3d\nUsed for point cloud initialization and transformation. At first I used this for voxelization too, but dropped it in favor of a simpler sampling approach due to slow runtime.","metadata":{"papermill":{"duration":0.054259,"end_time":"2024-09-12T22:38:50.671095","exception":false,"start_time":"2024-09-12T22:38:50.616836","status":"completed"},"tags":[]}},{"cell_type":"code","source":"%pip install --quiet /kaggle/input/timm_3d_deps/other/initial/9/pydicom/pydicom/pydicom-2.4.4-py3-none-any.whl\n%pip install timm_3d --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/timm_3d/\n%pip install torchio --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/torchio/\n%pip install itk --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/itk/itk\n%pip install skorch --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/skorch/skorch\n%pip install spacecutter --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/spacecutter/\n%pip install open3d --no-index --quiet --find-links=/kaggle/input/timm_3d_deps/other/initial/9/open3d","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"papermill":{"duration":145.725343,"end_time":"2024-09-12T22:41:16.449824","exception":false,"start_time":"2024-09-12T22:38:50.724481","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:14:44.629788Z","iopub.execute_input":"2024-09-13T03:14:44.630132Z","iopub.status.idle":"2024-09-13T03:17:15.088964Z","shell.execute_reply.started":"2024-09-13T03:14:44.630090Z","shell.execute_reply":"2024-09-13T03:17:15.087785Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_path = \"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/\"","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.062125,"end_time":"2024-09-12T22:41:16.566094","exception":false,"start_time":"2024-09-12T22:41:16.503969","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:15.090624Z","iopub.execute_input":"2024-09-13T03:17:15.090998Z","iopub.status.idle":"2024-09-13T03:17:15.096205Z","shell.execute_reply.started":"2024-09-13T03:17:15.090960Z","shell.execute_reply":"2024-09-13T03:17:15.095243Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\ndef retrieve_test_data(data_path):\n    test_df = pd.read_csv(data_path + 'test_series_descriptions.csv')\n\n    return test_df\n\nretrieve_test_data(data_path)","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.073626,"end_time":"2024-09-12T22:41:16.693585","exception":false,"start_time":"2024-09-12T22:41:16.619959","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:15.098300Z","iopub.execute_input":"2024-09-13T03:17:15.098737Z","iopub.status.idle":"2024-09-13T03:17:15.125413Z","shell.execute_reply.started":"2024-09-13T03:17:15.098694Z","shell.execute_reply":"2024-09-13T03:17:15.124532Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n\ndef retrieve_image_paths(base_path, study_id, series_id):\n    series_dir = os.path.join(base_path, str(study_id), str(series_id))\n    images = os.listdir(series_dir)\n    image_paths = [os.path.join(series_dir, img) for img in images]\n    return image_paths","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.062316,"end_time":"2024-09-12T22:41:16.811020","exception":false,"start_time":"2024-09-12T22:41:16.748704","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:15.126662Z","iopub.execute_input":"2024-09-13T03:17:15.127428Z","iopub.status.idle":"2024-09-13T03:17:15.133097Z","shell.execute_reply.started":"2024-09-13T03:17:15.127384Z","shell.execute_reply":"2024-09-13T03:17:15.132138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Data Loading\n\nQuite a few things are happening here. Refer here for more details on where the affine transforms come from: https://nipy.org/nibabel/dicom/dicom_orientation.html\n\nThe rough idea is -- converting the slices into point cloud format, transforming them into the same patient coordinate space, then converting into a voxel grid.\n\n1. Resizing each slice -- doing this first reduces the runtime from having to transform each point just to resize/downsample later anyway.\n2. Duplicating the slices and applying the affine transforms -- I found duplicating each slice by slice thickness makes it easier for the model to learn. The spatial information between slices might get somewhat warped, but the relative ordering is still the same but with much less empty space.\n3. Sampling into a voxel grid -- I am simply scaling the coordinates into the desired grid size, then sampling each channel by max.","metadata":{"papermill":{"duration":0.053315,"end_time":"2024-09-12T22:41:16.918166","exception":false,"start_time":"2024-09-12T22:41:16.864851","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import open3d as o3d\nfrom pydicom import dcmread\nimport math\nimport numpy as np\nimport cv2\nimport copy\n\ndef read_study_as_pcd(dir_path, series_types_dict=None, downsampling_factor=1, img_size=(256, 256)):\n    pcd_overall = o3d.geometry.PointCloud()\n\n    for path in glob.glob(os.path.join(dir_path, \"**/*.dcm\"), recursive=True):\n        dicom_slice = dcmread(path)\n\n        series_id = os.path.basename(os.path.dirname(path))\n        study_id = os.path.basename(os.path.dirname(os.path.dirname(path)))\n        if series_types_dict is None or int(series_id) not in series_types_dict:\n            series_desc = dicom_slice.SeriesDescription\n        else:\n            series_desc = series_types_dict[int(series_id)]\n            series_desc = series_desc.split(\" \")[-1]\n\n        x_orig, y_orig = dicom_slice.pixel_array.shape\n        img = np.expand_dims(cv2.resize(dicom_slice.pixel_array, img_size, interpolation=cv2.INTER_AREA), -1)\n        x, y, z = np.where(img)\n\n        downsampling_factor_iter = max(downsampling_factor, int(math.ceil(len(x) / 6e6)))\n\n        index_voxel = np.vstack((x, y, z))[:, ::downsampling_factor_iter]\n        grid_index_array = index_voxel.T\n        pcd = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(grid_index_array.astype(np.float64)))\n\n        vals = np.expand_dims(img[x, y, z][::downsampling_factor_iter], -1)\n        if series_desc == \"T1\":\n            vals = np.pad(vals, ((0, 0), (0, 2)))\n        elif series_desc == \"T2\":\n            vals = np.pad(vals, ((0, 0), (1, 1)))\n        elif series_desc == \"T2/STIR\":\n            vals = np.pad(vals, ((0, 0), (2, 0)))\n        else:\n            raise ValueError(f\"Unknown series desc: {series_desc}\")\n\n        pcd.colors = o3d.utility.Vector3dVector(vals.astype(np.float64))\n\n        dX, dY = dicom_slice.PixelSpacing\n        dZ = dicom_slice.SliceThickness\n\n        X = np.array(list(dicom_slice.ImageOrientationPatient[:3]) + [0]) * dX\n        Y = np.array(list(dicom_slice.ImageOrientationPatient[3:]) + [0]) * dY\n\n        for z in range(int(dZ)):\n            pos = list(dicom_slice.ImagePositionPatient)\n            if series_desc == \"T2\":\n                pos[-1] += z\n            else:\n                pos[0] += z\n            S = np.array(pos + [1])\n\n            transform_matrix = np.array([X, Y, np.zeros(len(X)), S]).T\n            transform_matrix = transform_matrix @ np.matrix(\n                [[0, y_orig / img_size[1], 0, 0],\n                 [x_orig / img_size[0], 0, 0, 0],\n                 [0, 0, 1, 0],\n                 [0, 0, 0, 1]]\n            )\n\n            pcd_overall += copy.deepcopy(pcd).transform(transform_matrix)\n\n    return pcd_overall\n\n\n\ndef read_study_as_voxel_grid(dir_path, series_type_dict=None, downsampling_factor=1, img_size=(256, 256)):\n    pcd_overall = read_study_as_pcd(dir_path,\n                                    series_types_dict=series_type_dict,\n                                    downsampling_factor=downsampling_factor,\n                                    img_size=img_size)\n    box = pcd_overall.get_axis_aligned_bounding_box()\n\n    max_b = np.array(box.get_max_bound())\n    min_b = np.array(box.get_min_bound())\n\n    pts = (np.array(pcd_overall.points) - (min_b)) * (\n                (img_size[0] - 1, img_size[0] - 1, img_size[0] - 1) / (max_b - min_b))\n    coords = np.round(pts).astype(np.int32)\n    vals = np.array(pcd_overall.colors, dtype=np.float16)\n\n    grid = np.zeros((3, img_size[0], img_size[0], img_size[0]), dtype=np.float16)\n    indices = coords[:, 0], coords[:, 1], coords[:, 2]\n\n    np.maximum.at(grid[0], indices, vals[:, 0])\n    np.maximum.at(grid[1], indices, vals[:, 1])\n    np.maximum.at(grid[2], indices, vals[:, 2])\n\n\n    return grid","metadata":{"_kg_hide-input":true,"papermill":{"duration":1.966404,"end_time":"2024-09-12T22:41:18.937893","exception":false,"start_time":"2024-09-12T22:41:16.971489","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:15.134399Z","iopub.execute_input":"2024-09-13T03:17:15.134727Z","iopub.status.idle":"2024-09-13T03:17:16.995204Z","shell.execute_reply.started":"2024-09-13T03:17:15.134696Z","shell.execute_reply":"2024-09-13T03:17:16.994208Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nfrom torch.utils.data import Dataset, DataLoader\nimport torchio as tio\nimport torch.nn as nn\nimport pydicom\n\nCONDITIONS = {\n    \"Sagittal T2/STIR\": [\"Spinal Canal Stenosis\"],\n    \"Axial T2\": [\"Left Subarticular Stenosis\", \"Right Subarticular Stenosis\"],\n    \"Sagittal T1\": [\"Left Neural Foraminal Narrowing\", \"Right Neural Foraminal Narrowing\"],\n}\n\n\nclass PatientLevelTestset(Dataset):\n    def __init__(self,\n                 base_path: str,\n                 dataframe: pd.DataFrame,\n                 transform_3d=None):\n        self.base_path = base_path\n\n        self.dataframe = (dataframe[['study_id', \"series_id\", \"series_description\"]]\n                          .drop_duplicates())\n\n        self.subjects = self.dataframe[['study_id']].drop_duplicates().reset_index(drop=True)\n        self.series_descs = {e[0]: e[1] for e in self.dataframe[[\"series_id\", \"series_description\"]].drop_duplicates().values}\n\n        self.transform_3d = transform_3d\n\n    def __len__(self):\n        return len(self.subjects)\n\n    def __getitem__(self, index):\n        curr = self.subjects.iloc[index]\n        study_path = os.path.join(self.base_path, str(curr[\"study_id\"]))\n\n        study_images = read_study_as_voxel_grid(study_path, self.series_descs)\n\n        if self.transform_3d is not None:\n            study_images = self.transform_3d(torch.FloatTensor(study_images))  # .data\n            return study_images.to(torch.half), str(curr[\"study_id\"])\n\n        return torch.HalfTensor(study_images), str(curr[\"study_id\"])\n","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.566174,"end_time":"2024-09-12T22:41:19.558863","exception":false,"start_time":"2024-09-12T22:41:18.992689","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:16.996691Z","iopub.execute_input":"2024-09-13T03:17:16.997333Z","iopub.status.idle":"2024-09-13T03:17:17.521102Z","shell.execute_reply.started":"2024-09-13T03:17:16.997276Z","shell.execute_reply":"2024-09-13T03:17:17.520308Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform_3d = tio.Compose([\n    tio.RescaleIntensity([0, 1]),\n])","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.062912,"end_time":"2024-09-12T22:41:19.677121","exception":false,"start_time":"2024-09-12T22:41:19.614209","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:17.522366Z","iopub.execute_input":"2024-09-13T03:17:17.522681Z","iopub.status.idle":"2024-09-13T03:17:17.527937Z","shell.execute_reply.started":"2024-09-13T03:17:17.522648Z","shell.execute_reply":"2024-09-13T03:17:17.527005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_subject_level_testset_and_loader(df: pd.DataFrame,\n                                             transform_3d,\n                                             base_path: str,\n                                             batch_size=1,\n                                             num_workers=0):\n    testset = PatientLevelTestset(base_path, df, transform_3d=transform_3d)\n    test_loader = DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=num_workers)\n\n    return testset, test_loader","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.066163,"end_time":"2024-09-12T22:41:19.798477","exception":false,"start_time":"2024-09-12T22:41:19.732314","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:17.529211Z","iopub.execute_input":"2024-09-13T03:17:17.529845Z","iopub.status.idle":"2024-09-13T03:17:17.539170Z","shell.execute_reply.started":"2024-09-13T03:17:17.529810Z","shell.execute_reply":"2024-09-13T03:17:17.538229Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n\ndata = retrieve_test_data(data_path)\ndataset, dataloader = create_subject_level_testset_and_loader(data, transform_3d, os.path.join(data_path, \"test_images\"))","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.07195,"end_time":"2024-09-12T22:41:19.925769","exception":false,"start_time":"2024-09-12T22:41:19.853819","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:17.540381Z","iopub.execute_input":"2024-09-13T03:17:17.540668Z","iopub.status.idle":"2024-09-13T03:17:17.568272Z","shell.execute_reply.started":"2024-09-13T03:17:17.540638Z","shell.execute_reply":"2024-09-13T03:17:17.567484Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport glob \nimport torch\n\ngrid = dataset[0][0]\n\nfig, axs = plt.subplots(3, 3)\n\naxs[0, 0].imshow(grid[0, 128])\naxs[1, 0].imshow(grid[1, 128])\naxs[2, 0].imshow(grid[2, 128])\n\naxs[0, 1].imshow(grid[0, :, 128])\naxs[1, 1].imshow(grid[1, :, 128])\naxs[2, 1].imshow(grid[2, :, 128])\n\naxs[0, 2].imshow(grid[0, :, :, 128])\naxs[1, 2].imshow(grid[1, :, :, 128])\naxs[2, 2].imshow(grid[2, :, :, 128])\n\nplt.show()","metadata":{"_kg_hide-input":true,"papermill":{"duration":21.331825,"end_time":"2024-09-12T22:41:41.314631","exception":false,"start_time":"2024-09-12T22:41:19.982806","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:17.569336Z","iopub.execute_input":"2024-09-13T03:17:17.569642Z","iopub.status.idle":"2024-09-13T03:17:38.518503Z","shell.execute_reply.started":"2024-09-13T03:17:17.569609Z","shell.execute_reply":"2024-09-13T03:17:38.517516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\ndevice = torch.device(\"cuda\") if torch.cuda.is_available() else \"cpu\"","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.065682,"end_time":"2024-09-12T22:41:41.438780","exception":false,"start_time":"2024-09-12T22:41:41.373098","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:38.519901Z","iopub.execute_input":"2024-09-13T03:17:38.520349Z","iopub.status.idle":"2024-09-13T03:17:38.525327Z","shell.execute_reply.started":"2024-09-13T03:17:38.520304Z","shell.execute_reply":"2024-09-13T03:17:38.524341Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Model Architecture\n\nI have somewhat better performance from a ViT. Might be due to better handling the gaps between slices. \n\nAlso note the LogisticCumulativeLink as the final head layer. This allows learning a continuous severity feature from ordinal labels and vice versa for inference.\n\n<!-- ![](https://www.ethanrosenthal.com/2018/12/06/spacecutter-ordinal-regression/index_11_0.png) -->","metadata":{"papermill":{"duration":0.05949,"end_time":"2024-09-12T22:41:41.557856","exception":false,"start_time":"2024-09-12T22:41:41.498366","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import torch.nn as nn\nimport timm_3d\nfrom spacecutter import *\nfrom spacecutter.losses import *\nfrom spacecutter.models import *\nfrom spacecutter.callbacks import *\n\n\nclass CNN_Model_3D_Multihead(nn.Module):\n    def __init__(self,\n                 backbone=\"efficientnet_lite0\",\n                 in_chans=1,\n                 out_classes=5,\n                 cutpoint_margin=0.15,\n                 pretrained=False):\n        super(CNN_Model_3D_Multihead, self).__init__()\n        self.out_classes = out_classes\n\n        self.encoder = timm_3d.create_model(\n            backbone,\n            features_only=False,\n            drop_rate=0,\n            drop_path_rate=0,\n            pretrained=pretrained,\n            in_chans=in_chans,\n            global_pool=\"max\"\n        )\n        if \"efficientnet\" in backbone:\n            head_in_dim = self.encoder.classifier.in_features\n            self.encoder.classifier = nn.Sequential(\n                nn.LayerNorm(head_in_dim),\n                nn.Dropout(0),\n            )\n\n        elif \"vit\" in backbone:\n            self.encoder.head.drop = nn.Dropout(0)\n            head_in_dim = self.encoder.head.fc.in_features\n            self.encoder.head.fc = nn.Identity()\n\n        self.heads = nn.ModuleList(\n            [nn.Sequential(\n                nn.Linear(head_in_dim, 1),\n                LogisticCumulativeLink(3)\n            ) for i in range(out_classes)]\n        )\n\n        self.ascension_callback = AscensionCallback(margin=cutpoint_margin)\n\n    def forward(self, x):\n        feat = self.encoder(x)\n        return torch.swapaxes(torch.stack([head(feat) for head in self.heads]), 0, 1)\n\n    def _ascension_callback(self):\n        for head in self.heads:\n            self.ascension_callback.clip(head[-1])","metadata":{"_kg_hide-input":true,"papermill":{"duration":1.73382,"end_time":"2024-09-12T22:41:43.350386","exception":false,"start_time":"2024-09-12T22:41:41.616566","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:38.526665Z","iopub.execute_input":"2024-09-13T03:17:38.526988Z","iopub.status.idle":"2024-09-13T03:17:40.104468Z","shell.execute_reply.started":"2024-09-13T03:17:38.526946Z","shell.execute_reply":"2024-09-13T03:17:40.103571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = CNN_Model_3D_Multihead(backbone=\"maxvit_rmlp_tiny_rw_256\", in_chans=3, out_classes=25).to(device)\nmodel.load_state_dict(torch.load(\"/kaggle/input/rsna-2024/pytorch/vit_voxel_v2/6/maxvit_rmlp_tiny_rw_256_256_v2_fold_3_32.pt\"))","metadata":{"_kg_hide-input":true,"papermill":{"duration":2.035628,"end_time":"2024-09-12T22:41:45.444532","exception":false,"start_time":"2024-09-12T22:41:43.408904","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:40.105745Z","iopub.execute_input":"2024-09-13T03:17:40.106113Z","iopub.status.idle":"2024-09-13T03:17:43.039930Z","shell.execute_reply.started":"2024-09-13T03:17:40.106048Z","shell.execute_reply":"2024-09-13T03:17:43.038072Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"CONDITIONS = {\n    \"Sagittal T2/STIR\": [\"spinal_canal_stenosis\"],\n    \"Axial T2\": [\"left_subarticular_stenosis\", \"right_subarticular_stenosis\"],\n    \"Sagittal T1\": [\"left_neural_foraminal_narrowing\", \"right_neural_foraminal_narrowing\"],\n}\n\nALL_CONDITIONS = sorted([\"spinal_canal_stenosis\", \"left_subarticular_stenosis\", \"right_subarticular_stenosis\", \"left_neural_foraminal_narrowing\", \"right_neural_foraminal_narrowing\"])\nLEVELS = [\"l1_l2\", \"l2_l3\", \"l3_l4\", \"l4_l5\", \"l5_s1\"]\n\nresults_df = pd.DataFrame({\"row_id\":[], \"normal_mild\": [], \"moderate\": [], \"severe\": []})\n\nALL_CONDITIONS","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.071632,"end_time":"2024-09-12T22:41:45.574356","exception":false,"start_time":"2024-09-12T22:41:45.502724","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:43.041385Z","iopub.execute_input":"2024-09-13T03:17:43.041807Z","iopub.status.idle":"2024-09-13T03:17:43.051136Z","shell.execute_reply.started":"2024-09-13T03:17:43.041756Z","shell.execute_reply":"2024-09-13T03:17:43.050086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Pre-populate results df\nimport glob\nimport os\n\nstudy_ids = glob.glob(\"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_images/*\")\nstudy_ids = [os.path.basename(e) for e in study_ids]\n\nresults_df = pd.DataFrame({\"row_id\":[], \"normal_mild\": [], \"moderate\": [], \"severe\": []})\nfor study_id in study_ids:\n    for condition in ALL_CONDITIONS:\n        for level in LEVELS:\n            row_id = f\"{study_id}_{condition}_{level}\"\n            results_df = results_df._append({\"row_id\": row_id, \"normal_mild\": 1/3, \"moderate\": 1/3, \"severe\": 1/3}, ignore_index=True)","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.145255,"end_time":"2024-09-12T22:41:45.777873","exception":false,"start_time":"2024-09-12T22:41:45.632618","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:43.052417Z","iopub.execute_input":"2024-09-13T03:17:43.052715Z","iopub.status.idle":"2024-09-13T03:17:43.097033Z","shell.execute_reply.started":"2024-09-13T03:17:43.052684Z","shell.execute_reply":"2024-09-13T03:17:43.095992Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset.dataframe","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.070815,"end_time":"2024-09-12T22:41:45.911214","exception":false,"start_time":"2024-09-12T22:41:45.840399","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:43.098311Z","iopub.execute_input":"2024-09-13T03:17:43.098599Z","iopub.status.idle":"2024-09-13T03:17:43.108542Z","shell.execute_reply.started":"2024-09-13T03:17:43.098569Z","shell.execute_reply":"2024-09-13T03:17:43.107522Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nfrom torch.cuda.amp import autocast\nimport time\n\nstart_time = time.time()\n\nwith torch.no_grad():\n    with autocast(dtype=torch.float16):\n        model.eval()\n\n        for images, study_id in dataloader:\n            output = model(images.to(device))\n            for i, batch_out in enumerate(output):\n                batch_out = output.cpu().numpy()[i]\n                for index, level in enumerate(batch_out):\n                    row_id = f\"{study_id[i]}_{ALL_CONDITIONS[index // 5]}_{LEVELS[index % 5]}\"\n                    results_df.loc[results_df.row_id == row_id,'normal_mild'] = level[0]\n                    results_df.loc[results_df.row_id == row_id,'moderate'] = level[1]\n                    results_df.loc[results_df.row_id == row_id,'severe'] = level[2]\n                \nprint(\"--- %s seconds ---\" % (time.time() - start_time))","metadata":{"_kg_hide-input":true,"papermill":{"duration":20.399329,"end_time":"2024-09-12T22:42:06.371376","exception":false,"start_time":"2024-09-12T22:41:45.972047","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:17:43.110055Z","iopub.execute_input":"2024-09-13T03:17:43.110915Z","iopub.status.idle":"2024-09-13T03:18:03.569352Z","shell.execute_reply.started":"2024-09-13T03:17:43.110870Z","shell.execute_reply":"2024-09-13T03:18:03.568252Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"results_df","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.076336,"end_time":"2024-09-12T22:42:06.506308","exception":false,"start_time":"2024-09-12T22:42:06.429972","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:18:03.570448Z","iopub.execute_input":"2024-09-13T03:18:03.570739Z","iopub.status.idle":"2024-09-13T03:18:03.584511Z","shell.execute_reply.started":"2024-09-13T03:18:03.570709Z","shell.execute_reply":"2024-09-13T03:18:03.583527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"results_df.to_csv('submission_9.csv', index=False)","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.068007,"end_time":"2024-09-12T22:42:06.633970","exception":false,"start_time":"2024-09-12T22:42:06.565963","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:18:03.585888Z","iopub.execute_input":"2024-09-13T03:18:03.586815Z","iopub.status.idle":"2024-09-13T03:18:03.597409Z","shell.execute_reply.started":"2024-09-13T03:18:03.586770Z","shell.execute_reply":"2024-09-13T03:18:03.596354Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Ensemble submissions","metadata":{"papermill":{"duration":0.059038,"end_time":"2024-09-12T22:42:06.751973","exception":false,"start_time":"2024-09-12T22:42:06.692935","status":"completed"},"tags":[]}},{"cell_type":"code","source":"if LAUNCH_VARIANT == 'option 12':\n    sm7 = pd.read_csv('submission_7.csv')\n    sm9 = pd.read_csv('submission_9.csv')\n    display(sm7,sm9)\n    sms = pd.merge(sm7,sm9, on=['row_id'])\n    sms['normal_mild'] = sms['normal_mild_x'] *0.20 + 0.80* sms['normal_mild_y']\n    sms['moderate']    = sms['moderate_x']    *0.20 + 0.80* sms['moderate_y']\n    sms['severe']      = sms['severe_x']      *0.20 + 0.80* sms['severe_y']\n    \nelif LAUNCH_VARIANT == 'option 15':\n    sm7 = pd.read_csv('submission_7.csv')\n    sm8 = pd.read_csv('submission_8.csv')\n    display(sm7,sm8)\n    sms = pd.merge(sm7,sm8, on=['row_id'])\n    sms['normal_mild'] = sms['normal_mild_x'] *0.70 + 0.30* sms['normal_mild_y']\n    sms['moderate']    = sms['moderate_x']    *0.70 + 0.30* sms['moderate_y']\n    sms['severe']      = sms['severe_x']      *0.70 + 0.30* sms['severe_y']\n    \nelif LAUNCH_VARIANT == 'option 16':\n    sm7 = pd.read_csv('submission_7.csv')\n    sm8 = pd.read_csv('submission_8.csv')\n    sm9 = pd.read_csv('submission_9.csv')\n    display(sm7,sm8,sm9)\n    sms = pd.merge(sm7,sm8, on=['row_id'])\n    sms = pd.merge(sms,sm9, on=['row_id'])\n    sms['normal_mild'] = sms['normal_mild_x'] *0.35 + 0.20* sms['normal_mild_y'] + 0.45* sms['normal_mild']\n    sms['moderate']    = sms['moderate_x']    *0.35 + 0.20* sms['moderate_y']    + 0.45* sms['moderate']\n    sms['severe']      = sms['severe_x']      *0.35 + 0.20* sms['severe_y']      + 0.45* sms['severe']\n    ","metadata":{"_kg_hide-input":false,"_kg_hide-output":false,"papermill":{"duration":0.104082,"end_time":"2024-09-12T22:42:07.043659","exception":false,"start_time":"2024-09-12T22:42:06.939577","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:18:03.599205Z","iopub.execute_input":"2024-09-13T03:18:03.599513Z","iopub.status.idle":"2024-09-13T03:18:03.640339Z","shell.execute_reply.started":"2024-09-13T03:18:03.599482Z","shell.execute_reply":"2024-09-13T03:18:03.639382Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = sms[['row_id','normal_mild','moderate','severe']]\nsub.to_csv('submission.csv', index=False, float_format='%.7f')\ndisplay(sub)","metadata":{"papermill":{"duration":0.084261,"end_time":"2024-09-12T22:42:07.189732","exception":false,"start_time":"2024-09-12T22:42:07.105471","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-09-13T03:18:03.641456Z","iopub.execute_input":"2024-09-13T03:18:03.641753Z","iopub.status.idle":"2024-09-13T03:18:03.658085Z","shell.execute_reply.started":"2024-09-13T03:18:03.641722Z","shell.execute_reply":"2024-09-13T03:18:03.657126Z"},"trusted":true},"execution_count":null,"outputs":[]}]}