{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Sørensen–Dice coefficient for the Vesuvius Challenge","metadata":{}},{"cell_type":"markdown","source":"From Wikipedia: \n\nGiven two (discrete) sets, X and Y, it is defined as:\n\n![image.png](attachment:02af39b9-bf45-4ba6-90bf-bac14b5cd682.png)\n\nAlternatively, as we are using boolean data here we could use the formula below (both give equivalent  results):\n\nUsing the definition of true positive (TP), false positive (FP), and false negative (FN), it can be written as:\n\n![download.png](attachment:c8e1d604-ff7d-479e-816c-3d449ef98cc9.png)","metadata":{},"attachments":{"c8e1d604-ff7d-479e-816c-3d449ef98cc9.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAL8AAAAmCAYAAACVg0qNAAAHiElEQVR4nO2d0XEbNxBAHzP5jo8VmEoDPrkAk0wKsNyATbkBiy4gkjL5zIzFfOUvlFNAqBQQU85/JLkBSWlAdAEx87FYA8QBx+NJFC0Rb4ZD8Q6HA8HFYrG7OEEisaY0Vt2AxLXYANrABDgGrpxzLaBXsZ495+8B8AiYBsodm/NXgXOJxK2xDYyAvnm/Ap455wfmeAfomnJTYGg+dxChP47UPQW2zOcGMpj0Ps2b/SqJRHWawDmQO8dU87fM5zGQOedV+DvOMRVonwNTNvOOd83xft2Gf0l8teoGJGrxCBHcA+eYCvsGsIkMholzvgN8ZFbTt4CzQP25OT4JHAe4qNvwROIm2GFW8+8hWrmLCLWrtRuIIPtaPqOo3ZumnkHgnqfIoPCvSSRWypi4Rt6kurnyzJTV9cMGMmuMzasVue7O8fWqG5C4EXrILNCJnNfj4wp1admc2ZmlD5zUal0isSRyxBzJS8ocIWZPFdf2KXBZsWwisTJyZr06G+blovb+UYX61N4f3lQDE4llkGEFX7X0AFnwuuTUt/fvNcnmv5tkwDtEsP1oq0Zr1XZ/at4/mWMXFBfGGeI+fW4+f4PMIOc31+QvD9+u2wYeRspeIK4y3/ertIBdpNN0mj1BNNGbQPltpLN1Wh4jfushsM897/hr0kL6L8Sued/3jk+Rvn5HceGrUWCXE8IBsHtLjo0E7mPD4B1saDu0sMqRweF2oEYJ/U7tmnoOsW6zBvJjqlZKi63ESthHhDbkzx0RFs4Lipoow2obRXNGYlpLZ5dEYiWMiLu6dEHkanPN9wj5mF1B3kQ0vj8duxwRHxiJxFJR+/swcj4k/Bo9fGf+dnFnj7GpuywjcEjRVZdILAXf25MDD4hHAkP2/gmS79EB/sHmkPSxXoVNJO/8LeW54GX55xnFwRVjQopGJubgZ3XOC4PHzneA18B7REh7wB/O+a3IdYvSCLwSiVr4mv8p8C/hBKkm8AT4k+IunwniznyDDb50EOF0y5alwuamnliZCfBXyfWL8BPWp51YL/7DmNau8DewpkloC9sOkg/umib7FP3Gava0IvXE6Jt7lLGIpi+798/ArwvUlbg/fJYLV/jb5j1kmnwHvEIE1LXZ24jw+3SY3WgxAn5AtHuovPr4y9YDLeBlyXmXc+C3kvMT4sG6xBqiQSn1tjSxQjyhuNhUk8YXsm0kM9Df8KAbnx97x/uEN04kEkulgSxGd7AmhW+jHzG7eFW6wAtkW9wrRLAz4IP5HNKsfafsBIknHBKeDe4Dvpm2iBm4jPv7hNrjykFIJpZNFdPWb0+tdt6kt2SRBqyiU2M0kQEJNsbhml9Dyncv6Xd4i50Fc3PdI/P5DFkvPTB1H2Nn1GXRQ5RTGWfMrrNG2ES4S/PSaP8YSZpb9v7dMfPlQs1kkPb3kL6eAN9if78WYoVcYTMTYht+1o4NrGeqi3TUOTYQ10I61A3qabBOB3BmrvNzmBqIcJ16x7XOWCAxRN2tg2qahvLz9wiv7zS9xQ82am5X1f2719nueEh4AGh6tq+0NxHhnhJeF15QvtlnLRkiJpe7GWSK3fjRx8YowAqTvzHkgKKw6MaQA4pU0W5Kl/KUkHnXxnKpOpF6Y3uBdVD4gzzGPvUtiwviMaFRoN4+kn0QS4wM1rXujy7JECFQLaVp1A/Me5vZ/KRYkC+nmIKtZf2HQmWm3vc12rsoofa6ruqQ7dwmLCxqwi3b7NlE0urdfutgFdSEYrt1g/2hudY1bbqEH8y19mQUp8MpVuD9KV61X1kOkzIgrN01ZbxqqkZMQ1dBtbhqwpxyz1psptCYzSJeuT3qaX7N/HVnmNOSuhpY4dbZ1p2ZNTW/wLrv5Jowa5OrVhw4513ayMLVzxsKacO2qbuDFXZ9wsLjQB0x6poOqsXdyHhOeaxENebUXKvu7i0kfSW0Kans/nXQNuwisaEMu/AOoRv4QdYkb5Hove5EazP7LNLPrLvwu7SQH/clcddrG0nvmEcTMROOsVrnHBlU8x4eW6bhXOatGVSIfsF+nyHl+VU6uN2N8EfY2SpGqM3TyLl59TxF3OU6270g/FQ5RU0e5QAR/h1sVkLwnkn4hQwRjNfEI8MqTFU222jZAeEYSYxQFPuhefmmz7wotrZhiF2PqNsvhJveshspEyNk4jyhuKaczqlbs4pH2AEbW4MoHWYVygmidJ4jg+a6yZT3njGzNnjoSQcxF2AIddXdxGP96np7yp7gFrtP2S67Ranj7dEZpqpHCcKL2Z6p55yStdW6e3tANOMRonF0v/JWoFwbsT2rCFSb8INeb4sm8zWmzyJPdVsWZfllITYpxlFAlM9HpB9C54Fk9hwQjoL+aN5z7EBoI4K/iwh1yH/fw5opV4g5sOxIrs8O1i350LRhRFwIcsTO1hTv54gb9jZTTraQNrt9fEncrMuQ76nR6B1mfw/1TGlQLMi6C/8h4QWs2sj6H08awPfm2JR4h14i+yG07CduV/AzZMb5APyObWfZbDVBhP1v81nNhdvkAtHU77GBxHn//WWMNXlCfax7SxJ3mEX+vdCXxF1scyKxHvwP74LeLQaEknEAAAAASUVORK5CYII="},"02af39b9-bf45-4ba6-90bf-bac14b5cd682.png":{"image/png":"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"}}},{"cell_type":"markdown","source":"For this notebook I will be using the mask as our predictions.","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport PIL.Image as Image\nimport matplotlib.pyplot as plt\n\ndef find_dice_coefficient1(img_ink_mask, img_ink_labels):\n    # img_ink_mask are the predictions here\n    dice_coefficient = 2*((img_ink_labels==1)*(img_ink_labels == img_ink_mask)).sum()/((img_ink_mask==1).sum()+(img_ink_labels==1).sum())\n    return round(dice_coefficient, 4)\n\ndef find_dice_coefficient2(img_ink_mask, img_ink_labels):\n    TP = ((img_ink_mask == 1) * (img_ink_labels==1)).sum()\n    FP = ((img_ink_mask == 1) * (img_ink_labels == 0)).sum()\n    FN = ((img_ink_mask == 0) * (img_ink_labels == 1)).sum()\n    dice_coefficient= 2*TP/(2*TP + FP + FN)\n    return round(dice_coefficient, 4)\n\ndef print_coefficient(image_num):\n    filepath = f'/kaggle/input/vesuvius-challenge-ink-detection/train/{image_num}/'\n    img_ink_labels = np.array(Image.open(filepath+'inklabels.png'))\n    img_ink_mask = np.array(Image.open(filepath+'mask.png'))\n    print(f\"Sørensen–Dice coefficient for train image {image_num}:\")\n    print(\"formula 1:\", find_dice_coefficient1(img_ink_mask, img_ink_labels))\n    print(\"formula 2:\", find_dice_coefficient2(img_ink_mask, img_ink_labels))\n    fig, (ax1, ax2) = plt.subplots(1, 2)\n    ax1.imshow(img_ink_labels, cmap = 'gray')\n    ax2.imshow(img_ink_mask, cmap = 'gray')\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-17T15:32:59.981038Z","iopub.execute_input":"2023-03-17T15:32:59.981460Z","iopub.status.idle":"2023-03-17T15:32:59.992922Z","shell.execute_reply.started":"2023-03-17T15:32:59.981424Z","shell.execute_reply":"2023-03-17T15:32:59.991352Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print_coefficient(1)","metadata":{"execution":{"iopub.status.busy":"2023-03-17T15:33:01.673510Z","iopub.execute_input":"2023-03-17T15:33:01.673904Z","iopub.status.idle":"2023-03-17T15:33:05.791336Z","shell.execute_reply.started":"2023-03-17T15:33:01.673870Z","shell.execute_reply":"2023-03-17T15:33:05.790077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print_coefficient(2)","metadata":{"execution":{"iopub.status.busy":"2023-03-17T15:33:05.793291Z","iopub.execute_input":"2023-03-17T15:33:05.793609Z","iopub.status.idle":"2023-03-17T15:33:15.978404Z","shell.execute_reply.started":"2023-03-17T15:33:05.793578Z","shell.execute_reply":"2023-03-17T15:33:15.977482Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print_coefficient(3)","metadata":{"execution":{"iopub.status.busy":"2023-03-17T15:33:15.980148Z","iopub.execute_input":"2023-03-17T15:33:15.980745Z","iopub.status.idle":"2023-03-17T15:33:19.664260Z","shell.execute_reply.started":"2023-03-17T15:33:15.980700Z","shell.execute_reply":"2023-03-17T15:33:19.662790Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Conclusion","metadata":{}},{"cell_type":"markdown","source":"We see that for less densely distributed labels within the mask we have a lower Sørensen–Dice coefficient.\n\nThis leads me to believe the labels within the test dataset are more sparely distributed.","metadata":{}}]}