{ "cells": [ { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEeCAYAAABmGcWlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA/DklEQVR4nO3deXgURfrA8e+bAwgkkHCFcJigiCCKuOAiIhLxWkBUEBUEBdwVUXFFVBRQDnGBdT1Q+Al4BhQVVwUERDwgrCi6HIqIuOguhDtyRZJAICT1+6OTMZPpTmaSmckx7+d55oGp6a6umkne6VR11yvGGJRSSoWGsIpugFJKqeDRoK+UUiFEg75SSoUQDfpKKRVCNOgrpVQI0aCvlFIhRIO+UkqFEA36KmSISIqImILHaRE5IiLrRGSiiNS32b6jiOSJyKZi5d+JyLsOx4gXkVwR+UvB850i8liR1xuIyAsiskNETorIQRH5QkQG+ru/StnRoK9CzRdAAnAG0A14GRgIbBWR1sW2vQuYDSSJSKci5S8B14tII5v6hwEngHccjv8+cFlB3a2BPwFvAw3K1BulfCR6R64KFSKSAjQ3xlxZrLwu8C2QZozpUVAWA+wDugIjgAhjzPAi2+8DJhljni5SjwDbgc+NMSMKynYCrxhjnhSRWOAo0McYsyyAXVXKkZ7pq5BnjDmGdUafXOTsfRDwszHmeyAFGCgi0UW2fwe4s1hVlwOtsP4SsJMFZGL9lVDHr51Qyksa9JWy/AAI0LLg+XBgHoAx5t/ALuDWItu/BLQWkcuKlN0JbDTGuM0BFDLGnAaGAH2BoyKyQUSeF5Eefu2JUiXQoK+URQr+NSLyR+B84K0ir8/D+iKwNrK+CL6l4GxfRBpgBXOns/zC/RYBzbDG8t8HzgU+F5H/8083lCqZBn2lLOcBBvgfVnCPAPYXXOVzGpgGdBSRPxTZ5yWgv4jEYZ3B52JNypbIGHPSGLPKGDPNGHMV8Dhwj4gk+bVHStnQoK9CXsHE7N3A51iBewBwL9ChyOMCYDVFzvaBBcBp4DbgL8DbxpjMMjRhW8G/dlcDKeVXERXdAKWCrIaINMEazokDLgbGADWxAv9grDP+140xJ4ruKCJvAjNE5EFjTLYxJlNE3gYmFdR1e0kHLhgCeh94HdgMZGD9hTEN2AF8558uKuVMz/RVqOkG7Ad2A19inbm/BZxnjPml4Pmy4gG/wCKgFtZ1/YXmYgX874wxG0o5dhbwFdZfEauwzvBfKPh/d2NMblk7pZS39Dp9pZQKIXqmr5RSIUSDvlJKhRAN+kopFUI06CulVAip9JdsNmzY0CQlJZVp3+zsbOrUCa0lTrTPoUH7XP2Vt78bN248ZIzxuPej0gf9pKQkNmwo7Uo4e6mpqSQnJ/u3QZWc9jk0aJ+rv/L2V0TS7Mp1eEcppUKIBn2llAohGvSVUiqEaNBXSqkQUukncp3k5+ezZ88esrOzHbepV68e27Ztc3y9OtI+Vx916tShefPmhIXpuZnynyob9A8dOoSIcM455zj+UmRmZhITExPkllUs7XP1kJ+fz969ezl06BCNGzeu6OaoaqTKnkJkZGQQHx+vZ0GqWgoLCyM+Pp7ffvutopuiqpkqGzHz8vKIjIys6GYoFTCRkZGcPn26opuhqpkqG/QBRKT0jZSqovTnWwVC0Mf0RWQAMBE4AzgADDXGfBHsdiilVHkcvDuJ/IOeN72GNUqk0eydwW+Ql4J6pi8iVwF/B4YBMcBlWImoVTUxcOBAFi9eHLTjffjhhwwdOjRox1OqUP7BNOLfMx4Puy+CyiTYwzuTgSeMMV8bY/KNMXuNMXv9VXmfPn3o1KmT69G9e3e35+V99OnTx6t2JCUlERUVRXR0NE2aNGHo0KFkZWW5Xh86dCiPPfYYX3zxBdHR0URHR1OnTh1ExPU8OjqaXbt2kZycjIiwefNmt2PccMMNiAipqam2bdi5cyci4jEmXHjsQsOHD3ddAZWSkuK2rTGGxx57jGbNmlGvXj2Sk5PZunWrY7+///57Nm/ezPXXXw/AqVOnePDBB2nevDnR0dG0bNmSBx54wPZ9iouLo3fv3uzevdutrTVq1CAmJoaYmBjOO+88xo4d6za5ed1117Ft2za+//57x3YppX4XtOEdEQkHOgEfisgvWLlGFwMP2ySgHo6Vq5T4+HjbwFavXj0yMzPdyvbu3cuaNWtcz/Py8ggPD/dbH7p37+5xTDvGGBYuXMjll19Oeno6ffv2ZfLkyUyYMAGA3NxcTp48SYcOHdi/fz8AaWlpnH/++ezevZuIiN8/lry8PFq1asUrr7zC1KlTATh8+DDr1q2jYcOGHD9+3K1NeXl5ZGZmur5kMjMz3eorPHbhPueccw59+vRh4sSJ5OTkuNX1wQcf8Oqrr7Jy5UrOOOMMpkyZwqBBg/jiC/vRuJkzZ9K/f3/XsadNm8Y333zDqlWraNKkCbt27eLLL790HaPo+5STk8Po0aO5++67efvtt11tvf/++5kwYQI5OTls3bqVCRMm0KVLF1atWuVagbBfv37MmjWLZ555ptTPpqrJycmx/fnPyspy/MKvripbn9uCbXucyn0VsP4aY4LyAJoCBtgAJAANsRJT/62k/Tp27Gjs/Pjjjx5lxbc9duyY7b5l5dSW4hITE82nn37qev7www+bXr16uZ4PGTLEjB8/3m2fHTt2GMDk5ua6lXfv3t1MnjzZNGvWzJw+fdoYY8zMmTPNiBEjTLNmzczq1avdti/ss1N9dsc2xpiuXbua119/3a1s+vTp5qabbnI9/+GHH0zNmjUd+92yZUvzxRdfuJ737t3bPPfcc47bF3+fli9fbs4+++wS23rs2DHTpEkTM3PmTFfZJ598YpKSkhyPU5XZ/ZwbYzw+91BQ2fp84EZ8KvdVefsLbDA2MTWYwzuFZ/MzjTH7jTGHgGeBXkFsQ9Dt2bOHFStW0KpVqzLX0bRpU84991w++eQTAObPn8/tt9/uryY6GjBgAL/88gvbt28nNzeXefPm8ac//cl22+zsbHbs2ME555zjKrv44ot59tlnefHFF9myZUvhl7+t48ePs3DhQi6++OIS2xQTE8NVV13l9tdG69at2blzJ8eOHfOxh0qFnqAN7xhjjorIHqyz/WqvcMw9KyuLHj16MHny5HLVd/vttzN//nzOPPNMMjIy6NKli1f7NWzY0O358ePHGTNmjFf7JiQk0K1bN8455xzCw8Np0aIFq1atst02IyMDwO3O2LFjxxIXF8eCBQt44IEHaNCgAdOmTWPIkCGubW644QYiIiLIysqicePGrFy5stR2NW3alI0bN7qeFx4zIyODunXretU3pUJVsCdyXwfuE5HGIhIHjAKWBbkNQbF48WIyMzNJTU3lp59+4tChQ+Wqr1+/fqxatYqZM2dy2223ebxeOPmbkJDArl27XOWHDh0iIyPD9bj11lu9PubkyZNZv349u3fvJicnh4kTJ9KjRw+OHz/usW1sbCyA25xAeHg49957L19++SUZGRmMHz+eO+64w22dnMWLF5ORkcHJkyeZNWsW3bt358CBAyW2a+/evdSvX9/1vPCYhW1QSjkLdtCfAqwHtgPbgG+BvwW5DUHVvXt3hg4dykMPPVSuemrXrk3Pnj2ZPXu2bdDPysoiKyuL/fv3c8YZZ5TrWIU2b97MLbfcQvPmzYmIiGDo0KEcPXqUH3/80WPbOnXqcNZZZ7F9+3bbuqKiorj33nuJi4uz3T88PJx+/foRHh7O2rVrHduUlZXFZ599Rrdu3Vxl27dvJykpSc/ylfJCUIO+MSbXGHOPMSbWGNPEGPNXY0xOMNtQEUaNGsWnn37Kd999V656pk6dypo1ayhrzmA7p06dIicnB2MMubm55OTkkJ+fD8BFF13EP//5T9LT08nPz+eNN94gNzfXcX6iV69ebldPzZgxg9TUVE6cOMHp06eZN28emZmZXHjhhR77GmNYsmQJR48epW3bth6vnzx5ko0bN3LDDTcQFxfHsGHDXK+tXbuWnj17lvetUCokVNlVNu0kJCTQqVMn1/P8/Hy/LsiWkJBQpv0aNWrE7bffzpQpU3j//ffLfPymTZvStGnTMu9v5+qrr3YF6q+++orhw4ezevVqkpOTeeSRR/j111/p0KED2dnZtGrVivfff99xGGX48OHccsstjB07FhEhKiqKBx98kF9++QURoXXr1rz//vuceeaZrn369OlDeHg4IkJiYiLz5s2jXbt2rtefeuopnn/+efLz80lKSuLaa6/lvffec0sY/d577/HWW2/59X1RqlDX6avYm3HCo/ybCmiLX9hd0lOZHr5cslmcvy/ZrAoqus8DBw40ixYtCtrxPvzwQ9O3b9+gHS/Y9JLN31VUnxMfWWZbXlUv2axWZ/qq4gX7jLtPnz4kJycH9ZhKVWVVepVNpZRSvtGgr5RSIUSDvlJKhRAN+kopFUI06CulVAjRoK+UUiFEL9lUSqkySnp0uUdZZb9pS4O+UgXGjh1LfHw8o0aNCsrxvv/+e0aMGMFXX30VlOMp/9s5vbdHWXr/CmiID6rV8E7SjCRksrgedZ+t6/a8vI+kGUlet+Wtt96iU6dOrpUve/bs6VpIbNKkSURGRrrSALZu3ZqRI0e6smiBlXlHRLj33nvd6r300ks90ho6ERF++eWXkt+zUlI7lkVKSgoiwj/+8Q+38ubNm3uVCcgp1WNxl19+OY0aNaJZs2ZccMEFLFmyxHa7YcOGlfpeHDx4kPnz53PXXXe5yqZOnUrLli2Jjo6mefPm3HLLLa7XkpOTqVWrFtHR0dSrV4/LLruMLVu2uF735jNu3749sbGxLF26tNT3RCl/qVZBP+23NMxE43ocG33M7Xl5H2m/eZfw+Nlnn2XUqFGMGzeO9PR0du3axT333OMWlG655RYyMzM5cuQIixYt4sCBA3Ts2NEtKNSpU4f58+ezc+dOf79VbpYuXUpWVhbfffcd3377LdOmTSt3nfXr1+fvf/97QBObPP/88+zfv5+9e/fy0ksvMXjwYLf3D6zF2P773/+WWldKSgq9evUiKioKgHnz5vHGG2/w2WefkZWVxYYNG7jiiivc9pk1axZZWVkcPnyY5ORkj9VPvfmMBw0axNy5c8v6Fijls2oV9CuD3377jQkTJvB///d/9OvXjzp16hAZGUmfPn08znwBIiMjadeuHQsXLqRRo0ZueV5jY2MZOnRoiQlYXnvtNdq2bUtcXBzXXHONay39yy67DIALLriA6OhoFi5cWGrbmzRpwjXXXOO2GujXX3/NJZdcQmxsLBdccIHbmXpKSgpnnnkmMTExtGzZkgULFrhea9u2LV26dOG5556zPVZ+fj7Tp0/nrLPOokGDBtx8880cOXLEre2xsbFER0ezbt062zrat2/vyv8rIuTm5rolVj99+jT33Xcfs2bNKrXvK1asoHv37q7n69ev55prruGss85yvTfDhw+33TciIoIBAwbYLhkNJX/GycnJfP7555w8ebLUNirlDxr0/WzdunXk5OTQt29fn/YLDw/n+uuv90g6Pn78eN5//33+85//eOyzePFipk6dygcffMDBgwfp1q0bd9xxBwD/+te/AGtN/KysLLehCSfFUzvu3buX3r1789hjj3HkyBGefvppbrzxRg4ePEh2djZ//etfWbFiBZmZmXz11Vd06NDBrb4pU6bw3HPPuYJ5US+88AKLFy9mzZo17Nu3j7i4ONdQVmHbMzIyyMrKKjFL2LXXXkujRo3o3LkzycnJbqusPvfcc1x22WW0b9++1L5v2bLFI9Xj/Pnz+cc//sGGDRvIy8tz3PfUqVMsWLCg1FSPdp9xs2bNiIyMtP18lQoEDfp+dvjwYRo2bOg6A/VF06ZNPQJkkyZNGDFiBBMmTPDYfu7cuYwdO5a2bdsSERHBuHHj2LJlC2lp3g1DFbrhhhuIiYmhRYsWNG7c2PWXxZtvvkmvXr3o1asXYWFhXHXVVXTq1ImPPvoIgLCwMH744QdOnDhBQkKC25LIAB06dODqq6/m73//u23b//a3v9G8eXNq1qzJpEmTeO+990odxy9u2bJl7Nu3j48++ohrrrnGtZT27t27mTt3Lk888YRX9WRkZLilehw8eDAzZ85k5cqVdO/encaNGzN9+nS3ff7617+6/hqZNWsWEydOLPU4dp9xTEyMK92kUoGmQd/PGjRowKFDh3wOXuCZBrDQI488wsqVK9m8ebNbeVpaGvfffz+xsbHExsZSv359jDHs3bvXtv6ePXu60ioWHYpxSu2YlpbGP//5T1f9sbGxrF27lv3791OnTh0WLlzInDlzSEhIoHfv3vz0008ex3ziiSeYPXu2RwrEtLQ0+vbt66q3bdu2hIeHk56ebtv2du3audpe/K+hyMhIevbsycqVK/nwww8BK3HNhAkTqFevnm19xcXFxbmlegRrvP2zzz4jIyODOXPmMGHCBLccvi+88AIZGRnk5OSwbNky+vfvz/fff1/icew+48zMTE31qIJGg76fdenShVq1arF48WKf9svPz2fp0qVuaQALNWjQgFGjRvH444+7lbdo0YK5c+e65cD99ddfueSSS2yPsWLFCldaxUGDBnm8Xjy1Y4sWLbjtttvc6s/OzubRRx8F4JprruHTTz9l//79tGnThjvvvNOjzjZt2tCvXz+mTp3q0fYVK1a41Z2Tk0OzZs0QEY96tm7d6mq73XsE1hh+4aTt559/zsMPP0yTJk1o0qQJYH02Tks/t2/f3jHVY2RkJDfddBPt27fnhx9+8Hg9LCyMbt260apVKz755BPbOsD+M963bx+nTp1yG1pSKpA06PtZvXr1eOKJJ7j33ntZvHgxx48fJzc3lxUrVjBmzBiP7XNzc9m2bRsDBw7kwIEDjB492rbe0aNH89VXX7klFR8xYgTTpk1j69atgDWJvGjRItfr8fHx/O9///Op/UVTOw4ePJilS5eycuVK8vLyyMnJITU1lT179pCens6HH35IdnY2NWvWJDo6mvDwcNs6J06cyOuvv+42hDFixAjGjx/vGoo6ePCg6+qmRo0aERYWVmLbf/rpJ1asWMGJEyfIzc3lzTff5F//+pdrMnb79u1s3ryZ7777zjUxvXTpUse5luKpHlNSUli+fDmZmZnk5+ezYsUKtm7dSufOnW33X7duHT/++KPHEBeU/BmnpqbSo0cPatas6dhXpfypWt2clVgvEZnseZboz/q9MXr0aOLj43nyyScZNGgQMTExdOzYkfHjx7u2WbhwIYsXL8YYQ9OmTbnqqqvYuHGjYzrEunXrMmbMGB555BFXWd++fcnKymLAgAGkpaVRr149kpOTuf322wHrWvEhQ4Zw4sQJXnrpJW6++eZS2148teOSJUsYM2YMAwcOJDw8nD/+8Y/Mnj2b/Px8nnnmGW677TZEhA4dOvDiiy/a1tmyZUtuu+02Zs+e7Sq7//77McZw9dVXs2/fPho3bswtt9zC9ddfT+3atRk/fjxdu3YlNzeXjz/+2GOS1BjDpEmT+PHHHwkPD+fss89m4cKF/OEPfwCgcePGHu1o2LCh65LM4m6//XY6dOjAiRMniIqKom7dukydOpXBgweTl5dHYmIis2fP5tJLL3XtM3LkSNeNXE2aNOHJJ590y9XrzWe8YMECRowYUcqnoioru3hzwGa7SsUunVZlemi6RN9on8tu7Nix5rnnnvNLXd74/vvvzcUXX1ziNpou8XeaLtE3aLpEpUpWfN4h0M4//3zHexCUChQd01dKqRCiQV8ppUJIUId3RCQVuBgovIh9rzFGr1VTSlW4rtNXsTfjhEd5s1j7yf+qqiLG9EcaY16pgOMqpZSjvRknbJdKrm50eEcppUJIRZzpTxOR6cB/gPHGmNTiG4jIcGA4WDcY2a3BXq9ePY/b5ovLy8srdZvqRvtcvRTeEFdcVlaWV7kJqpNg9NmX+ts6bO9U7quA9dfuOs5APYDOQAxQExgCZAJnlbSPXqfvG+1z9aLX6f8u0H12uh7fSVW9Tj+owzvGmG+MMZnGmJPGmHnAl0CvYLahoi1YsICrr746IHUPHTrU61UlSzNp0iQGDx4MwK5du4iOji5xeWGwzm6aN2/ul+OPGDGCKVOm+KWuknTt2pVvv/024Mcp9MILL7jWLlKqIlT0zVkG8Nu6CU6z7/7SLDaKLx/tUep2a9euZcyYMWzdupXw8HDatm3LjBkzuOiiixg0aJDtYmcV4a233uLZZ5/lp59+IiYmhg4dOjB+/Hi3pQYAzjjjjHKnUCxq2rRprFixwrVufqFDhw7RtGlTNm3axJw5cwDrS7IwhWFeXh4nT56kdu3arn2Kt2vo0KE0b96cJ598stR2LF26lJiYGC688ELAWl559OjRfPTRR2RnZ5OQkMCf//xn19IXIkLt2rUREWrVqsVVV13F7NmzXStkJicn8/XXXxMZGYmIcPbZZ3PTTTfxwAMPuNbWGT58OK1atWL06NG2S0UoFWhBC/oiEos1vLMG65LNW4DLgFH+Okbx2ffMzEy3NdLLyy7zfXHHjh3j2muvZfbs2dx8882cOnWKL774otItqPXss88yffp05syZwzXXXEONGjX4+OOPWbJkiUfQ97fbbruNxx9/nB07dtCyZUtX+TvvvMP555/Peeed5yor+iWZmprK4MGD2bNnj1/aMWfOHLcUhw888ADZ2dls27aNevXqsX37do9VNTdv3kyrVq04duwYN998M5MmTWLGjBmu12fNmsVf/vIXsrOzWb9+vWsBu88++8z1ZdGzZ0/mz5/vWs1UqWAK5vBOJPAkcBA4BNwH3GCMqVYpgwqX5y1coCwqKoqrr77alb0pJSXFLaiKCC+++CJnn302MTExPP744/z3v/+lS5cu1K1b1/XFAb8Pn0ydOpWGDRuSlJTkti5+ccuWLaNDhw7ExsZyySWXuNZ69zWlY/FE5UeOHGHYsGE0bdqUuLg4brjhBtvjv/DCC5x77rkeQbp58+b06NGDN954w618/vz5DBkyBLDO2B977DHHvpXXqVOnWLVqlUeKxFtvvZW4uDjCwsJo06YN/fv3t92/bt26XHfddY4pEuvUqUNycjIffvgh69atY/ny308YkpOT3Z4rFUxBC/rGmIPGmIuMMTHGmFhjzMXGmE+Ddfxgad26NeHh4QwZMoQVK1Zw9OjRUvf5+OOP2bhxI19//TVPPfUUw4cPZ8GCBezevZsffviBt99+27XtgQMHOHToEHv37mXevHkMHz7cNtXepk2buOOOO5g7dy6HDx/mrrvu4rrrruPkyZNlTulY6LbbbuP48eNs3bqVX3/9lQceeMBjmylTppCSksKaNWtsx/mHDBniFvT/85//8N133zFw4MAytclXP//8M2FhYW5tu/jiixk/fjyvv/46P//8c4n7Hz16lMWLF5eaIvGMM86gU6dObolf2rZt65EQR6lg0ev0/axu3bqsXbsWEeHOO++kUaNGXHfddY4ZocDKjFW3bl3atWvHeeedx9VXX82ZZ55JvXr16Nmzp8dE45QpU6hZsybdu3end+/evPvuux51vvzyy9x1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", "image/svg+xml": "\n\n\n \n \n \n \n 2022-10-17T12:36:24.972723\n image/svg+xml\n \n \n Matplotlib v3.5.1, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# IoU analysis for given 20 clicks\n", "import pickle \n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "\n", "data='DAVIS'\n", "sbd_file_vitb = f'/playpen-raid2/qinliu/models/model_0928_2022/evaluation_logs/others/sbd_vitb_epoch_54/plots/{data}_cvpr_NoBRS_20.pickle'\n", "with open(sbd_file_vitb, 'rb') as f:\n", " sbd_data_vitb = pickle.load(f)['all_ious']\n", "\n", "sbd_file_vitl = f'/playpen-raid2/qinliu/models/model_0928_2022/evaluation_logs/others/sbd_vitl_epoch_54/plots/{data}_cvpr_NoBRS_20.pickle'\n", "with open(sbd_file_vitl, 'rb') as f:\n", " sbd_data_vitl = pickle.load(f)['all_ious']\n", "\n", "sbd_file_vith = f'/playpen-raid2/qinliu/models/model_0928_2022/evaluation_logs/others/sbd_vith_epoch_54/plots/{data}_cvpr_NoBRS_20.pickle'\n", "with open(sbd_file_vith, 'rb') as f:\n", " sbd_data_vith = pickle.load(f)['all_ious']\n", "\n", "sbd_file_h18=f'/playpen-raid2/qinliu/models/model_0928_2022/evaluation_logs/others/sbd_h18_itermask/plots/{data}_cvpr_NoBRS_20.pickle'\n", "with open(sbd_file_h18, 'rb') as f:\n", " sbd_data_h18 = pickle.load(f)['all_ious']\n", "\n", "sbd_file_cdnet=f'/playpen-raid2/qinliu/projects/ClickSEG/experiments/evaluation_logs/others/sbd_cdnet_resnet34/plots/{data}_cvpr_CDNet_20.pickle'\n", "with open(sbd_file_cdnet, 'rb') as f:\n", " sbd_data_cdnet = pickle.load(f)['all_ious']\n", "\n", "sbd_file_sfb3=f'/playpen-raid2/qinliu/projects/ClickSEG/experiments/evaluation_logs/others/cocolvis_segformer_b3_s2/plots/{data}_cvpr_FocalClick_20.pickle'\n", "with open(sbd_file_sfb3, 'rb') as f:\n", " sbd_data_sfb3 = pickle.load(f)['all_ious']\n", "\n", "# load the 20th click\n", "click_id = 0\n", "sbd_iou_20_clicks_vitb = [sbd_data_vitb[i][click_id] for i in range(len(sbd_data_vitb))]\n", "sbd_iou_20_clicks_vitl = [sbd_data_vitl[i][click_id] for i in range(len(sbd_data_vitl))]\n", "sbd_iou_20_clicks_vith = [sbd_data_vith[i][click_id] for i in range(len(sbd_data_vith))]\n", "sbd_iou_20_clicks_h18 = [sbd_data_h18[i][click_id] for i in range(len(sbd_data_h18))]\n", "sbd_iou_20_clicks_cdnet = [sbd_data_cdnet[i][click_id] for i in range(len(sbd_data_cdnet))]\n", "sbd_iou_20_clicks_sfb3 = [sbd_data_sfb3[i][click_id] for i in range(len(sbd_data_sfb3))]\n", "\n", "# Plot for SBD\n", "plt.hist(sorted(sbd_iou_20_clicks_h18), bins=50, range=(0, 1.0), histtype='step', label='RITM-H18 (SBD)', alpha=0.8, color='black', density=True)\n", "# plt.hist(sorted(sbd_iou_20_clicks_sfb3), bins=50, range=(0, 1.0), histtype='step', label='FoclickClick-SF-B3 (C+L)', alpha=0.8, color='black')\n", "plt.hist(sorted(sbd_iou_20_clicks_cdnet), bins=50, range=(0, 1.0), histtype='step', label='CDNet-ResNet-34 (SBD)', alpha=1.0, color='green', density=True)\n", "# plt.hist(sorted(sbd_iou_20_clicks_vitb), bins=50, range=(0, 1.0), label='Ours-ViT-B (SBD)', alpha=0.5, color='#e85300')\n", "plt.hist(sorted(sbd_iou_20_clicks_vitl), bins=50, range=(0, 1.0), histtype='step', label='SimpleClick-ViT-L (SBD)', alpha=1.0, density=True)\n", "plt.hist(sorted(sbd_iou_20_clicks_vith), bins=50, range=(0, 1.0), histtype='step', label='SimpleClick-ViT-H (SBD)', alpha=1.0, color='#e85300', density=True)\n", "\n", "\n", "if data == 'PascalVOC':\n", " data = 'Pascal VOC' \n", "\n", "plt.xlabel(f'IoU@{click_id+1}', fontsize='x-large')\n", "plt.ylabel('Count (%)', loc='center', fontsize='x-large')\n", "plt.yticks(fontsize='large')\n", "plt.xticks(fontsize='large')\n", "\n", "plt.title(f'{data}', fontsize='x-large')\n", "plt.legend(loc='upper left', fontsize='large')\n", "plt.grid(True)\n", "plt.show()\n", "\n", "# plt.savefig(f'/playpen-raid2/qinliu/projects/SimpleClick/results/{data}_click_{click_id+1}.png', dpi=200)\n", "plt.clf()\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# IoU analysis for given 20 clicks\n", "import pickle \n", "import numpy as np\n", "\n", "# load DAVIS dataset\n", "davis_file_vitl = '/playpen-raid2/qinliu/models/model_0928_2022/evaluation_logs/others/cocolvis_vitl_epoch_54/plots/DAVIS_cvpr_NoBRS_20.pickle'\n", "with open(davis_file_vitl, 'rb') as f:\n", " davis_data_vitl = pickle.load(f)['all_ious']\n", "davis_iou_20_clicks_vitl = [davis_data_vitl[i][19] for i in range(len(davis_data_vitl))]\n", "print(len(davis_iou_20_clicks_vitl))\n", "\n", "davis_file_h32='/playpen-raid2/qinliu/models/model_0929_2022/evaluation_logs/others/coco_lvis_h32_itermask/plots/DAVIS_cvpr_NoBRS_20.pickle'\n", "with open(davis_file_h32, 'rb') as f:\n", " davis_data_h32 = pickle.load(f)['all_ious']\n", "davis_iou_20_clicks_h32 = [davis_data_h32[i][19] for i in range(len(davis_data_h32))]\n", "print(len(davis_iou_20_clicks_h32))\n", "\n", "# load SBD dataset\n", "sbd_file_vitl = '/playpen-raid2/qinliu/models/model_0928_2022/evaluation_logs/others/cocolvis_vitl_epoch_54/plots/SBD_cvpr_NoBRS_20.pickle'\n", "with open(sbd_file_vitl, 'rb') as f:\n", " sbd_data_vitl = pickle.load(f)['all_ious']\n", "sbd_iou_20_clicks_vitl = [sbd_data_vitl[i][19] for i in range(len(sbd_data_vitl))]\n", "print(len(sbd_iou_20_clicks_vitl))\n", "\n", "sbd_file_h32='/playpen-raid2/qinliu/models/model_0929_2022/evaluation_logs/others/coco_lvis_h32_itermask/plots/SBD_cvpr_NoBRS_20.pickle'\n", "with open(sbd_file_h32, 'rb') as f:\n", " sbd_data_h32 = pickle.load(f)['all_ious']\n", "sbd_iou_20_clicks_h32 = [sbd_data_h32[i][19] for i in range(len(sbd_data_h32))]\n", "print(len(sbd_iou_20_clicks_h32))\n", "\n", "# load Pascal dataset\n", "pascal_file_vitl = '/playpen-raid2/qinliu/models/model_0928_2022/evaluation_logs/others/cocolvis_vitl_epoch_54/plots/PascalVOC_cvpr_NoBRS_20.pickle'\n", "with open(pascal_file_vitl, 'rb') as f:\n", " pascal_data_vitl = pickle.load(f)['all_ious']\n", "pascal_iou_20_clicks_vitl = [pascal_data_vitl[i][19] for i in range(len(pascal_data_vitl))]\n", "print(len(pascal_iou_20_clicks_vitl))\n", "\n", "pascal_file_h32='/playpen-raid2/qinliu/models/model_0929_2022/evaluation_logs/others/coco_lvis_h32_itermask/plots/PascalVOC_cvpr_NoBRS_20.pickle'\n", "with open(pascal_file_h32, 'rb') as f:\n", " pascal_data_h32 = pickle.load(f)['all_ious']\n", "pascal_iou_20_clicks_h32 = [pascal_data_h32[i][19] for i in range(len(pascal_data_h32))]\n", "print(len(pascal_iou_20_clicks_h32))\n", "\n", "# load BraTS dataset\n", "brats_file_vitl = '/playpen-raid2/qinliu/models/model_0928_2022/evaluation_logs/others/cocolvis_vitl_epoch_54/plots/BraTS_cvpr_NoBRS_20.pickle'\n", "with open(brats_file_vitl, 'rb') as f:\n", " brats_data_vitl = pickle.load(f)['all_ious']\n", "brats_iou_20_clicks_vitl = [brats_data_vitl[i][19] for i in range(len(brats_data_vitl))]\n", "print(len(brats_iou_20_clicks_vitl))\n", "\n", "brats_file_h32='/playpen-raid2/qinliu/models/model_0929_2022/evaluation_logs/others/coco_lvis_h32_itermask/plots/BraTS_cvpr_NoBRS_20.pickle'\n", "with open(brats_file_h32, 'rb') as f:\n", " brats_data_h32 = pickle.load(f)['all_ious']\n", "brats_iou_20_clicks_h32 = [brats_data_h32[i][19] for i in range(len(brats_data_h32))]\n", "print(len(brats_iou_20_clicks_h32))\n", "\n", "# load OAIZIB dataset\n", "oaizib_file_vitl = '/playpen-raid2/qinliu/models/model_0928_2022/evaluation_logs/others/cocolvis_vitl_epoch_54/plots/OAIZIB_cvpr_NoBRS_20.pickle'\n", "with open(oaizib_file_vitl, 'rb') as f:\n", " oaizib_data_vitl = pickle.load(f)['all_ious']\n", "oaizib_iou_20_clicks_vitl = [oaizib_data_vitl[i][19] for i in range(len(oaizib_data_vitl))]\n", "print(len(oaizib_iou_20_clicks_vitl))\n", "\n", "oaizib_file_h32='/playpen-raid2/qinliu/models/model_0929_2022/evaluation_logs/others/coco_lvis_h32_itermask/plots/OAIZIB_cvpr_NoBRS_20.pickle'\n", "with open(oaizib_file_h32, 'rb') as f:\n", " oaizib_data_h32 = pickle.load(f)['all_ious']\n", "oaizib_iou_20_clicks_h32 = [oaizib_data_h32[i][19] for i in range(len(oaizib_data_h32))]\n", "print(len(oaizib_iou_20_clicks_h32))\n", "\n", "# load COCO_MVal dataset\n", "coco_file_vitl = '/playpen-raid2/qinliu/models/model_0928_2022/evaluation_logs/others/cocolvis_vitl_epoch_54/plots/COCO_MVal_cvpr_NoBRS_20.pickle'\n", "with open(coco_file_vitl, 'rb') as f:\n", " coco_data_vitl = pickle.load(f)['all_ious']\n", "coco_iou_20_clicks_vitl = [coco_data_vitl[i][19] for i in range(len(coco_data_vitl))]\n", "print(len(coco_iou_20_clicks_vitl))\n", "\n", "coco_file_h32='/playpen-raid2/qinliu/models/model_0929_2022/evaluation_logs/others/coco_lvis_h32_itermask/plots/COCO_MVal_cvpr_NoBRS_20.pickle'\n", "with open(coco_file_h32, 'rb') as f:\n", " coco_data_h32 = pickle.load(f)['all_ious']\n", "coco_iou_20_clicks_h32 = [coco_data_h32[i][19] for i in range(len(coco_data_h32))]\n", "print(len(coco_iou_20_clicks_h32))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", "# Plot for DAVIS\n", "plt.hist(sorted(davis_iou_20_clicks_h32), bins=50, range=(0, 1.0), label='RITM-H32', alpha=0.5)\n", "plt.hist(sorted(davis_iou_20_clicks_vitl)[1:-1], bins=50, range=(0, 1.0), label='SimpleClick-ViT-L', alpha=0.5)\n", "\n", "plt.xlabel('IoU')\n", "plt.ylabel('Count')\n", "plt.title('DAVIS')\n", "plt.legend()\n", "plt.grid(True)\n", "# plt.show()\n", "plt.savefig('/playpen-raid2/qinliu/models/model_1005_2022/DAVIS.png', dpi=200)\n", "plt.clf()\n", "\n", "# Plot for SBD\n", "plt.hist(sorted(sbd_iou_20_clicks_h32), bins=50, range=(0, 1.0), label='RITM-H32', alpha=0.5)\n", "plt.hist(sorted(sbd_iou_20_clicks_vitl), bins=50, range=(0, 1.0), label='SimpleClick-ViT-L', alpha=0.5)\n", "\n", "plt.xlabel('IoU')\n", "plt.ylabel('Count')\n", "plt.title('SBD')\n", "plt.legend()\n", "plt.grid(True)\n", "# plt.show()\n", "plt.savefig('/playpen-raid2/qinliu/models/model_1005_2022/SBD.png', dpi=200)\n", "plt.clf()\n", "\n", "\n", "# Plot for Pascal\n", "plt.hist(sorted(pascal_iou_20_clicks_h32), bins=50, range=(0, 1.0), label='RITM-H32', alpha=0.5)\n", "plt.hist(sorted(sbd_iou_20_clicks_vitl), bins=50, range=(0, 1.0), label='SimpleClick-ViT-L', alpha=0.5)\n", "\n", "plt.xlabel('IoU')\n", "plt.ylabel('Count')\n", "plt.title('SBD')\n", "plt.legend()\n", "plt.grid(True)\n", "# plt.show()\n", "plt.savefig('/playpen-raid2/qinliu/models/model_1005_2022/SBD.png', dpi=200)\n", "plt.clf()\n", "\n", "\n", "# Plot for BraTS\n", "plt.hist(sorted(brats_iou_20_clicks_h32), bins=50, range=(0, 1.0), label='RITM-H32', alpha=0.5)\n", "plt.hist(sorted(brats_iou_20_clicks_vitl), bins=50, range=(0, 1.0), label='SimpleClick-ViT-L', alpha=0.5)\n", "print(max(brats_iou_20_clicks_h32))\n", "print(max(brats_iou_20_clicks_vitl))\n", "\n", "plt.xlabel('IoU')\n", "plt.ylabel('Count')\n", "plt.title('BraTS')\n", "plt.legend()\n", "plt.grid(True)\n", "# plt.show()\n", "plt.savefig('/playpen-raid2/qinliu/models/model_1005_2022/BraTS.png', dpi=200)\n", "plt.clf()\n", "\n", "# Plot for OAIZIB\n", "plt.hist(sorted(oaizib_iou_20_clicks_h32), bins=50, range=(0, 1.0), label='RITM-H32', alpha=0.5)\n", "plt.hist(sorted(oaizib_iou_20_clicks_vitl), bins=50, range=(0, 1.0), label='SimpleClick-ViT-L', alpha=0.5)\n", "print(max(oaizib_iou_20_clicks_h32))\n", "print(max(oaizib_iou_20_clicks_vitl))\n", "\n", "plt.xlabel('IoU')\n", "plt.ylabel('Count')\n", "plt.title('OAIZIB')\n", "plt.legend()\n", "plt.grid(True)\n", "# plt.show()\n", "plt.savefig('/playpen-raid2/qinliu/models/model_1005_2022/OAIZIB.png', dpi=200)\n", "plt.clf()\n", "\n", "\n", "# Plot for COCO_MVal\n", "plt.hist(sorted(coco_iou_20_clicks_h32), bins=50, range=(0, 1.0), label='RITM-H32', alpha=0.5)\n", "plt.hist(sorted(coco_iou_20_clicks_vitl), bins=50, range=(0, 1.0), label='SimpleClick-ViT-L', alpha=0.5)\n", "print(max(coco_iou_20_clicks_h32))\n", "print(max(coco_iou_20_clicks_vitl))\n", "\n", "plt.xlabel('IoU')\n", "plt.ylabel('Count')\n", "plt.title('COCO_MVal')\n", "plt.legend()\n", "plt.grid(True)\n", "# plt.show()\n", "plt.savefig('/playpen-raid2/qinliu/models/model_1005_2022/COCO_MVal.png', dpi=200)\n", "plt.clf()\n", "\n", "\n", "# Plot for Pascal\n", "plt.hist(sorted(pascal_iou_20_clicks_h32), bins=50, range=(0.9, 1.0), label='RITM-H32', alpha=0.5)\n", "plt.hist(sorted(pascal_iou_20_clicks_vitl), bins=50, range=(0.9, 1.0), label='SimpleClick-ViT-L', alpha=0.5)\n", "print(max(pascal_iou_20_clicks_h32))\n", "print(max(pascal_iou_20_clicks_vitl))\n", "\n", "plt.xlabel('IoU')\n", "plt.ylabel('Count')\n", "plt.title('Pascal')\n", "plt.legend()\n", "plt.grid(True)\n", "# plt.show()\n", "plt.savefig('/playpen-raid2/qinliu/models/model_1005_2022/Pascal.png', dpi=200)\n", "plt.clf()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.8.8 ('base')", "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.8.8" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "e89c9d8a920cc6bbfac98998034c8a15ed2e75dae1678af787f4c4e38e5be518" } } }, "nbformat": 4, "nbformat_minor": 2 }