\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"resolution_rows = [\n",
" {\"model\": \"SimpleCNN\", **paired_delta(\"p1_simplecnn_baseline\", \"p2b_simplecnn_224\")},\n",
" {\"model\": \"ResNet18\", **paired_delta(\"p1_resnet18_baseline\", \"p2b_resnet18_224\")},\n",
"]\n",
"resolution_df = pd.DataFrame(resolution_rows)\n",
"display(resolution_df[[\"model\", \"before_mean\", \"after_mean\", \"delta_mean\", \"delta_ci95\", \"paired_t_p\"]]\n",
" .style.format({\"before_mean\": \"{:.4f}\", \"after_mean\": \"{:.4f}\", \"delta_mean\": \"{:+.4f}\", \"delta_ci95\": \"{:.4f}\", \"paired_t_p\": \"{:.4g}\"}))\n"
]
},
{
"cell_type": "markdown",
"id": "0354d84e",
"metadata": {},
"source": [
"Higher resolution barely changes SimpleCNN, but it substantially improves ResNet18 from AUC `0.9366` to `0.9660`. This is the first major improvement step, and it fits the architecture story: the pretrained model can use the extra spatial detail, while the smaller scratch-trained CNN cannot turn it into much additional signal.\n"
]
},
{
"cell_type": "markdown",
"id": "88538759",
"metadata": {},
"source": [
"## 3. Does normalization reveal color shortcuts?\n",
"\n",
"`real_norm` computes normalization statistics from real training images only within each fold. If this had strongly changed results, color distribution would be a stronger suspect.\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "a7da9597",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
before_mean
\n",
"
after_mean
\n",
"
delta_mean
\n",
"
delta_ci95
\n",
"
paired_t_p
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0.9660
\n",
"
0.9678
\n",
"
+0.0018
\n",
"
0.0031
\n",
"
0.3135
\n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"norm_df = pd.DataFrame([\n",
" {\"question\": \"normalization\", **paired_delta(\"p2a_t1_original\", \"p2a_t2_real_norm\")}\n",
"])\n",
"display(norm_df[[\"before_mean\", \"after_mean\", \"delta_mean\", \"delta_ci95\", \"paired_t_p\"]]\n",
" .style.format({\"before_mean\": \"{:.4f}\", \"after_mean\": \"{:.4f}\", \"delta_mean\": \"{:+.4f}\", \"delta_ci95\": \"{:.4f}\", \"paired_t_p\": \"{:.4g}\"}))\n"
]
},
{
"cell_type": "markdown",
"id": "2aa30a40",
"metadata": {},
"source": [
"The real-image normalization diagnostic is almost neutral: `real_norm` is only `+0.0018` AUC above the ImageNet/default normalization run. That difference is too small to drive the model choice, and ImageNet normalization remains the cleaner default for a pretrained ResNet because it matches the scale used during pretraining.\n"
]
},
{
"cell_type": "markdown",
"id": "5181b3ae",
"metadata": {},
"source": [
"## 4. Does source holdout reveal source-specific learning?\n",
"\n",
"A source-holdout experiment trains without one fake source, then evaluates all sources. The key number is held-out pairwise AUC versus the average pairwise AUC on the fake sources seen during training.\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "83e7cb25",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"facecrop_rows = [\n",
" {\"model\": \"SimpleCNN\", **paired_delta(\"p2b_simplecnn_224\", \"p2c_simplecnn_facecrop\")},\n",
" {\"model\": \"ResNet18\", **paired_delta(\"p2b_resnet18_224\", \"p2c_resnet18_facecrop\")},\n",
"]\n",
"facecrop_df = pd.DataFrame(facecrop_rows)\n",
"display(facecrop_df[[\"model\", \"before_mean\", \"after_mean\", \"delta_mean\", \"delta_ci95\", \"paired_t_p\"]]\n",
" .style.format({\"before_mean\": \"{:.4f}\", \"after_mean\": \"{:.4f}\", \"delta_mean\": \"{:+.4f}\", \"delta_ci95\": \"{:.4f}\", \"paired_t_p\": \"{:.4g}\"}))\n"
]
},
{
"cell_type": "markdown",
"id": "ee339e9e",
"metadata": {},
"source": [
"Facecrop helps ResNet18 but not SimpleCNN because the two models use visual evidence at different levels. ResNet18 is deeper and pretrained on ImageNet, so it already has reusable filters for edges, textures, facial parts, and object structure. Once the input is cropped around the face, that model can spend more of its capacity on the region where manipulation evidence should live, improving from 224x224 no-crop AUC `0.9660` to facecrop AUC `0.9755`.\n",
"\n",
"SimpleCNN is much smaller and trained from scratch on this limited subset. It may rely more on broad cues such as framing, background, clothing, color balance, or source-specific texture. Facecrop removes many of those cues. That is good for the intended detector, but it can hurt a low-capacity model that had not learned enough stable face-level evidence.\n"
]
},
{
"cell_type": "markdown",
"id": "2d0a1535",
"metadata": {},
"source": [
"## 6. Does augmentation help or over-regularize?\n",
"\n",
"Augmentation is tested both without facecrop and with facecrop. A useful augmentation should improve held-out AUC or reduce overfit without damaging source balance.\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "398da62a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
condition
\n",
"
model
\n",
"
before_mean
\n",
"
after_mean
\n",
"
delta_mean
\n",
"
delta_ci95
\n",
"
paired_t_p
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
no facecrop
\n",
"
SimpleCNN
\n",
"
0.7853
\n",
"
0.7346
\n",
"
-0.0507
\n",
"
0.0060
\n",
"
7.851e-05
\n",
"
\n",
"
\n",
"
1
\n",
"
no facecrop
\n",
"
ResNet18
\n",
"
0.9660
\n",
"
0.9665
\n",
"
+0.0005
\n",
"
0.0055
\n",
"
0.8721
\n",
"
\n",
"
\n",
"
2
\n",
"
facecrop
\n",
"
SimpleCNN
\n",
"
0.7661
\n",
"
0.7136
\n",
"
-0.0525
\n",
"
0.0074
\n",
"
0.0001544
\n",
"
\n",
"
\n",
"
3
\n",
"
facecrop
\n",
"
ResNet18
\n",
"
0.9755
\n",
"
0.9737
\n",
"
-0.0018
\n",
"
0.0035
\n",
"
0.3733
\n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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AML9PDfGU6H0gVu3br1kuxaHi87CGQAAAACSnxgHFk2aNHHt2rVzU6ZMsWBCt88++8ymQjVr1ix+9hIAAABA8qoK9c4779hCeC1btrTcCtHq208//bR766234mMfASDJOnHihMuUKZPdP378uMuYMWNC7xIAAPEixjkWHuVSbNy40e6rIlSGDBlcuCLHAkBkCCwAAElZvK687VEgUbJkySt9OwAAAIBkJFqBRePGjd348eMtStH9qEyfPj2u9g0AAABAcgosNPyhvApRcOHdBwAAAIBY5Vjg/yHHAkBkyLEAACRl8bqORY0aNdzhw4dD/lI9BwAAACD8xDiwWLhwoTt79uwl20+fPu1+/PHHuNovAAAAAElItKtCrV692n//r7/+crt37/Y/vnDhgpszZ4674YYb4n4PAQAAACSfwKJUqVKWtK1bqClP11xzjRsxYkRc7x8AAACA5BRYbN682SnPu3Dhwm758uUuR44c/ufSpk3rcubM6VKlShVf+wkAAAAgOQQWBQoUsJ8XL16Mz/0BAAAAkARd8crbyrPYunXrJYnc9evXj4v9AgAAAJCcA4tNmza5Ro0auTVr1li+hbcMhrdonhK5AQAAAISXGJebff75512hQoXc3r17XYYMGdzatWvd4sWLXdmyZa0ULQAAAIDwE+PAYunSpa5v377u+uuvdylTprRblSpVXP/+/V2nTp3iZy8BAAAQFk6cOOGvRKr7SMaBhaY6XXvttXZfwcXOnTv9yd0bNmxw8e29995zBQsWdOnTp3cVKlSwClVRmTp1qitWrJi9vmTJku7bb7+N8Lymcr366qsuT548VjK3Zs2a7p9//onnvwIAAAAI88CiRIkSbtWqVXZfJ/Zvv/22+/nnn20UQ6Vo49OUKVNcly5dXO/evd1vv/3m7rjjDlerVi2blhXKkiVLXLNmzVy7du3c77//7ho2bGi3P//80/8a7f/w4cPdqFGj3LJly1zGjBntM7WSOAAAAIDoSeHzsq+j6bvvvrNhqcaNG7t///3X1atXz/39998ue/bs7rPPPnP33nuviy8KZMqVK+feffddf+nbfPnyueeee8717Nnzktc3adLE9nXmzJn+bRUrVrTF/hRI6E/Pmzev69q1q+vWrZs9f+TIEZcrVy43fvx417Rp02jt19GjR12WLFnsvZkzZ46zvxdA0qc+KFOm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ly8f1/sHAAAAIDkGFh999JHbtWuXy58/vytSpIjddH/Hjh1u7Nix8bOXAAAAAJJXjoUCidWrV7u5c+e69evX27bixYu7mjVrRqgOBQAAACB8xDiwEAUQ999/v90AAAAAIFqBxfDhw6P9TXXq1IlvFQAAAAgz0QoshgwZEuHxvn373MmTJ/3VobSWhcrN5syZk8ACAAAACEPRSt7evHmz//bmm2/aAnlar+LgwYN2030tkPf666/H/x4DAAAASPpVoV555RU3YsQIV7RoUf823deoxssvv+ziiwKY5s2bu8yZM9tISbt27dzx48ejfM/p06fds88+67Jnz+4yZcrkHnrooQhlcg8cOOBq167t8ubN69KlS+fy5cvnOnbs6I4ePRpvfwcAAACQHMU4sFCp2fPnz1+y/cKFCxFO2uOagoq1a9daNaqZM2e6xYsX20rfUencubObMWOGmzp1qlu0aJHbuXOna9y4sf/5lClTugYNGrhvvvnG/f333278+PHuhx9+cE899VS8/R0AAABAchTjqlD33nuve/LJJ92YMWNs+pOsXLnSPf3001ZyNj5oqtWcOXPcihUrXNmyZW2bRk3q1Knj3nnnHRtxCHbkyBFbV2PSpEmuRo0atm3cuHFWGveXX35xFStWdNddd53tt6dAgQLumWeecQMHDoyXvwMAAABIrq5ogbzcuXPbCb6mD+mmFbdz5cplwUZ8WLp0qU1/8oIKURCjEYdly5aFfI+CnXPnzkUIdooVK2aL+enzQtGIxvTp0121atWi3J8zZ87YdKnAGwAAABDOYjxikSNHDvftt9/a1CFvgTydsN9yyy0uvuzevdsqTgVKnTq1y5Ytmz0X2XvSpk3rr1zlUQAU/J5mzZq5r7/+2p06dco9+OCDlw2Q+vfv7/r06XPFfw8AAADgwn3EwqNAon79+na70qCiZ8+ettheVDcveIlPSjz/7bffLLjYuHGj69KlS5Sv79Wrl0218m7btm2L930EAAAAkt3K29u3b7eE561bt7qzZ89GeG7w4MHR/pyuXbu61q1bR/mawoUL29SrvXv3RtiuBHJVitJzoWi79k1rbASOWijBPPg9eqybRl40CnL33Xdb9as8efKE/GxvChgAAACAKwws5s2bZ6MUOuHXaEKJEiXcli1bnM/n8ydzx2RalW6XU6lSJQsQlDdRpkwZ2zZ//nx38eJFV6FChZDv0evSpElj+6sys7JhwwYLhvR5kdFnenkUAAAAAOJpKpSmAXXr1s2tWbPGpU+f3n3xxRc2FUgJz4888oiLD6rkpPUm2rdv75YvX+5+/vlnW2+iadOm/opQO3bssBEHPS9ZsmSxtS40rWnBggUWlLRp08aCClWEEuWKqFLUn3/+acHRrFmzrNTsXXfd5QoWLBgvfwsAAACQHKW8ktKvLVu29CdQK+FZi8/17dvXDRgwwMWXiRMnWuCgcrcqM1ulShU3evRo//OqAKURiZMnT0bInahXr56NWFStWtWmO6nqk+eaa65xH374oX2Wghete6HRGK2TAQAAACAep0JlzJjRn1ehHAQlO9922232eP/+/S6+KPdBa1JERiMMmo4VSCMq7733nt1CqV69uluyZEmc7ysAAAAQbmIcWGga0U8//WRX+DVyoARsTYvSSIA3xQgAAABAeIlxYKGqT8ePH7f7WstB96dMmeJuvvnmGFWEAgAAABDGgYWqQQVOixo1alRc7xMAAACAcFkgDwAAAAA8BBYAAAAAYo3AAgAAAECsEVgAAAAAiDUCCwAAAABXvyqUFqGbNm2aW7Bggdu7d6+7ePFihOcDV7YGAAAAEB5iHFi88MIL7oMPPrBVq3PlyuVSpEgRP3sGAAAAIPkGFp988omNSmjVbQAAAAC4ohyLLFmyRFgkDwAAAABiHFi89tprrk+fPu7UqVN8ewAAAACubCrUo48+6iZPnuxy5szpChYs6NKkSRPh+d9++y2mHwkAAAAg3AKLVq1auZUrV7oWLVqQvA0AAADgygKLWbNmue+++85VqVIlpm8FAAAAkEzFOMciX758LnPmzPGzNwAAAADCI7AYNGiQ69Gjh9uyZUv87BEAAACA5D8VSrkVJ0+edDfddJPLkCHDJcnbBw8ejMv9AwAAAJAcA4uhQ4fGz54AAAAACK+qUAAAAAAQq8BCLly44L766iu3bt06e3zbbbe5+vXru1SpUl3JxwEAAAAIt8Di33//dXXq1HE7duxwRYsWtW39+/e3alEqRavcCwAAAADhJcZVoTp16mTBw7Zt22yVbd22bt3qChUqZM/FFyWFN2/e3ErdZs2a1bVr184dP348yvecPn3aPfvssy579uwuU6ZM7qGHHnJ79uwJ+doDBw64G2+80aVIkcIdPnw4nv4KAAAAIHmKcWCxaNEi9/bbb7ts2bL5t+nE/a233rLn4ouCirVr17q5c+e6mTNnusWLF7sOHTpE+Z7OnTu7GTNmuKlTp9q+7dy50zVu3DjkaxWo3H777fG09wAAAEDyFuPAIl26dO7YsWOXbNfoQdq0aV18UC7HnDlz3JgxY1yFChVs1e8RI0a4zz77zIKFUI4cOeLGjh3rBg8e7GrUqOHKlCnjxo0b55YsWeJ++eWXCK99//33bZSiW7du8bL/AAAAQHIX48CiXr16NlKwbNky5/P57KYT9aeeesoSuOPD0qVLbfpT2bJl/dtq1qzpUqZMafsRysqVK925c+fsdZ5ixYq5/Pnz2+d5/vrrL9e3b183YcIE+zwAAAAAMRfjM+nhw4dbjkWlSpVc+vTp7XbXXXe5IkWKuGHDhrn4sHv3bpczZ84I21KnTm3TsfRcZO/RCIoCkkC5cuXyv+fMmTOuWbNmbuDAgRZwRJfed/To0Qg3AAAAIJzFqCqURid0Eq0pSKoK5ZWbLV68uAUWMdWzZ083YMCAKF/j/Y740KtXL9t3rSYeE6qC1adPn3jbLwAAACDZBxYKIJREffPNN19RMBGoa9eurnXr1lG+pnDhwi537txu7969EbafP3/eKkXpuVC0/ezZs5Y7EThqoapQ3nvmz5/v1qxZ46ZNm+b/++T66693//vf/yINHhSQdOnSxf9YwZbK7QIAAADhKkaBhXIQFFCoNKt+xlaOHDnsdjmadqUAQXkTSsL2goKLFy9aMncoel2aNGncvHnzrMysbNiwwUrj6vPkiy++cKdOnfK/Z8WKFa5t27buxx9/jHI9DiWw6wYAAADgChfIU1nZ7t27WyWlEiVKuKtB05Vq167t2rdv70aNGmVJ2R07dnRNmzZ1efPmtddoata9995rSdjly5d3WbJksRKyGllQLobWv3juuecsqKhYsaK9Jzh42L9/v//3BedmAAAAAIjDwKJly5bu5MmT7o477rDk6GuuuSbC85qeFB8mTpxowYSCB42caBRCieQeBRsakdC+eYYMGeJ/rRKua9Wq5UaOHBkv+wcAAACEsxgHFkOHDnUJQaMOkyZNivT5ggUL+nMkPKpY9d5779ktOu65555LPgMAAABAHAUWmk70+uuvu4wZM7pChQq5ypUrW7lXAAAAAIj2OhZa5Vora0v16tXjbboTAAAAgKQpWsMOmmakfIb777/fpgpp5errrrsu5GurVq0a1/sIAAAAIDkEFlqZ+qmnnrKF4VKkSOEaNWoU8nV67sKFC3G9jwAAAACSQ2DRsGFDu2k6lMq2qvpSzpw543/vAAAAACQJMcrAzpQpk1uwYIElcJO8DQAAAMAT49JO1apVi+lbAAAAACRz0aoKBQAAAABRIbAAAAAAEGsEFgAAAACuXmChMrKrV692p06duuS5kydP2nMXL16M/R4BV+DEuXMu99BhdtN9AAAAJNLA4pNPPnFt27Z1adOmveQ5bdNzkyZNiuv9AwAAAJCcAouxY8e6bt26uVSpUl3ynErP9ujRw40ePTqu9w8AAMQDRnoBJFhgoUXxKlasGOnz5cqVc+vWrYur/QIAAACQHAOLEydOuKNHj0b6/LFjxyzXAgAAAED4iXZgcfPNN7slS5ZE+vxPP/1krwEAAAAQfqIdWDz22GPu5ZdftupPwVatWuVeffVVew0AAACA8JM6ui/s3Lmzmz17titTpoyrWbOmK1asmG1fv369++GHH9xdd91lrwEAAAAQfqIdWKRJk8Z9//33bsiQIVZWdvHixc7n87lbbrnFvfnmm+6FF16w1wAAAAAIP9EOLESBg8rK6gYAAAAAMQ4sIqsIlTFjxpBrWwAAAAAIH9FO3s6aNau77rrrLrldc801rmjRou7DDz+M3z0FAAAAkPRHLBYsWBBy++HDh93KlStd9+7dbQXuNm3axOX+AQAAAEhOgUW1atUifa5BgwauYMGCbsSIEQQWAAAAQBiK9lSo6AQe//77r4svBw8edM2bN3eZM2e2aVnt2rVzx48fj/I9p0+fds8++6zLnj27y5Qpk3vooYfcnj17IrwmRYoUl9w+++yzePs7AAAAgOQozgKLI0eOuCxZsrj4oqBi7dq1bu7cuW7mzJlW7rZDhw5RvkfrasyYMcNNnTrVLVq0yO3cudM1btz4kteNGzfO7dq1y39r2LBhvP0dAAAAgAv3crOROXfunBs4cKCrUKGCiw/r1q1zc+bMcStWrHBly5a1bZp2VadOHffOO++4vHnzhgx0xo4da2tu1KhRwx9AFC9e3P3yyy+uYsWK/tdqBCR37tzxsu8AAABAOIh2YBHqSr93Aq+RBE0h+vHHH118WLp0qZ38e0GFaPXvlClTumXLlrlGjRpd8h4llCvg0es8Wi08f/789nmBgYWmSz3xxBOucOHC7qmnnrI8Ef09AAAAAOI4sIhsmlO+fPksd0FTleJrKtTu3btdzpw5I2xTBaps2bLZc5G9J23atBaQBMqVK1eE9/Tt29dGNDJkyGAriz/zzDOWu9GpU6dI9+fMmTN2u9waHwAAAEC4iHZgoWlEca1nz55uwIABl50GFZ9eeeUV//3SpUu7EydO2LSuqAKL/v37uz59+sTrfgEAAABhl7ytK/bvv/9+hKlK0dG1a1cLHKK6aXqS8h/27t0b4b3nz5+3SlGR5UZo+9mzZ22djUCqChVVPoXyRLZv3x5hRCJYr169bAqYd9u2bVuM/m4AAAAguYlV8rYWzfvoo4/c9OnTbRpUqFyHqOTIkcNul1OpUiX/QnxlypSxbfPnz3cXL16MNGFcr0uTJo2bN2+eTdWSDRs2uK1bt9rnReaPP/6wFcXTpUsX6Wv0XFTPX225hgx14U4jTe69kXY/14C3XcaMGRN6lwAAAMJKjAOLHTt2uPHjx9vUKJ3sHzp0yCovPfroo/GW8KxKTrVr13bt27d3o0aNsqTsjh07uqZNm/orQmm/7r33XjdhwgRXvnx5C3S01kWXLl0sF0PrXzz33HMWVHiJ2ypFqxEMPU6fPr2Vsu3Xr5/r1q1bvPwdAAAAgAv3qVBffPGFlXctWrSoXdUfNGiQrQuhykwlS5aM9ypKEydOtKpOCh60H1WqVHGjR4/2P69gQyMSJ0+e9G8bMmSIq1evno1YVK1a1aZAaXTFoxGN9957z4KNUqVKuQ8++MANHjzY9e7dO17/FgAAACBsRyyaNGniXnzxRTdlyhR37bXXuqtNow4aGYlMwYIFnc/ni7BNoxAKHHQLRaMgugEAAAC4SiMWmlakE3SdiGs6kqZAAQAAAECMAgtNE9q1a5fr0KGDmzx5ssuTJ49r0KCBjRIoiRoAAABA+ErhC54/FE3//POPJXB//PHHtqBc3bp13cMPPxzpCt3JmcrtKllcpWeVJI6EqQqVKVMmu6/2SFUoAKDfBHB1z3OveB2Lm2++2SooaQ2HTz/91JKmmzVrdqUfBwAAACBc17EQVYV68MEH7Ra8iB0AAACA8BAnK297cubMGZcfBwAAACAcAwsAAAAA4YnAAgAAAECsEVgAAAAAiDUCCwAAAABXvyrUhQsX3JAhQ9znn3/utm7d6s6ePRvh+YMHD8Z+rwAAAAAk7xGLPn36uMGDB7smTZrYQhldunSxRfFUdva1116Ln70EAAAAkLwCi4kTJ7oPP/zQde3a1aVOndoWxRszZox79dVX3S+//BI/ewkAAAAgeQUWu3fvdiVLlrT7mTJlslELqVevnps1a1bc7yEAAACA5BdY3HjjjW7Xrl12/6abbnLff/+93V+xYoVLly5d3O8hAAAAgOQXWDRq1MjNmzfP7j/33HPulVdecTfffLNr2bKla9u2bXzsIwAAAIDkVhXqrbfe8t9XAneBAgXckiVLLLh48MEH43r/AAAAACTHwGLx4sWucuXKlrgtFStWtNv58+ftuapVq8bHfgJRypgxo/P5fHxLAAAASWUqVPXq1UOuVaEkbj0HAAAAIPzEOLDQVeEUKVJcsv3AgQN21RgAAABA+In2VCgtgicKKlq3bh2hApRW4169erVNkQIAAAAQfqIdWGTJksU/YnHttde6a665xv9c2rRpLc+iffv28bOXAAAAAJJHYDFu3Dj7WbBgQdetWzemPQEAAAC48qpQvXv3julbAAAAACRz0UreLl26tLvzzjujdYsvqkTVvHlzlzlzZpc1a1bXrl07d/z48Sjfc/r0affss8+67Nmzu0yZMrmHHnrI7dmz55LXjR8/3t1+++0uffr0LmfOnPYeAAAAAHE8YtGwYUOX0BRU7Nq1y82dO9edO3fOtWnTxnXo0MFNmjQp0vd07tzZzZo1y02dOtVyRDp27GhJ6D///LP/NYMHD3aDBg1yAwcOdBUqVHAnTpxwW7ZsuUp/FQAAAJA8pPAlgVXF1q1b52699Va3YsUKV7ZsWds2Z84cV6dOHbd9+3aXN2/ekOtq5MiRwwKPhx9+2LatX7/eFS9e3C1dutSSzQ8dOuRuuOEGN2PGDHfvvfde8f4dPXrUAhf9To2oAACQ2OlCmkbzRTMAKBkPILbnuTFex0IOHz7sxowZ43r16uVfLO+3335zO3bscPFBgYCmP3lBhdSsWdOlTJnSLVu2LOR7Vq5caSMbep2nWLFiLn/+/PZ5otGPixcv2n4r4Ljxxhvdo48+6rZt2xbl/pw5c8a+5MAbAAAAEM5iHFhovYpbbrnFDRgwwL3zzjsWZMj06dMt0IgPu3fvttyHQKlTp3bZsmWz5yJ7j8rgKiAJlCtXLv97Nm3aZIFFv3793NChQ920adMsULrvvvvc2bNnI92f/v37W+Tm3fLlyxcnfycAAFeLRig0aUE3RisAJEhg0aVLF1sg759//rFkZ4+mJS1evDhGn9WzZ09bcC+qm6YvxRcFFRrVGD58uKtVq5ZNj5o8ebL9bQsWLIj0fQqgNBzk3S43wgEAAAAkdzEuN6s8hw8++OCS7cpViGz0IDJdu3a1ICUqhQsXdrlz53Z79+6NsP38+fM2uqDnQtF2jTpoRCVw1EJVobz35MmTx34qf8OjvIzrr7/ebd26NdJ90qrjgSuPAwAAAOEuxoGFTqhD5RT8/fffdlIeE3p9dN5TqVIlCxCUN1GmTBnbNn/+fBtxUCWnUPS6NGnSuHnz5lmZWdmwYYMFDPo8ueuuu/zblV8hClb279/vChQoEKO/BQAAAAhnMZ4KVb9+fde3b1+bQiSarqST9RdffNF/Ah/XlFhdu3Zt1759e7d8+XIrF6vSsU2bNvVXhFICtpKz9bwo90FrXWjqlqY1KShRiVoFFZryJMoVadCggXv++efdkiVL3J9//ulatWpln1O9evV4+VsAAACA5CjGgYXWfFBZOiVTnzp1ylWrVs0VKVLEXXvtte7NN9+Mn710zk2cONFO+FUWVvkcVapUcaNHj/Y/r0BHIw8nT570bxsyZIirV6+eBTxVq1a1KVBKMg80YcIEG/WoW7eu/S0a5VApW/0EAAAAEM/rWPz0009WIUpBhlbcDizrGm5YxwIAAADhfp6bJBbIS+wILAAAABDu57kxSt5WsvT48eNtOtGWLVssv6JQoUK2svXjjz9ujwEAAACEn2jnWGhgQ4nbTzzxhCVKlyxZ0t12223uv//+s5KxjRo1it89BQAAAJBoRXvEQiMVWgBP5VuDKyap9GvDhg0tEbply5Yu3HizyUKV4QUAAACSKu/8NjrZE9HOsbj//vtdjRo1bLXsUPr16+cWLVrkvvvuOxdutm/f7vLly5fQuwEAAADEi23btvnXfYt1YKFSrSrDWqpUqZDP//777+6BBx6I8erbyYFyT3bu3Gkld8kzSdiIWgGeGv7lkouAq4m2icSKtonEiraZeChUOHbsmK0dlzJlyriZCqUVqXPlyhXp83ru0KFDLhzpS75cBIerR0EFgQUSI9omEivaJhIr2mbioKpQcZq8feHCBZc6deRxSKpUqdz58+ej+3EAAAAAkpHUMRkGUfWndOnShXz+zJkzcblfAAAAAJJjYNGqVavLviYcK0Ih8VDQ27t370iDXyCh0DaRWNE2kVjRNpMmVt4GAAAAEGvRzrEAAAAAgMgQWAAAAACINQILAAAAALFGYAGEGW9NzGiujQnEefvToqK0QSQGXlsEEoovmR2LCSyAMKPV4bVSPKvEIyFO4tTutKjouXPnaINIcN4qwlqrC0iIoDZFihTJ6osnsADC7Grc119/7apXr+5mzJiRIPuE8D6J27p1q3vyySddw4YNXZ8+fdyvv/5qz3HlGAlxdfj06dOucuXK7u233+YfAAkS1M6bN8+1a9fODRw40C1atChkO01KCCyAMOi4Ak/cChYs6IoUKeKmT5+egHuGcKMD5ahRo1zp0qXdgQMHXJUqVdyUKVNct27d3MmTJyO0VSA+2l+oq8Pp06d35cqVc2PGjHFnz57li8dVs3XrVlerVi3XokULd/78ebvoV7NmTbdx48YkPYpBTw4k4/yJjz76yLVt29atWbPGf+J2xx13uLvuusutWrXKLV26NEH3F8lPZFfaDh8+7D788EPXv39/N23aNNerVy/34osvuiNHjrj//vvvqu8nwqst6kTtxIkTbvDgwe7zzz+P8HynTp3c7t27LdAF4qsNBlMgoYsqy5cvdx9//LGbPXu2y5cvX5K/6EdgASQj3lUO/Tx27Jjr2LGjGz9+vKtbt64dTHVgFU2FypYtm/vkk08SeI8RLvOFt2zZ4g4dOuQyZcrk33bq1CkbwShevPhV20+Ej8C2eObMGZt6pxGypk2bWpC7Z88ee65QoULuscces6koQFznlEVm8uTJNoNAwYRo1OLmm292tWvXdkkZgQWQjLzzzjt2O3r0qLv22mvtIHrrrbfaKEXv3r1tbrtUrFjRRi2WLVvm/vzzz4TebSQD3oiYAtlnn33WhvMDk2KzZMniSpUqZSMVOqDWr1/fPfPMM+733393rVu3tnnGga8HYkuBg4KJHTt2uHTp0rmqVavaRRWdyH311VeW56ORCrVdjVqsW7eO3DPEmZQpU9qI7Msvv+xWr17t79+8UYwHH3zQ+sJPP/3UffbZZzY9dOXKlW7YsGHuyy+/TLL/EgQWQBIUnOjqnYxt2LDBjR492q4OixLCjh8/bgdTJSf+/PPPrk6dOu6PP/5wjz76qF091okgEFs6cD7wwAPuueeesyH+BQsW2PZUqVLZz8KFC1sbfPXVV+2nqkJpKp4CXl2pe/jhhyO8HoiuyBL/f/rpJztp003Kly/vSpYs6XLnzu0GDRpk79NorqbmaXuzZs3cm2++yRePWDtz5oz74IMPbES2X79+7n//+59t1wiGN4qhiyxvvPGGBbM6Vj/yyCN2/E6dOrVr06aNBb9JEYEFkESvhOjqmpcj4V0B0fx1JcYuXLjQppkUKFDA3XPPPXaiV6ZMGfftt9+67Nmz2wmgRit0oP3ll1/8gQgQ05M477GuzClQ/eabb2xkQoHFrl27IrxGRQM0gqY2qqkoFSpUsKvGOrjqYKp2Gtiegej2h/Lvv/9G2H7vvffa7bvvvrP2mTNnTrsqrGmiyjtbsmSJPa+RM53k6aeqlOkCDBAdwX2V7/8e79+/3yo8KUAYMmSIBbm68Ke2GjhqoVkFeqwLLq+99ppr3LixFblQX+ldnElq/SGBBZDETuTUyejk7bbbbnM1atRwEyZM8I9YXH/99TbFZNKkSf5goWvXrnbA1Ulb0aJFLa9Cc4yHDh1qV0oOHjzoT2YELkcHRq2DsnnzZv9jKVu2rF3t1eiYRh90EJ0/f36E14hO3BR4aKqeZ+3atS5NmjQuY8aM9jgpV0TB1e8T9+3bZ33bLbfcYgUBVEJWsmbN6u6++24LJDTlxJsGqoB2xIgRFsxq9Oytt96yUQ1NI9V7VPQCiA6vr/L6wxT/9/iGG25w7du3t+OvLp7ogopGLoLfp5ENXdyrVq2aPdYFQVFfuG3btgivTSoILIBEfvD0TsoUKHiLihUrVswCiwwZMtiV31atWlnpOunZs6f766+/bDRDr9cQf6VKlSwYWb9+vb1GB9N3333XAhJtmzlzpv9gDFyO2p7aj6iSjtrgNddcYyd28tBDD7nMmTNbYKHAVTTdSbT9n3/+ccOHD7c58JqWN3bsWH/eDxCdPlEXWHRSJjly5LDpTWpbaotKxPbWA9CIrYIOzVlXf3jjjTfaKIVGzXQBRlQ5T9OhNA1P7XXcuHHWRoHoUECqiylqU6K2pGBWF1l0jM6TJ49Ns9PFPeX0qJ15FwPVB2qaqKbmqbiFLrBMnDjRPkvFV5IkH4BEbeTIkb7y5cv7ateu7WvdurVvwYIFtv2VV17x5c6d2/fbb7/5ihcv7itdurRv+fLl9lzTpk191apV8/3777/2ePHixb4bbrjB9/HHH0f47A0bNvgmTZrkO3XqVAL8ZUhqzp49az+HDh3qy5Ytmy9nzpz284MPPvC/5sKFC/ZzyJAh1m6/+OKLCNulc+fO9t6yZcv6rr32Wl+zZs1827dvv+p/D5KegwcP+nr27OmrUaOGtZtx48bZ9qlTp/qKFi3qe/PNN32PPvqo7/rrr/d9/fXX9txnn33mu+OOO3yffPKJPVa/2KRJE+tTA6mN9u7d2/fpp58mwF+GpObixYv288cff/RVrFjRd9ddd/lSpEhhPw8cOBCh31u7dq21wU6dOtnjc+fO+Z//6quvfNdcc42vTJkydixX36g+NrDPTEoILIBEauXKlb5y5cr5ihQp4hs1apRv3rx5vpkzZ/oOHTpkz69Zs8aXPn1626ZOTAfTm266yffuu+/61q9f78ucObNv8uTJ/s6pVq1adtu4cWPI35dUOzHEH7WJ8+fPR9imA2KJEiXsANqwYcNLglLvYLtnzx47wD777LO+48eP27bTp0/bz5MnT/r+/vtvO/Hbu3fvJe8FgtvUmTNnfP379/dlyZLFd9999/mmTJniGzRokD94kFKlSvk6duxoba979+7WHz7//PO+v/76y4KQBx980P/aMWPGWCDivd8LmoGoqD/0+imvb5wwYYIvderUvqxZs/o+//zzkO9TP6n2mz17dt+JEyf8/avnjz/+sIt8EydOTPL/AAQWQCKkk7dWrVr5GjVq5Nu8eXPI1+hA2K5dO7vC4T1+//33fenSpfP169fPlzdvXt8TTzzh27Rpk/+K3gMPPBDyyjAndOHNO8BF1g6OHj3qW7RokT8IOHLkiO/FF1/0FSpUyPfPP/9c8nrvc/r06eOrWrWqnQQq4H3qqadCfr4O0AS2iIra36233hpyNME7wVP/V7hwYXutzJ8/30Z1GzRoYH2hAt3Zs2f7T+R0oWXgwIGR/v+A8KT+63LHxP/++893+PBhu6+LdcOHD7f2NWLECNsWfEFGNLvglltu8b3++uu+ffv22XE6suO7zgGS6nGZwAJIhDR1SQHCtGnT7LHXwQR3NJr6lCZNGt+MGTP82xRAaJhfV5T1nB4DlxPqZErTTtq0aWOjX3feeacN5etgKBqFUPvSAdUb1vd47fSnn36yqU5qixre1/SoYEn14ImrS9PqdGFE7TSwzQSeBOo5XWjRVLv9+/fbtiVLlthFGrVB3XSxJjBgBiITKjhQn1a5cmVfgQIFfFWqVPG1b9/ePxrbokULm17nXYAJ7tvU3jSdWe1QIxwKlLdt25bs+kOSt4GEzXGKsCCYV1Zu1apVLm3atJb8FbyidiAlZqviRGDtdSWRqRa2amKrRrsqoAR+NguQhbdQpQtVlalEiRLuiy++iJAk+/7779viYrNnz7Zyid27d3evv/66JcKqaomKBqhWuxISA6mdqnynFiTTqsaqOqYkxRdeeOGS353UKp4gfqntBVd9UnWc7du3W3J/YIWxwHUB1K/pObXJ77//3srJigpXaK0elfPMmzevVS/zyn2qMtn/XWDlnzWMhfr379Chg62xE9gWVehEJYl1TFWfqCpPSshWJTIdr+vVq2fJ/97idoHHWlXJa9Gihfv444/tGK1KUOp3VUwgufWHBBZAAlGHpU7EWxBMZea8TiVbtmy2sJ1qr3uvDdUJpk+f3lY5/u233/y111X5RNVRVFZWHZxWmRXvs1mALHyp7YQ6cKmik+qmqzpT4Iqx7733nlUZq1y5sh1UtTqsqod5q2oryNABc9asWfZYB1VvJXdV4lHFKAXJ3uJ3XmUoIFTbVD+ntufV+g9sn2pb2u5Vxgt+r9evqT/Ua7QGwIkTJ/yv0QJl//33n3vppZfstYEXa5LDyRxizjuWBv77e+1O6z2p7LAurHjUH6oi3uDBg13x4sVtm/pJ9XEqeaxqY4UKFbKgQ/2kyhl771c52vz581s/qgstWlcq+MJickFgAcQzdRy6quvV9Pc6Eh0kdSDV4mAqtamFdHQ1Qx2SFrbLkiWL1VoPfE9gJzhnzhzrrFSnXTWyVUJWVK5OdAUluXZcuDJqOzrx79u3r1u5cqV/u8odqkSsVs/2AlQdAG+//XZbiFE11rVmisomqpSxFnUSlfh8/PHHbU0ULTymdVS0roq0bt36koBCB1pAgan6r+C2qT5RZbUVHGjkYcyYMXZipnalkQYtdOeVLw68wKL3ajHGTZs22SKNNWvWtL7UC4C9ftEr88kIBbx2I1o4NniV65dfftku7k2fPt0CVVE5WK1PoXKyumDXsmVLW9ROZYu1+KLaad26da3PbN68ua267Y1i1K5d247nKsmt477aYeCFxWQloediAcmdSroqqSuwIomoconmDGveuiqUdO3a1UooeuXoGjdubBVQdu7cecn8S1Uy0fOqduKVT/Qq7gCROXbsmL+ik3IevvnmG/88c5VD1PxgtStRcmGePHksv6JLly6+HTt2+D9n69atvm+//dbuqyKZqo+pBKjaenKbL4y4p74uQ4YMlsMT6MMPP7TyxQ899JDlSaiEp8pmq4qOSmWr3Sp526vg5LUvtWHlTrz00kv2WHPc58yZwz8doqScHB17vfyb0aNH+3Nz5IUXXrBkax2r1ebUxymvTJUaVeZYRSw8q1at8ueezZ4929qwilcEH5fDoTAAgQVwFahShJIKly5d6t+m2uq33XabP0FMJ3L33HOPdXDq3FTRpGDBghZ4aC0ABQ+q8DR48GCr///GG29c0kmFQ6eFmPGSXb2TMFXBUb103VSes3nz5rZdz2vNFFUT+/33321by5YtfSVLlvStW7fO/3k6mPbt29fXrVu3kOufBCfXAsF27dplF010UudRn3fvvfdGWBPlhx9+sP5QJ3FqawoyFOyOHTvWys8qoFAwqxKzCoojK6UNBPdRnl9++cWOuyoVW79+fUvI3rJli7+dKpBQexOVgtWFGa/yU2BCty7I6IJLdJPAkzMCCyAeeB2J14GptOH9999vFSG853v16mXBgQ6GqrGu6jk6OHrlEOXXX3/1Va9e3Q6uCia0yJ2uoOgKMRCTNSi8K2cKUDWCpqvGGvnKly+fr169etbWVIpYB1lVNxGtNaEAxFt4TOsGqJKJDq7fffddyN8JRKd859NPP23tSKNoXvlOXUjR6IQWAVUVKNX8V9Ud70RP7fHhhx+2/lBVedQ3amExtd8///yTLx7ROi4HUnD62muvWcCqC3fq726//XZbtE46dOhg7VSBrUbC1G4VhGhNirlz51rZbbVFlTMOXJMneM2LcEJgAcShyE6stF0dUbFixXyrV6+2bVqDQldDvKF/XTnxaIqAt6iYamVrMbxZs2ZZ6cRA4dhpIWZ0sHzuuedsoTpv6F5Tm+6++26bSqeTNZUnVtCqK3MKHnSg9Oqr63m9Xq/Rgo2hSsYCkYnsaq3WP1HJTa8ctkZoVdJYI2a5cuXy9ejRI0IpzsAF7FSOWwuRqS0ySoGYUlvTlGNvJFYzCRRYaKE7Hau1qKLWP3n11Vct4FUgO336dH871DQ9BbW6yFKpUqWQF1nCGYEFEA8BhQ56zzzzjK0v4V3F+Pnnn+1kTtu9UQx1WN4wq0cd2SuvvGJX7SITvG4AEOpKnNqaVmfXCtlab0IBquinTuLUzrzgVPOJNXdY0020yJgOqoG0WnY4D+8jZgLbh/qrUaNG2QjZ7t27/dsfeeQRy6MQjZZpGooWVAy+8qu2602bCnXxJtQK8UAwHYM1tViBq2YJaKqd6IKLptOp//PouHz99df7g4zHHnssQrtUvxmY/xhZ2wxHBBZAHNKcTF1py5Ejh69mzZp2FUQHS53k6UqHTuR0lUPBg+ggqiseOmgqOVZXUjRlSjcl0wZjhALRDTJ10NSQvpcvEUyrYKuNeqNg+hwlZKt9KuDVSFpwMCGcwCG61KY00qrRMK3SrqlOapPz5s2z51esWOFLmTKl/4qv+kflnWkOu3LONE1KAYlGyt56662Qv4M+EcHtIVQfpb5MUzw1HVn5OcF9mY69KmihIgGBI2MKKLzkbi8QCWx3kf2+cEZgAcRQqKtjChzUAenKhpJhlYio12k+u07Qunfvbu/RFRMdJJVfIRrGf/LJJ61D0/ZMmTLZlBVV2gFicvKk4XxNs/Neq2BVV9w0Z13TmXSQ1ImcNxVPCYdK3vZW0vYo6H399dct5wKIjlAnVlOmTLEgtW3btlZtR0GG+jtVwtPFFm8aioLb++67z+6r+s6AAQN86dKl81WoUMGm5N14440RkryB6PSTam+BVeo0uqDgwKsWpgt3Gj3TVFE5dOiQFavQiEYgfY5GM5STFupCCy5FYAFcIe+qh9f5qJqJKp0o2cvbJpoHrKt1Si5Ux6QOSgliXvCg1+lkbuHChRFK0zGsiui0gU8++cSXP39+S7DWUP7jjz9u1Uk03UlJ2ioKoKvEqrijIFejaJqGJ7p6p5M6b1Qj+PdxNRgxEZgHof5NJ3LqEwNP8HRlWGW1VbpTdBU4VapUvmXLlvlfo0BY06a8ksa0R3j90eX6RF3kU06Z+rnSpUtbMQqvbWkmgPpJFUBR+Xfd18WX999/357XyJkKBqjtCSXcrwwL5AGXEbyg0u7du23xJq2cqVWJtSiTFv6qWrWqrV68f//+CIuCabEnvWft2rW2gmz16tXd4cOH/Yvf6b1akVOLkKVLl87ep9+nxaIQnryV1r028P3339sq6tu2bYvwOi1o9/7777vOnTvbwneTJ0+2lWC1OFOJEiVs9XXdtECjVsnWysNarX38+PH2/vr169siUCdPnozw+7x9YEVihBK86Oa8efNcw4YNrR2qTartZMuWzbVv394W6gxccV2LgWpBRi20ePToUVut+M4773R9+vTx97M333yztc0HHnjAHnvvpz2G96rs3iKKZ8+edT/++OMl/aHomPzrr7+6zz77zPq+YsWKuRYtWtjxV9s6duxoq6/rGD5lyhRbGFT9oRZiLFWqlLvjjjtsu+h47NHv9/plRI1lUIEQnZg6MO+ntzKmVsTWSdnw4cOtY2vWrJmt7vrLL7+4hQsXuptuuslWIe7evbvbu3evrcSpjkgHxbx589oq2VK+fHk74OoAG/J/SlYnDnveCf6gQYPcwIEDXebMmW2bTsR0cFQQK1rxVc+98MIL1j61gqzXFrXaa6FChezm2bNnj7vxxhttpXZp1KiRncCFWv2VwBaR9Y2B7UX9n/q8ChUq2P1FixbZRZN77rnHvfjii+7DDz+0Vd6LFi1q79PFFf1UW1bblR49etjKx1rhWIFI8O+jTwxvagO67du3z4ICXWTR8VUX6HTBRBdSdGxetmyZ++GHH9zs2bMteN26dau1M138W79+vfV7CiwCaSXtf/75x+XJk8f6vE8//dTuB6M/jIErHOkAkhXVo45sbYgff/zR5gSrgommMSnpVfMxvdU2NYw/bdo0e6zynTfffLNVnPDmbmpYVUmL3tx24HI0/1zTmlQEQG1LeRKLFi2yRH/l4nhT8VTj/3//+5+VTtSUE81L12KKgdMFlCvx5Zdf2qJ2mjKlaSheNRNvqhPJhwg1xc5rI8FT4jS9Uytda/qn2pVyKLzpT1p/QnljXgUd5VRoHQDll3ntVutOqNw2EF2a3qSpdZrOpNLs6iOVE6GpTF7ehKY8aXqTnq9Tp45NA1WZbOWWeTQdeebMmdYelf+j8sYqEBCMqchXjsACYSn4QPnoo4/666l7J1nqpLRIjuagK5jQgVAdm5KzAyvxqONSyUR9puZkaiExvU7zOzXfXbXa9f7gxC86LkSWw7B+/XrLj1BBgEAqG6uDpVdVTKUQ1daUP6HyxF7bVfvUwVPtUfPUGzRoYEHJp59+ypeOy/aJaidakNNb98TrF3WR5d133/UVL17cvw6PClYElt3Uyu4KcL2LLcrfURvVCZzyKhR46GQweE2ewL4X4SmyUsKi9qbqYoElX9Ue1bYmTZrkz99R/oSOueobdaHPo7wzVW1U8KvF7JT3WLduXYpUxAMCC4R1xxWYgB1IpQ4zZMhgnY8OlJ42bdpYOUR1Up6VK1dayUSNesjy5cutsoSSuHU/VNlYwKPRiOCTKt3XVeDMmTP726gSDLXKsEYcvHasA6dGzHTlOJCSEBUs66ROQUZwvXVO4BBZnxjYJj26KKKgQCsO64qxF9gqyNBorDdiITp5q1y5slXSUSKtV/lJF1pGjhzpGzZsGEmxiHH7VMUw9XXezAItIOutwq71okQLKuriixavC6TXanTXqy6m4gCB66mEGpXDlSM7FGHBSwr05kl+/fXXNv9XczE906ZNs7nqO3fudNdff717/vnn3fbt212+fPn8r+ndu7clHf7000/+z1TiYa1atdybb75pj4sXL+5q165tn12uXDmb16k8CxK/ENwmlS/x2GOP2ePAeeu6rzwKJbGqDRUoUMANGDDAVapUydqS2u+hQ4esrbVp08YNGTLEPfjgg27cuHHu4YcftjnHKiSgecaan+7NGfaSbkPlVCB8CwQoZ0xtx0vqz5AhgyX1KxlbCbLKi1A7VDu69tprrdiEqK2piIWKCyjHR3Lnzm394apVq9z8+fNtW7du3Sx5Vu21U6dO/iIVQCAdb+vWrevOnDnj36b2qX5LORUNGjRw/fr1c02aNHG5cuWynArljJ04ccIdO3bM7j/66KPu33//dY0bN7Z8CeWh1ahRwxK61Y+K+lW9X/8P6LO9HA7EDQILhAWv0/joo48sUOjSpYtVz9m4caN1SPL3339bdZOff/7ZHrdr184CDFXS0YFX1DGp4xs1apS/+pPoYLlhwwar/pQpUyZLiNXvVKK39/tJ/kJwm9RJm07WdGAMVrBgQSsGoED2f//7nyX/6wROyYeDBw+2g6vaoJJjlcCoRFidGOqkUEm0CnS95FgPAQU86o+U/Kq+Sydt6hu/+OILq44jSnzVxZY33njDHlepUsUKTihA8AJUnZypmp1eO3PmTP9nq22qL1T71smbAg0lb6vYhfpdISEbwdQO1Xepwp14F++847cKWeg5tau5c+daUvb06dPteKyqZHPmzLGiKuoHFRiPHDnSvfbaa65OnTpu+fLlrmbNmpf8P0CfGA9iMdoBJCnKobjzzjstUUsrunrD9B7NvaxWrVqE5GzNcdf89cDpTErC1tQnbw5xKAcPHrRcjLvvvjse/yIkVd6w+7hx42yRusBtgbTehOazv/zyyxG2a8hfBQUKFy5seUCe4HVQyONBZNT/KQFb/ZsKA6hP3L59e4S2NGjQIMuHOHz4sG377LPPLBFb7dajIhWafhKcD+QVr/BoRWNNW2FqKCKjKcYqfBIqF8zryzQVr1atWv426U2/69y5s+WfaVqeN5UvsD0LU0CvDkYskKwErjcRuE1DqxoW1fSQJ5980kYVNKQfSHXXVVNdQ/iqkS2aCrBu3Tr/KIaULFnSpjdpW/Bwvvf4uuuuc++8845bvHhxPP2lSMq8K3D333+/lSbWFV+vxHGgW265xYb2NSrhXSVWSU4N+Wsala4ia0qUR1NMvHrruhrHKFl4i2r6pUYYdBVXV3Xvvvtu6xNVejOwLWkKSfbs2d3bb79t21RStnTp0m7ChAn+16mcsdZMUT+pvjNwe+A+tGzZ0srOeqWOgVAjFuoLvZLDgf2hd1/rnWjkViMbHk2/0yiuRnhVclt9qnjt2VuLitGJq4PAAsmKTs68xb68EzFt01Qm1cDW3EqPTvpnzJhhw6d//PGHbVPHpAOh1gLQnOGyZcvauhPffPONTZXyKMdCHVnwcH7gY3V2QFQ0LUQna5pe4rXVQJrbrmF8BcFDhw6N8JwOmppa0rp16wjbCSgQ2BYiowBV7U0XW7x+UxdLVO9f0zq9wFZ5FJompX5R0/N08UVT8DRtyqNFQHWyp8XFItsHndgpKAFC0fFawaz6NU1J9tqMR0GBHms6nvJ6NN3Jm1bnHeu1forWuFA7DaT3kkNx9RBYINknw+qAqBMzXZXTysTqlLw8C81N19zMevXqWaChDkkLO+nK2pIlS/y5Fro64l0FkSxZsvg/GwgUk6RUXaFT7oTyIiKjhFddOVZblTRp0kS5CjIQVTKsR6NeujKsQEGv0QWUXr16ubvuustWINZJmi6UKLDQz2HDhtn79DrlnqmvDbyIom1R9Yec2IXvcTk6faJ3vK5evbot5Kn3BAfGXvt69dVXbXVsb4TMe6/XxugTE1YKzYdK4H0A4oySu5TQpWlIGTNmtG3etBAlyKoyhJK9NJ1JlU2UOJs1a1b3xBNPuFOnTllwoeQwBSdKSlTytTorbyVtIDJeO/NoaoiSpwOnl4R6vdrZfffd515++eVLPsOjNqkryjqp81YjBi5HI7Xq4zSaoAsqgcmwOvnSBRRNhdJJnKbVKTi47bbb3OjRo92sWbPsp7ZrZW1NJdWor6xZs8Zex1Q7RCZUPxV4HI2sr1MAq3apY6+OzZHp27evFR6I6jVIGBHncQBJvBPLkSOHlZdTUOFt8zovbdNJnG7BVNpTHZqCC80XVvUIBR/q/PQZ6gwj6wgB8drG0qVLbT65AlkFFpom0rZtW2t/gW3I+6mgQsFw4LZgapMeggpEl678qiKTpjcpsAhsO2prClR1C/bUU09ZXo+mS2m04oEHHnArVqywKno33XST9Y1Cn4jIeG1Nx+FXXnnFyhkryNWImCrWKacnkNeW1LaU0xNZwOAd1zVqgcSJsySEVTJsKCqLqDmdHTp0sDntovwJrQ+gIdbgE0EgVLtS0qBGyt577z3Le1iwYIG1R5VC9A6Cod6naSqaCuWtAwBcjWTYqPpHFa9QaW1vtE3TU5RXpqAiEH0iIqP+TGvvaLTs999/twt3jRo1snzFFi1a+Ee/gtuS1oXS1GVvKnJwGw0MjpmKnDhxpoSwSob1pgf88MMPdqDUYjtKBlOnpkXFAqnTYqYggtuEt6BSMB0wlQehnAktrqi6/Uq4fvrpp22+utqml4DofZbodQps06dPT3vDVUuGFa8da2RD00900wUWVd7RKFuxYsUi5PWwqB1CtbNQx0m1JY08KJh46KGHLFdH6/EouVoLJ6pwSqjAQIUBbr/9dmuTgW00FALbxInAAmGXDKv5werwlLytk8H+/ftboKEk2eBOi2knCG4TCg4OHDhgyatKHvRGGrRqu3eF1xvm1+u1WKKKAnjJr8GrwGs1beVPqBIP7Q1XMxnWG7FV2+zataudBCrhWyd9ehz8eha1Q6h2pn5LOWW6eVUZVVFMQaqeU2U7LwhRYQC1SQUYmnocTFXKtCio109ycS/pIbBAouVdzfAOZuq0vFVhI3u9aq5rXru3DkWoKyKaa6ypTp988olVe9JKnUIlCVzuapxWc33mmWdc3rx5LTjV/HWti6IDpK7uqsKO3hO47omCXZXh1AmcBJ+saSSjcePG/tXdgVACE6+9PjGwUl1k00I01U5TS9R2Q1FFJ1W+69Gjh1u2bJlN6dPJn34fJ3UI5gW1XnvTWigqy67cCY1MqIKdpt8p31EBhdrr7Nmz7bVeH6fRMM0Y8KboebxjsLfCu9fekbQQWCBJJMNq/QmdtOmmaSVKjA0+mMY0GVZTUAI7MxbPgcdrV97VOK89fffdd3ZA9H6qCpl+duzY0Z5XNTGNYKgUYuBn6eDrtbfgkzW1Rc059p4HLpcMqwpiGh3TiZum3SloiKw0p5JhNRUqquo5yp3QZym5NnC6Hyd18Nqc1295Qa1XaVEVw5QXoZkAquSktqP8RBUM0LTkBg0a2KwA8XIY9VpdnDl8+HCEL9g7Bms2gRYGRdJEVSgk2tJ0unKmIVEtXqdkWM3RVGKskmG3bNniBg0adNlkWM1bvxwCCgTzTtIUUGhEQqMNGoXQKJfq/2utE29BRc1jVxUoJWhrWpMOsirTqfanajoqb6w56irbKcHtXFftNIoGREXtSVOWNJrgJcNq+tyYMWPcf//9Z1WcdJU4qmTYypUrR1muWM8xbx3BAtuLFuV87rnnbBTi4MGD7t9//3VvvfWWBbq6aYRWF0o0zVijYOobtZhikyZNLI9RbVGfocAhsL0GYnX2pI0RCyQokmGR0HQyFTwNTomHKpGoKk8aUdBBVMGBptl566N47VdXejWdZOLEibZNB1UdXBWUaB7x0aNH7cBK8IDEngzLCAW8fi2wLak9vvvuu3bBRO1Qa0ho6pOCXY1a6IKK9z61Na1xounIek6BcNOmTa0P1NRjjWYo70yjbkieCCyQsA2QZFgkIG+dEm/UypvypJMwHUR10qYrbhql0DB+rly5bNqJDq6BCf6FCxd2hw4dsm2aY6w5x7p6pyt2X3/9teVYMF8d0UEyLBKK+ihvPQndlIittUzUt2n6p9Y3UTChQhWioEE5FwpqRa8V5Z5pMVpdhFGfqZXddVFG60N5sw3Un9InJk8EFriqSIZFYqKDpxIKdfWsUKFC7sUXX7R5vxqF0DQmCawwVq9ePXfs2DE3duxY/7Zdu3a5f/75xz89ysu1UPKhkmFFB1+uBiMUkmGRWHgLyv799982yvDggw+6uXPnumzZsrknnnjCqt3dfffd/tdrpfaGDRu6Xr162WNNCxXlneliilchSsnYWohRORjedOWopuQhaSOwwFVBMiwSWqirY6rIpORC5fOoUpiuyHkneppuoipjOrB6tGq7DrhKztbVNx1QFYAoQTZwqpPeq7nE06ZNs/wMynQiuC2SDIvESBdNqlataif9KkqhaZ2iUVglY3/00Uf2WO33uuuus9wyVSdT36jAQaO0GsFQ5SfvooxGb3WxRXkXf/75pwUgBBXJmA+4ijZu3OirWbOmr0SJEr4jR474GjRo4HvggQcivGbKlCm+dOnS+bZs2WKP27RpY4/bt2/vmz59uq9Fixa+m266yffrr7/yb4fLOn/+vO/ixYshnxszZoyvcOHCvrVr14Z8vl69er4mTZr4tm3bFmH7Dz/84OvRo4e15ffee++S3+e142nTpvEvhCiNHz/ed+211/p++ukn3zfffOPLmzevb8mSJf7nV61a5StZsqRvwIAB9njOnDnWHz766KO+r7/+2jd//nxfkSJFfC+99BLfNKLl3Llzl2xTv3Xs2DHfXXfd5XvxxRcveV596CeffGJtdfXq1RE+58cff/Q9//zzvvLly/uqVavmW7hw4SXv37Bhg+/ZZ5/1/fnnn/wrJXMp9J+EDm6QPOdpBlZb0pz0r776yhYW09UKLb6kq8HeGgBTp0611+l9Gj5VwqwW13nppZcsMVFVobTgjkrU6Sqzksc01ApEl6qLqe2orKuSraVnz55WinPFihWXrLiu9jthwgS7CqeSnqoAFdXwvab5UWEMUY3YehWX1I5U4U4VwXQFVzk6mreufrB9+/b+MpzefHettaPcHi3KqJ+asvfpp5/a1eFJkybZCNkbb7zhL+cJRLdP1DHVG5VQ5TuVdNc0TpUg9mgUV6OuykFT8rVGINTuvO0e9a9ZsmTxP2a6U3hiKhTiFMmwSCy8ayYqzakym0qqVi6Fgtbvv//enlO+hA6EWq3de49XUEBUIlHPq6KJhvtDBRWsg4Ko2iDJsEhsVOFJwYEKU2jdp9dee82262Kf+j4lWAcmY3vBQ8GCBa3qnaZ46jWBQYXauvrKwCp7THcKTwQWiNsGRTIsEoAOZl5uhEcHNZ3U6UquggklJKoEoq4Id+7c2e4rv2Lbtm1u8eLF/vd4izKqqolG15SwrRKKkV0NZpQCkSEZFgldyj3YzJkz3fjx413v3r2tD9SsgMmTJ7sBAwbY6IUuwmitKFGJbVElqIULF9pP5V8oGVtrTAXy+s7AKnsIUwk9FwtJV6h564cPH/bVrl3bV7p0acuH0Fz0ffv22XOaP3zbbbf5RowYEeE9epwtWzbfvffe6+vZs6fNF1bexa5duyL8rnvuucc+O3A7ENwOv//+e9/p06ft/oIFC3xly5a1ucMydepUX8GCBX233HKL77vvvrNtjRo18pUqVcr34YcfWg6Q5qxXrlzZ9/LLL0fazoHoUh5Prly5fE2bNrU+ccWKFbZ9+/btlqOjfi2wnWkueo4cOXxVq1b1DRs2zNe9e3dfzpw5LWfHc+HCBd/HH3/sS5EihW/NmjX8YyCCwD7r4MGDliPmbatevbrvlVdesfvHjx/39erVy9qRcsmUZzFhwgRfhgwZfOPGjfNt2rTJd+LECV///v19jz32mD/vEYgKgQVijGRYJDZnz571vfrqq3ZCpuD1888/t+1ffvmlndS9//77vhtuuMGS/gcNGuQ7dOiQ/706WHbp0sVO3hRwKDlRidk66Hp0UNbJHBAKybBIbP7991/fQw895MuTJ4/vzTff9O3YscP6vYYNG/pGjx7te+aZZ6yvu/vuu30zZszwBx5qy6+99povd+7cvuLFi1sxARW40EWZUEUqgGAkb+OKkQyLqy2yZMDXX3/d5v0qqf/OO++0KQCaD6x5wBq61+ORI0daYqJqsXvtV4UCNPQv27dvt/UoVDYxMMmWecKILpJhkRisXr3aEv61gJ1KaKssbJEiRVz69Omtv9MK2CqTrZXbtWq2+jj1hUreVs6FaIqoHmutCpXWBqKLHAtEG8mwSOiFFQNP8r32qOBBa1CocpNyJrRKtoIK0cqvWtApa9as9pwXVGzcuNENHDjQAgkvN0Pvq169ugUV2kZQgegiGRYJnVMW6IMPPrBF7UaMGGH9n3LMFFSIqtspyVqVxRRkeH2q1phQrsXOnTvtcb58+WzNHi+oiOr3AYEILBASybBIKD/88IMdDFUG1qNkQB0A16xZY8+fOHHCf0BUcJAjRw47eAaX99R2VYLav3+/JRzq/nPPPWf3VRFKP0MtXqdtjFQgEMmwSCj9+vVzY8aMsfveBQ+v39IomUq2B1LxibvuusuCCy+B2wsMnn76aVe8eHHrB5W4rRLHuuiiEvAa4VBlqEDBCzkCl0NLwSWCOy6tPKzpJKqQo+o5W7dudR9//LFd/dX0E9VWVz12dW7333+/u+2229zQoUOtVJ1KfP733392Qqf7Wr1T9do5aUMoWutEddKfffZZV758ef92tbvu3btbW9LoQ548eew1Dz/8sK1wrdWtdfPqqnvtS1VMdBD9+uuv3Zw5c6w++5kzZ2zlbLVHIDq8MsRy6NAhC2xVrlPtTKNlderUsXV3tH3VqlUW7KrMsUbMVNJT01FUiUfT7HLlymVroyhILlSokK2r4lUlAwLt2bPHtWrVytrU+++/b9u8vm3YsGF2nNVjrUOhqU8atdVaEloXxava5FVoCgwMdNzW1FAFJVolu1y5cm758uXWpoNxrEaMXZJ1AZAMiwRKwNaKr7Vq1fJvU3Wn3377zao0qXqJKoypwomSq5VY6CVYqwqZqpqo0o7nv//+87311lsRfsfJkycjPCYBEdFFMiyuNq1SrQRrJV57/ZX6yW7dulmfp5Ww161bZxWcUqdO7fv555/tdf369fOVK1fON3fuXHvsFZ7QitjqTwP7V6+Cnvc6quAhtggswlxknUjfvn19t99+u++rr77ybd261bd582bbrp/58uWzShF6zivjKb///ru/YxOdAKp0Z2A1HTotRGXgwIFWZvPJJ5+09qfSsapkMnToUP9rJk6caFVKVCJR7VRmzpzpK1asmJXuVEnPadOmWSlPBSTeQTmwDRJQICZWrVrlu/XWW63k5uLFi63E66lTp+y5SpUqWVusU6eO9X9eH6cynWq/HvWjkydP9p/sAZejinVqd6rS1LZtW1/Hjh1tu6o6KaAQ9Y8KJNQGW7RoYYHHP//8Y9WfihYt6vv666/t8bvvvus/pgcfh9UfUvUOcYXAIkyFKhnrPVbwkDVrVt/YsWMjbJe9e/fawVWdXfDVPG0fP358yNKL2kZQgcjoYCiPPPKIL126dL7rr7/e2lIgXWkrU6aMBRCqq/7UU09ZCVnPkiVLbC2UChUqWKnEzp07Rwh8gciobwrVb3lUmrNKlSq+AwcOXPLcyJEjrb9ctGhRhO0KItq0aXNJYOuJ6vcBXp+nC3mpUqWyNZx08c5bm0KBgAIK9XW6iNKnTx97nS7midZ7uu+++yy4UD+p9Xs0sgHEN3IswoCSXfv06eNee+01K7cZOO9S83w1j1Ml5zQfOKpkWM0x9pJh77nnHkt8VcUIzelUnoU+I6pkWCAy3gqvWt1aSYdqn2pPnrNnz1oVJyUXqqSsVogdMmSIVTBRvo/mIev1s2fPtlwLVXjy5gZ7bRcITIbVvPQnnngiZDKs8h4CV1pXMqzyx7xkWLVPL59HybCffPKJJcPWrVvXlS5d2n366ae2crsq74RKhg38fUBkvv/+e/9xWLk66v+Uu6jysfPnz3eff/655Vk88sgj1se99957bvr06a5kyZIud+7cVulp3759bu/eva5MmTJ80bgqONqGQTKsOh0lDQYnw1aoUMFqVnfs2NHVq1fPErokOBlWB0HvxCwwGbZ27dpuw4YNllCrZFh1YjogA6F41UlC8ao4KUhQYqsKBMyaNcv/vCo4LVy40N1xxx0WVOjk7N9//7VE7i5dukQIUFQmUW3WKxlLUAGPLqKo31IZTtXnD06GVTJ148aNreywHkt0k2EffPBBWz9Aga+CCSXDdurUyYpeBCIZFtGlwFTBQ61atSyA8Pq4wJKyCmbVxykJWxdgFFysX7/eXqMSs+oPvaCCkrG4KuJ9TAQJhmRYJAbBc3fPnDnjvx/Z9DglYtetW9e3du1ae6zpJNqmYf3vvvvO98ILL/geeOABG/bXnPeoPgvwkAyLpEirXufPn9/35Zdf+rcNGTLElzlzZntOuT1aZXvBggW+rl27+vbs2ZOg+4vwxohFMqYrG7oqpzKwKneoq70aqdBVuUcffdSmA+h5bdMVN13lUOlEbyVjlbhr0aKF+/LLL90XX3zh2rVrZ6MS3gI6oukCuirsXY32ruYBHm/EwBvlatu2rfvwww9DXr312lH79u1tRMIrw6lRim7dutmVY7XlZcuW2fQ+XVnWmhehPgsIphLZuoKr9qf+TKWv1U/ecsstbtKkSdbfaQrJrl27rC2qxKemnmjUV6U4NbqrPnDTpk12ZVgjEhpd82r9a3RCN73Xm4JHu0RsaXaBphlrpM2jtqvpn5qarJkHGr3V69555x2b5gckmISObBA/SIZFYqJE6pw5c/p69uzpa968uS9btmy+Dh06RJlcXa9ePV/Tpk2tMIBH5WV3794d4XWMVCC6SIZFUjVhwgRfgQIFrGRsYPlsjeqqAlkgKjwhIRFYJHMtW7b01ahRw6pDbNiwIcJ0lGbNmvnatWvnr1oyePBgK1kXWI1HAYrKJAaevNFpIVhkJVy1/e+//7YpTIEVSVRyM1OmTL7PPvvskvd4n/P5559bAKJa7dH9fUBUtK6JptCp0s6kSZP8fZzMmzfPV6pUKWuTXh+nYFglPrV+iqjErPrDX3/9lS8aV5UusFSrVs3KcYdCyVgkFin0n4QbL0FseNVJQgmshKPVhh966CH35JNPus6dO9u2AwcOWOWIXr16WTUTNQMN80+ePNmG7vV8MCV+6fcxtI/Adqb24LWJkydPWpJ1sWLFbNqSzJs3z4oDqE1lyJDBXxVHVXY0fP/RRx/ZFJVQVG1H0/aCE2CBK3X8+HHrB5VorSl1niZNmrj9+/fblD21RyXDqhKPkrc1Ja9KlSoh+0SqO+FqUL+pKcnqC1UoAEisyLFIgrwKOl5QoUoQHi9ODKyEc9ttt1mZOp3geZVNzpw546pWrWrzhFXSTpV1Nm/ebB2XKkkFfpZHB1CCCgTy5pCrPY0aNcrKIOqkTXkPOjFTG1KJYuXi/Pjjj/7KYl4ehdqkV+UklMcff5ygAnFKQYOq7KjqndfXiearq0TsnDlz3JIlS6xCmfLL1DcqByMUggpcLepnH374YYIKJHqMWCRhurKm5EIlYKucrE7UIhvV0Ancs88+awlfSn4VHURfffVVS9pWwqLKK5YrVy4B/hIkVQpqlSyo0YhDhw5Z8qtGwtq0aeNOnDjh3nrrLRu9UICgA6ParOfdd991gwYNsjUC1P4i441wAHFl27ZtVgxAIxTqGz0qLrBlyxZ7vlmzZpYsG7ieBZDQ6A+R2DFikUTpKlqHDh1sMSbp2bOnTXXSMH8gb1RDC+PdfPPNbtGiRW7jxo22rWzZsm7q1Kl2YqcrdF5Qwew4RFfatGltkcWRI0fayEONGjVshOLtt9+2aSJqX1myZLGAQws1KnhVRR0t2KTnNM0pqqBCCCoQ11QZStPz1BeqT/RohEILjGlRsTFjxviDCm+UGEho9IdI7AgsEqnAEq7B27Uy9rfffusGDBjg+vfvb6u8aoE6lUsMXFTM432O5gtr2pMCCY9W286VK1eE30fHhZgGuSoHGzgt5NZbb7UFGVesWOFWrlxpAYRGxzS6UadOHcu/0EmbN3oGXG2VK1d2BQsWtHbpUZtU21UukFcyVlhkEQCih6lQiQzJsEiKmjdv7o4ePWojFVqZXRTA9ujRw9aa0GrE3srHGh3TyRurtCMhkQwLAHGPEYtEhmRYJEWPPfaY27Fjh013CkyGVdLrzJkzbbqUaHSsUaNGFlQoiA41KgdcDSTDAkDcI7BIhMmwWhH7pZdecsuXL3ezZ892P/30k+VSaFVsbStQoICVPtS8dvHmAetqcObMmS2JNirkUCCu1a1b1+XPn9/9/PPP7r///vNvV9K2Vif2RjEC26CCaFZqR0KjPwSAuENgkciQDIukqmnTppZPoTKznnvuuce1bt36krKc5PEgsaAtAkDcIbBIhEiGRVKkRRhr1qxpSdvBuCoMAEDyR/J2IkUyLAAAAJISRiwSKZJhkVRR8x8AgPDEiEUi1rBhQ5c+fXpbr0IJ27Jw4UJbGVYLjgXOW2c1TgAAACQkRiwSMZJhAQAAkFRELNWCRJcMu2jRokiTYalmAgAAgMSCqVAAAAAAYo2pUEkAybAAAABI7BixAAAAABBrjFgAAAAAiDUCCwAAAACxRmABAAAAINYILAAAAADEGoEFAAAAgFgjsAAAAAAQawQWAAAAAGKNwAIAAABArBFYAAAAAIg1AgsAAAAALrb+P84kLFTfXcZzAAAAAElFTkSuQmCC",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"augmentation_rows = [\n",
" {\"condition\": \"no facecrop\", \"model\": \"SimpleCNN\", **paired_delta(\"p2b_simplecnn_224\", \"p2d_simplecnn_aug\")},\n",
" {\"condition\": \"no facecrop\", \"model\": \"ResNet18\", **paired_delta(\"p2b_resnet18_224\", \"p2d_resnet18_aug\")},\n",
" {\"condition\": \"facecrop\", \"model\": \"SimpleCNN\", **paired_delta(\"p2c_simplecnn_facecrop\", \"p2e_simplecnn_facecrop_aug\")},\n",
" {\"condition\": \"facecrop\", \"model\": \"ResNet18\", **paired_delta(\"p2c_resnet18_facecrop\", \"p2e_resnet18_facecrop_aug\")},\n",
"]\n",
"augmentation_df = pd.DataFrame(augmentation_rows)\n",
"display(augmentation_df[[\"condition\", \"model\", \"before_mean\", \"after_mean\", \"delta_mean\", \"delta_ci95\", \"paired_t_p\"]]\n",
" .style.format({\"before_mean\": \"{:.4f}\", \"after_mean\": \"{:.4f}\", \"delta_mean\": \"{:+.4f}\", \"delta_ci95\": \"{:.4f}\", \"paired_t_p\": \"{:.4g}\"}))\n",
"\n",
"fig, ax = plt.subplots(figsize=(8, 4))\n",
"labels = augmentation_df[\"condition\"] + \" / \" + augmentation_df[\"model\"]\n",
"colors = [\"#54A24B\" if d > 0 else \"#E45756\" for d in augmentation_df[\"delta_mean\"]]\n",
"ax.bar(labels, augmentation_df[\"delta_mean\"], yerr=augmentation_df[\"delta_ci95\"], color=colors, alpha=0.85)\n",
"ax.axhline(0, color=\"black\", linewidth=1)\n",
"ax.set_ylabel(\"Delta AUC from adding augmentation\")\n",
"ax.set_title(\"Augmentation ablation\")\n",
"ax.tick_params(axis=\"x\", rotation=25)\n",
"fig.tight_layout()\n",
"fig.savefig(FIGURES_DIR / \"04_augmentation_delta.png\", dpi=180, bbox_inches=\"tight\")\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"id": "202507a6",
"metadata": {},
"source": [
"Augmentation separates the models even more clearly. SimpleCNN drops in both settings: without facecrop it goes from AUC `0.7853` to `0.7346`, and with facecrop it goes from `0.7661` to `0.7136`. This is consistent with a low-capacity scratch model: the extra flips, rotations, color shifts, blur, noise, erasing, and recompression make the task harder before the model has learned robust face/manipulation features. Some of the cues it was using may simply be removed.\n",
"\n",
"ResNet18 is more resilient because it starts from stronger pretrained visual features. Without facecrop, augmentation is almost neutral in AUC (`0.9660` -> `0.9665`), but accuracy and F1 still fall, so there is no practical win. With facecrop, augmentation becomes slightly negative (`0.9755` -> `0.9737`). Once the image is already concentrated on the face, the extra perturbations may hide the subtle evidence that made facecrop useful. For the current 20% data setting, augmentation looks more like over-regularization than improved generalization, so the best supported classifier remains ResNet18 at 224x224 with facecrop and no augmentation.\n"
]
},
{
"cell_type": "markdown",
"id": "3c5b2bd7",
"metadata": {},
"source": [
"## 7. Decision table\n",
"\n",
"These decisions summarize the best supported setting from existing classifier logs. They are recommendations for report interpretation and future work, not claims about unrun experiments.\n",
"\n",
"| Choice | Decision | Evidence | Confidence |\n",
"|---|---|---|---|\n",
"| Input size | 224x224 | ResNet18 improves from AUC `0.9366` to `0.9660`. | High |\n",
"| Face crop | Enable | Best Phase 2 run is `p2c_resnet18_facecrop` with AUC `0.9755`. | Medium-high |\n",
"| Augmentation | Disable for the current 20% setting | `p2e_resnet18_facecrop_aug` reaches AUC `0.9737`, below facecrop-only `0.9755`; SimpleCNN drops sharply with augmentation. | Low |\n",
"| Normalization | ImageNet/default | `real_norm` is only `+0.0018` AUC and is less aligned with pretrained ImageNet weights. | Medium |\n",
"| Source generalization | Report as limitation and diagnostic target | Holding out `text2img` and `insight` drops pairwise AUC to `0.7595` and `0.8421`. | High |\n"
]
},
{
"cell_type": "markdown",
"id": "2739c949",
"metadata": {},
"source": [
"## Conclusion\n",
"\n",
"Phase 2 improves the classifier through controlled ablations. The largest reliable improvement comes from moving ResNet18 from 128x128 to 224x224, increasing AUC from `0.9366` to `0.9660`. Face cropping gives the best observed classifier result, with `p2c_resnet18_facecrop` reaching AUC `0.9755`. Augmentation does not help at this data scale: `p2e_resnet18_facecrop_aug` reaches `0.9737`, slightly below facecrop-only, and augmentation substantially hurts SimpleCNN.\n",
"\n",
"The strongest caution is source generalization. When `text2img` is held out, `wiki_vs_text2img` AUC falls to `0.7595`; when `insight` is held out, `wiki_vs_insight` AUC falls to `0.8421`; inpainting generalizes better at `0.9296`. The model is therefore strong under the controlled DFF split, but not fully source-agnostic.\n",
"\n",
"Report-ready decision: use 224x224 input, facecrop enabled, augmentation disabled for the current 20% setting, ImageNet/default normalization, and discuss source generalization as the main limitation.\n",
"\n",
"Next: `05_gradcam_analysis.ipynb` inspects model focus qualitatively. The story then continues with `06_phase3_model_family_analysis.ipynb` for stronger backbones and `07_phase4_data_scaling_analysis.ipynb` for the data-scaling plan/status.\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"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.12.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}