├── .gitignore ├── FaceClassifier.py ├── GoogleImageSpider.py ├── ImageClassifier.py ├── ImageNormalizer.py ├── LICENSE ├── README.md ├── get_them_all.ipynb ├── git_images ├── final_dataset_demo_1.png ├── final_dataset_demo_2.png └── trump_dataset.png └── trump_pictures_dataset.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | .spyproject 93 | 94 | # Rope project settings 95 | .ropeproject 96 | 97 | # mkdocs documentation 98 | /site 99 | 100 | # mypy 101 | .mypy_cache/ 102 | -------------------------------------------------------------------------------- /FaceClassifier.py: -------------------------------------------------------------------------------- 1 | # Thanks Ramiz Raja for his: https://github.com/informramiz/opencv-face-recognition-python 2 | 3 | from IPython.display import display 4 | from PIL import Image 5 | import sys, os 6 | import numpy as np 7 | import cv2 8 | 9 | class FaceClassifier: 10 | faceSize = -1 11 | face_recognizer = None 12 | debug = False 13 | subjects = [] 14 | 15 | def __init__(self, debug=False, face_resize=-1): 16 | #self.face_recognizer = cv2.face.LBPHFaceRecognizer_create() 17 | self.face_recognizer = cv2.face.FisherFaceRecognizer_create() 18 | self.debug = debug 19 | self.faceSize = face_resize 20 | 21 | def train(self, train_path, delete_originals=False, show_train_images=False): 22 | print("Preparing data...") 23 | faces, labels = self.prepare_training_data(train_path, show_train_images=show_train_images) 24 | print("Data prepared") 25 | 26 | #print total faces and labels 27 | print("Total faces: ", len(faces)) 28 | print("Labels tagged: ", len(labels), "with", len(np.unique(labels)), "labels") 29 | print("Training...") 30 | self.face_recognizer.train(faces, np.array(labels)) 31 | print("We are ready!") 32 | 33 | def predict(self, test_path): 34 | ret = [] 35 | detections = self.detect_face(test_path); 36 | for detection in detections: 37 | face, rect = detection[0], detection[1] 38 | if face is None: 39 | return "No_face" 40 | 41 | #predict the image using our face recognizer 42 | label = self.face_recognizer.predict(face) 43 | #get name of respective label returned by face recognizer 44 | ret.append(self.subjects[label[0]-1]) 45 | return ret 46 | 47 | def detect_face(self, img, grayscale_output=True): 48 | ret = [] 49 | img = cv2.imread(img) 50 | if img is None: 51 | ret.append([None, None]) 52 | return ret 53 | 54 | #convert the test image to gray image as opencv face detector expects gray images 55 | gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 56 | 57 | #load OpenCV face detector, I am using LBP which is fast 58 | #there is also a more accurate but slow Haar classifier 59 | face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml") 60 | #face_cascade = cv2.CascadeClassifier('lbpcascade_frontalface.xml') 61 | 62 | #let's detect multiscale (some images may be closer to camera than others) images 63 | #result is a list of faces 64 | faces = face_cascade.detectMultiScale(gray)#, scaleFactor=1.2, minNeighbors=5); 65 | 66 | #if no faces are detected then return original img 67 | if (len(faces) == 0): 68 | ret.append([None, None]) 69 | return ret 70 | 71 | i = 0 72 | for face in faces: 73 | (x, y, w, h) = face 74 | 75 | #return only the face part of the image 76 | if (grayscale_output): 77 | img_face = gray[y:y+w, x:x+h] 78 | else: 79 | img_face = img[y:y+w, x:x+h] 80 | img_face = cv2.cvtColor(img_face, cv2.COLOR_BGR2RGB) 81 | 82 | if self.faceSize > 0: 83 | img_face = cv2.resize(img_face, (self.faceSize, self.faceSize), interpolation = cv2.INTER_AREA) 84 | ret.append([img_face, faces[i]]) 85 | return ret 86 | 87 | def prepare_training_data(self, train_path, show_train_images=False): 88 | #------STEP-1-------- 89 | #get the directories (one directory for each subject) in data folder 90 | dirs = os.listdir(train_path) 91 | 92 | #list to hold all subject faces 93 | faces = [] 94 | #list to hold labels for all subjects 95 | labels = [] 96 | self.subjects = [] 97 | 98 | #let's go through each directory and read images within it 99 | label = 0 100 | for dir_name in dirs: 101 | #------STEP-2-------- 102 | #extract label number of subject from dir_name 103 | #format of dir name = slabel 104 | #, so removing letter 's' from dir_name will give us label 105 | label += 1 106 | self.subjects.append(dir_name) 107 | print (dir_name, "label = ", label) 108 | 109 | #build path of directory containin images for current subject subject 110 | #sample subject_dir_path = "training-data/s1" 111 | subject_dir_path = train_path + "/" + dir_name 112 | 113 | #get the images names that are inside the given subject directory 114 | subject_images_names = os.listdir(subject_dir_path) 115 | 116 | #------STEP-3-------- 117 | #go through each image name, read image, 118 | #detect face and add face to list of faces 119 | for image_name in subject_images_names: 120 | 121 | #ignore system files like .DS_Store 122 | if image_name.startswith("."): 123 | continue; 124 | 125 | #build image path 126 | #sample image path = training-data/s1/1.pgm 127 | image_path = subject_dir_path + "/" + image_name 128 | 129 | #detect face 130 | detections = self.detect_face(image_path); 131 | face, rect = detections[0][0], detections[0][1] 132 | 133 | #------STEP-4-------- 134 | #for the purpose of this tutorial 135 | #we will ignore faces that are not detected 136 | if face is not None: 137 | if show_train_images: 138 | print ("Image: ", image_path) 139 | display(Image.fromarray(face)) 140 | 141 | faces.append(face) 142 | labels.append(label) 143 | 144 | cv2.destroyAllWindows() 145 | cv2.waitKey(1) 146 | cv2.destroyAllWindows() 147 | 148 | return faces, labels -------------------------------------------------------------------------------- /GoogleImageSpider.py: -------------------------------------------------------------------------------- 1 | '''DISCLAIMER: DUE TO COPYRIGHT ISSUES, IMAGES GATHERED SHOULD 2 | ONLY BE USED FOR RESEARCH AND EDUCATION PURPOSES ONLY''' 3 | from bs4 import BeautifulSoup 4 | import certifi, urllib3 5 | from urllib3.util.url import parse_url 6 | import imghdr 7 | import re 8 | import sys, os 9 | import json 10 | import hashlib 11 | 12 | class GoogleImageSpider: 13 | debug = False 14 | actual_images=[] # Contains the link for Large original images, type of image 15 | http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where()) 16 | header = { # Headers emulation of a usual browser (My use case: Chrome in linux) 17 | # 'accept-encoding': 'gzip, deflate, br', 18 | 'accept-language': 'en-US,en;q=0.9,es-ES;q=0.8,es;q=0.7,ca-ES;q=0.6,ca;q=0.5', 19 | 'upgrade-insecure-requests': '1', 20 | 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36', 21 | 'x-chrome-uma-enabled': '1', 22 | 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 23 | 'cache-control': 'max-age=0', 24 | 'authority': 'www.google.es', 25 | 'cookie': 'CONSENT=WP.26915a; 1P_JAR=2018-01-21-15; NID=122=iyOn0m6Eogu0T1dNztHWOm2ckyjz6TqeB7aHEav-1YhcyClxqPWDIXn764n5y_asAmLWjS9mKPZkbt_kvRj_TarUFGaSLXdAUElpQo9FRoheTxlu7DFwLwLI3mjiaaGp', 26 | 'x-client-data': 'CI22yQEIorbJAQitmMoBCPqcygEIqZ3KAQioo8oB' 27 | } 28 | 29 | def __init__(self, debug = False): 30 | self.actual_images=[] 31 | self.http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where()) 32 | self.debug = debug 33 | 34 | def get_html(self, keyword): 35 | url = "https://www.google.es/search?q="+keyword+"&source=lnms&tbm=isch" 36 | print ("Looking for: ", keyword) 37 | request = self.http.request('GET', url, headers=self.header) 38 | page = request.data.decode('utf-8') 39 | request.release_conn() 40 | return BeautifulSoup(page, 'html.parser') 41 | 42 | def get_more_html(self, keyword, offset): 43 | url = 'https://www.google.es/search?ei=bqtkWtnIBIORUZPosNgF&yv=2&q='+keyword+'\ 44 | &tbm=isch&vet=10ahUKEwjZt8HGqenYAhWDSBQKHRM0DFsQuT0I6AEoAQ.bqtkWtnIBIORUZPosNgF.i&ved=0\ 45 | ahUKEwjZt8HGqenYAhWDSBQKHRM0DFsQuT0I6AEoAQ&ijn=2&start='+str(offset)+'&asearch=ichunk&async=_id:rg_s,_pms:s' 46 | print ("Looking for", keyword, "at offset", offset) 47 | request = self.http.request('GET', url, headers=self.header) 48 | page = request.data.decode('unicode-escape').replace("\\/", "/") 49 | request.release_conn() 50 | return BeautifulSoup(page, 'html.parser') 51 | 52 | def get_images_from_html(self, html, limit=1000): 53 | size = len(self.actual_images) 54 | for a in html.find_all("div",{"class":"rg_meta"}): 55 | link , Type =json.loads(a.text)["ou"] ,json.loads(a.text)["ity"] 56 | self.actual_images.append((link,Type)) 57 | limit -= 1 58 | if (limit == 0): 59 | break 60 | if self.debug: 61 | print ("Images added: ", len(self.actual_images)-size) 62 | 63 | def save_images(self, prefix, path): 64 | if not os.path.exists(path): 65 | os.mkdir(path) 66 | 67 | chunk_size = 1024 68 | print ("Saving", len(self.actual_images), "images..") 69 | filename = "" 70 | for i in range(len(self.actual_images)): 71 | try: 72 | url_image = parse_url(self.actual_images[i][0]) 73 | url_image = url_image.url 74 | file_extension = self.actual_images[i][1] 75 | # url_image = self.actual_images[i][0].split('?')[0] 76 | # print (i, url_image, file_extension) 77 | r = self.http.request('GET', url_image, preload_content=False, timeout=5.0) 78 | filename = "./"+path+"/"+str(prefix)+str(i) 79 | if file_extension != "": 80 | filename += '.'+file_extension 81 | with open(filename, 'wb') as out: 82 | while True: 83 | data = r.read(chunk_size) 84 | if not data: 85 | break 86 | out.write(data) 87 | r.release_conn() 88 | 89 | # HASH AND GET REAL FILETYPE 90 | filehash = self.file_hash(filename) 91 | if file_extension == "": 92 | file_extension = imghdr.what(filename) 93 | if file_extension is None: 94 | file_extension = "" 95 | os.rename(filename, path+"/"+filehash+"."+file_extension) 96 | except Exception as e: 97 | print ("Error saving image: ", filename, "\nError:", e) 98 | 99 | print (len(self.actual_images), "images saved to: ", path) 100 | 101 | def get_images(self, keyword, how_many): 102 | parsed_keyword = keyword.split() 103 | parsed_keyword = '+'.join(parsed_keyword) 104 | 105 | html = self.get_html(parsed_keyword) 106 | self.get_images_from_html(html, limit=how_many) 107 | 108 | if how_many > 100: 109 | for i in range(0, how_many, 100): 110 | html = self.get_more_html(parsed_keyword, i) 111 | self.get_images_from_html(html, limit=how_many-i) 112 | 113 | def clear(self, delete=False): 114 | self.actual_images=[] 115 | 116 | def file_hash(self, filename): 117 | h = hashlib.sha256() 118 | with open(filename, 'rb', buffering=0) as f: 119 | for b in iter(lambda : f.read(128*1024), b''): 120 | h.update(b) 121 | return h.hexdigest() -------------------------------------------------------------------------------- /ImageClassifier.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | from tensorflow.python.framework import ops 3 | from tensorflow.python.framework import dtypes 4 | import matplotlib.image as mpimg 5 | from PIL import Image 6 | from IPython.display import display 7 | import numpy as np 8 | import random 9 | import time 10 | import shutil 11 | import sys, os 12 | import hashlib 13 | 14 | class ImageClassifier: 15 | good_path = None 16 | bad_path = None 17 | debug = False 18 | train_image_batch = None 19 | train_label_batch = None 20 | test_image_batch = None 21 | test_label_batch = None 22 | img_size = None 23 | sess = None 24 | 25 | # GENERAL VARS 26 | logs_path = 'CNN/log_stats_cnn' 27 | network_path = 'CNN/saved_cnn.ckpt' 28 | 29 | batch_size = None 30 | test_batch_percentage = 0.1 31 | learning_rate = 0.0001 32 | training_epochs = None 33 | training_epochs_log = 100 34 | 35 | # PARTICULAR VARS 36 | num_classes = 2 37 | max_pool_lost = 2 38 | 39 | def __init__(self, good_path, bad_path, img_size, \ 40 | batch_size=60, training_epochs=2000, test_batch_percentage=0.1, debug=False): 41 | self.good_path = good_path 42 | self.bad_path = bad_path 43 | self.debug = debug 44 | self.img_size = img_size 45 | self.batch_size = batch_size 46 | self.training_epochs = training_epochs 47 | self.test_batch_percentage = test_batch_percentage 48 | 49 | # It can be inception without training 50 | if good_path == None or bad_path == None: 51 | return 52 | 53 | # create dataset arrays 54 | all_filepaths = [self.good_path+"/"+s for s in os.listdir(self.good_path)] 55 | all_labels = np.full((len(all_filepaths), 2), [1,0]) 56 | all_filepaths = all_filepaths + [self.bad_path+"/"+s for s in os.listdir(self.bad_path)] 57 | all_labels = np.vstack((all_labels, np.full((len(all_filepaths)-len(all_labels), 2), [0,1]))) 58 | 59 | # create a partition vector 60 | partitions = [0] * len(all_filepaths) 61 | partitions[:int(len(all_filepaths) * self.test_batch_percentage)] = [1] * int(len(all_filepaths) * self.test_batch_percentage) 62 | random.shuffle(partitions) 63 | 64 | # convert string into tensors 65 | all_images = ops.convert_to_tensor(all_filepaths, dtype=dtypes.string) 66 | all_labels = ops.convert_to_tensor(all_labels, dtype=dtypes.int32) 67 | 68 | # partition our data into a test and train set according to our partition vector 69 | train_images, test_images = tf.dynamic_partition(all_images, partitions, 2) 70 | train_labels, test_labels = tf.dynamic_partition(all_labels, partitions, 2) 71 | 72 | # create input queues 73 | train_input_queue = tf.train.slice_input_producer([train_images, train_labels], shuffle=True) 74 | test_input_queue = tf.train.slice_input_producer([test_images, test_labels], shuffle=True) 75 | 76 | # process path and string tensor into an image and a label 77 | file_content = tf.read_file(train_input_queue[0]) 78 | train_image = tf.image.decode_jpeg(file_content, channels=3) 79 | train_label = train_input_queue[1] 80 | 81 | file_content = tf.read_file(test_input_queue[0]) 82 | test_image = tf.image.decode_jpeg(file_content, channels=3) 83 | test_label = test_input_queue[1] 84 | 85 | # define tensor shape 86 | train_image.set_shape([img_size, img_size, 3]) 87 | test_image.set_shape([img_size, img_size, 3]) 88 | 89 | # collect batches of images before processing 90 | self.train_image_batch, self.train_label_batch = tf.train.batch([train_image, train_label], batch_size=self.batch_size) 91 | self.test_image_batch, self.test_label_batch = tf.train.batch([test_image, test_label], \ 92 | batch_size=int(len(all_filepaths) * self.test_batch_percentage)) 93 | 94 | def train(self): 95 | with tf.device("/gpu:0"): 96 | # INPUTS AND DESIRED OUTPUT 97 | X = tf.placeholder(tf.float32, [None, self.img_size, self.img_size, 3],name="input") 98 | Y = tf.placeholder(tf.float32, [None, self.num_classes], name="prediction") 99 | 100 | # WEIGHTS AND BIAS 101 | fc_final_img_size = int(self.img_size / self.max_pool_lost / self.max_pool_lost / self.max_pool_lost) # 3 Max Pool 102 | weights = { 103 | 'wc1': self.init_weights([6, 6, 3, 32], "Weight_conv1"), # 3x3x1 conv, 32 outputs 104 | 'wc2': self.init_weights([4, 4, 32, 64], "Weight_conv2"), # 3x3x32 conv, 64 outputs 105 | 'wc3': self.init_weights([3, 3, 64, 128], "Weight_conv3"), # 3x3x32 conv, 128 outputs 106 | 'wfc': self.init_weights([128 * fc_final_img_size * fc_final_img_size, 625], "Weight_FC"), # FC 128 * size * size inputs, 625 outputs 107 | 'wsm': self.init_weights([625, self.num_classes], "Weight_Softmax") # FC 625 inputs, num_classes outputs (labels) 108 | } 109 | 110 | biases = { 111 | 'bc1': self.init_weights([32], "Bias_conv1"), 112 | 'bc2': self.init_weights([64], "Bias_conv2"), 113 | 'bc3': self.init_weights([128], "Bias_conv3"), 114 | 'bfc': self.init_weights([625], "Bias_FC"), 115 | 'bsm': self.init_weights([self.num_classes], "Bias_Softmax") 116 | } 117 | 118 | # MODEL 119 | p_keep_conv = tf.placeholder(tf.float32, name="p_keep_conv") 120 | p_keep_hidden = tf.placeholder(tf.float32, name="p_keep_hidden") 121 | Y_ = self.model(X, weights, biases, p_keep_conv, p_keep_hidden) 122 | 123 | # LOSS FUNCTION AND OPTIMIZER 124 | cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=Y_, labels=Y) 125 | cost = tf.reduce_mean(cross_entropy) 126 | train_step = tf.train.AdamOptimizer(self.learning_rate).minimize(cost) 127 | 128 | # DEFINE ACCURACY FOR SUMMARY 129 | correct_prediction = tf.equal(tf.argmax(Y, 1), tf.argmax(Y_, 1)) 130 | accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 131 | 132 | # SUMMARIES 133 | tf.summary.scalar("cost", cost) 134 | tf.summary.scalar("accuracy", accuracy) 135 | summary_op = tf.summary.merge_all() 136 | 137 | # RUN 138 | config = tf.ConfigProto(allow_soft_placement = True, log_device_placement=True) 139 | with tf.Session(config = config) as sess: 140 | start_time = time.time() 141 | sess.run(tf.global_variables_initializer()) 142 | coord = tf.train.Coordinator() 143 | threads = tf.train.start_queue_runners(coord=coord) 144 | 145 | writer = tf.summary.FileWriter(self.logs_path, graph=tf.get_default_graph()) 146 | saver = tf.train.Saver() 147 | for epoch in range(self.training_epochs): 148 | # Image and Label get Batches from pipeline 149 | batch_images, batch_labels = sess.run([self.train_image_batch, self.train_label_batch]) 150 | valid_images, valid_labels = sess.run([self.test_image_batch, self.test_label_batch]) 151 | 152 | _, summary = sess.run([train_step, summary_op], feed_dict={X: batch_images, Y: batch_labels,\ 153 | p_keep_conv: 0.8, p_keep_hidden: 0.7}) 154 | writer.add_summary(summary, epoch) 155 | 156 | if epoch % self.training_epochs_log == 0: 157 | print("Epoch: ", epoch) 158 | saver.save(sess, self.logs_path + 'model.ckpt', global_step=epoch) 159 | batch_accuracy = accuracy.eval(feed_dict={X: batch_images, Y: batch_labels, \ 160 | p_keep_conv: 1.0, p_keep_hidden: 1.0}) 161 | validation_accuracy = accuracy.eval(feed_dict={X: valid_images, Y: valid_labels, \ 162 | p_keep_conv: 1.0, p_keep_hidden: 1.0}) 163 | print("Accuracy for batch: %s / Accuracy for validation: %s" % (batch_accuracy, validation_accuracy)) 164 | 165 | # TIMING CONTROL 166 | elapsed_time = time.time() - start_time 167 | mins = int(elapsed_time / 60) 168 | secs = elapsed_time - (mins * 60) 169 | print("Accumulative time: %02d:%02d" % (mins, int(secs % 60))) 170 | print("----------------------") 171 | 172 | validation_accuracy = accuracy.eval(feed_dict={X: valid_images, Y: valid_labels, p_keep_conv: 1.0, p_keep_hidden: 1.0}) 173 | print("Final Accuracy:", validation_accuracy) 174 | 175 | # SAVE IT 176 | save_path = saver.save(sess, self.network_path) 177 | print("Model saved to %s" % save_path) 178 | print("Finished in %.2f seconds" % ((time.time() - start_time))) 179 | 180 | coord.request_stop() 181 | coord.join(threads) 182 | sess.close() 183 | 184 | def load(self, checkpoint_restore=0): 185 | if (checkpoint_restore != 0): 186 | self.network_path = logs_path + "model.ckpt-" + str(checkpoint_restore) 187 | print ("Checkpoint to load( %s ): " % (checkpoint_restore, network_path)) 188 | 189 | self.sess = tf.InteractiveSession() 190 | new_saver = tf.train.import_meta_graph(self.network_path + '.meta') 191 | new_saver.restore(self.sess, self.network_path) 192 | tf.get_default_graph().as_graph_def() 193 | 194 | def run(self, source_path, good_path, bad_path, batch_size=60, good_percent_treshold=50, delete_images=False): 195 | if not os.path.exists(source_path): 196 | raise ValueError('The source for already normalized images path not found.') 197 | if not os.path.exists(source_path): 198 | os.makedirs(source_path) 199 | if not os.path.exists(good_path): 200 | os.makedirs(good_path) 201 | if not os.path.exists(bad_path): 202 | os.makedirs(bad_path) 203 | 204 | x = self.sess.graph.get_tensor_by_name("input:0") 205 | y_conv = self.sess.graph.get_tensor_by_name("output:0") 206 | 207 | for image_path in os.listdir(source_path): 208 | filename = source_path +"/"+ image_path 209 | if os.path.isdir(filename): 210 | continue 211 | 212 | try: 213 | img = mpimg.imread(filename) 214 | except: 215 | print ("Unloadable image: " + filename) 216 | continue 217 | 218 | image_0 = np.resize(img,(1, self.img_size, self.img_size, 3)) 219 | _, result = self.sess.run(["input:0", y_conv], feed_dict= {x:image_0, "p_keep_conv:0": 1.0, "p_keep_hidden:0": 1.0}) 220 | is_good_image = (np.argmax(result[0]) == 0) 221 | result = self.sess.run(tf.nn.softmax(result)) 222 | if self.debug: 223 | print ("Result is: ", "GOOD" if is_good_image else "BAD") 224 | print ("With a %.2f %%" % (result[0][np.argmax(result)] * 100)) 225 | 226 | # GET THE CORRECT FILENAME 227 | percent = int(result[0][np.argmax(result)]*100) 228 | fname, fextension = os.path.splitext(image_path) 229 | filehash = self.file_hash(filename) 230 | final_filename = filehash +"_"+ str(percent) +"_GOOD"+ fextension 231 | if not is_good_image: 232 | final_filename = filehash +"_"+ str(percent) +"_BAD"+ fextension 233 | 234 | # MOVE TO CORRECT PATH 235 | final_path = bad_path +"/"+ final_filename 236 | if is_good_image and percent >= good_percent_treshold: 237 | final_path = good_path +"/"+ final_filename 238 | 239 | 240 | if delete_images: 241 | shutil.move(filename, final_path) 242 | else: 243 | shutil.copy(filename, final_path) 244 | 245 | 246 | def test(self): 247 | # RUN 248 | config = tf.ConfigProto(allow_soft_placement = True, log_device_placement=True) 249 | with tf.Session(config = config) as sess: 250 | start_time = time.time() 251 | sess.run(tf.global_variables_initializer()) 252 | coord = tf.train.Coordinator() 253 | threads = tf.train.start_queue_runners(coord=coord) 254 | 255 | batch_images, batch_labels = sess.run([self.train_image_batch, self.train_label_batch]) 256 | valid_images, valid_labels = sess.run([self.test_image_batch, self.test_image_batch]) 257 | 258 | for i in range(5): 259 | img = Image.fromarray(np.asarray(batch_images[i])) 260 | display(img) 261 | print ("Label:", batch_labels[i], "- Marked as", "GOOD" if np.argmax(batch_labels[i]) == 0 else "BAD") 262 | 263 | coord.request_stop() 264 | coord.join(threads) 265 | sess.close() 266 | 267 | 268 | def init_weights(self, shape, layer_name): 269 | return tf.Variable(tf.random_normal(shape, stddev=0.01), name=layer_name) 270 | 271 | # MODEL 272 | def model(self, X, W, b, p_keep_conv, p_keep_hidden): 273 | with tf.name_scope("Conv1") as scope: 274 | if (self.debug): 275 | tf.summary.histogram("Weight_Conv1", W['wc1']) 276 | tf.summary.histogram("Bias_Conv1", b['bc1']) 277 | 278 | conv1 = tf.nn.conv2d(X, W['wc1'], strides=[1, 1, 1, 1], padding='SAME') 279 | conv1_a = tf.nn.relu(conv1) + b['bc1'] 280 | conv1 = tf.nn.max_pool(conv1_a, ksize=[1, self.max_pool_lost, self.max_pool_lost, 1], \ 281 | strides=[1, self.max_pool_lost, self.max_pool_lost, 1], padding='SAME') 282 | conv1 = tf.nn.dropout(conv1, p_keep_conv) 283 | 284 | with tf.name_scope("Conv2") as scope: 285 | if (self.debug): 286 | tf.summary.histogram("Weight_Conv2", W['wc2']) 287 | tf.summary.histogram("Bias_Conv2", b['bc2']) 288 | 289 | conv2 = tf.nn.conv2d(conv1, W['wc2'], strides=[1, 1, 1, 1], padding='SAME') 290 | conv2_a = tf.nn.relu(conv2) + b['bc2'] 291 | conv2 = tf.nn.max_pool(conv2_a, ksize=[1, self.max_pool_lost, self.max_pool_lost, 1], \ 292 | strides=[1, self.max_pool_lost, self.max_pool_lost, 1], padding='SAME') 293 | conv2 = tf.nn.dropout(conv2, p_keep_conv) 294 | 295 | with tf.name_scope("Conv3") as scope: 296 | if (self.debug): 297 | tf.summary.histogram("Weight_Conv3", W['wc3']) 298 | tf.summary.histogram("Bias_Conv3", b['bc3']) 299 | 300 | conv3 = tf.nn.conv2d(conv2, W['wc3'], strides=[1, 1, 1, 1], padding='SAME') 301 | conv3_a = tf.nn.relu(conv3) + b['bc3'] 302 | conv3 = tf.nn.max_pool(conv3, ksize=[1, self.max_pool_lost, self.max_pool_lost, 1], \ 303 | strides=[1, self.max_pool_lost, self.max_pool_lost, 1], padding='SAME') 304 | conv3 = tf.nn.dropout(conv3, p_keep_conv) 305 | 306 | with tf.name_scope("FC_layer") as scope: 307 | if (self.debug): 308 | tf.summary.histogram("Weight_FC", W['wfc']) 309 | tf.summary.histogram("Bias_FC", b['bfc']) 310 | 311 | FC_layer = tf.reshape(conv3, [-1, W['wfc'].get_shape().as_list()[0]]) 312 | FC_layer = tf.nn.relu(tf.matmul(FC_layer, W['wfc'])) 313 | FC_layer = tf.nn.dropout(FC_layer, p_keep_hidden) 314 | 315 | with tf.name_scope("Softmax") as scope: 316 | if (self.debug): 317 | tf.summary.histogram("Weight_Softmax", W['wsm']) 318 | tf.summary.histogram("Bias_Softmax", b['bsm']) 319 | 320 | # output_layer = tf.add(tf.matmul(FC_layer, W['wsm']), b['bsm']) 321 | 322 | output_layer = tf.add(tf.matmul(FC_layer, W['wsm']), b['bsm'], name="output") 323 | 324 | return output_layer 325 | 326 | def file_hash(self, filename): 327 | h = hashlib.sha256() 328 | with open(filename, 'rb', buffering=0) as f: 329 | for b in iter(lambda : f.read(128*1024), b''): 330 | h.update(b) 331 | return h.hexdigest() -------------------------------------------------------------------------------- /ImageNormalizer.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | import sys, os 3 | 4 | class ImageNormalizer: 5 | origin_path = None 6 | debug = False 7 | 8 | def __init__(self, origin_path, debug=False): 9 | self.origin_path = origin_path 10 | self.debug = debug 11 | 12 | def normalize(self, size, destin_path, fill_color=(255, 255, 255), delete_originals=False): 13 | print ("Normalizing..") 14 | 15 | if not os.path.exists(destin_path): 16 | os.makedirs(destin_path) 17 | 18 | for image in os.listdir(self.origin_path): 19 | self.normalize_single_image(image, size, destin_path, fill_color, delete_original=delete_originals) 20 | 21 | def normalize_single_image(self, image, size, destin_path, fill_color=(255, 255, 255), delete_original=False): 22 | if self.debug: 23 | print ("Normalizing:", image) 24 | 25 | try: 26 | origin = self.origin_path + "/" + image 27 | img = Image.open(origin).convert("RGBA") 28 | img.thumbnail(size, Image.ANTIALIAS) 29 | new_img = Image.new('RGB', size, fill_color) 30 | # new_img = Image.new('RGBA', size, fill_color) 31 | posx = (int)((size[0] - img.size[0]) / 2) 32 | posy = (int)((size[1] - img.size[1]) / 2) 33 | filename, file_extension = os.path.splitext(image) 34 | new_img.paste(img, (posx, posy), img) 35 | # new_img.paste(img, (posx, posy)) 36 | new_img.save(destin_path + "/" + filename + ".jpg", "JPEG") #"PNG" 37 | 38 | if delete_original: 39 | os.remove(origin) 40 | 41 | except: 42 | if self.debug: 43 | print ("Something goes wrong trying to process image ", image, ":", sys.exc_info()[0]) -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Image Dataset Ceator For Machine Learning 2 | Image Dataset Creator and Normalizer for Machine Learning Projects 3 | 4 | ## Overview 5 | This is a series of tools to create image datasets for machine learning based on google image search and a pre-trained neural network to discriminate useful or rubbish images. 6 | 7 | The tools I created are: 8 | * **GoogleImageSpider.py**: A wrapper-spider which function is to emulate a browser using google image search in order to download a bunch o images about the same topic 9 | * **ImageNormalizer.py**: Really useful class to normalize PNG, JPG or GIF of images into a little thumbnails of the size, background and no transparencies images finally saved in a JPG. (Really useful for my ML projects) 10 | * **FaceClassifier.py**: Using OpenCV we can detect faces, recognize them and crop to a size to normalize from the pictures you got from GoogleImageSpider. You can see a demo with Trump here. 11 | * **ImageClassifier.py**: Last but not least, an CNN implementing an image classifier in order to tag "GOOD" and "BAD" images with two or tree simples lines of code. 12 | 13 | ## Examples 14 | here are some examples about how all this works trying to create datasets 15 | 16 | [Pokemon dataset example](https://github.com/ianholing/image_dataset_creator_for_ML/blob/master/get_them_all.ipynb) and how the final result will be: 17 | ![FINAL DATASET 1](git_images/final_dataset_demo_1.png) 18 | 19 | And this another one for trump faces at [trump faces dataset](https://github.com/ianholing/image_dataset_creator_for_ML/blob/master/trump_pictures_dataset.ipynb): 20 | ![FINAL DATASET 2](git_images/trump_dataset.png) 21 | -------------------------------------------------------------------------------- /get_them_all.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "''' IMPORTS, RELOAD THIS BLOCK WHEN NEEDED '''\n", 12 | "\n", 13 | "from IPython.display import display\n", 14 | "from GoogleImageSpider import *\n", 15 | "from ImageNormalizer import *\n", 16 | "from ImageClassifier import *\n", 17 | "import certifi, urllib3\n", 18 | "import time\n", 19 | "import json\n", 20 | "import os\n", 21 | "\n", 22 | "path = \"pokemon_images\"\n", 23 | "images_per_pokemon = 100\n", 24 | "start_time = time.time()\n", 25 | "\n", 26 | "def print_time():\n", 27 | " # TIMING CONTROL\n", 28 | " elapsed_time = time.time() - start_time\n", 29 | " mins = int(elapsed_time / 60)\n", 30 | " secs = elapsed_time - (mins * 60)\n", 31 | " print(\"Accumulative time: %02d:%02d\" % (mins, int(secs % 60)))" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 2, 37 | "metadata": {}, 38 | "outputs": [ 39 | { 40 | "name": "stdout", 41 | "output_type": "stream", 42 | "text": [ 43 | "Pokemons in API: 949\n", 44 | "Accumulative time: 00:08\n", 45 | "Looking for: pokemon+misdreavus+image\n", 46 | "100 images saved to: pokemon_images\n", 47 | "misdreavus downloaded\n", 48 | "Accumulative time: 00:43\n", 49 | "Looking for: pokemon+bibarel+image\n", 50 | "100 images saved to: pokemon_images\n", 51 | "bibarel downloaded\n", 52 | "Accumulative time: 01:25\n", 53 | "Looking for: pokemon+klang+image\n", 54 | "Something goes wrong trying to save image: \n", 55 | "100 images saved to: pokemon_images\n", 56 | "klang downloaded\n", 57 | "Accumulative time: 02:36\n", 58 | "Looking for: pokemon+necrozma+image\n", 59 | "100 images saved to: pokemon_images\n", 60 | "necrozma downloaded\n", 61 | "Accumulative time: 03:21\n", 62 | "All pokemon images downloaded\n", 63 | "Accumulative time: 03:21\n" 64 | ] 65 | } 66 | ], 67 | "source": [ 68 | "''' FIRST STEP GET A \"SMALL\" SAMPLE OF POKEMON IMAGES (LET ONLY DO 3 OR 4 POKEMONS AND STOP IT) \n", 69 | " THAT WILL MEAN 300 or 400 POKEMON IMAGES '''\n", 70 | "\n", 71 | "if not os.path.exists(path):\n", 72 | " os.makedirs(path)\n", 73 | " \n", 74 | "start_time = time.time()\n", 75 | "\n", 76 | "# FIRST USE A POKEMON API TO GET EACH POKEMON NAME:\n", 77 | "http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())\n", 78 | "json_string = http.request('GET', 'https://pokeapi.co/api/v2/pokemon/?limit=1000')\n", 79 | "json_string = json_string.data.decode('utf-8')\n", 80 | "pokemons = json.loads(json_string)\n", 81 | "print(\"Pokemons in API: \", len(pokemons['results']))\n", 82 | "print_time()\n", 83 | "\n", 84 | "# SECOND STEP DOWNLOAD IMAGES FROM EACH POKEMON NAME:\n", 85 | "gis = GoogleImageSpider()\n", 86 | "i = 0\n", 87 | "for poketemp in pokemons['results']:\n", 88 | " # SKIP SOME OF THEM BETWEEN DOWNLOADS TO NOT DOWNLOAD SIMILAR IMAGES FROM EVOLUTIONS\n", 89 | " i += 1\n", 90 | " if i % 200 != 0:\n", 91 | " continue\n", 92 | " \n", 93 | " gis.get_images(\"pokemon \" + poketemp['name'] + \" image\", images_per_pokemon)\n", 94 | " gis.save_images(poketemp['name'], path)\n", 95 | " gis.clear()\n", 96 | " print (\"Pokemon number\", i, \", \", poketemp['name'], \", downloaded\")\n", 97 | " print_time()\n", 98 | "\n", 99 | "print (\"All pokemon images downloaded\")\n", 100 | "print_time()" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 3, 106 | "metadata": {}, 107 | "outputs": [ 108 | { 109 | "name": "stdout", 110 | "output_type": "stream", 111 | "text": [ 112 | "Normalizing..\n", 113 | "Something goes wrong trying to process image necrozma73.jpg : \n", 114 | "Something goes wrong trying to process image klang83.png : \n", 115 | "Something goes wrong trying to process image klang43.jpg : \n", 116 | "Something goes wrong trying to process image klang71.jpg : \n" 117 | ] 118 | }, 119 | { 120 | "data": { 121 | "image/png": "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\n", 122 | "text/plain": [ 123 | "" 124 | ] 125 | }, 126 | "metadata": {}, 127 | "output_type": "display_data" 128 | }, 129 | { 130 | "name": "stdout", 131 | "output_type": "stream", 132 | "text": [ 133 | "Accumulative time: 00:25\n", 134 | "Done!\n" 135 | ] 136 | } 137 | ], 138 | "source": [ 139 | "''' SECOND STEP: NORMALIZE THAT POKEMONS IN ORDER TO USE OUR CLAFSSIFICATION NETWORK '''\n", 140 | "\n", 141 | "start_time = time.time()\n", 142 | "\n", 143 | "im = ImageNormalizer(path)\n", 144 | "im.normalize((256, 256), \"pkm_destin_images\")\n", 145 | "\n", 146 | "filename, file_extension = os.path.splitext(os.listdir(path)[0])\n", 147 | "display(Image.open(\"pkm_destin_images\"+\"/\"+ filename + \".jpg\"))\n", 148 | "print_time()\n", 149 | "print (\"Done!\")" 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": null, 155 | "metadata": { 156 | "collapsed": true, 157 | "scrolled": false 158 | }, 159 | "outputs": [], 160 | "source": [ 161 | "''' THIRD STEP: NOW WE SHOULD MANUALLY CREATE A SAMPLE FOR OUR NEURAL NETWORK \n", 162 | " DISCRIMINATING GOOD AND BAD IMAGES INTO A SEPARATED FOLDERS (\"GOOD\" AND \"BAD\").\n", 163 | " YES IT IS MANUAL WORK HERE, BUT IF YOU THINK ABOUT IT, IT IS COOL ENOUGH..\n", 164 | " IF YOU DO ONLY 300 IMAGES AND THE NEURAL NETWORK CREATES 50.000 \n", 165 | " \n", 166 | " IN MY CASE (POKEMONS) I TRIED TO REMOVE CONSECUTIVE NUMBERS TO AVOID EVOLUTIONS \n", 167 | " AND SIMILAR POKEMONS IN FIRST STEP (THAT'S WHY THE if i % 200 != 0: continue ).\n", 168 | " AND I WILL TRY TO DISCRIMINATE ALL NON SINGLE-WHITE BACKGROUND POKEMONS'''" 169 | ] 170 | }, 171 | { 172 | "cell_type": "code", 173 | "execution_count": 1, 174 | "metadata": {}, 175 | "outputs": [ 176 | { 177 | "name": "stdout", 178 | "output_type": "stream", 179 | "text": [ 180 | "Epoch: 0\n", 181 | "Accuracy for batch: 0.39999998 / Accuracy for validation: nan\n", 182 | "Accumulative time: 00:11\n", 183 | "----------------------\n", 184 | "Epoch: 100\n", 185 | "Accuracy for batch: 0.82 / Accuracy for validation: nan\n", 186 | "Accumulative time: 00:55\n", 187 | "----------------------\n", 188 | "Epoch: 200\n", 189 | "Accuracy for batch: 0.87999994 / Accuracy for validation: nan\n", 190 | "Accumulative time: 01:39\n", 191 | "----------------------\n", 192 | "Epoch: 300\n", 193 | "Accuracy for batch: 0.98 / Accuracy for validation: nan\n", 194 | "Accumulative time: 02:23\n", 195 | "----------------------\n", 196 | "Epoch: 400\n", 197 | "Accuracy for batch: 1.0 / Accuracy for validation: nan\n", 198 | "Accumulative time: 03:08\n", 199 | "----------------------\n", 200 | "Epoch: 500\n", 201 | "Accuracy for batch: 0.98 / Accuracy for validation: nan\n", 202 | "Accumulative time: 03:52\n", 203 | "----------------------\n", 204 | "Epoch: 600\n", 205 | "Accuracy for batch: 1.0 / Accuracy for validation: nan\n", 206 | "Accumulative time: 04:37\n", 207 | "----------------------\n", 208 | "Epoch: 700\n", 209 | "Accuracy for batch: 1.0 / Accuracy for validation: nan\n", 210 | "Accumulative time: 05:22\n", 211 | "----------------------\n", 212 | "Epoch: 800\n", 213 | "Accuracy for batch: 1.0 / Accuracy for validation: nan\n", 214 | "Accumulative time: 06:06\n", 215 | "----------------------\n", 216 | "Epoch: 900\n", 217 | "Accuracy for batch: 1.0 / Accuracy for validation: nan\n", 218 | "Accumulative time: 06:51\n", 219 | "----------------------\n", 220 | "Final Accuracy: nan\n", 221 | "Model saved to CNN/saved_cnn.ckpt\n", 222 | "Finished in 455.51 seconds\n" 223 | ] 224 | } 225 | ], 226 | "source": [ 227 | "''' FOURTH STEP: IS TO TRAIN A NETWORK WITH THIS IMAGES (I MADE ONE SIMPLE \n", 228 | " CONVOLUTIONAL CLASSIFIER, FEEL FREE TO UPDATE IT AND SEND A PUSH IT TO THE REPO)'''\n", 229 | "\n", 230 | "from ImageClassifier import *\n", 231 | "good_images_folder = \"pkm_classifier/good\"\n", 232 | "bad_images_folder = \"pkm_classifier/bad\"\n", 233 | "start_time = time.time()\n", 234 | "\n", 235 | "ic = ImageClassifier(good_images_folder, bad_images_folder, 256, batch_size=50, training_epochs=1000, \\\n", 236 | " test_batch_percentage = 0) # Once proved that works, we need to use all possible inputs\n", 237 | "#ic.test()\n", 238 | "ic.train()" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": null, 244 | "metadata": {}, 245 | "outputs": [ 246 | { 247 | "name": "stdout", 248 | "output_type": "stream", 249 | "text": [ 250 | "Loading CNN..\n", 251 | "INFO:tensorflow:Restoring parameters from CNN/saved_cnn.ckpt\n", 252 | "Loading Normalizer..\n", 253 | "Accessing Pokemons..\n", 254 | "Pokemons in API: 949\n", 255 | "Accumulative time: 00:06\n", 256 | "Looking for: pokemon+bulbasaur+image\n", 257 | "Something goes wrong trying to save image: \n", 258 | "Something goes wrong trying to save image: \n", 259 | "Something goes wrong trying to save image: \n", 260 | "Something goes wrong trying to save image: \n", 261 | "100 images saved to: original_images\n", 262 | "Normalizing..\n", 263 | "bulbasaur processed\n", 264 | "Accumulative time: 01:07\n", 265 | "Looking for: pokemon+ivysaur+image\n", 266 | "Something goes wrong trying to save image: \n", 267 | "100 images saved to: original_images\n", 268 | "Normalizing..\n", 269 | "ivysaur processed\n", 270 | "Accumulative time: 02:06\n", 271 | "Looking for: pokemon+venusaur+image\n", 272 | "Something goes wrong trying to save image: \n", 273 | "Something goes wrong trying to save image: \n", 274 | "Something goes wrong trying to save image: \n", 275 | "100 images saved to: original_images\n", 276 | "Normalizing..\n", 277 | "venusaur processed\n", 278 | "Accumulative time: 03:17\n", 279 | "Looking for: pokemon+charmander+image\n", 280 | "Something goes wrong trying to save image: \n", 281 | "Something goes wrong trying to save image: \n", 282 | "100 images saved to: original_images\n", 283 | "Normalizing..\n", 284 | "charmander processed\n", 285 | "Accumulative time: 04:49\n", 286 | "Looking for: pokemon+charmeleon+image\n", 287 | "Something goes wrong trying to save image: \n", 288 | "100 images saved to: original_images\n", 289 | "Normalizing..\n", 290 | "charmeleon processed\n", 291 | "Accumulative time: 06:05\n", 292 | "Looking for: pokemon+charizard+image\n", 293 | "Something goes wrong trying to save image: \n", 294 | "Something goes wrong trying to save image: \n", 295 | "100 images saved to: original_images\n", 296 | "Normalizing..\n", 297 | "charizard processed\n", 298 | "Accumulative time: 07:45\n", 299 | "Looking for: pokemon+squirtle+image\n", 300 | "Something goes wrong trying to save image: \n", 301 | "Something goes wrong trying to save image: \n", 302 | "Something goes wrong trying to save image: \n", 303 | "100 images saved to: original_images\n", 304 | "Normalizing..\n", 305 | "squirtle processed\n", 306 | "Accumulative time: 10:25\n", 307 | "Looking for: pokemon+wartortle+image\n", 308 | "Something goes wrong trying to save image: \n", 309 | "100 images saved to: original_images\n", 310 | "Normalizing..\n", 311 | "wartortle processed\n", 312 | "Accumulative time: 12:00\n", 313 | "Looking for: pokemon+blastoise+image\n", 314 | "Something goes wrong trying to save image: \n", 315 | "Something goes wrong trying to save image: \n", 316 | "100 images saved to: original_images\n", 317 | "Normalizing..\n", 318 | "blastoise processed\n", 319 | "Accumulative time: 13:19\n", 320 | "Looking for: pokemon+caterpie+image\n", 321 | "Something goes wrong trying to save image: \n", 322 | "100 images saved to: original_images\n", 323 | "Normalizing..\n", 324 | "caterpie processed\n", 325 | "Accumulative time: 14:36\n", 326 | "Looking for: pokemon+metapod+image\n", 327 | "100 images saved to: original_images\n", 328 | "Normalizing..\n", 329 | "metapod processed\n", 330 | "Accumulative time: 15:34\n", 331 | "Looking for: pokemon+butterfree+image\n", 332 | "100 images saved to: original_images\n", 333 | "Normalizing..\n", 334 | "butterfree processed\n", 335 | "Accumulative time: 17:15\n", 336 | "Looking for: pokemon+weedle+image\n", 337 | "Something goes wrong trying to save image: \n", 338 | "100 images saved to: original_images\n", 339 | "Normalizing..\n", 340 | "weedle processed\n", 341 | "Accumulative time: 18:15\n", 342 | "Looking for: pokemon+kakuna+image\n", 343 | "100 images saved to: original_images\n", 344 | "Normalizing..\n", 345 | "kakuna processed\n", 346 | "Accumulative time: 19:38\n", 347 | "Looking for: pokemon+beedrill+image\n", 348 | "Something goes wrong trying to save image: \n", 349 | "100 images saved to: original_images\n", 350 | "Normalizing..\n", 351 | "beedrill processed\n", 352 | "Accumulative time: 21:07\n", 353 | "Looking for: pokemon+pidgey+image\n", 354 | "Something goes wrong trying to save image: \n", 355 | "Something goes wrong trying to save image: \n", 356 | "100 images saved to: original_images\n", 357 | "Normalizing..\n", 358 | "pidgey processed\n", 359 | "Accumulative time: 22:22\n", 360 | "Looking for: pokemon+pidgeotto+image\n", 361 | "100 images saved to: original_images\n", 362 | "Normalizing..\n", 363 | "pidgeotto processed\n", 364 | "Accumulative time: 23:53\n", 365 | "Looking for: pokemon+pidgeot+image\n", 366 | "Something goes wrong trying to save image: \n", 367 | "100 images saved to: original_images\n", 368 | "Normalizing..\n", 369 | "pidgeot processed\n", 370 | "Accumulative time: 25:57\n", 371 | "Looking for: pokemon+rattata+image\n", 372 | "Something goes wrong trying to save image: \n", 373 | "100 images saved to: original_images\n", 374 | "Normalizing..\n", 375 | "rattata processed\n", 376 | "Accumulative time: 27:24\n", 377 | "Looking for: pokemon+raticate+image\n", 378 | "100 images saved to: original_images\n", 379 | "Normalizing..\n", 380 | "raticate processed\n", 381 | "Accumulative time: 29:27\n", 382 | "Looking for: pokemon+spearow+image\n", 383 | "100 images saved to: original_images\n", 384 | "Normalizing..\n", 385 | "spearow processed\n", 386 | "Accumulative time: 30:49\n", 387 | "Looking for: pokemon+fearow+image\n", 388 | "Something goes wrong trying to save image: \n", 389 | "100 images saved to: original_images\n", 390 | "Normalizing..\n", 391 | "fearow processed\n", 392 | "Accumulative time: 32:34\n", 393 | "Looking for: pokemon+ekans+image\n", 394 | "100 images saved to: original_images\n", 395 | "Normalizing..\n", 396 | "ekans processed\n", 397 | "Accumulative time: 34:23\n", 398 | "Looking for: pokemon+arbok+image\n", 399 | "100 images saved to: original_images\n", 400 | "Normalizing..\n", 401 | "arbok processed\n", 402 | "Accumulative time: 35:49\n", 403 | "Looking for: pokemon+pikachu+image\n", 404 | "Something goes wrong trying to save image: \n", 405 | "100 images saved to: original_images\n", 406 | "Normalizing..\n", 407 | "pikachu processed\n", 408 | "Accumulative time: 37:26\n", 409 | "Looking for: pokemon+raichu+image\n", 410 | "Something goes wrong trying to save image: \n", 411 | "Something goes wrong trying to save image: \n", 412 | "100 images saved to: original_images\n", 413 | "Normalizing..\n", 414 | "raichu processed\n", 415 | "Accumulative time: 39:48\n", 416 | "Looking for: pokemon+sandshrew+image\n", 417 | "Something goes wrong trying to save image: \n", 418 | "100 images saved to: original_images\n", 419 | "Normalizing..\n", 420 | "sandshrew processed\n", 421 | "Accumulative time: 41:41\n", 422 | "Looking for: pokemon+sandslash+image\n", 423 | "Something goes wrong trying to save image: \n", 424 | "100 images saved to: original_images\n", 425 | "Normalizing..\n", 426 | "sandslash processed\n", 427 | "Accumulative time: 43:13\n", 428 | "Looking for: pokemon+nidoran-f+image\n", 429 | "100 images saved to: original_images\n", 430 | "Normalizing..\n", 431 | "nidoran-f processed\n", 432 | "Accumulative time: 44:52\n", 433 | "Looking for: pokemon+nidorina+image\n", 434 | "100 images saved to: original_images\n", 435 | "Normalizing..\n", 436 | "nidorina processed\n", 437 | "Accumulative time: 46:23\n", 438 | "Looking for: pokemon+nidoqueen+image\n", 439 | "100 images saved to: original_images\n", 440 | "Normalizing..\n", 441 | "nidoqueen processed\n", 442 | "Accumulative time: 48:36\n", 443 | "Looking for: pokemon+nidoran-m+image\n", 444 | "100 images saved to: original_images\n", 445 | "Normalizing..\n", 446 | "nidoran-m processed\n", 447 | "Accumulative time: 50:07\n", 448 | "Looking for: pokemon+nidorino+image\n", 449 | "100 images saved to: original_images\n", 450 | "Normalizing..\n", 451 | "nidorino processed\n", 452 | "Accumulative time: 51:24\n", 453 | "Looking for: pokemon+nidoking+image\n", 454 | "100 images saved to: original_images\n", 455 | "Normalizing..\n", 456 | "nidoking processed\n", 457 | "Accumulative time: 53:32\n", 458 | "Looking for: pokemon+clefairy+image\n", 459 | "Something goes wrong trying to save image: \n", 460 | "100 images saved to: original_images\n", 461 | "Normalizing..\n", 462 | "clefairy processed\n", 463 | "Accumulative time: 55:09\n", 464 | "Looking for: pokemon+clefable+image\n", 465 | "Something goes wrong trying to save image: \n", 466 | "Something goes wrong trying to save image: \n", 467 | "100 images saved to: original_images\n", 468 | "Normalizing..\n", 469 | "clefable processed\n", 470 | "Accumulative time: 56:46\n", 471 | "Looking for: pokemon+vulpix+image\n", 472 | "Something goes wrong trying to save image: \n", 473 | "100 images saved to: original_images\n", 474 | "Normalizing..\n", 475 | "vulpix processed\n", 476 | "Accumulative time: 58:55\n", 477 | "Looking for: pokemon+ninetales+image\n" 478 | ] 479 | }, 480 | { 481 | "name": "stdout", 482 | "output_type": "stream", 483 | "text": [ 484 | "100 images saved to: original_images\n", 485 | "Normalizing..\n", 486 | "ninetales processed\n", 487 | "Accumulative time: 60:39\n", 488 | "Looking for: pokemon+jigglypuff+image\n", 489 | "Something goes wrong trying to save image: \n", 490 | "Something goes wrong trying to save image: \n", 491 | "100 images saved to: original_images\n", 492 | "Normalizing..\n", 493 | "jigglypuff processed\n", 494 | "Accumulative time: 62:47\n", 495 | "Looking for: pokemon+wigglytuff+image\n", 496 | "Something goes wrong trying to save image: \n", 497 | "100 images saved to: original_images\n", 498 | "Normalizing..\n", 499 | "wigglytuff processed\n", 500 | "Accumulative time: 64:47\n", 501 | "Looking for: pokemon+zubat+image\n", 502 | "100 images saved to: original_images\n", 503 | "Normalizing..\n", 504 | "zubat processed\n", 505 | "Accumulative time: 67:00\n", 506 | "Looking for: pokemon+golbat+image\n", 507 | "100 images saved to: original_images\n", 508 | "Normalizing..\n", 509 | "golbat processed\n", 510 | "Accumulative time: 68:36\n", 511 | "Looking for: pokemon+oddish+image\n", 512 | "100 images saved to: original_images\n", 513 | "Normalizing..\n", 514 | "oddish processed\n", 515 | "Accumulative time: 70:09\n", 516 | "Looking for: pokemon+gloom+image\n", 517 | "Something goes wrong trying to save image: \n", 518 | "100 images saved to: original_images\n", 519 | "Normalizing..\n", 520 | "gloom processed\n", 521 | "Accumulative time: 71:53\n", 522 | "Looking for: pokemon+vileplume+image\n", 523 | "Something goes wrong trying to save image: \n", 524 | "100 images saved to: original_images\n", 525 | "Normalizing..\n", 526 | "vileplume processed\n", 527 | "Accumulative time: 73:46\n", 528 | "Looking for: pokemon+paras+image\n", 529 | "100 images saved to: original_images\n", 530 | "Normalizing..\n", 531 | "paras processed\n", 532 | "Accumulative time: 75:50\n", 533 | "Looking for: pokemon+parasect+image\n", 534 | "100 images saved to: original_images\n", 535 | "Normalizing..\n", 536 | "parasect processed\n", 537 | "Accumulative time: 77:28\n", 538 | "Looking for: pokemon+venonat+image\n", 539 | "100 images saved to: original_images\n", 540 | "Normalizing..\n", 541 | "venonat processed\n", 542 | "Accumulative time: 79:39\n", 543 | "Looking for: pokemon+venomoth+image\n", 544 | "Something goes wrong trying to save image: \n", 545 | "Something goes wrong trying to save image: \n", 546 | "100 images saved to: original_images\n", 547 | "Normalizing..\n", 548 | "venomoth processed\n", 549 | "Accumulative time: 83:00\n", 550 | "Looking for: pokemon+diglett+image\n", 551 | "Something goes wrong trying to save image: \n", 552 | "Something goes wrong trying to save image: \n", 553 | "100 images saved to: original_images\n", 554 | "Normalizing..\n", 555 | "diglett processed\n", 556 | "Accumulative time: 84:46\n", 557 | "Looking for: pokemon+dugtrio+image\n", 558 | "100 images saved to: original_images\n", 559 | "Normalizing..\n", 560 | "dugtrio processed\n", 561 | "Accumulative time: 86:39\n", 562 | "Looking for: pokemon+meowth+image\n", 563 | "Something goes wrong trying to save image: \n", 564 | "Something goes wrong trying to save image: \n", 565 | "Something goes wrong trying to save image: \n", 566 | "100 images saved to: original_images\n", 567 | "Normalizing..\n", 568 | "meowth processed\n", 569 | "Accumulative time: 89:55\n", 570 | "Looking for: pokemon+persian+image\n", 571 | "100 images saved to: original_images\n", 572 | "Normalizing..\n", 573 | "persian processed\n", 574 | "Accumulative time: 91:35\n", 575 | "Looking for: pokemon+psyduck+image\n", 576 | "Something goes wrong trying to save image: \n", 577 | "100 images saved to: original_images\n", 578 | "Normalizing..\n", 579 | "psyduck processed\n", 580 | "Accumulative time: 93:40\n", 581 | "Looking for: pokemon+golduck+image\n", 582 | "Something goes wrong trying to save image: \n", 583 | "Something goes wrong trying to save image: \n", 584 | "100 images saved to: original_images\n", 585 | "Normalizing..\n", 586 | "golduck processed\n", 587 | "Accumulative time: 97:05\n", 588 | "Looking for: pokemon+mankey+image\n", 589 | "Something goes wrong trying to save image: \n", 590 | "100 images saved to: original_images\n", 591 | "Normalizing..\n", 592 | "mankey processed\n", 593 | "Accumulative time: 99:19\n", 594 | "Looking for: pokemon+primeape+image\n", 595 | "100 images saved to: original_images\n", 596 | "Normalizing..\n", 597 | "primeape processed\n", 598 | "Accumulative time: 101:04\n", 599 | "Looking for: pokemon+growlithe+image\n", 600 | "100 images saved to: original_images\n", 601 | "Normalizing..\n", 602 | "growlithe processed\n", 603 | "Accumulative time: 103:33\n", 604 | "Looking for: pokemon+arcanine+image\n", 605 | "Something goes wrong trying to save image: \n", 606 | "Something goes wrong trying to save image: \n", 607 | "Something goes wrong trying to save image: \n", 608 | "100 images saved to: original_images\n", 609 | "Normalizing..\n", 610 | "arcanine processed\n", 611 | "Accumulative time: 107:32\n", 612 | "Looking for: pokemon+poliwag+image\n", 613 | "100 images saved to: original_images\n", 614 | "Normalizing..\n", 615 | "poliwag processed\n", 616 | "Accumulative time: 110:05\n", 617 | "Looking for: pokemon+poliwhirl+image\n", 618 | "100 images saved to: original_images\n", 619 | "Normalizing..\n", 620 | "poliwhirl processed\n", 621 | "Accumulative time: 112:27\n", 622 | "Looking for: pokemon+poliwrath+image\n", 623 | "Something goes wrong trying to save image: \n", 624 | "100 images saved to: original_images\n", 625 | "Normalizing..\n", 626 | "poliwrath processed\n", 627 | "Accumulative time: 115:00\n", 628 | "Looking for: pokemon+abra+image\n", 629 | "Something goes wrong trying to save image: \n", 630 | "Something goes wrong trying to save image: \n", 631 | "100 images saved to: original_images\n", 632 | "Normalizing..\n", 633 | "abra processed\n", 634 | "Accumulative time: 117:28\n", 635 | "Looking for: pokemon+kadabra+image\n", 636 | "Something goes wrong trying to save image: \n", 637 | "100 images saved to: original_images\n", 638 | "Normalizing..\n", 639 | "kadabra processed\n", 640 | "Accumulative time: 119:31\n", 641 | "Looking for: pokemon+alakazam+image\n", 642 | "Something goes wrong trying to save image: \n", 643 | "100 images saved to: original_images\n", 644 | "Normalizing..\n", 645 | "alakazam processed\n", 646 | "Accumulative time: 121:12\n", 647 | "Looking for: pokemon+machop+image\n", 648 | "100 images saved to: original_images\n", 649 | "Normalizing..\n", 650 | "machop processed\n", 651 | "Accumulative time: 123:09\n", 652 | "Looking for: pokemon+machoke+image\n", 653 | "100 images saved to: original_images\n", 654 | "Normalizing..\n", 655 | "machoke processed\n", 656 | "Accumulative time: 125:16\n", 657 | "Looking for: pokemon+machamp+image\n", 658 | "Something goes wrong trying to save image: \n", 659 | "Something goes wrong trying to save image: \n", 660 | "100 images saved to: original_images\n", 661 | "Normalizing..\n", 662 | "machamp processed\n", 663 | "Accumulative time: 128:23\n", 664 | "Looking for: pokemon+bellsprout+image\n", 665 | "Something goes wrong trying to save image: \n", 666 | "Something goes wrong trying to save image: \n", 667 | "Something goes wrong trying to save image: \n", 668 | "100 images saved to: original_images\n", 669 | "Normalizing..\n", 670 | "bellsprout processed\n", 671 | "Accumulative time: 130:13\n", 672 | "Looking for: pokemon+weepinbell+image\n", 673 | "Something goes wrong trying to save image: \n", 674 | "100 images saved to: original_images\n", 675 | "Normalizing..\n", 676 | "weepinbell processed\n", 677 | "Accumulative time: 131:49\n", 678 | "Looking for: pokemon+victreebel+image\n", 679 | "Something goes wrong trying to save image: \n", 680 | "Something goes wrong trying to save image: \n", 681 | "Something goes wrong trying to save image: \n", 682 | "Something goes wrong trying to save image: \n", 683 | "100 images saved to: original_images\n", 684 | "Normalizing..\n", 685 | "victreebel processed\n", 686 | "Accumulative time: 135:06\n", 687 | "Looking for: pokemon+tentacool+image\n", 688 | "Something goes wrong trying to save image: \n", 689 | "Something goes wrong trying to save image: \n", 690 | "100 images saved to: original_images\n", 691 | "Normalizing..\n", 692 | "tentacool processed\n", 693 | "Accumulative time: 137:21\n", 694 | "Looking for: pokemon+tentacruel+image\n", 695 | "100 images saved to: original_images\n", 696 | "Normalizing..\n", 697 | "tentacruel processed\n", 698 | "Accumulative time: 140:11\n", 699 | "Looking for: pokemon+geodude+image\n", 700 | "Something goes wrong trying to save image: \n", 701 | "100 images saved to: original_images\n", 702 | "Normalizing..\n", 703 | "geodude processed\n", 704 | "Accumulative time: 141:53\n", 705 | "Looking for: pokemon+graveler+image\n", 706 | "Something goes wrong trying to save image: \n" 707 | ] 708 | }, 709 | { 710 | "name": "stdout", 711 | "output_type": "stream", 712 | "text": [ 713 | "100 images saved to: original_images\n", 714 | "Normalizing..\n", 715 | "graveler processed\n", 716 | "Accumulative time: 143:48\n", 717 | "Looking for: pokemon+golem+image\n", 718 | "Something goes wrong trying to save image: \n", 719 | "100 images saved to: original_images\n", 720 | "Normalizing..\n", 721 | "golem processed\n", 722 | "Accumulative time: 145:47\n", 723 | "Looking for: pokemon+ponyta+image\n", 724 | "Something goes wrong trying to save image: \n", 725 | "100 images saved to: original_images\n", 726 | "Normalizing..\n", 727 | "ponyta processed\n", 728 | "Accumulative time: 148:08\n", 729 | "Looking for: pokemon+rapidash+image\n", 730 | "100 images saved to: original_images\n", 731 | "Normalizing..\n", 732 | "rapidash processed\n", 733 | "Accumulative time: 151:07\n", 734 | "Looking for: pokemon+slowpoke+image\n", 735 | "Something goes wrong trying to save image: \n", 736 | "Something goes wrong trying to save image: \n", 737 | "100 images saved to: original_images\n", 738 | "Normalizing..\n", 739 | "slowpoke processed\n", 740 | "Accumulative time: 153:17\n", 741 | "Looking for: pokemon+slowbro+image\n", 742 | "Something goes wrong trying to save image: \n", 743 | "Something goes wrong trying to save image: \n", 744 | "100 images saved to: original_images\n", 745 | "Normalizing..\n", 746 | "slowbro processed\n", 747 | "Accumulative time: 156:18\n", 748 | "Looking for: pokemon+magnemite+image\n", 749 | "100 images saved to: original_images\n", 750 | "Normalizing..\n", 751 | "magnemite processed\n", 752 | "Accumulative time: 158:43\n", 753 | "Looking for: pokemon+magneton+image\n", 754 | "Something goes wrong trying to save image: \n", 755 | "100 images saved to: original_images\n", 756 | "Normalizing..\n", 757 | "magneton processed\n", 758 | "Accumulative time: 160:51\n", 759 | "Looking for: pokemon+farfetchd+image\n", 760 | "100 images saved to: original_images\n", 761 | "Normalizing..\n", 762 | "farfetchd processed\n", 763 | "Accumulative time: 163:51\n", 764 | "Looking for: pokemon+doduo+image\n", 765 | "100 images saved to: original_images\n", 766 | "Normalizing..\n", 767 | "doduo processed\n", 768 | "Accumulative time: 167:00\n", 769 | "Looking for: pokemon+dodrio+image\n", 770 | "100 images saved to: original_images\n", 771 | "Normalizing..\n", 772 | "dodrio processed\n", 773 | "Accumulative time: 169:07\n", 774 | "Looking for: pokemon+seel+image\n", 775 | "100 images saved to: original_images\n", 776 | "Normalizing..\n", 777 | "seel processed\n", 778 | "Accumulative time: 171:18\n", 779 | "Looking for: pokemon+dewgong+image\n", 780 | "Something goes wrong trying to save image: \n", 781 | "100 images saved to: original_images\n", 782 | "Normalizing..\n", 783 | "dewgong processed\n", 784 | "Accumulative time: 173:34\n", 785 | "Looking for: pokemon+grimer+image\n", 786 | "Something goes wrong trying to save image: \n", 787 | "100 images saved to: original_images\n", 788 | "Normalizing..\n", 789 | "grimer processed\n", 790 | "Accumulative time: 175:43\n", 791 | "Looking for: pokemon+muk+image\n", 792 | "100 images saved to: original_images\n", 793 | "Normalizing..\n", 794 | "muk processed\n", 795 | "Accumulative time: 177:52\n", 796 | "Looking for: pokemon+shellder+image\n", 797 | "Something goes wrong trying to save image: \n", 798 | "100 images saved to: original_images\n", 799 | "Normalizing..\n", 800 | "shellder processed\n", 801 | "Accumulative time: 179:40\n", 802 | "Looking for: pokemon+cloyster+image\n", 803 | "Something goes wrong trying to save image: \n", 804 | "Something goes wrong trying to save image: \n", 805 | "100 images saved to: original_images\n", 806 | "Normalizing..\n", 807 | "cloyster processed\n", 808 | "Accumulative time: 182:49\n", 809 | "Looking for: pokemon+gastly+image\n", 810 | "Something goes wrong trying to save image: \n", 811 | "Something goes wrong trying to save image: \n", 812 | "Something goes wrong trying to save image: \n", 813 | "Something goes wrong trying to save image: \n", 814 | "Something goes wrong trying to save image: \n", 815 | "100 images saved to: original_images\n", 816 | "Normalizing..\n", 817 | "gastly processed\n", 818 | "Accumulative time: 184:52\n", 819 | "Looking for: pokemon+haunter+image\n", 820 | "Something goes wrong trying to save image: \n", 821 | "Something goes wrong trying to save image: \n", 822 | "100 images saved to: original_images\n", 823 | "Normalizing..\n", 824 | "haunter processed\n", 825 | "Accumulative time: 186:43\n", 826 | "Looking for: pokemon+gengar+image\n", 827 | "Something goes wrong trying to save image: \n", 828 | "Something goes wrong trying to save image: \n", 829 | "Something goes wrong trying to save image: \n", 830 | "100 images saved to: original_images\n", 831 | "Normalizing..\n", 832 | "gengar processed\n", 833 | "Accumulative time: 190:50\n", 834 | "Looking for: pokemon+onix+image\n", 835 | "Something goes wrong trying to save image: \n", 836 | "100 images saved to: original_images\n", 837 | "Normalizing..\n", 838 | "onix processed\n", 839 | "Accumulative time: 193:59\n", 840 | "Looking for: pokemon+drowzee+image\n", 841 | "100 images saved to: original_images\n", 842 | "Normalizing..\n", 843 | "drowzee processed\n", 844 | "Accumulative time: 196:08\n", 845 | "Looking for: pokemon+hypno+image\n", 846 | "100 images saved to: original_images\n", 847 | "Normalizing..\n", 848 | "hypno processed\n", 849 | "Accumulative time: 198:10\n", 850 | "Looking for: pokemon+krabby+image\n", 851 | "100 images saved to: original_images\n", 852 | "Normalizing..\n", 853 | "krabby processed\n", 854 | "Accumulative time: 200:19\n", 855 | "Looking for: pokemon+kingler+image\n", 856 | "100 images saved to: original_images\n", 857 | "Normalizing..\n", 858 | "kingler processed\n", 859 | "Accumulative time: 202:18\n", 860 | "Looking for: pokemon+voltorb+image\n", 861 | "Something goes wrong trying to save image: \n", 862 | "100 images saved to: original_images\n", 863 | "Normalizing..\n", 864 | "voltorb processed\n", 865 | "Accumulative time: 204:19\n", 866 | "Looking for: pokemon+electrode+image\n", 867 | "Something goes wrong trying to save image: \n", 868 | "100 images saved to: original_images\n", 869 | "Normalizing..\n", 870 | "electrode processed\n", 871 | "Accumulative time: 206:21\n", 872 | "Looking for: pokemon+exeggcute+image\n", 873 | "100 images saved to: original_images\n", 874 | "Normalizing..\n", 875 | "exeggcute processed\n", 876 | "Accumulative time: 208:17\n", 877 | "Looking for: pokemon+exeggutor+image\n", 878 | "100 images saved to: original_images\n", 879 | "Normalizing..\n", 880 | "exeggutor processed\n", 881 | "Accumulative time: 210:16\n", 882 | "Looking for: pokemon+cubone+image\n", 883 | "100 images saved to: original_images\n", 884 | "Normalizing..\n", 885 | "cubone processed\n", 886 | "Accumulative time: 212:23\n", 887 | "Looking for: pokemon+marowak+image\n", 888 | "100 images saved to: original_images\n", 889 | "Normalizing..\n", 890 | "marowak processed\n", 891 | "Accumulative time: 214:26\n", 892 | "Looking for: pokemon+hitmonlee+image\n", 893 | "100 images saved to: original_images\n", 894 | "Normalizing..\n", 895 | "hitmonlee processed\n", 896 | "Accumulative time: 216:34\n", 897 | "Looking for: pokemon+hitmonchan+image\n", 898 | "100 images saved to: original_images\n", 899 | "Normalizing..\n", 900 | "hitmonchan processed\n", 901 | "Accumulative time: 218:48\n", 902 | "Looking for: pokemon+lickitung+image\n", 903 | "Something goes wrong trying to save image: \n", 904 | "100 images saved to: original_images\n", 905 | "Normalizing..\n", 906 | "lickitung processed\n", 907 | "Accumulative time: 221:12\n", 908 | "Looking for: pokemon+koffing+image\n", 909 | "100 images saved to: original_images\n", 910 | "Normalizing..\n", 911 | "koffing processed\n", 912 | "Accumulative time: 223:18\n", 913 | "Looking for: pokemon+weezing+image\n", 914 | "100 images saved to: original_images\n", 915 | "Normalizing..\n", 916 | "weezing processed\n", 917 | "Accumulative time: 225:28\n", 918 | "Looking for: pokemon+rhyhorn+image\n", 919 | "100 images saved to: original_images\n", 920 | "Normalizing..\n", 921 | "rhyhorn processed\n", 922 | "Accumulative time: 227:35\n", 923 | "Looking for: pokemon+rhydon+image\n", 924 | "100 images saved to: original_images\n", 925 | "Normalizing..\n", 926 | "rhydon processed\n", 927 | "Accumulative time: 229:42\n", 928 | "Looking for: pokemon+chansey+image\n", 929 | "100 images saved to: original_images\n", 930 | "Normalizing..\n", 931 | "chansey processed\n", 932 | "Accumulative time: 231:57\n", 933 | "Looking for: pokemon+tangela+image\n", 934 | "100 images saved to: original_images\n", 935 | "Normalizing..\n", 936 | "tangela processed\n", 937 | "Accumulative time: 234:13\n", 938 | "Looking for: pokemon+kangaskhan+image\n", 939 | "100 images saved to: original_images\n", 940 | "Normalizing..\n", 941 | "kangaskhan processed\n", 942 | "Accumulative time: 236:32\n", 943 | "Looking for: pokemon+horsea+image\n", 944 | "100 images saved to: original_images\n", 945 | "Normalizing..\n", 946 | "horsea processed\n", 947 | "Accumulative time: 238:38\n", 948 | "Looking for: pokemon+seadra+image\n", 949 | "100 images saved to: original_images\n", 950 | "Normalizing..\n", 951 | "seadra processed\n", 952 | "Accumulative time: 240:53\n", 953 | "Looking for: pokemon+goldeen+image\n", 954 | "Something goes wrong trying to save image: \n", 955 | "Something goes wrong trying to save image: \n", 956 | "100 images saved to: original_images\n", 957 | "Normalizing..\n", 958 | "goldeen processed\n", 959 | "Accumulative time: 243:19\n", 960 | "Looking for: pokemon+seaking+image\n" 961 | ] 962 | }, 963 | { 964 | "name": "stdout", 965 | "output_type": "stream", 966 | "text": [ 967 | "100 images saved to: original_images\n", 968 | "Normalizing..\n", 969 | "seaking processed\n", 970 | "Accumulative time: 245:39\n", 971 | "Looking for: pokemon+staryu+image\n", 972 | "100 images saved to: original_images\n", 973 | "Normalizing..\n", 974 | "staryu processed\n", 975 | "Accumulative time: 248:01\n", 976 | "Looking for: pokemon+starmie+image\n", 977 | "100 images saved to: original_images\n", 978 | "Normalizing..\n", 979 | "starmie processed\n", 980 | "Accumulative time: 250:15\n", 981 | "Looking for: pokemon+mr-mime+image\n", 982 | "100 images saved to: original_images\n", 983 | "Normalizing..\n", 984 | "mr-mime processed\n", 985 | "Accumulative time: 252:30\n", 986 | "Looking for: pokemon+scyther+image\n", 987 | "Something goes wrong trying to save image: \n", 988 | "100 images saved to: original_images\n", 989 | "Normalizing..\n", 990 | "scyther processed\n", 991 | "Accumulative time: 254:48\n", 992 | "Looking for: pokemon+jynx+image\n", 993 | "100 images saved to: original_images\n", 994 | "Normalizing..\n", 995 | "jynx processed\n", 996 | "Accumulative time: 257:05\n", 997 | "Looking for: pokemon+electabuzz+image\n", 998 | "100 images saved to: original_images\n", 999 | "Normalizing..\n", 1000 | "electabuzz processed\n", 1001 | "Accumulative time: 259:20\n", 1002 | "Looking for: pokemon+magmar+image\n", 1003 | "100 images saved to: original_images\n", 1004 | "Normalizing..\n", 1005 | "magmar processed\n", 1006 | "Accumulative time: 261:41\n", 1007 | "Looking for: pokemon+pinsir+image\n", 1008 | "100 images saved to: original_images\n", 1009 | "Normalizing..\n", 1010 | "pinsir processed\n", 1011 | "Accumulative time: 263:54\n", 1012 | "Looking for: pokemon+tauros+image\n", 1013 | "100 images saved to: original_images\n", 1014 | "Normalizing..\n", 1015 | "tauros processed\n", 1016 | "Accumulative time: 266:20\n", 1017 | "Looking for: pokemon+magikarp+image\n", 1018 | "Something goes wrong trying to save image: \n", 1019 | "Something goes wrong trying to save image: \n", 1020 | "Something goes wrong trying to save image: \n", 1021 | "100 images saved to: original_images\n", 1022 | "Normalizing..\n", 1023 | "magikarp processed\n", 1024 | "Accumulative time: 268:34\n", 1025 | "Looking for: pokemon+gyarados+image\n", 1026 | "Something goes wrong trying to save image: \n", 1027 | "Something goes wrong trying to save image: \n", 1028 | "100 images saved to: original_images\n", 1029 | "Normalizing..\n", 1030 | "gyarados processed\n", 1031 | "Accumulative time: 270:58\n", 1032 | "Looking for: pokemon+lapras+image\n", 1033 | "Something goes wrong trying to save image: \n", 1034 | "100 images saved to: original_images\n", 1035 | "Normalizing..\n", 1036 | "lapras processed\n", 1037 | "Accumulative time: 273:16\n", 1038 | "Looking for: pokemon+ditto+image\n", 1039 | "Something goes wrong trying to save image: \n", 1040 | "100 images saved to: original_images\n", 1041 | "Normalizing..\n", 1042 | "ditto processed\n", 1043 | "Accumulative time: 275:45\n", 1044 | "Looking for: pokemon+eevee+image\n", 1045 | "Something goes wrong trying to save image: \n", 1046 | "100 images saved to: original_images\n", 1047 | "Normalizing..\n", 1048 | "eevee processed\n", 1049 | "Accumulative time: 278:02\n", 1050 | "Looking for: pokemon+vaporeon+image\n", 1051 | "Something goes wrong trying to save image: \n", 1052 | "100 images saved to: original_images\n", 1053 | "Normalizing..\n", 1054 | "vaporeon processed\n", 1055 | "Accumulative time: 280:31\n", 1056 | "Looking for: pokemon+jolteon+image\n", 1057 | "Something goes wrong trying to save image: \n", 1058 | "Something goes wrong trying to save image: \n", 1059 | "100 images saved to: original_images\n", 1060 | "Normalizing..\n", 1061 | "jolteon processed\n", 1062 | "Accumulative time: 283:14\n", 1063 | "Looking for: pokemon+flareon+image\n", 1064 | "Something goes wrong trying to save image: \n", 1065 | "Something goes wrong trying to save image: \n", 1066 | "100 images saved to: original_images\n", 1067 | "Normalizing..\n", 1068 | "flareon processed\n", 1069 | "Accumulative time: 285:49\n", 1070 | "Looking for: pokemon+porygon+image\n", 1071 | "Something goes wrong trying to save image: \n", 1072 | "100 images saved to: original_images\n", 1073 | "Normalizing..\n", 1074 | "porygon processed\n", 1075 | "Accumulative time: 288:12\n", 1076 | "Looking for: pokemon+omanyte+image\n", 1077 | "100 images saved to: original_images\n", 1078 | "Normalizing..\n", 1079 | "omanyte processed\n", 1080 | "Accumulative time: 290:46\n", 1081 | "Looking for: pokemon+omastar+image\n", 1082 | "100 images saved to: original_images\n", 1083 | "Normalizing..\n", 1084 | "omastar processed\n", 1085 | "Accumulative time: 293:07\n", 1086 | "Looking for: pokemon+kabuto+image\n", 1087 | "100 images saved to: original_images\n", 1088 | "Normalizing..\n", 1089 | "kabuto processed\n", 1090 | "Accumulative time: 295:35\n", 1091 | "Looking for: pokemon+kabutops+image\n", 1092 | "100 images saved to: original_images\n", 1093 | "Normalizing..\n", 1094 | "kabutops processed\n", 1095 | "Accumulative time: 297:57\n", 1096 | "Looking for: pokemon+aerodactyl+image\n", 1097 | "100 images saved to: original_images\n", 1098 | "Normalizing..\n", 1099 | "aerodactyl processed\n", 1100 | "Accumulative time: 300:23\n", 1101 | "Looking for: pokemon+snorlax+image\n", 1102 | "100 images saved to: original_images\n", 1103 | "Normalizing..\n", 1104 | "snorlax processed\n", 1105 | "Accumulative time: 302:49\n", 1106 | "Looking for: pokemon+articuno+image\n", 1107 | "Something goes wrong trying to save image: \n", 1108 | "Something goes wrong trying to save image: \n", 1109 | "100 images saved to: original_images\n", 1110 | "Normalizing..\n", 1111 | "articuno processed\n", 1112 | "Accumulative time: 305:16\n", 1113 | "Looking for: pokemon+zapdos+image\n", 1114 | "Something goes wrong trying to save image: \n", 1115 | "100 images saved to: original_images\n", 1116 | "Normalizing..\n", 1117 | "zapdos processed\n", 1118 | "Accumulative time: 307:53\n", 1119 | "Looking for: pokemon+moltres+image\n", 1120 | "100 images saved to: original_images\n", 1121 | "Normalizing..\n", 1122 | "moltres processed\n", 1123 | "Accumulative time: 310:14\n", 1124 | "Looking for: pokemon+dratini+image\n", 1125 | "Something goes wrong trying to save image: \n", 1126 | "100 images saved to: original_images\n", 1127 | "Normalizing..\n", 1128 | "dratini processed\n", 1129 | "Accumulative time: 312:48\n", 1130 | "Looking for: pokemon+dragonair+image\n", 1131 | "Something goes wrong trying to save image: \n", 1132 | "Something goes wrong trying to save image: \n" 1133 | ] 1134 | } 1135 | ], 1136 | "source": [ 1137 | "''' LAST STEP: FINALLY WE MIX ALL THAT TOGETHER, DOWNLOAD ALL THE DATASET, NORMALIZE,\n", 1138 | " AND LET OUR NEURAL NETWORK DISCRIMINATE THEM TO GET ONLY THE GOOD ONES.\n", 1139 | " \n", 1140 | " THIS IS PRETTY MUCH COPY OF THE FIRST STEP CODE IMPROVED.\n", 1141 | " \n", 1142 | " WE ARRIVE HERE IN LIKE 15 MINUTES, BUT NOW 100 IMAGES PER 949 POKEMONS WILL TAKE A WHILE.. \n", 1143 | " TAKE A COFEE AND COME BACK IN A FEW HOURS ;) \n", 1144 | " GOOD NEWS IS THAT IS COMPLETELY FREE OF HUMAN INTERACTION '''\n", 1145 | "\n", 1146 | "originals_temp_path = \"pkm_original_images\"\n", 1147 | "source_path = \"pkm_destin_images\"\n", 1148 | "good_images_folder = source_path+\"/good\"\n", 1149 | "bad_images_folder = source_path+\"/bad\"\n", 1150 | "images_per_pokemon = 100\n", 1151 | "start_time = time.time()\n", 1152 | " \n", 1153 | "if not os.path.exists(originals_temp_path):\n", 1154 | " os.makedirs(originals_temp_path)\n", 1155 | "\n", 1156 | "print (\"Loading CNN..\")\n", 1157 | "ic = ImageClassifier(None, None, 256)\n", 1158 | "ic.load()\n", 1159 | "\n", 1160 | "print (\"Loading Normalizer..\")\n", 1161 | "im = ImageNormalizer(originals_temp_path)\n", 1162 | "\n", 1163 | "print (\"Accessing Pokemons..\")\n", 1164 | "# FIRST USE A POKEMON API TO GET EACH POKEMON NAME:\n", 1165 | "http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())\n", 1166 | "json_string = http.request('GET', 'https://pokeapi.co/api/v2/pokemon/?limit=1000')\n", 1167 | "json_string = json_string.data.decode('utf-8')\n", 1168 | "pokemons = json.loads(json_string)\n", 1169 | "print(\"Pokemons in API: \", len(pokemons['results']))\n", 1170 | "print_time()\n", 1171 | "\n", 1172 | "# SECOND STEP DOWNLOAD IMAGES FROM EACH POKEMON NAME:\n", 1173 | "i = 0\n", 1174 | "gis = GoogleImageSpider()\n", 1175 | "for poketemp in pokemons['results']:\n", 1176 | " i += 1\n", 1177 | " gis.get_images(\"pokemon \" + poketemp['name'] + \" image\", images_per_pokemon)\n", 1178 | " gis.save_images(poketemp['name'], originals_temp_path)\n", 1179 | " im.normalize((256, 256), source_path, delete_originals=True)\n", 1180 | " ic.run(source_path, good_images_folder, bad_images_folder, good_percent_treshold=85, delete_images=True)\n", 1181 | " gis.clear()\n", 1182 | " print (\"Pokemon number\", i, \", \", poketemp['name'], \", processed\")\n", 1183 | " print_time()\n", 1184 | " sys.stdout.flush() # For python command line\n", 1185 | "\n", 1186 | "print (\"Dataset finally done!\")\n", 1187 | "print_time()\n" 1188 | ] 1189 | }, 1190 | { 1191 | "cell_type": "code", 1192 | "execution_count": null, 1193 | "metadata": { 1194 | "collapsed": true 1195 | }, 1196 | "outputs": [], 1197 | "source": [ 1198 | "''' HINT1: EXECUTE THIS LAST STEP IN A STANDALONE PYTHON EXECUTABLE CAUSE MY JUPYTER NOTEBOOK\n", 1199 | " FREEZES AT 5 HOURS (AT LEAST MINE) AND THIS IS A 18H PROCESS MORE OR LESS (THIS IS WHAT I \n", 1200 | " GET NEXT DAY, AND A MESSAGE TELLING ME MY KERNEL IS STOPPED)\n", 1201 | "\n", 1202 | " HINT2: ONCE YOU HAVE A MORE LENGTH ON YOUR ALREADY CREATED DATASET YOU CAN REPEAT THE \n", 1203 | " PROCESS HELPING MANUALLY THE NETWORK TO GET BETTER AND THAT WAY FINALLY CREATE A HUGE \n", 1204 | " AND ALMOST PERFECT DATASET (IT IS ABOUT STATISTICS NOT PERFECTION, DO NOT OBSESS)'''" 1205 | ] 1206 | }, 1207 | { 1208 | "cell_type": "markdown", 1209 | "metadata": {}, 1210 | "source": [ 1211 | "![FINAL DATASET 1](git_images/final_dataset_demo_1.png)" 1212 | ] 1213 | }, 1214 | { 1215 | "cell_type": "markdown", 1216 | "metadata": {}, 1217 | "source": [ 1218 | "![FINAL DATASET 2](git_images/final_dataset_demo_2.png)" 1219 | ] 1220 | } 1221 | ], 1222 | "metadata": { 1223 | "kernelspec": { 1224 | "display_name": "Python 3", 1225 | "language": "python", 1226 | "name": "python3" 1227 | }, 1228 | "language_info": { 1229 | "codemirror_mode": { 1230 | "name": "ipython", 1231 | "version": 3 1232 | }, 1233 | "file_extension": ".py", 1234 | "mimetype": "text/x-python", 1235 | "name": "python", 1236 | "nbconvert_exporter": "python", 1237 | "pygments_lexer": "ipython3", 1238 | "version": "3.5.2" 1239 | } 1240 | }, 1241 | "nbformat": 4, 1242 | "nbformat_minor": 2 1243 | } 1244 | -------------------------------------------------------------------------------- /git_images/final_dataset_demo_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ianholing/image_dataset_creator_for_ML/1722dc519cc50fc963d36ecbcea4ede6eed2e980/git_images/final_dataset_demo_1.png -------------------------------------------------------------------------------- /git_images/final_dataset_demo_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ianholing/image_dataset_creator_for_ML/1722dc519cc50fc963d36ecbcea4ede6eed2e980/git_images/final_dataset_demo_2.png -------------------------------------------------------------------------------- /git_images/trump_dataset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ianholing/image_dataset_creator_for_ML/1722dc519cc50fc963d36ecbcea4ede6eed2e980/git_images/trump_dataset.png --------------------------------------------------------------------------------