├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── corruptions.py ├── frost ├── frost1.png ├── frost2.png ├── frost3.png ├── frost4.jpg ├── frost5.jpg └── frost6.jpg ├── pessimal_noise.ipynb ├── pessimal_noise_matrix └── visualize_corruptions.ipynb /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to Contribute 2 | 3 | We'd love to accept your patches and contributions to this project. There are 4 | just a few small guidelines you need to follow. 5 | 6 | ## Contributor License Agreement 7 | 8 | Contributions to this project must be accompanied by a Contributor License 9 | Agreement. You (or your employer) retain the copyright to your contribution; 10 | this simply gives us permission to use and redistribute your contributions as 11 | part of the project. Head over to to see 12 | your current agreements on file or to sign a new one. 13 | 14 | You generally only need to submit a CLA once, so if you've already submitted one 15 | (even if it was for a different project), you probably don't need to do it 16 | again. 17 | 18 | ## Code reviews 19 | 20 | All submissions, including submissions by project members, require review. We 21 | use GitHub pull requests for this purpose. Consult 22 | [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more 23 | information on using pull requests. 24 | 25 | ## Community Guidelines 26 | 27 | This project follows [Google's Open Source Community 28 | Guidelines](https://opensource.google.com/conduct/). 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MNIST-C 2 | 3 | This repository contains the source code used to create the MNIST-C dataset, a 4 | corrupted MNIST benchmark for testing out-of-distribution robustness of computer 5 | vision models. 6 | 7 | Please see our full paper [https://arxiv.org/abs/1906.02337](https://arxiv.org/abs/1906.02337) for more details. 8 | 9 | ## Dataset 10 | 11 | The static dataset is available for download at [https://zenodo.org/record/3239543](https://zenodo.org/record/3239543). 12 | -------------------------------------------------------------------------------- /corruptions.py: -------------------------------------------------------------------------------- 1 | # Copyright 2018 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # https://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import numpy as np 16 | from PIL import Image 17 | import pickle 18 | 19 | # /////////////// Corruption Helpers /////////////// 20 | 21 | import skimage as sk 22 | from skimage.filters import gaussian 23 | from skimage import transform, feature 24 | from io import BytesIO 25 | from wand.image import Image as WandImage 26 | from wand.api import library as wandlibrary 27 | import wand.color as WandColor 28 | import ctypes 29 | from PIL import Image as PILImage 30 | from PIL import ImageDraw as draw 31 | import cv2 32 | from scipy.ndimage import zoom as scizoom 33 | from scipy.ndimage.interpolation import map_coordinates 34 | import warnings 35 | import os 36 | from pkg_resources import resource_filename 37 | 38 | warnings.simplefilter("ignore", UserWarning) 39 | 40 | CORRUPTIONS = ['identity', 41 | 'shot_noise', 42 | 'impulse_noise', 43 | 'glass_blur', 44 | 'motion_blur', 45 | 'shear', 46 | 'scale', 47 | 'rotate', 48 | 'brightness', 49 | 'translate', 50 | 'stripe', 51 | 'fog', 52 | 'spatter', 53 | 'dotted_line', 54 | 'zigzag', 55 | 'canny_edges',] 56 | 57 | ALL_CORRUPTIONS = ['identity', 58 | 'gaussian_noise', 59 | 'shot_noise', 60 | 'impulse_noise', 61 | 'speckle_noise', 62 | 'pessimal_noise', 63 | 'gaussian_blur', 64 | 'glass_blur', 65 | 'defocus_blur', 66 | 'motion_blur', 67 | 'zoom_blur', 68 | 'fog', 69 | 'frost', 70 | 'snow', 71 | 'spatter', 72 | 'contrast', 73 | 'brightness', 74 | 'saturate', 75 | 'jpeg_compression', 76 | 'pixelate', 77 | 'elastic_transform', 78 | 'quantize', 79 | 'shear', 80 | 'rotate', 81 | 'scale', 82 | 'translate', 83 | 'line', 84 | 'dotted_line', 85 | 'zigzag', 86 | 'inverse', 87 | 'stripe', 88 | 'canny_edges',] 89 | 90 | 91 | with open("pessimal_noise_matrix", "rb") as f: 92 | pessimal_noise_matrix = pickle.load(f) 93 | 94 | def disk(radius, alias_blur=0.1, dtype=np.float32): 95 | if radius <= 8: 96 | L = np.arange(-8, 8 + 1) 97 | ksize = (3, 3) 98 | else: 99 | L = np.arange(-radius, radius + 1) 100 | ksize = (5, 5) 101 | X, Y = np.meshgrid(L, L) 102 | aliased_disk = np.array((X ** 2 + Y ** 2) <= radius ** 2, dtype=dtype) 103 | aliased_disk /= np.sum(aliased_disk) 104 | 105 | # supersample disk to antialias 106 | return cv2.GaussianBlur(aliased_disk, ksize=ksize, sigmaX=alias_blur) 107 | 108 | 109 | # Tell Python about the C method 110 | wandlibrary.MagickMotionBlurImage.argtypes = (ctypes.c_void_p, # wand 111 | ctypes.c_double, # radius 112 | ctypes.c_double, # sigma 113 | ctypes.c_double) # angle 114 | 115 | 116 | # Extend wand.image.Image class to include method signature 117 | class MotionImage(WandImage): 118 | def motion_blur(self, radius=0.0, sigma=0.0, angle=0.0): 119 | wandlibrary.MagickMotionBlurImage(self.wand, radius, sigma, angle) 120 | 121 | 122 | # modification of https://github.com/FLHerne/mapgen/blob/master/diamondsquare.py 123 | def plasma_fractal(mapsize=256, wibbledecay=3): 124 | """ 125 | Generate a heightmap using diamond-square algorithm. 126 | Return square 2d array, side length 'mapsize', of floats in range 0-255. 127 | 'mapsize' must be a power of two. 128 | """ 129 | assert (mapsize & (mapsize - 1) == 0) 130 | maparray = np.empty((mapsize, mapsize), dtype=np.float_) 131 | maparray[0, 0] = 0 132 | stepsize = mapsize 133 | wibble = 100 134 | 135 | def wibbledmean(array): 136 | return array / 4 + wibble * np.random.uniform(-wibble, wibble, array.shape) 137 | 138 | def fillsquares(): 139 | """For each square of points stepsize apart, 140 | calculate middle value as mean of points + wibble""" 141 | cornerref = maparray[0:mapsize:stepsize, 0:mapsize:stepsize] 142 | squareaccum = cornerref + np.roll(cornerref, shift=-1, axis=0) 143 | squareaccum += np.roll(squareaccum, shift=-1, axis=1) 144 | maparray[stepsize // 2:mapsize:stepsize, 145 | stepsize // 2:mapsize:stepsize] = wibbledmean(squareaccum) 146 | 147 | def filldiamonds(): 148 | """For each diamond of points stepsize apart, 149 | calculate middle value as mean of points + wibble""" 150 | mapsize = maparray.shape[0] 151 | drgrid = maparray[stepsize // 2:mapsize:stepsize, stepsize // 2:mapsize:stepsize] 152 | ulgrid = maparray[0:mapsize:stepsize, 0:mapsize:stepsize] 153 | ldrsum = drgrid + np.roll(drgrid, 1, axis=0) 154 | lulsum = ulgrid + np.roll(ulgrid, -1, axis=1) 155 | ltsum = ldrsum + lulsum 156 | maparray[0:mapsize:stepsize, stepsize // 2:mapsize:stepsize] = wibbledmean(ltsum) 157 | tdrsum = drgrid + np.roll(drgrid, 1, axis=1) 158 | tulsum = ulgrid + np.roll(ulgrid, -1, axis=0) 159 | ttsum = tdrsum + tulsum 160 | maparray[stepsize // 2:mapsize:stepsize, 0:mapsize:stepsize] = wibbledmean(ttsum) 161 | 162 | while stepsize >= 2: 163 | fillsquares() 164 | filldiamonds() 165 | stepsize //= 2 166 | wibble /= wibbledecay 167 | 168 | maparray -= maparray.min() 169 | return maparray / maparray.max() 170 | 171 | 172 | def clipped_zoom(img, zoom_factor): 173 | h = img.shape[0] 174 | # ceil crop height(= crop width) 175 | ch = int(np.ceil(h / float(zoom_factor))) 176 | 177 | top = (h - ch) // 2 178 | img = scizoom(img[top:top + ch, top:top + ch], (zoom_factor, zoom_factor), order=1) 179 | # trim off any extra pixels 180 | trim_top = (img.shape[0] - h) // 2 181 | 182 | return img[trim_top:trim_top + h, trim_top:trim_top + h] 183 | 184 | 185 | def line_from_points(c0, r0, c1, r1): 186 | if c1 == c0: 187 | return np.zeros((28, 28)) 188 | 189 | # Decay function defined as log(1 - d/2) + 1 190 | cc, rr = np.meshgrid(np.linspace(0, 27, 28), np.linspace(0, 27, 28), sparse=True) 191 | 192 | m = (r1 - r0) / (c1 - c0) 193 | f = lambda c: m * (c - c0) + r0 194 | dist = np.clip(np.abs(rr - f(cc)), 0, 2.3 - 1e-10) 195 | corruption = np.log(1 - dist / 2.3) + 1 196 | corruption = np.clip(corruption, 0, 1) 197 | 198 | l = np.int(np.floor(c0)) 199 | r = np.int(np.ceil(c1)) 200 | 201 | corruption[:,:l] = 0 202 | corruption[:,r:] = 0 203 | 204 | return np.clip(corruption, 0, 1) 205 | 206 | 207 | # /////////////// End Corruption Helpers /////////////// 208 | 209 | 210 | # /////////////// Corruptions /////////////// 211 | 212 | def identity(x): 213 | return np.array(x, dtype=np.float32) 214 | 215 | def gaussian_noise(x, severity=5): 216 | c = [.08, .12, 0.18, 0.26, 0.38][severity - 1] 217 | 218 | x = np.array(x) / 255. 219 | x = np.clip(x + np.random.normal(size=x.shape, scale=c), 0, 1) * 255 220 | return x.astype(np.float32) 221 | 222 | 223 | def shot_noise(x, severity=5): 224 | c = [60, 25, 12, 5, 3][severity - 1] 225 | 226 | x = np.array(x) / 255. 227 | x = np.clip(np.random.poisson(x * c) / float(c), 0, 1) * 255 228 | return x.astype(np.float32) 229 | 230 | 231 | def impulse_noise(x, severity=4): 232 | c = [.03, .06, .09, 0.17, 0.27][severity - 1] 233 | 234 | x = sk.util.random_noise(np.array(x) / 255., mode='s&p', amount=c) 235 | x = np.clip(x, 0, 1) * 255 236 | return x.astype(np.float32) 237 | 238 | 239 | def speckle_noise(x, severity=5): 240 | c = [.15, .2, 0.35, 0.45, 0.6][severity - 1] 241 | 242 | x = np.array(x) / 255. 243 | x = np.clip(x + x * np.random.normal(size=x.shape, scale=c), 0, 1) * 255 244 | return x.astype(np.float32) 245 | 246 | 247 | def pessimal_noise(x, severity=1): 248 | c = 10.63 249 | x = np.array(x) / 255. 250 | noise = np.random.normal(size=196) @ pessimal_noise_matrix 251 | scaled_noise = noise / np.linalg.norm(noise) * c / 4 252 | tiled_noise = np.tile(scaled_noise.reshape(14, 14), (2, 2)) 253 | x = np.clip(x + tiled_noise, 0, 1) * 255 254 | return x.astype(np.float32) 255 | 256 | 257 | def gaussian_blur(x, severity=2): 258 | c = [1, 2, 3, 4, 6][severity - 1] 259 | 260 | x = gaussian(np.array(x) / 255., sigma=c, multichannel=True) 261 | x = np.clip(x, 0, 1) * 255 262 | return x.astype(np.float32) 263 | 264 | 265 | def glass_blur(x, severity=1): 266 | # sigma, max_delta, iterations 267 | c = [(0.7, 1, 2), (0.9, 2, 1), (1, 2, 3), (1.1, 3, 2), (1.5, 4, 2)][severity - 1] 268 | 269 | x = np.uint8(gaussian(np.array(x) / 255., sigma=c[0], multichannel=True) * 255) 270 | 271 | # locally shuffle pixels 272 | for i in range(c[2]): 273 | for h in range(28 - c[1], c[1], -1): 274 | for w in range(28 - c[1], c[1], -1): 275 | if np.random.choice([True, False], 1)[0]: 276 | dx, dy = np.random.randint(-c[1], c[1], size=(2,)) 277 | h_prime, w_prime = h + dy, w + dx 278 | # swap 279 | x[h, w], x[h_prime, w_prime] = x[h_prime, w_prime], x[h, w] 280 | 281 | x = np.clip(gaussian(x / 255., sigma=c[0], multichannel=True), 0, 1) * 255 282 | return x.astype(np.float32) 283 | 284 | 285 | def defocus_blur(x, severity=1): 286 | c = [(3, 0.1), (4, 0.5), (6, 0.5), (8, 0.5), (10, 0.5)][severity - 1] 287 | 288 | x = np.array(x) / 255. 289 | kernel = disk(radius=c[0], alias_blur=c[1]) 290 | x = cv2.filter2D(x, -1, kernel) 291 | 292 | x = np.clip(x, 0, 1) * 255 293 | return x.astype(np.float32) 294 | 295 | 296 | def motion_blur(x, severity=1): 297 | c = [(10, 3), (15, 5), (15, 8), (15, 12), (20, 15)][severity - 1] 298 | 299 | output = BytesIO() 300 | x.save(output, format='PNG') 301 | x = MotionImage(blob=output.getvalue()) 302 | 303 | x.motion_blur(radius=c[0], sigma=c[1], angle=np.random.uniform(-45, 45)) 304 | 305 | x = cv2.imdecode(np.frombuffer(x.make_blob(), np.uint8), 306 | cv2.IMREAD_UNCHANGED) 307 | 308 | return np.clip(np.array(x), 0, 255).astype(np.float32) 309 | 310 | 311 | def zoom_blur(x, severity=5): 312 | c = [np.arange(1, 1.11, 0.01), 313 | np.arange(1, 1.16, 0.01), 314 | np.arange(1, 1.21, 0.02), 315 | np.arange(1, 1.26, 0.02), 316 | np.arange(1, 1.31, 0.03)][severity - 1] 317 | 318 | x = (np.array(x) / 255.).astype(np.float32) 319 | out = np.zeros_like(x) 320 | for zoom_factor in c: 321 | out += clipped_zoom(x, zoom_factor) 322 | 323 | x = (x + out) / (len(c) + 1) 324 | return np.clip(x, 0, 1) * 255 325 | 326 | 327 | def fog(x, severity=5): 328 | c = [(1.5, 2), (2., 2), (2.5, 1.7), (2.5, 1.5), (3., 1.4)][severity - 1] 329 | 330 | x = np.array(x) / 255. 331 | max_val = x.max() 332 | x = x + c[0] * plasma_fractal(wibbledecay=c[1])[:28, :28] 333 | x = np.clip(x * max_val / (max_val + c[0]), 0, 1) * 255 334 | return x.astype(np.float32) 335 | 336 | 337 | def frost(x, severity=5): 338 | c = [(1, 0.4), 339 | (0.8, 0.6), 340 | (0.7, 0.7), 341 | (0.65, 0.7), 342 | (0.6, 0.75)][severity - 1] 343 | 344 | idx = np.random.randint(5) 345 | filename = [resource_filename(__name__, 'frost/frost1.png'), 346 | resource_filename(__name__, 'frost/frost2.png'), 347 | resource_filename(__name__, 'frost/frost3.png'), 348 | resource_filename(__name__, 'frost/frost4.jpg'), 349 | resource_filename(__name__, 'frost/frost5.jpg'), 350 | resource_filename(__name__, 'frost/frost6.jpg')][idx] 351 | frost = cv2.imread(filename, 0) 352 | # randomly crop and convert to rgb 353 | x_start, y_start = np.random.randint(0, frost.shape[0] - 28), np.random.randint(0, frost.shape[1] - 28) 354 | frost = frost[x_start:x_start + 28, y_start:y_start + 28] 355 | 356 | x = np.clip(c[0] * np.array(x) + c[1] * frost, 0, 255) 357 | return x.astype(np.float32) 358 | 359 | 360 | def snow(x, severity=5): 361 | c = [(0.1, 0.3, 3, 0.5, 10, 4, 0.8), 362 | (0.2, 0.3, 2, 0.5, 12, 4, 0.7), 363 | (0.55, 0.3, 4, 0.9, 12, 8, 0.7), 364 | (0.55, 0.3, 4.5, 0.85, 12, 8, 0.65), 365 | (0.55, 0.3, 2.5, 0.85, 12, 12, 0.55)][severity - 1] 366 | 367 | x = np.array(x, dtype=np.float32) / 255. 368 | snow_layer = np.random.normal(size=x.shape, loc=c[0], scale=c[1]) # [:2] for monochrome 369 | 370 | snow_layer = clipped_zoom(snow_layer, c[2]) 371 | snow_layer[snow_layer < c[3]] = 0 372 | 373 | snow_layer = PILImage.fromarray((np.clip(snow_layer.squeeze(), 0, 1) * 255).astype(np.uint8), mode='L') 374 | output = BytesIO() 375 | snow_layer.save(output, format='PNG') 376 | snow_layer = MotionImage(blob=output.getvalue()) 377 | 378 | snow_layer.motion_blur(radius=c[4], sigma=c[5], angle=np.random.uniform(-135, -45)) 379 | 380 | snow_layer = cv2.imdecode(np.frombuffer(snow_layer.make_blob(), np.uint8), 381 | cv2.IMREAD_UNCHANGED) / 255. 382 | 383 | x = c[6] * x + (1 - c[6]) * np.maximum(x, x * 1.5 + 0.5) 384 | x = np.clip(x + snow_layer + np.rot90(snow_layer, k=2), 0, 1) * 255 385 | return x.astype(np.float32) 386 | 387 | 388 | def spatter(x, severity=4): 389 | c = [(0.65, 0.3, 4, 0.69, 0.6, 0), 390 | (0.65, 0.3, 3, 0.68, 0.6, 0), 391 | (0.65, 0.3, 2, 0.68, 0.5, 0), 392 | (0.65, 0.3, 1, 0.65, 1.5, 1), 393 | (0.67, 0.4, 1, 0.65, 1.5, 1)][severity - 1] 394 | 395 | x = np.array(x, dtype=np.float32) / 255. 396 | 397 | liquid_layer = np.random.normal(size=x.shape, loc=c[0], scale=c[1]) 398 | 399 | liquid_layer = gaussian(liquid_layer, sigma=c[2]) 400 | liquid_layer[liquid_layer < c[3]] = 0 401 | 402 | m = np.where(liquid_layer > c[3], 1, 0) 403 | m = gaussian(m.astype(np.float32), sigma=c[4]) 404 | m[m < 0.8] = 0 405 | 406 | # mud spatter 407 | color = 63 / 255. * np.ones_like(x) * m 408 | x *= (1 - m) 409 | 410 | return np.clip(x + color, 0, 1) * 255 411 | 412 | 413 | def contrast(x, severity=4): 414 | c = [0.4, .3, .2, .1, .05][severity - 1] 415 | 416 | x = np.array(x) / 255. 417 | means = np.mean(x, axis=(0, 1), keepdims=True) 418 | x = np.clip((x - means) * c + means, 0, 1) * 255 419 | return x.astype(np.float32) 420 | 421 | 422 | def brightness(x, severity=5): 423 | c = [.1, .2, .3, .4, .5][severity - 1] 424 | 425 | x = np.array(x) / 255. 426 | x = sk.color.gray2rgb(x) 427 | x = sk.color.rgb2hsv(x) 428 | x[:, :, 2] = np.clip(x[:, :, 2] + c, 0, 1) 429 | x = sk.color.hsv2rgb(x) 430 | x = sk.color.rgb2gray(x) 431 | 432 | x = np.clip(x, 0, 1) * 255 433 | return x.astype(np.float32) 434 | 435 | 436 | def saturate(x, severity=5): 437 | c = [(0.3, 0), (0.1, 0), (2, 0), (5, 0.1), (20, 0.2)][severity - 1] 438 | 439 | x = np.array(x) / 255. 440 | x = sk.color.gray2rgb(x) 441 | x = sk.color.rgb2hsv(x) 442 | x = np.clip(x * c[0] + c[1], 0, 1) 443 | x = sk.color.hsv2rgb(x) 444 | x = sk.color.rgb2gray(x) 445 | 446 | x = np.clip(x, 0, 1) * 255 447 | return x.astype(np.float32) 448 | 449 | 450 | def jpeg_compression(x, severity=5): 451 | c = [25, 18, 15, 10, 7][severity - 1] 452 | 453 | output = BytesIO() 454 | x.save(output, 'JPEG', quality=c) 455 | x = PILImage.open(output) 456 | 457 | return np.array(x).astype(np.float32) 458 | 459 | 460 | def pixelate(x, severity=3): 461 | c = [0.6, 0.5, 0.4, 0.3, 0.25][severity - 1] 462 | 463 | x = x.resize((int(28 * c), int(28 * c)), PILImage.BOX) 464 | x = x.resize((28, 28), PILImage.BOX) 465 | 466 | return np.array(x).astype(np.float32) 467 | 468 | 469 | # mod of https://gist.github.com/erniejunior/601cdf56d2b424757de5 470 | def elastic_transform(image, severity=1): 471 | c = [(28 * 2, 28 * 0.7, 28 * 0.1), 472 | (28 * 2, 28 * 0.08, 28 * 0.2), 473 | (28 * 0.05, 28 * 0.01, 28 * 0.02), 474 | (28 * 0.07, 28 * 0.01, 28 * 0.02), 475 | (28 * 0.12, 28 * 0.01, 28 * 0.02)][severity - 1] 476 | 477 | image = np.array(image, dtype=np.float32) / 255. 478 | shape = image.shape 479 | 480 | # random affine 481 | center_square = np.float32(shape) // 2 482 | square_size = min(shape) // 3 483 | pts1 = np.float32([center_square + square_size, 484 | [center_square[0] + square_size, center_square[1] - square_size], 485 | center_square - square_size]) 486 | pts2 = pts1 + np.random.uniform(-c[2], c[2], size=pts1.shape).astype(np.float32) 487 | M = cv2.getAffineTransform(pts1, pts2) 488 | image = cv2.warpAffine(image, M, shape, borderMode=cv2.BORDER_CONSTANT) 489 | 490 | dx = (gaussian(np.random.uniform(-1, 1, size=shape), 491 | c[1], mode='reflect', truncate=3) * c[0]).astype(np.float32) 492 | dy = (gaussian(np.random.uniform(-1, 1, size=shape), 493 | c[1], mode='reflect', truncate=3) * c[0]).astype(np.float32) 494 | 495 | x, y = np.meshgrid(np.arange(shape[1]), np.arange(shape[0])) 496 | indices = np.reshape(y + dy, (-1, 1)), np.reshape(x + dx, (-1, 1)) 497 | return np.clip(map_coordinates(image, indices, order=1, mode='constant').reshape(shape), 0, 1) * 255 498 | 499 | 500 | def quantize(x, severity=5): 501 | bits = [5, 4, 3, 2, 1][severity-1] 502 | 503 | x = np.array(x).astype(np.float32) 504 | x *= (2 ** bits - 1) / 255. 505 | x = x.round() 506 | x *= 255. / (2 ** bits - 1) 507 | 508 | return x 509 | 510 | 511 | def shear(x, severity=2): 512 | c = [0.2, 0.4, 0.6, 0.8, 1.][severity-1] 513 | 514 | # Randomly switch directions 515 | bit = np.random.choice([-1, 1], 1)[0] 516 | c *= bit 517 | aff = transform.AffineTransform(shear=c) 518 | 519 | # Calculate translation in order to keep image center (13.5, 13.5) fixed 520 | a1, a2 = aff.params[0,:2] 521 | b1, b2 = aff.params[1,:2] 522 | a3 = 13.5 * (1 - a1 - a2) 523 | b3 = 13.5 * (1 - b1 - b2) 524 | aff = transform.AffineTransform(shear=c, translation=[a3, b3]) 525 | 526 | x = np.array(x) / 255. 527 | x = transform.warp(x, inverse_map=aff) 528 | x = np.clip(x, 0, 1) * 255. 529 | return x.astype(np.float32) 530 | 531 | 532 | def rotate(x, severity=2): 533 | c = [0.2, 0.4, 0.6, 0.8, 1.][severity-1] 534 | 535 | # Randomly switch directions 536 | bit = np.random.choice([-1, 1], 1)[0] 537 | c *= bit 538 | aff = transform.AffineTransform(rotation=c) 539 | 540 | a1, a2 = aff.params[0,:2] 541 | b1, b2 = aff.params[1,:2] 542 | a3 = 13.5 * (1 - a1 - a2) 543 | b3 = 13.5 * (1 - b1 - b2) 544 | aff = transform.AffineTransform(rotation=c, translation=[a3, b3]) 545 | 546 | x = np.array(x) / 255. 547 | x = transform.warp(x, inverse_map=aff) 548 | x = np.clip(x, 0, 1) * 255 549 | return x.astype(np.float32) 550 | 551 | 552 | def scale(x, severity=3): 553 | c = [(1/.9, 1/.9), (1/.8, 1/.8), (1/.7, 1/.7), (1/.6, 1/.6), (1/.5, 1/.5)][severity-1] 554 | 555 | aff = transform.AffineTransform(scale=c) 556 | 557 | a1, a2 = aff.params[0,:2] 558 | b1, b2 = aff.params[1,:2] 559 | a3 = 13.5 * (1 - a1 - a2) 560 | b3 = 13.5 * (1 - b1 - b2) 561 | aff = transform.AffineTransform(scale=c, translation=[a3, b3]) 562 | 563 | x = np.array(x) / 255. 564 | x = transform.warp(x, inverse_map=aff) 565 | x = np.clip(x, 0, 1) * 255 566 | return x.astype(np.float32) 567 | 568 | 569 | def translate(x, severity=3): 570 | c = [1, 2, 3, 4, 5][severity-1] 571 | bit = np.random.choice([-1, 1], 2) 572 | dx = c * bit[0] 573 | dy = c * bit[1] 574 | aff = transform.AffineTransform(translation=[dx, dy]) 575 | 576 | x = np.array(x) / 255. 577 | x = transform.warp(x, inverse_map=aff) 578 | x = np.clip(x, 0, 1) * 255 579 | return x.astype(np.float32) 580 | 581 | 582 | def line(x): 583 | x = np.array(x) / 255. 584 | c0 = np.random.randint(low=0, high=5) 585 | c1 = np.random.randint(low=22, high=27) 586 | r0, r1 = np.random.randint(low=0, high=27, size=2) 587 | corruption = line_from_points(c0, r0, c1, r1) 588 | 589 | x = np.clip(x + corruption, 0, 1) * 255 590 | return x.astype(np.float32) 591 | 592 | 593 | def dotted_line(x): 594 | x = np.array(x) / 255. 595 | r0, r1 = np.random.randint(low=0, high=27, size=2) 596 | corruption = line_from_points(0, r0, 27, r1) 597 | 598 | idx = np.arange(0, 30, 2) 599 | off = True 600 | for i in range(1, len(idx)): 601 | if off: 602 | corruption[:,idx[i-1]:idx[i]] = 0 603 | off = not off 604 | 605 | x = np.clip(x + corruption, 0, 1) * 255 606 | return x.astype(np.float32) 607 | 608 | 609 | def zigzag(x): 610 | x = np.array(x) / 255. 611 | # a, b are length and width of zigzags 612 | a = 2. 613 | b = 2. 614 | 615 | c0, c1 = 2, 25 616 | r0 = np.random.randint(low=0, high=27) 617 | r1 = r0 + np.random.randint(low=-5, high=5) 618 | 619 | theta = np.arctan((r1 - r0) / (c1 - c0)) 620 | 621 | # Calculate length of straight line 622 | d = (c1 - c0) / np.cos(theta) 623 | endpoints = [(0, 0)] 624 | 625 | for i in range(int((d - a) // (2 * a)) + 1): 626 | c_i = (2 * i + 1) * a 627 | r_i = (-1) ** i * b 628 | endpoints.append((c_i, r_i)) 629 | 630 | max_c = (2 * a) * (d // (2 * a)) 631 | if d != max_c: 632 | endpoints.append((d, r_i / (2 * (d - max_c)))) 633 | endpoints = np.array(endpoints).T 634 | 635 | # Rotate by theta 636 | M = np.array([[np.cos(theta), -np.sin(theta)], 637 | [np.sin(theta), np.cos(theta)]]) 638 | endpoints = M.dot(endpoints) 639 | 640 | cs, rs = endpoints 641 | cs += c0 642 | rs += r0 643 | 644 | for i in range(1, endpoints.shape[1]): 645 | x += line_from_points(cs[i-1], rs[i-1], cs[i], rs[i]) 646 | x = np.clip(x, 0, 1) 647 | 648 | x = x * 255 649 | return x.astype(np.float32) 650 | 651 | 652 | def inverse(x): 653 | x = np.array(x).astype(np.float32) 654 | return 255. - x 655 | 656 | 657 | def stripe(x): 658 | x = np.array(x).astype(np.float32) 659 | x[:,:7] = 255. - x[:,:7] 660 | x[:,21:] = 255. - x[:,21:] 661 | return x 662 | 663 | 664 | def canny_edges(x): 665 | x = np.array(x) / 255. 666 | x = feature.canny(x).astype(np.float32) 667 | return x * 255 668 | -------------------------------------------------------------------------------- /frost/frost1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google-research/mnist-c/bba57e4ccc282f106907c5239958e72298451ea7/frost/frost1.png -------------------------------------------------------------------------------- /frost/frost2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google-research/mnist-c/bba57e4ccc282f106907c5239958e72298451ea7/frost/frost2.png -------------------------------------------------------------------------------- /frost/frost3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google-research/mnist-c/bba57e4ccc282f106907c5239958e72298451ea7/frost/frost3.png -------------------------------------------------------------------------------- /frost/frost4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google-research/mnist-c/bba57e4ccc282f106907c5239958e72298451ea7/frost/frost4.jpg -------------------------------------------------------------------------------- /frost/frost5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google-research/mnist-c/bba57e4ccc282f106907c5239958e72298451ea7/frost/frost5.jpg -------------------------------------------------------------------------------- /frost/frost6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google-research/mnist-c/bba57e4ccc282f106907c5239958e72298451ea7/frost/frost6.jpg -------------------------------------------------------------------------------- /pessimal_noise.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "pessimal_noise.ipynb", 7 | "version": "0.3.2", 8 | "provenance": [], 9 | "collapsed_sections": [] 10 | }, 11 | "language_info": { 12 | "codemirror_mode": { 13 | "name": "ipython", 14 | "version": 3 15 | }, 16 | "file_extension": ".py", 17 | "mimetype": "text/x-python", 18 | "name": "python", 19 | "nbconvert_exporter": "python", 20 | "pygments_lexer": "ipython3", 21 | "version": "3.7.3" 22 | }, 23 | "kernelspec": { 24 | "display_name": "Python [conda env:py37]", 25 | "language": "python", 26 | "name": "conda-env-py37-py" 27 | } 28 | }, 29 | "cells": [ 30 | { 31 | "cell_type": "code", 32 | "metadata": { 33 | "id": "eaYdz8thKggB", 34 | "colab_type": "code", 35 | "colab": {} 36 | }, 37 | "source": [ 38 | "import matplotlib.pyplot as plt\n", 39 | "import numpy as np\n", 40 | "import torch\n", 41 | "import torch.nn as nn\n", 42 | "import torch.nn.functional as F\n", 43 | "import torch.optim as optim\n", 44 | "from torchvision import datasets, transforms\n", 45 | "\n", 46 | "import corruptions\n", 47 | "import models\n", 48 | "\n", 49 | "%matplotlib inline\n", 50 | "%env CUDA_VISIBLE_DEVICES=3" 51 | ], 52 | "execution_count": 0, 53 | "outputs": [] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "metadata": { 58 | "id": "LxDMLOt5KggG", 59 | "colab_type": "code", 60 | "colab": {} 61 | }, 62 | "source": [ 63 | "def show(x):\n", 64 | " x = np.array(x)\n", 65 | " plt.imshow(x, cmap='gray')\n", 66 | " plt.show()\n", 67 | " \n", 68 | "train_mnist = datasets.MNIST(\"../data/\", train=True, transform=transforms.ToTensor())\n", 69 | "test_mnist = datasets.MNIST(\"../data/\", train=False, transform=transforms.ToTensor())\n", 70 | "IMAGES = [test_mnist[i][0] for i in range(50)]\n", 71 | "LABELS = [test_mnist[i][1] for i in range(50)]\n", 72 | "to_pil = transforms.ToPILImage()\n", 73 | "device = torch.device(\"cuda\")\n", 74 | "cpu = torch.device(\"cpu\")" 75 | ], 76 | "execution_count": 0, 77 | "outputs": [] 78 | }, 79 | { 80 | "cell_type": "code", 81 | "metadata": { 82 | "id": "bAqMdfw4KggI", 83 | "colab_type": "code", 84 | "colab": {} 85 | }, 86 | "source": [ 87 | "def normalize(tensor, mean=(0.1307,), std=(0.3081,)):\n", 88 | " mean = torch.as_tensor(mean, dtype=torch.float32, device=tensor.device)\n", 89 | " std = torch.as_tensor(std, dtype=torch.float32, device=tensor.device)\n", 90 | " return tensor.sub(mean[:, None, None]).div(std[:, None, None])\n", 91 | "\n", 92 | "def main(model, epochs, lr, momentum, sgd, batch_size, targeted, adv_target, test_batch_size, log_interval, eps, lam):\n", 93 | "\n", 94 | " def train(model, A, device, train_loader, optimizer, epoch):\n", 95 | " model.eval()\n", 96 | " for batch_idx, (data, target) in enumerate(train_loader):\n", 97 | " A.requires_grad = True\n", 98 | " data, target = data.to(device), target.to(device)\n", 99 | " noise = torch.normal(mean=torch.zeros(batch_size, 1, 196)).to(device) @ A\n", 100 | " norm = noise.norm(dim=-1)\n", 101 | " scaled_noise = (noise.transpose(0, -1) / norm.squeeze()).transpose(0, -1) * eps / 4\n", 102 | " tiled_noise = scaled_noise.view(batch_size, 1, 14, 14).repeat(1, 1, 2, 2)\n", 103 | " data = data + tiled_noise.view(data.shape)\n", 104 | " data = normalize(torch.clamp(data, 0, 1))\n", 105 | " optimizer.zero_grad()\n", 106 | " output = model(data)\n", 107 | " if targeted:\n", 108 | " loss = -F.nll_loss(output, target) + F.nll_loss(output, adv_target)\n", 109 | " else:\n", 110 | " loss = -F.nll_loss(output, target)\n", 111 | " loss.backward()\n", 112 | " optimizer.step()\n", 113 | " if batch_idx % log_interval == 0:\n", 114 | " print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'.format(\n", 115 | " epoch, batch_idx * len(data), len(train_loader.dataset),\n", 116 | " 100. * batch_idx / len(train_loader), loss.item()))\n", 117 | " A.detach_()\n", 118 | "\n", 119 | "\n", 120 | " def test(model, A, device, test_loader):\n", 121 | " model.eval()\n", 122 | " test_loss = 0\n", 123 | " correct = 0\n", 124 | " with torch.no_grad():\n", 125 | " for data, target in test_loader:\n", 126 | " data, target = data.to(device), target.to(device)\n", 127 | " noise = torch.normal(mean=torch.zeros(test_batch_size, 1, 196)).to(device) @ A\n", 128 | " norm = noise.norm(dim=-1)\n", 129 | " scaled_noise = (noise.transpose(0, -1) / norm.squeeze()).transpose(0, -1) * eps / 4\n", 130 | " tiled_noise = scaled_noise.view(test_batch_size, 1, 14, 14).repeat(1, 1, 2, 2)\n", 131 | " data = data + tiled_noise.view(data.shape)\n", 132 | " data = normalize(torch.clamp(data, 0, 1))\n", 133 | " output = model(data)\n", 134 | " test_loss += F.nll_loss(output, target, reduction='sum').item() # sum up batch loss\n", 135 | " pred = output.argmax(dim=1, keepdim=True) # get the index of the max log-probability\n", 136 | " correct += pred.eq(target.view_as(pred)).sum().item()\n", 137 | "\n", 138 | " test_loss /= len(test_loader.dataset)\n", 139 | "\n", 140 | " print('\\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\\n'.format(\n", 141 | " test_loss, correct, len(test_loader.dataset),\n", 142 | " 100. * correct / len(test_loader.dataset)))\n", 143 | " \n", 144 | " device = torch.device(\"cuda\")\n", 145 | " cpu = torch.device(\"cpu\")\n", 146 | "\n", 147 | " train_loader = torch.utils.data.DataLoader(\n", 148 | " datasets.MNIST('../data', train=True, download=True,\n", 149 | " transform=transforms.ToTensor()),\n", 150 | " batch_size=batch_size, shuffle=True, pin_memory=True)\n", 151 | " test_loader = torch.utils.data.DataLoader(\n", 152 | " datasets.MNIST('../data', train=False,\n", 153 | " transform=transforms.ToTensor()),\n", 154 | " batch_size=test_batch_size, shuffle=True, pin_memory=True)\n", 155 | "\n", 156 | " A = torch.eye(196).to(device)\n", 157 | " A.requires_grad = True\n", 158 | " \n", 159 | " if targeted:\n", 160 | " adv_target = torch.tensor([adv_target]).repeat(batch_size).to(device)\n", 161 | "\n", 162 | " model = model()\n", 163 | " \n", 164 | " if sgd:\n", 165 | " optimizer = optim.SGD([A], lr=lr, momentum=momentum)\n", 166 | " else:\n", 167 | " optimizer = optim.Adam([A])\n", 168 | " \n", 169 | " for epoch in range(1, epochs + 1):\n", 170 | " if epoch in [45, 90]:\n", 171 | " new_lr = lr * (0.1 ** (epoch // 30))\n", 172 | " for param_group in optimizer.param_groups:\n", 173 | " param_group['lr'] = new_lr\n", 174 | " train(model, A, device, train_loader, optimizer, epoch)\n", 175 | " test(model, A, device, test_loader)\n", 176 | " \n", 177 | " return A" 178 | ], 179 | "execution_count": 0, 180 | "outputs": [] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "metadata": { 185 | "id": "Ai27kwXaKolf", 186 | "colab_type": "code", 187 | "colab": {} 188 | }, 189 | "source": [ 190 | "A = main(model=models.ConvNet, epochs=135, lr=1000., momentum=0., sgd=True, batch_size=100,\n", 191 | " targeted=False, adv_target=8, test_batch_size=1000, log_interval=100, eps=10.63, lam=0.)" 192 | ], 193 | "execution_count": 0, 194 | "outputs": [] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "metadata": { 199 | "id": "qj-TwlBaKggO", 200 | "colab_type": "code", 201 | "colab": {}, 202 | "outputId": "c6e1a607-e25c-4358-a639-efac83bc2985" 203 | }, 204 | "source": [ 205 | "noise = torch.normal(mean=torch.zeros(1, 1, 196)) @ A.to(cpu)\n", 206 | "norm = noise.norm(dim=-1)\n", 207 | "scaled_noise = (noise.transpose(0, -1) / norm.squeeze()).transpose(0, -1) * 10.63 / 4\n", 208 | "tiled_noise = scaled_noise.view(1, 1, 14, 14).repeat(1, 1, 2, 2)\n", 209 | "x = IMAGES[0] + tiled_noise.view(IMAGES[0].shape)\n", 210 | "x = torch.clamp(x, 0, 1)\n", 211 | "show(x[0])\n", 212 | "x = A.to(cpu).view(196, 196)\n", 213 | "plt.imshow(np.array(x), cmap=\"gray\")" 214 | ], 215 | "execution_count": 0, 216 | "outputs": [ 217 | { 218 | "output_type": "display_data", 219 | "data": { 220 | "image/png": "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\n", 221 | "text/plain": [ 222 | "
" 223 | ] 224 | }, 225 | "metadata": { 226 | "tags": [], 227 | "needs_background": "light" 228 | } 229 | }, 230 | { 231 | "output_type": "execute_result", 232 | "data": { 233 | "text/plain": [ 234 | "" 235 | ] 236 | }, 237 | "metadata": { 238 | "tags": [] 239 | }, 240 | "execution_count": 26 241 | }, 242 | { 243 | "output_type": "display_data", 244 | "data": { 245 | "image/png": "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\n", 246 | "text/plain": [ 247 | "
" 248 | ] 249 | }, 250 | "metadata": { 251 | "tags": [], 252 | "needs_background": "light" 253 | } 254 | } 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "metadata": { 260 | "id": "XTTY4aLHKggV", 261 | "colab_type": "code", 262 | "colab": {} 263 | }, 264 | "source": [ 265 | "final = A.detach().cpu().numpy()\n", 266 | "torch.save(final, \"pessimal_noise_matrix\")" 267 | ], 268 | "execution_count": 0, 269 | "outputs": [] 270 | } 271 | ] 272 | } -------------------------------------------------------------------------------- /pessimal_noise_matrix: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google-research/mnist-c/bba57e4ccc282f106907c5239958e72298451ea7/pessimal_noise_matrix -------------------------------------------------------------------------------- /visualize_corruptions.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "visualize_corruptions.ipynb", 7 | "version": "0.3.2", 8 | "provenance": [], 9 | "collapsed_sections": [] 10 | }, 11 | "kernelspec": { 12 | "name": "python2", 13 | "display_name": "Python 2" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "code", 19 | "metadata": { 20 | "id": "-MTZUhlGEbTU", 21 | "colab_type": "code", 22 | "colab": {} 23 | }, 24 | "source": [ 25 | "import corruptions\n", 26 | "from importlib import reload\n", 27 | "import matplotlib.pyplot as plt\n", 28 | "import torchvision\n", 29 | "import numpy as np\n", 30 | "%matplotlib inline" 31 | ], 32 | "execution_count": 0, 33 | "outputs": [] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "metadata": { 38 | "id": "fQYM1-K-EbTX", 39 | "colab_type": "code", 40 | "colab": {} 41 | }, 42 | "source": [ 43 | "train_mnist = torchvision.datasets.MNIST(\"../data/\", train=True, download=True)\n", 44 | "test_mnist = torchvision.datasets.MNIST(\"../data/\", train=False, download=True)\n", 45 | "IMAGES = [test_mnist[i][0] for i in range(50)]\n", 46 | "LABELS = [test_mnist[i][1] for i in range(50)]" 47 | ], 48 | "execution_count": 0, 49 | "outputs": [] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "metadata": { 54 | "id": "eEICV4aTEbTa", 55 | "colab_type": "code", 56 | "colab": {} 57 | }, 58 | "source": [ 59 | "def show(x):\n", 60 | " plt.imshow(x, cmap='gray', vmin=0, vmax=255)\n", 61 | " plt.axis(\"off\")\n", 62 | " plt.show()\n", 63 | " \n", 64 | "def round_and_astype(x):\n", 65 | " return np.round(x).astype(np.uint8)\n", 66 | "\n", 67 | "def inspect(corruption):\n", 68 | " for im, l in zip(IMAGES, LABELS):\n", 69 | " print(\"Label: \" + str(l))\n", 70 | " x = np.array(corruption(im))\n", 71 | " show(round_and_astype(x))\n", 72 | " \n", 73 | "def inspect_single(image, corruption):\n", 74 | " x = np.array(corruption(image))\n", 75 | " show(round_and_astype(x))\n", 76 | " \n", 77 | "def save(image, corruption, filename):\n", 78 | " x = round_and_astype(np.array(corruption(image)))\n", 79 | " fig = plt.figure()\n", 80 | " ax = fig.add_subplot(111)\n", 81 | " ax.axes.get_xaxis().set_visible(False)\n", 82 | " ax.axes.get_yaxis().set_visible(False)\n", 83 | " ax.set_frame_on(False)\n", 84 | " ax.imshow(x, cmap='gray', vmin=0, vmax=255)\n", 85 | " plt.savefig(filename, bbox_inches='tight',transparent=True, pad_inches=0)" 86 | ], 87 | "execution_count": 0, 88 | "outputs": [] 89 | }, 90 | { 91 | "cell_type": "code", 92 | "metadata": { 93 | "scrolled": true, 94 | "id": "beg98c3hEbTc", 95 | "colab_type": "code", 96 | "colab": {} 97 | }, 98 | "source": [ 99 | "reload(corruptions)\n", 100 | "inspect(corruptions.glass_blur)" 101 | ], 102 | "execution_count": 0, 103 | "outputs": [] 104 | } 105 | ] 106 | } --------------------------------------------------------------------------------