From 912168e5cc5e6c679749dd86caccf727c7379782 Mon Sep 17 00:00:00 2001 From: rfgzuid Date: Fri, 14 Jun 2024 08:18:00 +0200 Subject: [PATCH] final result finished --- experiments/PIV Test.ipynb | 161 ++++++++++++++++++------------------ experiments/ctf.npy | Bin 0 -> 10828 bytes src/SIV_library/advanced.py | 6 +- 3 files changed, 85 insertions(+), 82 deletions(-) create mode 100644 experiments/ctf.npy diff --git a/experiments/PIV Test.ipynb b/experiments/PIV Test.ipynb index 649db2a..1d58fa6 100644 --- a/experiments/PIV Test.ipynb +++ b/experiments/PIV Test.ipynb @@ -16,8 +16,8 @@ "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2024-06-13T20:18:03.586847500Z", - "start_time": "2024-06-13T20:18:03.436659Z" + "end_time": "2024-06-13T22:15:25.378631Z", + "start_time": "2024-06-13T22:15:25.221900100Z" } }, "source": [ @@ -52,13 +52,13 @@ ] } ], - "execution_count": 55 + "execution_count": 123 }, { "metadata": { "ExecuteTime": { - "end_time": "2024-06-13T18:53:25.284089300Z", - "start_time": "2024-06-13T18:53:25.141785Z" + "end_time": "2024-06-13T22:15:26.079934900Z", + "start_time": "2024-06-13T22:15:25.931102100Z" } }, "cell_type": "code", @@ -81,7 +81,7 @@ ] } ], - "execution_count": 2 + "execution_count": 124 }, { "cell_type": "markdown", @@ -113,12 +113,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-13T18:54:08.690264600Z", - "start_time": "2024-06-13T18:54:08.468712300Z" + "end_time": "2024-06-13T22:02:03.997281200Z", + "start_time": "2024-06-13T22:02:03.828594600Z" } }, "id": "e415162f1d18b88f", - "execution_count": 8 + "execution_count": 103 }, { "cell_type": "code", @@ -189,12 +189,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-13T19:19:55.659681500Z", - "start_time": "2024-06-13T19:19:55.484374Z" + "end_time": "2024-06-13T22:15:32.299508800Z", + "start_time": "2024-06-13T22:15:32.130185500Z" } }, "id": "dbd62634a9d3b488", - "execution_count": 24 + "execution_count": 125 }, { "cell_type": "code", @@ -245,12 +245,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-13T20:17:37.844020500Z", - "start_time": "2024-06-13T20:17:37.706941200Z" + "end_time": "2024-06-13T22:15:36.257416600Z", + "start_time": "2024-06-13T22:15:36.115107300Z" } }, "id": "c5af121528197517", - "execution_count": 52 + "execution_count": 126 }, { "cell_type": "code", @@ -259,21 +259,7 @@ "name": "stderr", "output_type": "stream", "text": [ - " 0%| | 4/2675 [00:16<2:59:32, 4.03s/it]\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[1;31mKeyboardInterrupt\u001B[0m Traceback (most recent call last)", - "Cell \u001B[1;32mIn[53], line 4\u001B[0m\n\u001B[0;32m 1\u001B[0m idx \u001B[38;5;241m=\u001B[39m \u001B[38;5;241m0\u001B[39m\n\u001B[0;32m 2\u001B[0m u3_avg \u001B[38;5;241m=\u001B[39m torch\u001B[38;5;241m.\u001B[39mzeros((\u001B[38;5;28mlen\u001B[39m(ctf_gen\u001B[38;5;241m.\u001B[39mdataset),))\n\u001B[1;32m----> 4\u001B[0m \u001B[38;5;28;43;01mfor\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43mres\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;129;43;01min\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43mctf_gen\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m:\u001B[49m\n\u001B[0;32m 5\u001B[0m \u001B[43m \u001B[49m\u001B[43mx\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43my\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mu\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mv\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43m \u001B[49m\u001B[43mres\u001B[49m\n\u001B[0;32m 6\u001B[0m \u001B[43m \u001B[49m\u001B[43mu3_avg\u001B[49m\u001B[43m[\u001B[49m\u001B[43midx\u001B[49m\u001B[43m]\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43m \u001B[49m\u001B[43mtorch\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mmean\u001B[49m\u001B[43m(\u001B[49m\u001B[43mu\u001B[49m\u001B[43m)\u001B[49m\n", - "File \u001B[1;32m~\\PycharmProjects\\LowCostPIV\\src\\SIV_library\\advanced.py:81\u001B[0m, in \u001B[0;36mCTF.__call__\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 78\u001B[0m a \u001B[38;5;241m=\u001B[39m t(a[\u001B[38;5;28;01mNone\u001B[39;00m, :, :, :])\u001B[38;5;241m.\u001B[39msqueeze(\u001B[38;5;241m0\u001B[39m) \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;124m'\u001B[39m\u001B[38;5;124ma\u001B[39m\u001B[38;5;124m'\u001B[39m \u001B[38;5;129;01min\u001B[39;00m t\u001B[38;5;241m.\u001B[39mapply_to \u001B[38;5;28;01melse\u001B[39;00m a\n\u001B[0;32m 79\u001B[0m b \u001B[38;5;241m=\u001B[39m t(b[\u001B[38;5;28;01mNone\u001B[39;00m, :, :, :])\u001B[38;5;241m.\u001B[39msqueeze(\u001B[38;5;241m0\u001B[39m) \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mb\u001B[39m\u001B[38;5;124m'\u001B[39m \u001B[38;5;129;01min\u001B[39;00m t\u001B[38;5;241m.\u001B[39mapply_to \u001B[38;5;28;01melse\u001B[39;00m b\n\u001B[1;32m---> 81\u001B[0m du, dv \u001B[38;5;241m=\u001B[39m \u001B[43moptical_flow\u001B[49m\u001B[43m(\u001B[49m\u001B[43ma\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mb\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43malpha\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mnum_iter\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43meps\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 82\u001B[0m u, v \u001B[38;5;241m=\u001B[39m (u \u001B[38;5;241m+\u001B[39m du, v \u001B[38;5;241m+\u001B[39m dv) \u001B[38;5;28;01mif\u001B[39;00m idx \u001B[38;5;241m!=\u001B[39m \u001B[38;5;241m0\u001B[39m \u001B[38;5;28;01melse\u001B[39;00m (du, dv)\n\u001B[0;32m 84\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m idx \u001B[38;5;241m<\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mnum_passes \u001B[38;5;241m-\u001B[39m \u001B[38;5;241m1\u001B[39m:\n", - "File \u001B[1;32m~\\PycharmProjects\\LowCostPIV\\src\\SIV_library\\optical_flow.py:31\u001B[0m, in \u001B[0;36moptical_flow\u001B[1;34m(img1, img2, alpha, num_iter, eps)\u001B[0m\n\u001B[0;32m 28\u001B[0m u_avg \u001B[38;5;241m=\u001B[39m conv2d(u, avg_kernel, padding\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m1\u001B[39m)\n\u001B[0;32m 29\u001B[0m v_avg \u001B[38;5;241m=\u001B[39m conv2d(v, avg_kernel, padding\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m1\u001B[39m)\n\u001B[1;32m---> 31\u001B[0m der \u001B[38;5;241m=\u001B[39m (Ix \u001B[38;5;241m*\u001B[39m u_avg \u001B[38;5;241m+\u001B[39m Iy \u001B[38;5;241m*\u001B[39m v_avg \u001B[38;5;241m+\u001B[39m It) \u001B[38;5;241m/\u001B[39m (alpha \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39m \u001B[38;5;241m2\u001B[39m \u001B[38;5;241m+\u001B[39m \u001B[43mIx\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43m \u001B[49m\u001B[38;5;241;43m2\u001B[39;49m \u001B[38;5;241m+\u001B[39m Iy \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39m \u001B[38;5;241m2\u001B[39m)\n\u001B[0;32m 33\u001B[0m u_new \u001B[38;5;241m=\u001B[39m u_avg \u001B[38;5;241m-\u001B[39m Ix \u001B[38;5;241m*\u001B[39m der\n\u001B[0;32m 34\u001B[0m v_new \u001B[38;5;241m=\u001B[39m v_avg \u001B[38;5;241m-\u001B[39m Iy \u001B[38;5;241m*\u001B[39m der\n", - "File \u001B[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\torch\\_tensor.py:34\u001B[0m, in \u001B[0;36m_handle_torch_function_and_wrap_type_error_to_not_implemented..wrapped\u001B[1;34m(*args, **kwargs)\u001B[0m\n\u001B[0;32m 31\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21m_handle_torch_function_and_wrap_type_error_to_not_implemented\u001B[39m(f):\n\u001B[0;32m 32\u001B[0m assigned \u001B[38;5;241m=\u001B[39m functools\u001B[38;5;241m.\u001B[39mWRAPPER_ASSIGNMENTS\n\u001B[1;32m---> 34\u001B[0m \u001B[38;5;129m@functools\u001B[39m\u001B[38;5;241m.\u001B[39mwraps(f, assigned\u001B[38;5;241m=\u001B[39massigned)\n\u001B[0;32m 35\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mwrapped\u001B[39m(\u001B[38;5;241m*\u001B[39margs, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs):\n\u001B[0;32m 36\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m 37\u001B[0m \u001B[38;5;66;03m# See https://github.com/pytorch/pytorch/issues/75462\u001B[39;00m\n\u001B[0;32m 38\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m has_torch_function(args):\n", - "\u001B[1;31mKeyboardInterrupt\u001B[0m: " + "100%|██████████| 2675/2675 [2:11:50<00:00, 2.96s/it] \n" ] } ], @@ -289,12 +275,29 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-13T20:17:56.659018300Z", - "start_time": "2024-06-13T20:17:40.336726200Z" + "end_time": "2024-06-14T00:30:07.351571700Z", + "start_time": "2024-06-13T22:18:16.769419200Z" } }, "id": "9c7adcc2a153f094", - "execution_count": 53 + "execution_count": 128 + }, + { + "cell_type": "code", + "outputs": [], + "source": [ + "import numpy as np\n", + "np.save(\"../experiments/ctf.npy\", u3_avg.numpy())" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-14T06:08:21.008669300Z", + "start_time": "2024-06-14T06:08:20.866403900Z" + } + }, + "id": "253f31033c7d4bf4", + "execution_count": 138 }, { "cell_type": "markdown", @@ -315,12 +318,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-13T20:18:59.018229500Z", - "start_time": "2024-06-13T20:18:58.195499Z" + "end_time": "2024-06-13T22:02:13.462268Z", + "start_time": "2024-06-13T22:02:13.313259800Z" } }, "id": "d4328ad8b24e27eb", - "execution_count": 59 + "execution_count": 104 }, { "cell_type": "code", @@ -329,7 +332,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "100%|██████████| 2675/2675 [57:10<00:00, 1.28s/it] \n" + "100%|██████████| 19/19 [00:22<00:00, 1.18s/it]\n" ] } ], @@ -345,12 +348,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-13T21:33:10.573589100Z", - "start_time": "2024-06-13T20:35:55.882428700Z" + "end_time": "2024-06-13T22:03:39.360211500Z", + "start_time": "2024-06-13T22:03:12.005716500Z" } }, "id": "4e85e0ae2eac11fe", - "execution_count": 79 + "execution_count": 107 }, { "cell_type": "markdown", @@ -446,12 +449,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-13T21:33:19.887244500Z", - "start_time": "2024-06-13T21:33:19.747186Z" + "end_time": "2024-06-14T06:00:46.979169200Z", + "start_time": "2024-06-14T06:00:46.794205700Z" } }, "id": "43dd9a881d3bbd1b", - "execution_count": 82 + "execution_count": 130 }, { "cell_type": "code", @@ -476,18 +479,18 @@ "cell_type": "code", "outputs": [], "source": [ - "u1, u2, u4 = process(-u1_avg), process(-u2_avg), process(-u4_avg) # u3 = process(-u3_avg)\n", - "u1, u2, u4 = u1 * factor, u2 * factor, u4 * factor # u3 = u3 * factor" + "u1, u2, u3, u4 = process(-u1_avg), process(-u2_avg), process(-u3_avg), process(-u4_avg)\n", + "u1, u2, u3, u4 = u1 * factor, u2 * factor, u3 * factor, u4 * factor" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-13T21:33:22.713779600Z", - "start_time": "2024-06-13T21:33:22.510490900Z" + "end_time": "2024-06-14T06:01:21.405193500Z", + "start_time": "2024-06-14T06:01:21.198587Z" } }, "id": "5522ed9c105eca27", - "execution_count": 84 + "execution_count": 131 }, { "cell_type": "code", @@ -503,7 +506,7 @@ { "data": { "text/plain": "", - "text/html": "
" + "text/html": "
" }, "metadata": {}, "output_type": "display_data" @@ -519,7 +522,8 @@ "# plt.plot(ds[::2], pair_averages, label='measurements')\n", "plt.plot(ds[::2], u1, 'b-', label='SAD')\n", "plt.plot(ds[::2], u2, 'g-', label='Optical')\n", - "plt.plot(ds[::2], u4, 'b--', label='Refine')\n", + "plt.plot(ds[::2], u3, 'b--', label='CTF')\n", + "# plt.plot(ds[::2], u4, 'b--', label='Refine')\n", "plt.plot(times, velocities, 'r--', label='Testo', linewidth=1)\n", "\n", "plt.xlabel('Time (s)')\n", @@ -535,12 +539,37 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-13T21:33:55.332850100Z", - "start_time": "2024-06-13T21:33:55.137492600Z" + "end_time": "2024-06-14T06:05:05.456452Z", + "start_time": "2024-06-14T06:05:05.263118700Z" } }, "id": "afd5755c1eeba3d4", - "execution_count": 86 + "execution_count": 136 + }, + { + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": "torch.Size([2675])" + }, + "execution_count": 137, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "u3_avg.shape" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-14T06:05:06.407491500Z", + "start_time": "2024-06-14T06:05:06.255928700Z" + } + }, + "id": "7a14746af79b6187", + "execution_count": 137 }, { "cell_type": "code", @@ -588,32 +617,6 @@ "id": "9eb582797e9463cb", "execution_count": 87 }, - { - "cell_type": "code", - "outputs": [ - { - "data": { - "text/plain": "tensor([-17.8040, -38.4342, -17.1759, ..., -11.6538, -35.1645, -8.6250])" - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "u1_avg = torch.tensor(np.load(\"../experiments/SAD.npy\"))\n", - "u1_avg" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-06-13T21:35:51.462629200Z", - "start_time": "2024-06-13T21:35:51.319489200Z" - } - }, - "id": "6a43e472d4be94c2", - "execution_count": 89 - }, { "cell_type": "code", "outputs": [], diff --git a/experiments/ctf.npy b/experiments/ctf.npy new file mode 100644 index 0000000000000000000000000000000000000000..3015745352dcbe9af6fc51bf32a872fd71c680dc GIT binary patch literal 10828 zcmbW7_g~HL|Hqr!Q+rQs?WH=e>l7+UB`q?O2pJ(WNh%|m$%=$jR#r03^?b32sjKYw3WCs(TlR{!6RYV!>> zl-(R9h%R>1v#|}5 z>VT8{=ei_%6%xS4?^Q-?;y}KC>tC|EmMfY;7Fh37CG?b0hr{VX0`=9#mIiO}BySaH z9ed8@U39Q3_p5MslQu*}$H;5vK?)y!g8iJM3V-1pvne)5&ZwoVp~Mq6dOESUUPgFn z{Dgj)Dq?`yOTqS*KIWeGqzQ8>=*=sMP+@0+{FIMeyj~uae|IqX-bzUHm%)F(jF7g% zQ{;4753^?%QC*@gPOTrnT4m&6JXV3Wcxpmne-FkKZ=~!U!*Y+y;nk0=e73{}<7MpF z#wThpS_A&~pgE%Rt}taiE4P=WJoRaWn8 z4DYWhg41hb$RCMdrV*cLNxwVn`WzL=H7(%>ANE9k<42*TP8|ye4`BWal#wCpMO%s$ zur1D!3c}<(>Qrw z%9pNH(#v?VnV|}J&f!O7K9l{z2cmcH)nU`-LG2qzYl%;IV(`M(Pq~oMeKi&W{weO##DJhhvkr z0SvWPvH@yy$#wb|W{}@bVQW_M;wV|f*eqh3#+ab#_EDO;>KnPgI3YQzsEoT}8S=bp zg70oQ%)Cc8JvC`&w|1L@EdsxFQwN9tixbj!n4rSksVys%>dn&O(C9YKWNRZD*E`Yn+j4E3I7@BqM_NH3S(uF z=&VJR^9<1c(ny-J&=?a69*9Eks^P-V6?7$A6K{=+ge^(!WKdHoTA$SuOZo*fMm^1ZOU*2w%(PacR+bR=wW@nYmgtBIr9= z9OzGJgN?A`R5MFeS4GhJPD;;LL0)eQ{-mEi8rqatlA9?m$JR>jtkpqIj5;$`QpN_! z1a@nV3BrFD^Q;XrP?N0`BF1WC*zPmJq!oskYF$qY8uZY+x)-Y+qzAnqpVJe18X+}4 zSlIGZ2j4FK4xJ(O2N!^aKubgvv}*)yJ?dyZebTqoJ6 zZUpt%ZoY7<9ELwU!o!~_Kr6D84K^^u-}`!W`m8cM`}~j$bu$R3hx-D`@$ zLss%-dg&B#-~xT~Gei8LY3xF+3L1B6G3C432s}5H{dj5$g_4)Ty-91RJLnzn?QVks zFLe3YU_I1(=+R7(C9Y{6VySn%(O>y2X|L{ugUY+eqjLEOJ9 zY($j?KAtdx(RF8>uxQ~i70yU`_ds%P#1}g6S532r=_6~}4<>38;j%#{#$VEg*5hmz zD{BhLq89$c!4$6poWxEI>TpjRLFr+^D9yORD%$LEvEqwF)a(pup2Z)3w#CikS~R1} z9vl3hN`7ZrL+9Z(Y8-8ag>_1#SNoCHZm4Dx&Y56|Mlls3; zZk5UiM_=e-TFQ0$cg!9%`7D{6ES6+Xp$<T6l0w z6$f6d6v|c1acQ^>T@6)(LH$4>UEdIgsx;Wv!&~V{R}p`o(i6|?rT0-Yz|)5oe5j{8 z_B!ebhX>l>>fL`lvaFjv9bQ4DB@W1XQp}F0SfF3E0eQaCz!ZyeAfv0sKz5_GF;L-?@MDfPRvkzXM)&hTvYimD;ctk-kPoLv#2X;y;|!iztck20 z)olJ48(gZ$;JK9>XyveK85G6doYz8ZO)|eR*d7_@_6zY(EU;8# zH9O;Bh4uv{Ty3!_Cf+q*Q}WcH8GVwJlU4A3`8<|*L=KYw+HAS9#O8|Liej+Du+O{t+eYT*P)w|3~jCr<3dqZP+f)W6Sy|V~TPK&$rXY z&w<-WURwk9K0ih4ekfsZze0A&(j5KT#5~ec4T%>th5HT0c)o+N2v<35EB{Ec&&~19 z@i<%OsDqfN9z6N3F_zsZJR6vh?&CsyUoR+MT_V>|#tl&QloE&Mu zi$)rwMfyKBkq(B9R%CWJ?Qs6V1IdB>4Rq&-7Ojre#Fn^`6cn2&w-u1 z4Q9BX5hFOrYa-&{OCH=Vi%0WRsA!=*mdq;PdB)~YZwciCH~*$2ov*z2_@9)0^M>Fv z%>W^DmFZuA2E^7I+16E7*mqlXBuE0TKy&Csz-lYe|_ju{7=g)hDJ5qD9<*GHM*>55X(hqK9E*}}|j z8kxykO3yEOI{(-l`8Q=)&Osg6j#w=iueU+K6FZ@HfdRY@JYnyr>!55x3)O~wryUKU zqQ*31yjdnMdg8B()Rrnb*4Pt%9qv^B-W`IoDjh!M0ePZM*>Eie`2b!5~hCT}f5)bWx4LQoJ=08PD?FuF9CR50?Dx6ZXH$}7KVUe!d z7+UoEk7UeQZH%{AMInncP@%MnnY=aw&+U*L>e7S5g$~|0{W|>^>&P_3mgu*wFK@9l zgZ^|c_B=rqUlh)B$EB_?Y&B!=FB_skt6DgE$QDkMX7KkGJrHvII3=HQ#C_cozFgA` z&D*wd%f~hJySE>ZS}K;#iH9n&Lktm$aqj@b~Rm4 zQsXsE=D4f4L}cz_gvl3|(A73eTy|8T&pR}6J3F5o)a|jSd7%N*VM#r$lFCFI`U z72Y0n!hqS^C^*mx+tl{(yo_G>C#yoUJq@J$GK=XiGe))V7Jgr34sq5EK1D+j>6?S8 z^GY+F7`uUes8vTvulW@8N)}cl)yS>d3^85%gvk*GNE?(v`%>lLcs!gc%M>uxcMmUV zSHsN934%lMS6c4WhfSTJgS`A6SbO~&oj$yT=WI~I#p*7eAKXR0eRr{*_bqWha0NRw zUjzB|JLzV%KHhKgzN*wTgwaY`g&vFZVM{&Gey$j?%-MN zrm&1YD7j~0FU?O%G-l^TT9f=xGX1I*`rkgo8|HLVi3@$O3$;R$LlVC* z-UfSC#S6<`8=$4GT$u319%BU$I%}zo$5g^BympZ9;^pkruU_c7K8&W0@H?r+gK@NqMIJ%38iv!wo$&EBUwyMo6$(!7qfmVvvce1ow^M zbf=u>7=&S0ldIsL6;2~cQ-w1#>~QcJ*iAu*pIyMuY!1M~Ob=$z+Xuf=TTV}%=mU-EBUtrjdn_of<%YGc&@Qo zD{dm#3aCNJM&hv;F)_{gWO=(W_6Y;+v3x*>p0RJy?QXB{m( z=724s`a<4qTYUao%VM9oAc+Riw&4zN9oUOa^^$Vx;LBX4zYSJ@w4t;q_bBtLi2g+Q zVD1SQX7S4j$CE4hG0#5O?BYeq(!L~D5eUhg&$L&fMq`}yp*c!mtXdA8?b@tvvnx)P zYqDEq9kjSA7)vx2vGQ>b_UnZ$%CCJD81t|bh?Zg+G?nHTwi9l+8w>WM6u!7{Sj#AM~?nhFjKB#Z4a$c-0Ci^ zS21nVddOuDdSc`&8^*drvHDFV@BC?n0gfLe10Fde;@Vf*8RZAl15&Tj-xp^s2lLoM z5llP!3g+6XSeanM{w?vq`ioonvOFs!t~24+6D-lAx4QU)mm!Rr0${Vz8YSr>CVA?I z32O{k`HTS6rcbAT`aW3OVJW=c)(dle=QF(5!w8iD(la0gew%mmD>c&Rb?`J$!*HH^>`I;lTx=0B+Dw~8IO4_hTDAiT=Mbc$A zW?k-y_x_x#-?s(JS<5$nV^CVZRCuwwHWXCr`s~Igd))YXirZ`XV0PRFzGSsI8ivl{SF${iI_Uye81tFBr*?9O z1Z&u-8q$I=9qd^#nk_1J!@o7kbo+u6W+xmLeO+UZ)@O%=?kZ{i+mI((ud9zX$0aOk z!8bZ#Rl*xHLUF@owGfqDM;q>~p^h>!KI9}aotI%)yP=MEJD3C27r0;OeY)*Go7D4l zFn7RRR^Qhin~q9rDVI*S!dD4zj(H))Lo9r(H$};aBG$Ox12L0=Y4(s_7%*AFmpW~v z5ree_(*bVyrp!t8rY+icl?w(XVOY;WKixd={O(a9Y}PwBJbJ!gPF87G@)Pq{N5$DNi8x9x@NLwizDr!&60z6&0*R2Mt>Uj9tV zmF~flMEA;UVLo^**S9jpx5J~DX{JS^%Ev?PqJ|XCUJ0Ho7|67aFHJ zS&95@+VG}ak~Pl*j=3*c_lgKS9Hq;8>=I$EZ4PVf2*DV8Q}L&oez?DJC{4+XLCT7Q z)a2*^t1mLb$~0-;Yl$FP19!};TF)koNdc0jZY4e%f2tyB-<2eo7Fdx_Y&0BIUeLRK zZU~q>UUEEeDbby$lw~mxsdLr{KBq$A-sC0GxY`E~jxAVS01u47G`2K37OJl{ zQFOHz3Z?tnVyg!hi$>C?9wHn`^P^pX!LaQAnC}& zT>~*sY$U$7W;B*e71)f6A^7>?wP@aySoD@XCtNI%`mdZ_CuLSJ$dRj1n&yqP{=Y;K zOZvj;{$0_&N=G=@-eu#@I^)!kll-CY1?o(m%s#d;e5=fq+@0?Y(_DM(76riV`65xH#EOh^Aks!>4)BX3f$;}vOTwiF11+nYSy8n6GKrHmnSr@8-%_azKL$@ z2jIZNLRNdFA8I$h;feDzv*`53n-?Z*wUiGwt7?<-sx9uU|GjlYy8Xz|Q-tWP_xRcAdGz(+ zNNV)(!$|Y~bU8*J(VeBDoYrV~Z7dhuTEkG#XFs*KPAAi)D&)h&2>yD4Yd+RMiC{)r zs@||4<-zu0Lhzs;L||HxLz>6 z2CU&z#K9;jvSSPU;?U=08nx?1W8r^iPtCX!2FL6wn%CS1^LsZ){d_3)1qSn&8)B?% zNMI+Myl~@~IZJy!1YU(s^e#w@KAX4l{_PRSOmU%MC#3wk;s-PPJP3+?F3@&4D>P z?4fF*&W>p|l3m6c(rk4`>4_V{N=GT59W>&TrN2|HA12g~@ParcNOY{l0(&0S(ELxX z2+AEpvEz(My+31h-Z9vIppxYVOTEb!kuc@61I~P@Wwq#q(RV|6-c?Vebzk89qFt~w zB%j?oww(@zX0XZXCg`6dBe>k}q#vGVsph#VPVaxucI|e>*Guu_aljMWiwCoMS#P9v zjNliIVzEj=k(P!9VDa=DLTcZgwEN5s;jpS34D-wRh-O!$ymjFUS8OoK)tt@aTJY!- zKwAv)V=PqF|lEoY;cqE3SuxU-W{D45s2+7lZ;FjVU1W(mv`ofPs!!hK35Ar$D z8|QnrP+nLhO2%YT7asx_KUb!$*AD?Zp9)rEq9NBy#OoCUP;)Yjm0j_{;VwXq3YtLDc!$1)h)~*n;MTr<6 zoIzg8`{Go`E*2{e#5C6hG)re3o(^2k_WbaMOXP0hPk06GNP5fiw1%VU=rrzp$`hWy zzX`$f+@YJRAU3W|#6NY$#6yyJ`Mk)MRBx117sB)lZ26N^~pP;F!_K0%K2!|0|& ziSAu=fz`^XOlhJeG=elJWs(`ZCh3buwS>a+={2F#ED}@3N*!ZiAkJReN%hTsXc$q= zlyCf?q1VbN`*%FzY_9U0Pa=4l?qU}wrr_-CN^;8%hI95K;nG?kxW3#j^t>uYKy@^o zyXOVxyE$AT&KD8-3AE`&G+a*&k!bB;IDf`bJm+XIxTy}-ykJlctP-wo?FE@v=ebN? z0H(%mr_L`io&k`pzb1qqiO1$YM`+b0sTcM)7v)NG z=(l=xk?U6z^y7u1lF|}t%e+e}e_ZglwjcYsJ`7_Vx3TO38^kn&Y}CULbbq#_!N&!H zXf9Jx?2Qxd8>O=%W1RhbLU?v?2>L1i5Dry&LBZh?!*VggGLQ50utAt;_L}$Aj6n3R zVwU|n0nZMEa=CT8DDgu#Z-{h5MO&`mqZ$u|>je~7J_H_h&qd=@EKsH9MeW05kz%Kb zr;q(n^R9t!8vK|}b$9Z`$5nA{)k$`d`QhmNERx+33oFAi$%JB7dILFmcE5`f($B`jS-*ko{KW8F;DED%y`l4l^UbB9 zs2o|vmVFF{qNyFzIO2na{bXsARw6d^Dq&lf#bW;VCuFuP4txKdk+f)qV`FnWPv{W^ zTcKOHAKpkEvvp{*QVPEN_^_{{Fa%5Ii?-Lrh)D}0MRh-TsYuxJanc!B!blp@(+6pS zmatTMj{edD#hi-5Y}XI`T5~csMHC8gu{Wq<{8k<|!yl1AER{a=(!K=Jk>W3kyN&CoK1H%#2Z?|Y$LI8wnPxjSp99|f0 z6!tA2fbvPZ*%199P@5b}?NNDTona}~QOdxj% z3Oc*ekiEZ!`K}3ruczsiqE|;aDaW`kxLE|vhY71T85r={W9%TO{ z96v6}u}43KqM=8=5YRmg)_a!=wTY>id*L+y^Dr8(3 zm?*KVK1yd>4%CQnrwj8WP~oS;;jq9ajR=NoAYckjvib>JEEhY`5}$e7N_F+ zkq1;Ctd5b1gT&UQQVu@!LTG3mjnpbV>ai;TvzI>?Y<*_qY^6H8CSBKi*Ynw;$VBY0 zk`Zg(nSmpx4iHoG2K??an~zygu2Z4Y)vj1~c_(d3H^uN zE9xd<@6T}Z)f|HHV{MqRMi_GUWs#CJA5ILbr_JsY@S>xU{$_hYah5i9{Eb5O>-n_o z&?rP{?hs|vr@?>xIPz!-K|p(ul<(q^=xWL4G^JwDt-V}rRtlzc?h>N550Jj+QBN}) zP4O!ItS~dd2NOoI;yqa=jNkHl1S|rZW8e(aQfE7>Kp%D_P5p z<&^dibasmuuC^U#?lK`LT=9zicO(oK&jyR0-1Wz|u!X`LsgoSk_J9|AJD^ZHiWAnm zV^w()9gnfbx0iS5yZvu^7vM)3fo4!`G-qYbPPp)3Fe{(sg;_bxjOix8$#)q&KQkO} zE}vzduH%rT@sOU*On`aBPHy+d2QNn~VTad_hOeNEDxXC7cKzmYTldiG@))6?v|b_p zsw|a;VUgKxb~7{Q#VDR@w^RHw%9`_(pp?RDG;v*2O`Th5c&@vaF=P3IOg|>TXgqEL4~1M5@Um} z3vNrU+!bM+bp_R@j>WR}jqFuqA+P^uz;g2$_DW9SlVUHdk@?1&|JvYY$S-#1aDOaq z42R1Cd;F~IDUR(g!cmhZ+PKFJt9?e&M6P;gC~UZ)O0_UG=? z`UCo)^hy<(NPT+kv=YI5NQiVkQ7sHq8h|^KuM>L^h3lib*qstze3Gmd;t%%2)dEkx zV`vhRzGO@0_X$I>LkRn?L4ejtH+0ktz~RyUWH>bu{^fi41g{MAD&oSj+E9c~)naZB zr2A-U8BLUo$KA`7tfEgEYHrF2D|8}})b)-{pwW15VNI>u!XQ6w0h?(O4p;jz+|fTA zE3KT!eNQG1dC4&=9tFh-tElbedmdw>$49=Ljq&@7$W`Mam0gynq2`9L&s{8Rf9i}k z)n{4kYg=3%Vn(4O&G0XGsUZ8?8I65@i6)%5O`R8t=|*%uC6C+B&Py{;(K!u ZO)e(RjVQY&lUtNs;muB(+&b5k{s(f3*8u torch.Tensor: grid = torch.stack((x, y), dim=-1).to(x.device) v_grid = grid + torch.stack((-self.u / (cols / 2), self.v / (rows / 2)), dim=-1) - img_new = grid_sample(image.float(), v_grid, mode='bicubic').to(torch.uint8) + img_new = grid_sample(image.float(), v_grid[None, :, :, :], mode='bicubic').to(torch.uint8) return img_new def interpolate_field(self, img_shape) -> None: if self.u.shape[-2:] == img_shape: return - self.u = interpolate(self.u[None, None, :, :], img_shape, mode='bicubic').squeeze(dim=0) - self.v = interpolate(self.v[None, None, :, :], img_shape, mode='bicubic').squeeze(dim=0) + self.u = interpolate(self.u[None, None, :, :], img_shape, mode='bicubic').squeeze() + self.v = interpolate(self.v[None, None, :, :], img_shape, mode='bicubic').squeeze() y, x = torch.meshgrid(torch.arange(0, img_shape[0], 1), torch.arange(0, img_shape[1], 1)) self.x, self.y = x.to(self.x.device), y.to(self.y.device)