├── LICENSE ├── README.md ├── backgrounds ├── countryside.png ├── desert.png ├── forest.png └── glacial.png ├── characters ├── mage.png ├── monster.png ├── pirate.png ├── toadking.png └── warrior.png ├── data.csv ├── generated ├── generated0.png └── generated1.png ├── main.py └── objects ├── anchor.png ├── axe.png ├── bananas.png ├── barrel.png ├── bomb.png ├── chest.png ├── cupcake.png ├── donut.png ├── heart.png └── key.png /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Albert Sanchez Lafuente 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Algorithmically generated image dataset 2 | 3 | In this repository is the code used in the article ["Algorithmically Generated Image Dataset".](https://towardsdatascience.com/algorithmically-generated-image-dataset-71aee957563a) Feel free to modify and play with the code and the images as much as you like. 4 | 5 | Description of the project files: 6 | - *backgrounds*: folder containing background images 7 | - *characters*: folder containing character images 8 | - *generated*: folder where generated images are saved 9 | - *objects*: folder containing object images 10 | - *data.csv*: example of a generated dataset containing the characteristics of each generated image. 11 | - *main.py*: project code 12 | 13 | 14 | All images used in this repository are not mine, their original sources are: 15 | - characters and objects: https://craftpix.net/freebies/ 16 | - glacial background: https://www.publicdomainpictures.net/es/view-image.php?image=282737&picture=lago-glaciar-jokulsarlon 17 | - desert background: https://www.publicdomainpictures.net/es/view-image.php?image=342429&picture=autopista-de-arizona 18 | - countryside background: https://www.publicdomainpictures.net/es/view-image.php?image=200702&picture=casa-de-campo 19 | - forest background: https://www.publicdomainpictures.net/es/view-image.php?image=167694&picture=bosque-de-la-pintura-al-oleo -------------------------------------------------------------------------------- /backgrounds/countryside.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/backgrounds/countryside.png -------------------------------------------------------------------------------- /backgrounds/desert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/backgrounds/desert.png -------------------------------------------------------------------------------- /backgrounds/forest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/backgrounds/forest.png -------------------------------------------------------------------------------- /backgrounds/glacial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/backgrounds/glacial.png -------------------------------------------------------------------------------- /characters/mage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/characters/mage.png -------------------------------------------------------------------------------- /characters/monster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/characters/monster.png -------------------------------------------------------------------------------- /characters/pirate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/characters/pirate.png -------------------------------------------------------------------------------- /characters/toadking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/characters/toadking.png -------------------------------------------------------------------------------- /characters/warrior.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/characters/warrior.png -------------------------------------------------------------------------------- /data.csv: -------------------------------------------------------------------------------- 1 | background,character,object,generated image 2 | countryside,mage,anchor,generated0 3 | countryside,mage,axe,generated1 4 | countryside,mage,bananas,generated2 5 | countryside,mage,barrel,generated3 6 | countryside,mage,bomb,generated4 7 | countryside,mage,chest,generated5 8 | countryside,mage,cupcake,generated6 9 | countryside,mage,donut,generated7 10 | countryside,mage,heart,generated8 11 | countryside,mage,key,generated9 12 | countryside,mage,none,generated10 13 | countryside,monster,anchor,generated11 14 | countryside,monster,axe,generated12 15 | countryside,monster,bananas,generated13 16 | countryside,monster,barrel,generated14 17 | countryside,monster,bomb,generated15 18 | countryside,monster,chest,generated16 19 | countryside,monster,cupcake,generated17 20 | countryside,monster,donut,generated18 21 | countryside,monster,heart,generated19 22 | countryside,monster,key,generated20 23 | countryside,monster,none,generated21 24 | countryside,pirate,anchor,generated22 25 | countryside,pirate,axe,generated23 26 | countryside,pirate,bananas,generated24 27 | countryside,pirate,barrel,generated25 28 | countryside,pirate,bomb,generated26 29 | countryside,pirate,chest,generated27 30 | countryside,pirate,cupcake,generated28 31 | countryside,pirate,donut,generated29 32 | countryside,pirate,heart,generated30 33 | countryside,pirate,key,generated31 34 | countryside,pirate,none,generated32 35 | countryside,toadking,anchor,generated33 36 | countryside,toadking,axe,generated34 37 | countryside,toadking,bananas,generated35 38 | countryside,toadking,barrel,generated36 39 | countryside,toadking,bomb,generated37 40 | countryside,toadking,chest,generated38 41 | countryside,toadking,cupcake,generated39 42 | countryside,toadking,donut,generated40 43 | countryside,toadking,heart,generated41 44 | countryside,toadking,key,generated42 45 | countryside,toadking,none,generated43 46 | countryside,warrior,anchor,generated44 47 | countryside,warrior,axe,generated45 48 | countryside,warrior,bananas,generated46 49 | countryside,warrior,barrel,generated47 50 | countryside,warrior,bomb,generated48 51 | countryside,warrior,chest,generated49 52 | countryside,warrior,cupcake,generated50 53 | countryside,warrior,donut,generated51 54 | countryside,warrior,heart,generated52 55 | countryside,warrior,key,generated53 56 | countryside,warrior,none,generated54 57 | desert,mage,anchor,generated55 58 | desert,mage,axe,generated56 59 | desert,mage,bananas,generated57 60 | desert,mage,barrel,generated58 61 | desert,mage,bomb,generated59 62 | desert,mage,chest,generated60 63 | desert,mage,cupcake,generated61 64 | desert,mage,donut,generated62 65 | desert,mage,heart,generated63 66 | desert,mage,key,generated64 67 | desert,mage,none,generated65 68 | desert,monster,anchor,generated66 69 | desert,monster,axe,generated67 70 | desert,monster,bananas,generated68 71 | desert,monster,barrel,generated69 72 | desert,monster,bomb,generated70 73 | desert,monster,chest,generated71 74 | desert,monster,cupcake,generated72 75 | desert,monster,donut,generated73 76 | desert,monster,heart,generated74 77 | desert,monster,key,generated75 78 | desert,monster,none,generated76 79 | desert,pirate,anchor,generated77 80 | desert,pirate,axe,generated78 81 | desert,pirate,bananas,generated79 82 | desert,pirate,barrel,generated80 83 | desert,pirate,bomb,generated81 84 | desert,pirate,chest,generated82 85 | desert,pirate,cupcake,generated83 86 | desert,pirate,donut,generated84 87 | desert,pirate,heart,generated85 88 | desert,pirate,key,generated86 89 | desert,pirate,none,generated87 90 | desert,toadking,anchor,generated88 91 | desert,toadking,axe,generated89 92 | desert,toadking,bananas,generated90 93 | desert,toadking,barrel,generated91 94 | desert,toadking,bomb,generated92 95 | desert,toadking,chest,generated93 96 | desert,toadking,cupcake,generated94 97 | desert,toadking,donut,generated95 98 | desert,toadking,heart,generated96 99 | desert,toadking,key,generated97 100 | desert,toadking,none,generated98 101 | desert,warrior,anchor,generated99 102 | desert,warrior,axe,generated100 103 | desert,warrior,bananas,generated101 104 | desert,warrior,barrel,generated102 105 | desert,warrior,bomb,generated103 106 | desert,warrior,chest,generated104 107 | desert,warrior,cupcake,generated105 108 | desert,warrior,donut,generated106 109 | desert,warrior,heart,generated107 110 | desert,warrior,key,generated108 111 | desert,warrior,none,generated109 112 | forest,mage,anchor,generated110 113 | forest,mage,axe,generated111 114 | forest,mage,bananas,generated112 115 | forest,mage,barrel,generated113 116 | forest,mage,bomb,generated114 117 | forest,mage,chest,generated115 118 | forest,mage,cupcake,generated116 119 | forest,mage,donut,generated117 120 | forest,mage,heart,generated118 121 | forest,mage,key,generated119 122 | forest,mage,none,generated120 123 | forest,monster,anchor,generated121 124 | forest,monster,axe,generated122 125 | forest,monster,bananas,generated123 126 | forest,monster,barrel,generated124 127 | forest,monster,bomb,generated125 128 | forest,monster,chest,generated126 129 | forest,monster,cupcake,generated127 130 | forest,monster,donut,generated128 131 | forest,monster,heart,generated129 132 | forest,monster,key,generated130 133 | forest,monster,none,generated131 134 | forest,pirate,anchor,generated132 135 | forest,pirate,axe,generated133 136 | forest,pirate,bananas,generated134 137 | forest,pirate,barrel,generated135 138 | forest,pirate,bomb,generated136 139 | forest,pirate,chest,generated137 140 | forest,pirate,cupcake,generated138 141 | forest,pirate,donut,generated139 142 | forest,pirate,heart,generated140 143 | forest,pirate,key,generated141 144 | forest,pirate,none,generated142 145 | forest,toadking,anchor,generated143 146 | forest,toadking,axe,generated144 147 | forest,toadking,bananas,generated145 148 | forest,toadking,barrel,generated146 149 | forest,toadking,bomb,generated147 150 | forest,toadking,chest,generated148 151 | forest,toadking,cupcake,generated149 152 | forest,toadking,donut,generated150 153 | forest,toadking,heart,generated151 154 | forest,toadking,key,generated152 155 | forest,toadking,none,generated153 156 | forest,warrior,anchor,generated154 157 | forest,warrior,axe,generated155 158 | forest,warrior,bananas,generated156 159 | forest,warrior,barrel,generated157 160 | forest,warrior,bomb,generated158 161 | forest,warrior,chest,generated159 162 | forest,warrior,cupcake,generated160 163 | forest,warrior,donut,generated161 164 | forest,warrior,heart,generated162 165 | forest,warrior,key,generated163 166 | forest,warrior,none,generated164 167 | glacial,mage,anchor,generated165 168 | glacial,mage,axe,generated166 169 | glacial,mage,bananas,generated167 170 | glacial,mage,barrel,generated168 171 | glacial,mage,bomb,generated169 172 | glacial,mage,chest,generated170 173 | glacial,mage,cupcake,generated171 174 | glacial,mage,donut,generated172 175 | glacial,mage,heart,generated173 176 | glacial,mage,key,generated174 177 | glacial,mage,none,generated175 178 | glacial,monster,anchor,generated176 179 | glacial,monster,axe,generated177 180 | glacial,monster,bananas,generated178 181 | glacial,monster,barrel,generated179 182 | glacial,monster,bomb,generated180 183 | glacial,monster,chest,generated181 184 | glacial,monster,cupcake,generated182 185 | glacial,monster,donut,generated183 186 | glacial,monster,heart,generated184 187 | glacial,monster,key,generated185 188 | glacial,monster,none,generated186 189 | glacial,pirate,anchor,generated187 190 | glacial,pirate,axe,generated188 191 | glacial,pirate,bananas,generated189 192 | glacial,pirate,barrel,generated190 193 | glacial,pirate,bomb,generated191 194 | glacial,pirate,chest,generated192 195 | glacial,pirate,cupcake,generated193 196 | glacial,pirate,donut,generated194 197 | glacial,pirate,heart,generated195 198 | glacial,pirate,key,generated196 199 | glacial,pirate,none,generated197 200 | glacial,toadking,anchor,generated198 201 | glacial,toadking,axe,generated199 202 | glacial,toadking,bananas,generated200 203 | glacial,toadking,barrel,generated201 204 | glacial,toadking,bomb,generated202 205 | glacial,toadking,chest,generated203 206 | glacial,toadking,cupcake,generated204 207 | glacial,toadking,donut,generated205 208 | glacial,toadking,heart,generated206 209 | glacial,toadking,key,generated207 210 | glacial,toadking,none,generated208 211 | glacial,warrior,anchor,generated209 212 | glacial,warrior,axe,generated210 213 | glacial,warrior,bananas,generated211 214 | glacial,warrior,barrel,generated212 215 | glacial,warrior,bomb,generated213 216 | glacial,warrior,chest,generated214 217 | glacial,warrior,cupcake,generated215 218 | glacial,warrior,donut,generated216 219 | glacial,warrior,heart,generated217 220 | glacial,warrior,key,generated218 221 | glacial,warrior,none,generated219 222 | -------------------------------------------------------------------------------- /generated/generated0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/generated/generated0.png -------------------------------------------------------------------------------- /generated/generated1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/generated/generated1.png -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from os import path, mkdir 2 | from PIL import Image 3 | import pandas as pd 4 | import numpy as np 5 | 6 | output_folder = "generated" 7 | if not path.exists(output_folder): 8 | mkdir(output_folder) 9 | 10 | backgrounds = ["countryside", "desert", "forest", "glacial"] 11 | characters = ["mage", "warrior", "pirate", "monster", "toadking"] 12 | objects = ["none", "barrel", "anchor", "axe", "bomb", "key", "chest", "bananas", "cupcake", "donut", "heart",] 13 | 14 | def generate_image(background, character, object, file_name): 15 | """Generate image with given background, given character and given object and save it with the given file name 16 | 17 | Args: 18 | background (str): background name 19 | character (str): character name 20 | object (str): object name 21 | file_name (str): file name 22 | """ 23 | background_file = path.join("backgrounds", f"{background}.png") 24 | background_image = Image.open(background_file) 25 | 26 | #Create character 27 | character_file = path.join("characters", f"{character}.png") 28 | character_image = Image.open(character_file) 29 | 30 | coordinates = (int(1920/2-character_image.width/2), int(1000-character_image.height)) #x, y 31 | background_image.paste(character_image, coordinates, mask=character_image) 32 | 33 | #Create object 34 | if object != "none": 35 | object_file = path.join("objects", f"{object}.png") 36 | object_image = Image.open(object_file) 37 | 38 | coordinates = (int(1920/2+character_image.width/2+30), int(1000-object_image.height)) #x, y 39 | background_image.paste(object_image, coordinates, mask=object_image) 40 | 41 | output_file = path.join(output_folder, f"{file_name}.png") 42 | background_image.save(output_file) 43 | 44 | def generate_all_imgs(): 45 | """Generate all possible combination of images 46 | """ 47 | num = 0 48 | df = pd.DataFrame(columns = ["background", "character", "object", "generated image"]) 49 | for background in backgrounds: 50 | for character in characters: 51 | for object in objects: 52 | generate_image(background, character, object, f"generated{num}") 53 | data = [background, character, object, f"generated{num}"] 54 | s = pd.Series(data, index=df.columns) 55 | df = df.append(s, ignore_index=True) 56 | num += 1 57 | df.to_csv('data.csv', index=False) 58 | 59 | def generate_random_imgs(total_imgs): 60 | """Generates a given number of random images according to predefined probabilities 61 | 62 | Args: 63 | total_imgs (int): total number of images to generate 64 | """ 65 | df = pd.DataFrame(columns = ["background", "character", "object", "generated image"]) 66 | 67 | for num in range(total_imgs): 68 | background = np.random.choice(np.arange(0,len(backgrounds)), p=[0.3, 0.3, 0.3, 0.1]) 69 | background = backgrounds[background] 70 | 71 | character = np.random.choice(np.arange(0,len(characters)), p=[0.4, 0.3, 0.2, 0.095, 0.005]) 72 | character = characters[character] 73 | 74 | object = np.random.choice(np.arange(0,len(objects)), p=[0.3, 0.2, 0.1, 0.1, 0.1, 0.05, 0.05, 0.04, 0.03, 0.025, 0.005]) 75 | object = objects[object] 76 | 77 | generate_image(background, character, object, f"generated{num}") 78 | data = [background, character, object, f"generated{num}"] 79 | s = pd.Series(data, index=df.columns) 80 | df = df.append(s, ignore_index=True) 81 | 82 | df.to_csv('data.csv', index=False) 83 | 84 | if __name__ == "__main__": 85 | #generate_all_imgs() 86 | generate_random_imgs(500) 87 | 88 | -------------------------------------------------------------------------------- /objects/anchor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/objects/anchor.png -------------------------------------------------------------------------------- /objects/axe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/objects/axe.png -------------------------------------------------------------------------------- /objects/bananas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/objects/bananas.png -------------------------------------------------------------------------------- /objects/barrel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/objects/barrel.png -------------------------------------------------------------------------------- /objects/bomb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/objects/bomb.png -------------------------------------------------------------------------------- /objects/chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/objects/chest.png -------------------------------------------------------------------------------- /objects/cupcake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/objects/cupcake.png -------------------------------------------------------------------------------- /objects/donut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/objects/donut.png -------------------------------------------------------------------------------- /objects/heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/objects/heart.png -------------------------------------------------------------------------------- /objects/key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/albertsl/image-dataset-generator/ddb9f22c49de00590c3644f194ca5869c30c3701/objects/key.png --------------------------------------------------------------------------------