From b7bb1450899fd4c916a3977a2dd57bc179221fe9 Mon Sep 17 00:00:00 2001 From: turtlebasket Date: Fri, 21 Oct 2022 11:41:37 -0700 Subject: [PATCH] WIP batch processing --- Pipfile | 1 + Pipfile.lock | 112 +++++++++++++++++++++++++++++------------ README.md | 48 ++++++++++++++++++ batch-process.py | 62 +++++++++++++++++++++++ config.example.yaml | 14 ++++++ images-input/.gitkeep | 0 images-output/.gitkeep | 0 ratio_pyrometry.py | 1 - 8 files changed, 204 insertions(+), 34 deletions(-) create mode 100644 batch-process.py create mode 100644 config.example.yaml create mode 100644 images-input/.gitkeep create mode 100644 images-output/.gitkeep diff --git a/Pipfile b/Pipfile index 92a5671..3ca4241 100644 --- a/Pipfile +++ b/Pipfile @@ -9,6 +9,7 @@ numba = "*" flask = "*" gunicorn = "*" werkzeug = "*" +pyyaml = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index c86cde6..7b89559 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "f32b823e3975ed0083bf7bedff36887eb3c9a01fe41b0e9142630b508e63692a" + "sha256": "0cfa12a983973f0699999da1f8adcf4662998d4d37158ae1eed984cb7b773fc3" }, "pipfile-spec": 6, "requires": { @@ -138,37 +138,37 @@ }, "numba": { "hashes": [ - "sha256:0c358fd4ef7c5efc09ee96432284d66df285bd68654e85c39cf6c570dc35429a", - "sha256:2713f161c51e0638dd4f92036999a523df5dcc498d39adb1559cf7cacb6f0fe9", - "sha256:2a1d81994bedc0e02f900ea4b81bdfd4929ee844f6ef9242e196c50f30f95449", - "sha256:2e4ac02b1bacea083e7cab5c02ded3bb5db7bb35d9c3a0a63da4f8c86691365a", - "sha256:339e519f4091fab3a446b474e041c86eedd216334f8dd7febee4b43df112179c", - "sha256:3492f0a5d09e257fc521f5377a6c6b907eec1920d14739f0b2458b9d29946a5a", - "sha256:36903c24088aed9a768d7e8269f4ee4d3abc5662e2aeacacf524a7c5d1707b04", - "sha256:45cefeefa78762753c2be9f64e7579a7523afff479642c3c661fb78bd740a352", - "sha256:590112ac60ff482f1d096e7574f9a781dff2f7bc91bfe388fe7d87e52630c0ec", - "sha256:6184d0c125bdf2f19ad78e71e9ea873ad6c88c55f7609f987bd4354d15c54bb3", - "sha256:61d472e42ecad262857409a00f9f24d4609b190ba1fab5fc118e7a1ee43c9d39", - "sha256:63199334b9fedf3511369738fa8ef07411abc1cd9e8cd0e474cf671133b85180", - "sha256:6465f23beff2f6134f53da873d4202671cdbb02716a29f2b5f5c77102ece37c0", - "sha256:6b885219eba813a4c70e68fce18339a3e575fb2b75e92d2babbcf04a40f74dee", - "sha256:8a8e35d9b86d33c2f77e50fd8a610b984f57005e1cd1a2c8267d4cfd743d8f49", - "sha256:9eb56e7a23c4daa195cefba894671a45464533b0af9908483ba3de74a75fe682", - "sha256:ae89056d1681c70b79bc9835c40672d4ba22cf4e75eacc0b8ff7f176c7233781", - "sha256:bb3609bb76fd5b1d3adc9a7df40f27c3eb8c7e5d2c8a536c1bdc7b09c2fdc215", - "sha256:c011436c8e0ec7e37fbb81953537ceb659e662f7c7f9850f2638a100e857bee4", - "sha256:c4467aed831297473ec94f9f3d9795de551c447bf6ea17d7ac24b6a47fb687ea", - "sha256:d216a8957057afa43374eb9a11c69a874424d33e20f4270f80cef878c7efa500", - "sha256:d87bdb704ef219c00844844a8ac9c6f1c518f2cee9c26d1971427b6bc3d2004d", - "sha256:e50d1de5291d1afd3d660ca149447c682d70b8d3c22f97ed9a3076e6344330b0", - "sha256:e998782d1e466ce5a61cce18f23fd69ba0eeb78069fd2ad59e1a2928a29f952f", - "sha256:ea7d286519eb575f66617805582391e6483e8b33968831331ecd46fe3c7f753f", - "sha256:edbba200696c4be93a10020e4e0eab5ca0898dff4920f3dc2b4d39c14e40b993", - "sha256:f112dcfcbcbb19da33e9218611c51208499d52d74e358f2160e64ccb46e50f07", - "sha256:faced8cc33ee6a272654bb3e570994e1949790ae06579ea485c25849f4e79008" + "sha256:0744cf4214ed795eb2df3ed1635d77a6ffcbd990a66a06125548b5fb8ee46323", + "sha256:07a2d8a149ecc6eca4ef5c7216e58511d48184854e07b7f59d0c32fab0742e8f", + "sha256:0a413c2ce289071c62905308fc2fa66bc5f21b6f55d7539625c1ff3a11a17edf", + "sha256:18f8c98641bf746b06b3d37efc09fe5ebb84c951df5ad8bd573795756d07e7f8", + "sha256:20e2a02937b27800c2126d1efcb6c8e0535292e82434ab0d98b1060ffeb1867a", + "sha256:2256fee4332ab1e51cd0ec57086989e4011616ddb438659d99bb35822f43939b", + "sha256:22c493a20d816980712768cb302eea417609a200348b784523e106a45a6e2185", + "sha256:32a16bd6257b5e09e3227b886dea40ca16cf62df45c1914c630f43c5bf4ebf7e", + "sha256:35aeaae51bbbc87035e8c07189eac0d1d4b2490e43c503a585fa4a220b9d0320", + "sha256:35da8eb35659cc7d8a603ecc3e65359166f5496b1e7b9b77f712a97893e9d81a", + "sha256:49c6ac44877d11523040ec1b92323184b23afa5619931a4e0137ed8d2b958819", + "sha256:5398e6c75017f4dc04875cbc1efe28556b0e1719cff6c41b6cd7509a896698f2", + "sha256:63c9fb3fdda56fababaa128a51209c8fabef12dd21491b1af41e0a6888e4c63e", + "sha256:6f3a848e73e8353b2c5ac9e9b03e99a13d5fa693c6ee14684a36c045ab369770", + "sha256:70f834f17136f6b403304ea2ffdeda0893c976540c4e9cd8f32b99258f75ada3", + "sha256:73529b33c0195e9f9e77b60896a5c5dc7ae0190bd8a1e3db15916b03befd641e", + "sha256:79c154566b1a8f0644eb9c8f1808f66007bc8278791a44623cc3b7f3ddc61edd", + "sha256:8848697e1e952b56886e84eecd5ae83d890ec0481c48ac803e13e2ab75a7d294", + "sha256:9439331818d38fa1ca87ccbc211fe6bec48aad51d028a93a5d7214aee4de94d9", + "sha256:99463b892e2e71fe6a10ffd4bd7e8517fac66cd73909b738fee715a2111e423c", + "sha256:a776b5b177605569fbc04e6e68ba62e461ec5bbb1ea007a0c8d2e5f2a872c1a8", + "sha256:b4e300e749430e77bcc8b4d990dcc8e217a6d9bcae8f9f402686933d3a6ee53d", + "sha256:bf8fbaff80aa9969da316b54280dd2707bb9dcfafcaaa58cc681206ccc1f8c57", + "sha256:c230f875a157772f51d82ba3e510cd97bdfec8fed4603e49f97d221332adc714", + "sha256:c6b0539a30ab68903730f86ff6a9140e705b33c572402a42962b24a4e1fe8eb2", + "sha256:e668e2be37c76c74d4011f590f611b4fd3dac79438a491365391f2739ff2f233", + "sha256:ea63562915c15dff559c1eb45dced16b61cfbc7233ffb9444063421ec6c5ffaf", + "sha256:f9ae7b37e5cb53b62eb958f159f8defabd666af4ff1a9eb1de48cf2faf1dc918" ], "index": "pypi", - "version": "==0.56.2" + "version": "==0.56.3" }, "numpy": { "hashes": [ @@ -217,13 +217,59 @@ "index": "pypi", "version": "==4.6.0.66" }, + "pyyaml": { + "hashes": [ + "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", + "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", + "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", + "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", + "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", + "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", + "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", + "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", + "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", + "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", + "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", + "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", + "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", + "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", + "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", + "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", + "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", + "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", + "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", + "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", + "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", + "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", + "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", + "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", + "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", + "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", + "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", + "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", + "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", + "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", + "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", + "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", + "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", + "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", + "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", + "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", + "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", + "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", + "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", + "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" + ], + "index": "pypi", + "version": "==6.0" + }, "setuptools": { "hashes": [ - "sha256:09980778aa734c3037a47997f28d6db5ab18bdf2af0e49f719bfc53967fd2e82", - "sha256:608a7885b664342ae9fafc43840b29d219c5a578876f6f7e00c4e2612160587f" + "sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17", + "sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356" ], "markers": "python_version >= '3.7'", - "version": "==59.8.0" + "version": "==65.5.0" }, "werkzeug": { "hashes": [ diff --git a/README.md b/README.md index b065116..9c04a27 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,54 @@ | --- | --- | | ![](screenshots/pyro_input.png) | ![](screenshots/pyro_results.png) +## Using the web version + +1. Go to [pyro.turtlebasket.ml](https://pyro.turtlebasket.ml). +2. Select an input image. +3. Enter your DSLR camera settings. +4. Click "Generate Heatmap". + +## Using the local (batch) version + +Create a new config file: + +``` +cp config.example.yaml config.yaml +``` + +...then edit the values to match your DSLR camera settings. Standard config syntax is: + +```yaml +--- +# camera settings +iso: 64 +i-darkcurrent: 7.7 +exposure-time: 0.5 +f-stop: 2.4 + +# pyrometry settings +min-temp: 600 +max-temp: 1200 +scaling-factor: 0.55 + +# output settings +smoothing-radius: 2 +``` + +Install dependencies: + +``` +pipenv install +``` + +...then load images into `images-input`. Run: + +``` +pipenv run python3 batch-process.py +``` + +...and find outputs in `images-output`. + ## Developing the web frontend To serve in production: diff --git a/batch-process.py b/batch-process.py new file mode 100644 index 0000000..9d9152a --- /dev/null +++ b/batch-process.py @@ -0,0 +1,62 @@ +import yaml +import cv2 as cv +import numpy as np +import os +from ratio_pyrometry import rg_ratio_normalize + +config = {} +with open("./config.yaml", "r") as yaml_stream: + config = yaml.safe_load(yaml_stream) + +img_in_dir = "./images-input" +img_out_dir = "./images-output" +accepted_formats = [ + ".jpg", + ".jpeg", + ".png", + ".tiff", +] + +files = [] + +for file in os.listdir(img_in_dir): + filename = os.fsdecode(file) + valid = False + for fmt in accepted_formats: + if filename.endswith(fmt): + files.append(os.path.join(img_in_dir, filename)) + valid = True + break + if not valid: + print(f"Invalid file extension for {filename}.") + exit + +for filename in files: + with open(filename) as imgfile: + # read image & crop + img_orig = cv.imread(imgfile, cv.IMREAD_UNCHANGED) + + img = rg_ratio_normalize( + img_orig, + config['i-darkcurrent'], + config['f-stop'], + config['exposure-time'], + config['iso'], + config['min-temp'], + config['max-temp'], + config['scaling-factor'], + ) + + # build & apply smoothing conv kernel + k = [] + smoothing_radius = config['smoothing-radius'] + for i in range(smoothing_radius): + k.append([1/(smoothing_radius**2) for i in range(smoothing_radius)]) + kernel = np.array(k) + + img = cv.filter2D(src=img, ddepth=-1, kernel=kernel) + + # write colormapped image + img_jet = cv.applyColorMap(img, cv.COLORMAP_JET) + + # TODO: GENERTE TEMP KEY & OUTPUT MATPLOTLIB diff --git a/config.example.yaml b/config.example.yaml new file mode 100644 index 0000000..4367673 --- /dev/null +++ b/config.example.yaml @@ -0,0 +1,14 @@ +--- +# camera settings +iso: 64 +i-darkcurrent: 7.7 +exposure-time: 0.5 +f-stop: 2.4 + +# pyrometry settings +min-temp: 600 +max-temp: 1200 +scaling-factor: 0.55 + +# output settings +smoothing-radius: 2 diff --git a/images-input/.gitkeep b/images-input/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/images-output/.gitkeep b/images-output/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ratio_pyrometry.py b/ratio_pyrometry.py index b36311b..c20189a 100644 --- a/ratio_pyrometry.py +++ b/ratio_pyrometry.py @@ -103,7 +103,6 @@ def ratio_pyrometry_pipeline( img = cv.filter2D(src=img, ddepth=-1, kernel=kernel) # write colormapped image - # img_jet = img img_jet = cv.applyColorMap(img, cv.COLORMAP_JET) # --- Generate temperature key ---