bat._main
1import click 2import validators 3 4import numpy as np 5from PIL import Image 6 7from bat.apis.imagga import Imagga 8from bat.apis.google import CloudVision 9from bat.apis.deepapi import bat_deepapi_model_list 10 11from bat.examples.simba_attack_deepapi import simba_attack_deepapi 12from bat.examples.bandits_attack_deepapi import bandits_attack_deepapi 13from bat.examples.square_attack_deepapi import square_attack_deepapi 14 15bat_api_list = { 16 'deepapi': 'An open-source image classification cloud service for research on black-box adversarial attacks.', 17 'google': 'Google Cloud Vision AI.', 18 'imagga': 'Imagga automatic tagging API.' 19} 20 21bat_attack_list = [ 22 ('SimBA', 'Local Search', 'A Simple Black-box Adversarial Attacks'), 23 ('Square Attack', 'Local Search', 'A query-efficient black-box adversarial attack via random search.'), 24 ('Bandits Atack', 'Gradient Estimation', 'Black-Box Adversarial Attacks with Bandits and Priors') 25] 26 27bat_example_list = [ 28 ('simba_deepapi', 'SimBA Attack against DeepAPI'), 29 ('bandits_deepapi', 'Bandits Attack against DeepAPI'), 30 ('square_deepapi', 'Square Attack against DeepAPI'), 31] 32 33# Main CLI (bat) 34@click.group() 35def main_cli(): 36 """The CLI tool for Black-box Adversarial Toolbox (BAT).""" 37 pass 38 39# bat api 40@click.group() 41def api(): 42 """Manage Cloud APIs""" 43 pass 44 45# bat api list 46@api.command('list') 47def api_list(): 48 """List supported Cloud APIs""" 49 max_len = max([len(x) for x in bat_api_list.keys()]) 50 for i, api in enumerate(bat_api_list.keys(), start=1): 51 print('{} : {:<{w}s}\t{}'.format(i, api, bat_api_list[api], w=max_len+1)) 52 53# bat api run 54@api.group('run') 55def api_run(): 56 """Run supported Cloud APIs""" 57 pass 58 59# bat api run deepapi 60@api_run.command('deepapi') 61def api_run_deepapi(): 62 """Send an image to DeepAPI""" 63 for i, (_, model) in enumerate(bat_deepapi_model_list.items(), start=1): 64 print(i, ':', model[0]) 65 66 try: 67 # Get the model type 68 index = input(f"Please input the model index (default: 1): ") 69 if len(index) == 0: 70 index = 1 71 else: 72 while not index.isdigit() or int(index) > len(bat_deepapi_model_list): 73 index = input(f"Model [{index}] does not exist. Please try again: ") 74 75 # Get the DeepAPI server url 76 deepapi_url = input(f"Please input the DeepAPI URL (default: http://localhost:8080): ") 77 if len(deepapi_url) == 0: 78 deepapi_url = 'http://localhost:8080' 79 else: 80 while not validators.url(deepapi_url): 81 deepapi_url = input(f"Invalid URL. Please try again: ") 82 83 # Get the image file 84 try: 85 file = input(f"Please input the image file: ") 86 while len(file) == 0: 87 file = input(f"Please input the image file: ") 88 image = Image.open(file).convert('RGB') 89 x = np.array(image) 90 except Exception as e: 91 print(e) 92 return 93 94 deepapi_model = bat_deepapi_model_list[int(index)][1](deepapi_url) 95 96 y = deepapi_model.predict(np.array([x]))[0] 97 98 if y is not None: 99 deepapi_model.print(y) 100 101 except KeyboardInterrupt as e: 102 print() 103 return 104 105# bat api run imagga 106@api_run.command('imagga') 107def api_run_deepapi(): 108 """Send an image to Imagga auto-tagging API""" 109 api_key = input(f"Please input the Imagga API Key: ") 110 api_secret = input(f"Please input the Imagga API Secret: ") 111 imagga_client = Imagga(api_key, api_secret, concurrency=2) 112 113 # Get the image file 114 try: 115 file = input(f"Please input the image file: ") 116 while len(file) == 0: 117 file = input(f"Please input the image file: ") 118 except Exception as e: 119 print(e) 120 return 121 122 # Make predictions 123 y = imagga_client.predict(file) 124 125 # Print results 126 if y is not None: 127 imagga_client.print(y) 128 129# bat api run google 130@api_run.command('google') 131def api_run_google(): 132 """Send an image to Google Cloud Vision""" 133 vision_client = CloudVision() 134 135 # Get the image file 136 try: 137 file = input(f"Please input the image file: ") 138 while len(file) == 0: 139 file = input(f"Please input the image file: ") 140 except Exception as e: 141 print(e) 142 return 143 144 # Make predictions 145 y = vision_client.predict(file) 146 147 # Print resuilts 148 if y is not None: 149 vision_client.print(y) 150 151# bat attack 152@click.group() 153def attack(): 154 """Manage Attacks""" 155 pass 156 157# bat attack list 158@attack.command('list') 159def attack_list(): 160 """List supported Attacks""" 161 max_len = max([len(x[0]) for x in bat_attack_list]) 162 for i, attack in enumerate(bat_attack_list, start=1): 163 print('{} : {:<{w}s}\t{}'.format(i, attack[0], attack[1], w=max_len)) 164 165# bat example 166@click.group() 167def example(): 168 """Manage Examples""" 169 pass 170 171# bat example list 172@example.command('list') 173def example_list(): 174 """List examples""" 175 max_len = max([len(x[0]) for x in bat_example_list]) 176 for i, example in enumerate(bat_example_list, start=1): 177 print('{} : {:<{w}s}\t{}'.format(i, example[0], example[1], w=max_len)) 178 179# bat exmaple run 180@example.group('run') 181def example_run(): 182 """Run examples""" 183 pass 184 185# bat exmaple run simba_deepapi 186@example_run.command('simba_deepapi') 187def example_run_simba_deepapi(): 188 """SimBA Attack against DeepAPI""" 189 simba_attack_deepapi() 190 191# bat exmaple run bandits_deepapi 192@example_run.command('bandits_deepapi') 193def example_run_bandits_deepapi(): 194 """Bandits Attack against DeepAPI""" 195 bandits_attack_deepapi() 196 197# bat exmaple run square_deepapi 198@example_run.command('square_deepapi') 199def example_run_bandits_deepapi(): 200 """Square Attack against DeepAPI""" 201 square_attack_deepapi() 202 203def main(): 204 main_cli.add_command(api) 205 main_cli.add_command(attack) 206 main_cli.add_command(example) 207 208 api.add_command(api_list) 209 api.add_command(api_run) 210 211 attack.add_command(attack_list) 212 213 example.add_command(example_list) 214 example.add_command(example_run) 215 216 return main_cli() 217 218if __name__ == "__main__": 219 220 main()
main_cli =
<Group main-cli>
The CLI tool for Black-box Adversarial Toolbox (BAT).
api =
<Group api>
Manage Cloud APIs
api_list =
<Command list>
List supported Cloud APIs
api_run =
<Group run>
Run supported Cloud APIs
api_run_deepapi =
<Command imagga>
Send an image to Imagga auto-tagging API
api_run_google =
<Command google>
Send an image to Google Cloud Vision
attack =
<Group attack>
Manage Attacks
attack_list =
<Command list>
List supported Attacks
example =
<Group example>
Manage Examples
example_list =
<Command list>
List examples
example_run =
<Group run>
Run examples
example_run_simba_deepapi =
<Command simba_deepapi>
SimBA Attack against DeepAPI
example_run_bandits_deepapi =
<Command square_deepapi>
Square Attack against DeepAPI
def
main():
204def main(): 205 main_cli.add_command(api) 206 main_cli.add_command(attack) 207 main_cli.add_command(example) 208 209 api.add_command(api_list) 210 api.add_command(api_run) 211 212 attack.add_command(attack_list) 213 214 example.add_command(example_list) 215 example.add_command(example_run) 216 217 return main_cli()