├── 1.png ├── 11.png ├── 12.png ├── 13.png ├── 14.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── 7.png ├── 8.png ├── 9.png ├── README.md └── src_code ├── method1 ├── README.md └── test.py ├── method2 ├── CNN_Image_Classification.ipynb └── README.md └── method3 ├── README.md ├── Testdata ├── 15ca602c71ff28821f18a3b11059bc0e.jpg ├── C3A26B2176EB4870E8C7DC1CA3775BEE.jpg ├── IMG_2740.JPG ├── Ragdoll_from_Gatil_Ragbelas.jpg ├── birman cat.jpg └── cat-senior-landing-hero.jpg ├── label_image.py ├── retrained_graph.pb └── retrained_labels.txt /1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/1.png -------------------------------------------------------------------------------- /11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/11.png -------------------------------------------------------------------------------- /12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/12.png -------------------------------------------------------------------------------- /13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/13.png -------------------------------------------------------------------------------- /14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/14.png -------------------------------------------------------------------------------- /2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/2.png -------------------------------------------------------------------------------- /3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/3.png -------------------------------------------------------------------------------- /4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/4.png -------------------------------------------------------------------------------- /5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/5.png -------------------------------------------------------------------------------- /7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/7.png -------------------------------------------------------------------------------- /8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/8.png -------------------------------------------------------------------------------- /9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/9.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Introduction 2 | 3 | ### Motivation 4 | 5 | Image classification problem is the task of assigning an input image one label from a fixed set of categories. This is one of the core problems in Computer Vision that, despite its simplicity, has a large variety of practical applications. 6 | 7 | Traditional way: Feature Description and Detection. 8 | ![](3.png) 9 | Maybe good for some sample task, but the actual situation is far more complicated. 10 | ![](2.png) 11 | 12 | Therefore, instead of trying to specify what every one of the categories of interest look like directly in code, we're going to use machine learning, which is providing the computer with many examples of each class and then develop learning algorithms that look at these examples and learn about the visual appearance of each class. 13 | 14 | However, image classification problem is such a complicated work that always been done with deep learning model like Convolutional Neural Network. We already learnt that many algorithms we studied in class like KNN and SVM usually do a great job on many data mining problems. But it seems that they are sometimes not the best choices for image classification problems. 15 | 16 | So we would like to compare the performance among the algorithms we learnt in class and CNN and Transfer Learning. 17 | 18 | 19 | ### Objective 20 | 21 | Our Objective is to: 22 | 23 | 1. Compare normal algorithms we learnt in class with 2 methods that are usually used in industry on image classification problem, which are CNN and Transfer Learning. 24 | 2. Gain experience on deep learning. 25 | 3. Explore the machine learning framework by Google - TensorFlow. 26 | 27 | 28 | ## System Design & Implementation details 29 | 30 | ### Algorithms and Tools 31 | 32 | The 5 methods we used in this project are KNN, SVM, BP Neural Network, Convolutional Neural Network and Transfer Learning. 33 | 34 | The whole project is divided into 3 methods. 35 | 36 | - **The first method**: Used **KNN, SVM and BP Neural Network**, which are algorithms we learnt in class. There are powerful and easy to implement. We mainly used **sklearn** to implement those algorithms. 37 | 38 | - **The second method**: While traditional multilayer perceptron (MLP) models were successfully used for image recognition, due to the full connectivity between nodes they suffer from the curse of dimensionality and thus do not scale well to higher resolution images. So in this part we built a **CNN** using deep learning frame work by Google - **TensorFlow**. 39 | 40 | - **The third method**: Retrained the last layer of a pre-trained deep neural network called **Inception V3**, also provided by **TensorFlow**. 41 | Inception V3 is trained for the ImageNet Large Visual Recognition Challenge using the data from 2012. This is a standard task in computer vision, where models try to classify entire images into 1000 classes, like "Zebra", "Dalmatian", and "Dishwasher". In order to retrain this pre-trained network, we need to ensure that our own dataset is not already pretrained. 42 | 43 | 44 | ### Implementation 45 | 46 | - **The first method:** **Preprocess dataset and apply KNN, SVM and BP Neural Network with sklearn.** 47 | 48 | Firstly, we defined 2 different preprocessing functions using openCV package:The first one is called image to feature vector, to resize the image and then flatten the image into a list of row pixel. The second one is called extract color histogram, to extract a 3D color histogram from the HSV color spacing using cv2.normalize and then flatten the result. 49 | 50 | Then, we construct several arguments we need to parse. Because we want to test the accuracy on this part not only for the whole dataset but also the sub-dataset with different number of labels, we construct the dataset as a arguments parsed into our program. And we also construct the number of neighbors used for k-NN method as a parse argument. 51 | 52 | After that, we began to extract each image features in the dataset and put them into arrays. We used the cv2.imread to read each image, split the label out by extract the string from the image name. In our dataset, we set the name with the same format: “class label”.”image number”.jpg, so we can easily extract the class label for each image. Then we used those 2 functions we defined before to extract 2 kinds of features and append to the array rawImages and features, and the label we extracted earlier append to the array labels. 53 | 54 | The next step is to split the dataset with the function train_test_split, imported from sklearn package. The set with postfix RI,RL is the split result of the rawImages and labels pair, and another is the split result of the features and labels pair. We use 85% of the dataset as train set, and 15% as the test set. 55 | 56 | Finally we applied the KNN, SVM and BP Neural Network functions to evaluate the data. For KNN we used KNeighborsClassifier, for SVM we used SVC, and for BP neural network we used MLPClassifier. 57 | 58 | 59 | - **The second method**: **Built CNN with TensorFlow** 60 | The entire purpose of TensorFlow is to let you build a computational graph (using any languages like Python) and then execute the graph in C++, which is much more efficiently than if the same calculations were to be performed directly in Python. 61 | 62 | TensorFlow can also automatically calculate the gradients that are needed to optimize the variables of the graph so as to make the model perform better. This is because the graph is a combination of simple mathematical expressions so the gradient of the entire graph can be calculated using the chain-rule for derivatives. 63 | 64 | A TensorFlow graph consists of the following parts which will be detailed below: 65 | - Placeholder variables used for inputting data to the graph. 66 | - Variables that are going to be optimized so as to make the convolutional network perform better. 67 | - The mathematical formulas for the convolutional network. 68 | - A cost measure that can be used to guide the optimization of the variables. 69 | - An optimization method which updates the variables. 70 | 71 | A CNN architecture is formed by a stack of distinct layers that transform the input volume into an output volume (e.g. holding the class scores) through a differentiable function. 72 | 73 | ![](12.png) 74 | 75 | So in our implementation, the first layer is to hold the images, then we built **3 Convolutional layers** with **2 x 2 max-pooling and Rectified Linear Unit (ReLU)**. 76 | The input is a 4-dim tensor with the following dimensions: 77 | 78 | - Image number. 79 | - Y-axis of each image. 80 | - X-axis of each image. 81 | - Channels of each image. 82 | 83 | The output is another 4-dim tensor with the following dimensions: 84 | 85 | - Image number, same as input. 86 | - Y-axis of each image. If 2x2 pooling is used, then the height and width of the input images is divided by 2. 87 | - X-axis of each image. Ditto. 88 | - Channels produced by the convolutional filters. 89 | 90 | 91 | And then we built **2 Fully-Connected Layers** at the end of the network. 92 | The input is a 2-dim tensor of shape [num_images, num_inputs]. The output is a 2-dim tensor of shape [num_images, num_outputs] 93 | 94 | However to connect Convolutional layers and Fully-Connected Layers we need a **Flatten Layer** to reduce the 4-dim tensor to 2-dim which can be used as input to the fully-connected layer. 95 | 96 | The very end of CNN is always a **softmax layer** which normalize the output from Fully-connected layer so that each element is limited between 0 and 1 and all the elements sum to 1. 97 | ![](14.png) 98 | 99 | To **optimize** the training result we need a cost measure and try to minimize it every iteration. 100 | The **Cost function** we used here is **cross entropy** (called from tf.nn.oftmax_cross_entropy_with_logits()), and take the average of cross-entropy for all the image classifications. 101 | The **Optimization Method** is tf.train.AdamOptimizer() which is an advanced form of **Gradient Descent.** The is a parameter **learning rate** which could be adjusted. 102 | 103 | - **The third method**: **Retrain Inception V3** 104 | Modern object recognition models have millions of parameters and can take weeks to fully train. Transfer learning is a technique that shortcuts a lot of this work by taking a fully-trained model for a set of categories like ImageNet, and retrains from the existing weights for new classes. Though it's not as good as a full training run, this is surprisingly effective for many applications, and can be run in as little as thirty minutes on a laptop, without requiring a GPU. 105 | For this part of implementation, we followed the instruction here: [link](https://www.tensorflow.org/tutorials/image_retraining). 106 | 107 | First we need to get the pre-trained model, remove the old top layer, and trains a new one on the dataset we have. None of the cat breeds were in the original ImageNet classes the full network was trained on. The magic of transfer learning is that lower layers that have been trained to distinguish between some objects can be reused for many recognition tasks without any alteration. 108 | Then we analyzes all the images on disk and calculates the bottleneck values for each of them. See details about 'bottleneck' here: [link](https://www.tensorflow.org/tutorials/image_retraining). Because every image is reused multiple times during training and calculating each bottleneck takes a significant amount of time, it speeds things up to cache these bottleneck values on disk so they don't have to be repeatedly recalculated. 109 | 110 | The script will run 4,000 training steps. Each step chooses ten images at random from the training set, finds their bottlenecks from the cache, and feeds them into the final layer to get predictions. Those predictions are then compared against the actual labels to update the final layer's weights through the back-propagation process. 111 | 112 | 113 | 114 | 115 | ## Experiments 116 | 117 | ### Dataset 118 | The Oxford-IIIT Pet Dataset: [link](http://www.robots.ox.ac.uk/~vgg/data/pets/) 119 | 120 | There are 25 breeds of dog and 12 breeds of cat. Each breed has 200 images. 121 | 122 | We only used 10 cat breeds in our project. 123 | ![](1.png) 124 | 125 | The classes we used here is 126 | ['Sphynx','Siamese','Ragdoll','Persian','Maine-Coon','British-shorthair','Bombay','Birman','Bengal','Abyssinian'] 127 | 128 | So we have totally **2000 images** in our dataset. 129 | The sizes are different with each other. But we resized them into fixed sizes like 64 x 64 or 128 x 128. 130 | 131 | ### Preprocessing 132 | 133 | In this project we mainly used OpenCV for precessing the image data like read the image into array and reshape into the size we need. 134 | 135 | A common way of improving the results of image training is by deforming, cropping, or brightening the training inputs in random ways. This has the advantage of expanding the effective size of the training data thanks to all the possible variations of the same images, and tends to help the network learn to cope with all the distortions that will occur in real-life uses of the classifier. 136 | 137 | 138 | ![](4.png) 139 | 140 | See links here: [https://github.com/aleju/imgaug](https://github.com/aleju/imgaug). 141 | 142 | ### Evaluation 143 | - **The first method:** 144 | The first part: Preprocess dataset and apply KNN, SVM and BP Neural Network with sklearn. 145 | 146 | In the program, there are many parameters could be adjusted: 147 | In image_to_feature_vector function, we set the size we desired is 128x128, we do have tried other size before like 8x8, 64x64, 256x256. We found that the bigger image size, the better the accuracy. But large image size also increase the execution time and memory it consumed. So we finally decided the image size to be 128x128 because its not too big but can also ensure the accuracy. 148 | 149 | In extract_color_histogram function, we set the number of bins per channel to 32, 32, 32. As the previous function, we tried 8, 8, 8, and 64, 64, 64, and higher number can result to higher result, as well as higher execution time. So we think 32, 32, 32 is appropriate. 150 | 151 | For the dataset, we tried 3 kinds of datasets. The first one is the sub-dataset with 400 images, 2 labels. The second one is the sub-dataset with 1000 images, 5 labels. And the last one is the whole dataset with 1997 images, 10 labels. And we parsed the different dataset as arguments in the program. 152 | 153 | In **KNeighborsClassifier**, we only changed the number of neighbors and stored the result for the best K for each dataset. All the other parameters we set as default. 154 | 155 | In **MLPClassifier**, we set one hidden layer with 50 neurons. We do have tested multiple hidden layers, but it seems has no significant change in the final result. And the maximum iteration time is 1000, with tolerance 1e-4, in order to make sure it converged. And set L2 penalty parameter alpha to default value, random state to 1, solver to ‘sgd’ with learning rate 0.1. 156 | 157 | In **SVC**, maximum iteration time is 1000, and class weight is ‘balanced’. 158 | 159 | The **running time** for our program is not very long, it takes about 3 to 5 minutes from 2 labels dataset to 10 labels dataset. 160 | 161 | - **The second method**: **Built CNN with TensorFlow** 162 | 163 | It takes a long time to calculate the gradient of the model using the entirety of a large dataset . We therefore only use a small batch of images in each iteration of the optimizer. The batch size is normally 32 or 64. 164 | The dataset is divided into training set contains 1600 images, validation set contains 400 images, and test set contains 300 images. 165 | 166 | There are many **parameters** could be adjusted. 167 | 168 | First is the **learning rate**. A good learning rate is easy find as long as it's small enough that could converge and big enough that it won't make the program too slow. 169 | We chose 1 x 10^-4. 170 | 171 | The second is the **size of images** we feed to the network. We tried 64*64 and 128 * 128. It turns out that the bigger images, the better accuracy we could get. However the exchange is running time. 172 | 173 | And then is the **layers and their shapes**. However actually there are too many parameters can be adjusted so it's a very hard work to find the best values for all of them. 174 | 175 | According to many resources from internet, we learnt that the **parameters choosing** for building the network is pretty much rely on **experience**. 176 | 177 | At first we try to built a relatively complicated network. The parameters are showed below: 178 | 179 | # Convolutional Layer 1. 180 | filter_size1 = 5 181 | num_filters1 = 64 182 | 183 | # Convolutional Layer 2. 184 | filter_size2 = 5 185 | num_filters2 = 64 186 | 187 | # Convolutional Layer 3. 188 | filter_size3 = 5 189 | num_filters3 = 128 190 | 191 | # Fully-connected layer 1. 192 | fc1_size = 256 193 | 194 | # Fully-connected layer 2. 195 | fc1_size = 256 196 | 197 | We used 3 Convolutional Layers and 2 Fully-connected layers, all of them are relatively complicated. 198 | 199 | 200 | However, the result is -- **Overfitting**. Only after a thousand iteration, our program get 100% training accuracy and only 30 % test accuracy. 201 | At first I'm pretty confused about why we got overfitting, and I tried to adjust parameters randomly, and things never getting better. Several days later, I happened to read a article by Google talking about a deep learning project conducted by Chinese researchers. [Link](https://medium.com/@blaisea/physiognomys-new-clothes-f2d4b59fdd6a) . They pointed out that the research conducted by them is problematic. "**One technical problem is that fewer than 2000 examples are insufficient to train and test a CNN like AlexNet without overfitting**." So I realized that, first our dataset is actually small, second, our network is too complicated. 202 | 203 | **Remember our dataset contains exactly 2000 images** 204 | 205 | Then I tried to reduce the number layers and sizes of kernels. I tried many parameters, this is the final structure we used. 206 | 207 | # Convolutional Layer 1. 208 | filter_size1 = 5 209 | num_filters1 = 64 210 | 211 | # Convolutional Layer 2. 212 | filter_size2 = 3 213 | num_filters2 = 64 214 | 215 | # Fully-connected layer 1. 216 | fc1_size = 128 # Number of neurons in fully-connected layer. 217 | 218 | # Fully-connected layer 2. 219 | fc2_size = 128 # Number of neurons in fully-connected layer. 220 | 221 | # Number of color channels for the images: 1 channel for gray-scale. 222 | num_channels = 3 223 | 224 | We only used **2 Convolutional Layers** with small shapes and 2 Fully-connected layers. 225 | The result was not that good, we **still get overfitting** after 4000 iterations, however the **test result was 10% better** than before. 226 | 227 | We're still finding a way to deal with it, however the **obvious reason is that our dataset is insufficient**, and we don't have enough time to make more improvement. 228 | 229 | As a result, we roughly **achieved 43% accuracy after 5000 iterations**, and the running time is **over half an hour**. 230 | 231 | **PS**: Actually we feel a little bit upset due to this result, we even didn't gain a sense of how long will a images training process be . So we found another standard dataset called **CIFAR-10**. [Link](https://www.cs.toronto.edu/~kriz/cifar.html). 232 | 233 | ![](13.png) 234 | The CIFAR-10 dataset consists of 60000 32x32 color images in 10 classes, with 6000 images per class. There are 50000 training images and 10000 test images. 235 | 236 | We used the same network constructed above, after 10 hours training, we got 78 % accuracy on test set. 237 | 238 | - **The third method**: **Retrain Inception V3** 239 | Same here, we randomly select a few images to train and select another batch a images for validation. 240 | 241 | There are many parameters could be adjusted. 242 | 243 | First is **training steps**, the default is 4000, we can try more or try a smaller one if we could get a reasonable result earlier. 244 | 245 | The --**learning rate** controls the magnitude of the updates to the final layer during training. Intuitively if this is smaller then the learning will take longer, but it can end up helping the overall precision. The --**train batch **size controls how many images are examined during one training step, and because the learning rate is applied per batch we'll need to reduce it if you have larger batches to get the same overall effect. 246 | 247 | Since for deep learning task, the running time is usually pretty long, we won't hope to know our model is actually bad after hours of training. So we **report validation accuracy frequently**. By this way we can also avoid **overfitting**. The split is putting 80% of the images into the main training set, keeping 10% aside to run as validation frequently during training, and then have a final 10% that are used less often as a testing set to predict the real-world performance of the classifier. 248 | 249 | 250 | ## Result 251 | 252 | - **The first method:** **Preprocess dataset and apply KNN, SVM and BP Neural Network with sklearn.** 253 | 254 | The results are in the following chart. Because the SVM result is very bad, even below the random guessing (1/ # of labels), we did not provide the result of that. 255 | 256 | ![](5.png) 257 | 258 | From the result we can see: 259 | 260 | - In k-NN, the raw pixel accuracy and histogram accuracy are relatively same. In 5 labels sub-dataset the histogram accuracy is a little bit higher than raw pixel, but over all, the raw pixel shows better result. 261 | 262 | - In the neural network MLP classifier, the raw pixel accuracy is much lower than histogram accuracy. For the whole dataset(10 labels), the raw pixel accuracy even lower than random guessing. 263 | 264 | - All these 2 sklearn methods do not give very good performance, the accuracy for recognizing the right category is only about 24% in the whole dataset (10 labels dataset). 265 | These results reveal that using sklearn methods for image recognition are not good enough. They are not able to give good performance for the complex images with many categories. But when comparing to the random guessing, they do have made some improvement, but not enough. 266 | 267 | Based on the results, we found that in order to improve the accuracy, its necessary to use some deep learning method. 268 | 269 | - **The second method**: **Built CNN with TensorFlow** 270 | As we said above, we could not get a good result due to overfitting. 271 | 272 | ![](11.png) 273 | 274 | It normally takes half an hour to train, however since the result is overfitting, we think this running time is not valuable. 275 | After comparing with method 1 we can see that: although the CNN overfits the training data, we still get better result than method 1. 276 | 277 | 278 | - **The third method**: **Retrain Inception V3** 279 | 280 | ![](7.png) 281 | 282 | The whole training progress takes no more than 10 mins. And we got extremely good results. We can actually see the power of deep learning and transfer learning. 283 | 284 | Demo: ![](8.png) 285 | 286 | 287 | ## Conclusion 288 | 289 | Based the comparison above, we can see that: 290 | 291 | - The methods we learnt in class are not enough for some specific task like image classification. 292 | - Although we got overfitting in CNN part, it's still better than those methods learnt in class on image classification problem. 293 | - Transfer Learning is pretty efficient and powerful on image classification problem. It's accurate and fast enough to finish training in a short time without GPU. And it also does a good job to against overfitting even though you have a small dataset. 294 | 295 | 296 | We learnt some very important experience for image classification task. This kind of task is pretty different from other tasks we did in class. The dataset is relatively large and not sparse, the network are complicated, so the running time would be pretty long if we don't use GPU. 297 | 298 | - Crop or resize images to make them smaller. 299 | - Randomly choosing a small batch for training every iteration. 300 | - Randomly choosing a small batch in validation set for validation, report validation score frequently during training process. 301 | - Try using Image Augmentation to convert a set of input images into a new, much larger set of slightly altered images. 302 | - For image classification task, we need larger dataset than 200 x 10, the CIFAR10 dataset contains 60000 images. 303 | - More complicated network needs more dataset to train. 304 | - Be careful of overfitting. 305 | 306 | 307 | ## References 308 | 309 | 1. [CS231n Convolutional Neural Networks for Visual Recognition](http://cs231n.github.io/convolutional-networks/) 310 | 2. [TensorFlow Convolutional Neural Networks](https://www.tensorflow.org/tutorials/deep_cnn) 311 | 3. [How to Retrain Inception's Final Layer for New Categories](https://www.tensorflow.org/tutorials/image_retraining) 312 | 3. [k-NN classifier for image classification](http://www.pyimagesearch.com/2016/08/08/k-nn-classifier-for-image-classification/) 313 | 4. [Image Augmentation for Deep Learning With Keras](http://machinelearningmastery.com/image-augmentation-deep-learning-keras/) 314 | 5. [Convolutional Neural Network TensorFlow Tutorial](https://github.com/Hvass-Labs/TensorFlow-Tutorials/blob/master/02_Convolutional_Neural_Network.ipynb) 315 | 316 | Note: The first method is performed by Ji Tong https://github.com/JI-tong 317 | -------------------------------------------------------------------------------- /src_code/method1/README.md: -------------------------------------------------------------------------------- 1 | ## Method 1 2 | 3 | To run the code, first put all the dataset and program file in the same folder. 4 | 5 | Download dataset here: 6 | https://drive.google.com/open?id=0B1_962u-W17hZk15UF9MNElSOTg 7 | 8 | Put this folder in the same path with script. 9 | 10 | If run in the terminal, go to the directory where the program file locate. 11 | 12 | Then run the program in the terminal using the command: 13 | Python –test.py --dataset “dataset_name” --neighbors “# of neighbors” 14 | 15 | You may need OpenCV, see link here: http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_setup/py_intro/py_intro.html 16 | -------------------------------------------------------------------------------- /src_code/method1/test.py: -------------------------------------------------------------------------------- 1 | 2 | # python test.py --dataset "set_name" --neighbors "# of neighors" 3 | 4 | 5 | 6 | # import the necessary packages 7 | from sklearn.neighbors import KNeighborsClassifier 8 | from sklearn.neural_network import MLPClassifier 9 | from sklearn.svm import SVC 10 | from sklearn.cross_validation import train_test_split 11 | from imutils import paths 12 | import numpy as np 13 | import argparse 14 | import imutils 15 | import cv2 16 | import os 17 | 18 | def image_to_feature_vector(image, size=(128, 128)): 19 | # resize the image to a fixed size, then flatten the image into 20 | # a list of raw pixel intensities 21 | return cv2.resize(image, size).flatten() 22 | 23 | def extract_color_histogram(image, bins=(32, 32, 32)): 24 | # extract a 3D color histogram from the HSV color space using 25 | # the supplied number of `bins` per channel 26 | hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) 27 | hist = cv2.calcHist([hsv], [0, 1, 2], None, bins, 28 | [0, 180, 0, 256, 0, 256]) 29 | 30 | # handle normalizing the histogram if we are using OpenCV 2.4.X 31 | if imutils.is_cv2(): 32 | hist = cv2.normalize(hist) 33 | 34 | # otherwise, perform "in place" normalization in OpenCV 3 35 | else: 36 | cv2.normalize(hist, hist) 37 | 38 | # return the flattened histogram as the feature vector 39 | return hist.flatten() 40 | 41 | 42 | 43 | # construct the argument parse and parse the arguments 44 | ap = argparse.ArgumentParser() 45 | ap.add_argument("-d", "--dataset", required=True, 46 | help="path to input dataset") 47 | ap.add_argument("-k", "--neighbors", type=int, default=1, 48 | help="# of nearest neighbors for classification") 49 | args = vars(ap.parse_args()) 50 | 51 | # grab the list of images that we'll be describing 52 | print("[INFO] handling images...") 53 | imagePaths = list(paths.list_images(args["dataset"])) 54 | 55 | # initialize the raw pixel intensities matrix, the features matrix, 56 | # and labels list 57 | rawImages = [] 58 | features = [] 59 | labels = [] 60 | 61 | # loop over the input images 62 | for (i, imagePath) in enumerate(imagePaths): 63 | # load the image and extract the class label 64 | # our images were named as labels.image_number.format 65 | image = cv2.imread(imagePath) 66 | # get the labels from the name of the images by extract the string before "." 67 | label = imagePath.split(os.path.sep)[-1].split(".")[0] 68 | 69 | # extract raw pixel intensity "features" 70 | #followed by a color histogram to characterize the color distribution of the pixels 71 | # in the image 72 | pixels = image_to_feature_vector(image) 73 | hist = extract_color_histogram(image) 74 | 75 | # add the messages we got to the raw images, features, and labels matricies 76 | rawImages.append(pixels) 77 | features.append(hist) 78 | labels.append(label) 79 | 80 | # show an update every 200 images until the last image 81 | if i > 0 and ((i + 1)% 200 == 0 or i ==len(imagePaths)-1): 82 | print("[INFO] processed {}/{}".format(i+1, len(imagePaths))) 83 | 84 | 85 | # show some information on the memory consumed by the raw images 86 | # matrix and features matrix 87 | rawImages = np.array(rawImages) 88 | features = np.array(features) 89 | labels = np.array(labels) 90 | print("[INFO] pixels matrix: {:.2f}MB".format( 91 | rawImages.nbytes / (1024 * 1000.0))) 92 | print("[INFO] features matrix: {:.2f}MB".format( 93 | features.nbytes / (1024 * 1000.0))) 94 | 95 | # partition the data into training and testing splits, using 85% 96 | # of the data for training and the remaining 15% for testing 97 | (trainRI, testRI, trainRL, testRL) = train_test_split( 98 | rawImages, labels, test_size=0.15, random_state=42) 99 | (trainFeat, testFeat, trainLabels, testLabels) = train_test_split( 100 | features, labels, test_size=0.15, random_state=42) 101 | 102 | # k-NN 103 | print("\n") 104 | print("[INFO] evaluating raw pixel accuracy...") 105 | model = KNeighborsClassifier(n_neighbors=args["neighbors"]) 106 | model.fit(trainRI, trainRL) 107 | acc = model.score(testRI, testRL) 108 | print("[INFO] k-NN classifier: k=%d" % args["neighbors"]) 109 | print("[INFO] raw pixel accuracy: {:.2f}%".format(acc * 100)) 110 | 111 | # k-NN 112 | print("\n") 113 | print("[INFO] evaluating histogram accuracy...") 114 | model = KNeighborsClassifier(n_neighbors=args["neighbors"]) 115 | model.fit(trainFeat, trainLabels) 116 | acc = model.score(testFeat, testLabels) 117 | print("[INFO] k-NN classifier: k=%d" % args["neighbors"]) 118 | print("[INFO] histogram accuracy: {:.2f}%".format(acc * 100)) 119 | 120 | #neural network 121 | print("\n") 122 | print("[INFO] evaluating raw pixel accuracy...") 123 | model = MLPClassifier(hidden_layer_sizes=(50,), max_iter=1000, alpha=1e-4, 124 | solver='sgd', tol=1e-4, random_state=1, 125 | learning_rate_init=.1) 126 | model.fit(trainRI, trainRL) 127 | acc = model.score(testRI, testRL) 128 | print("[INFO] neural network raw pixel accuracy: {:.2f}%".format(acc * 100)) 129 | 130 | 131 | #neural network 132 | print("\n") 133 | print("[INFO] evaluating histogram accuracy...") 134 | model = MLPClassifier(hidden_layer_sizes=(50,), max_iter=1000, alpha=1e-4, 135 | solver='sgd', tol=1e-4, random_state=1, 136 | learning_rate_init=.1) 137 | model.fit(trainFeat, trainLabels) 138 | acc = model.score(testFeat, testLabels) 139 | print("[INFO] neural network histogram accuracy: {:.2f}%".format(acc * 100)) 140 | 141 | ''' 142 | #SVC 143 | print("\n") 144 | print("[INFO] evaluating raw pixel accuracy...") 145 | model = SVC(max_iter=1000,class_weight='balanced') 146 | model.fit(trainRI, trainRL) 147 | acc = model.score(testRI, testRL) 148 | print("[INFO] SVM-SVC raw pixel accuracy: {:.2f}%".format(acc * 100)) 149 | 150 | 151 | #SVC 152 | print("\n") 153 | print("[INFO] evaluating histogram accuracy...") 154 | model = SVC(max_iter=1000,class_weight='balanced') 155 | model.fit(trainFeat, trainLabels) 156 | acc = model.score(testFeat, testLabels) 157 | print("[INFO] SVM-SVC histogram accuracy: {:.2f}%".format(acc * 100)) 158 | ''' 159 | 160 | 161 | 162 | -------------------------------------------------------------------------------- /src_code/method2/CNN_Image_Classification.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import os\n", 12 | "%matplotlib inline\n", 13 | "import matplotlib.pyplot as plt\n", 14 | "import tensorflow as tf\n", 15 | "import pandas as pd\n", 16 | "import numpy as np\n", 17 | "from sklearn.metrics import confusion_matrix\n", 18 | "import time\n", 19 | "from datetime import timedelta\n", 20 | "import math\n", 21 | "import random\n", 22 | "import glob\n", 23 | "import numpy as np\n", 24 | "import cv2\n", 25 | "from sklearn.utils import shuffle" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": {}, 31 | "source": [ 32 | "## Function of loading dataset" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 2, 38 | "metadata": { 39 | "collapsed": false 40 | }, 41 | "outputs": [], 42 | "source": [ 43 | "def load_train(train_path, image_size, classes):\n", 44 | " images = []\n", 45 | " labels = []\n", 46 | " ids = []\n", 47 | " cls = []\n", 48 | "\n", 49 | " print('Reading training images')\n", 50 | " for fld in classes: # assuming data directory has a separate folder for each class, and that each folder is named after the class\n", 51 | " index = classes.index(fld)\n", 52 | " print('Loading {} files (Index: {})'.format(fld, index))\n", 53 | " path = os.path.join(train_path, fld, '*g')\n", 54 | " files = glob.glob(path)\n", 55 | " for fl in files:\n", 56 | " image = cv2.imread(fl)\n", 57 | " image = cv2.resize(image, (image_size, image_size), interpolation = cv2.INTER_LINEAR)\n", 58 | " images.append(image)\n", 59 | " label = np.zeros(len(classes))\n", 60 | " label[index] = 1.0\n", 61 | " labels.append(label)\n", 62 | " flbase = os.path.basename(fl)\n", 63 | " ids.append(flbase)\n", 64 | " cls.append(fld)\n", 65 | " images = np.array(images)\n", 66 | " labels = np.array(labels)\n", 67 | " ids = np.array(ids)\n", 68 | " cls = np.array(cls)\n", 69 | "\n", 70 | " return images, labels, ids, cls\n", 71 | "\n", 72 | "\n", 73 | "def load_test(test_path, image_size):\n", 74 | " path = os.path.join(test_path, '*g')\n", 75 | " files = sorted(glob.glob(path))\n", 76 | "\n", 77 | " X_test = []\n", 78 | " X_test_id = []\n", 79 | " print(\"Reading test images\")\n", 80 | " for fl in files:\n", 81 | " flbase = os.path.basename(fl)\n", 82 | " img = cv2.imread(fl)\n", 83 | " img = cv2.resize(img, (image_size, image_size), interpolation = cv2.INTER_LINEAR)\n", 84 | " X_test.append(img)\n", 85 | " X_test_id.append(flbase)\n", 86 | "\n", 87 | "### because we're not creating a DataSet object for the test images, normalization happens here\n", 88 | " X_test = np.array(X_test, dtype=np.uint8)\n", 89 | " X_test = X_test.astype('float32')\n", 90 | " X_test = X_test / 255\n", 91 | "\n", 92 | " return X_test, X_test_id\n", 93 | "\n", 94 | "\n", 95 | "\n", 96 | "class DataSet(object):\n", 97 | "\n", 98 | " def __init__(self, images, labels, ids, cls):\n", 99 | " \"\"\"Construct a DataSet. one_hot arg is used only if fake_data is true.\"\"\"\n", 100 | "\n", 101 | " self._num_examples = images.shape[0]\n", 102 | "\n", 103 | "\n", 104 | " # Convert shape from [num examples, rows, columns, depth]\n", 105 | " # to [num examples, rows*columns] (assuming depth == 1)\n", 106 | " # Convert from [0, 255] -> [0.0, 1.0].\n", 107 | "\n", 108 | " images = images.astype(np.float32)\n", 109 | " images = np.multiply(images, 1.0 / 255.0)\n", 110 | "\n", 111 | " self._images = images\n", 112 | " self._labels = labels\n", 113 | " self._ids = ids\n", 114 | " self._cls = cls\n", 115 | " self._epochs_completed = 0\n", 116 | " self._index_in_epoch = 0\n", 117 | "\n", 118 | " @property\n", 119 | " def images(self):\n", 120 | " return self._images\n", 121 | "\n", 122 | " @property\n", 123 | " def labels(self):\n", 124 | " return self._labels\n", 125 | "\n", 126 | " @property\n", 127 | " def ids(self):\n", 128 | " return self._ids\n", 129 | "\n", 130 | " @property\n", 131 | " def cls(self):\n", 132 | " return self._cls\n", 133 | "\n", 134 | " @property\n", 135 | " def num_examples(self):\n", 136 | " return self._num_examples\n", 137 | "\n", 138 | " @property\n", 139 | " def epochs_completed(self):\n", 140 | " return self._epochs_completed\n", 141 | "\n", 142 | " def next_batch(self, batch_size):\n", 143 | " \"\"\"Return the next `batch_size` examples from this data set.\"\"\"\n", 144 | " start = self._index_in_epoch\n", 145 | " self._index_in_epoch += batch_size\n", 146 | "\n", 147 | " if self._index_in_epoch > self._num_examples:\n", 148 | " # Finished epoch\n", 149 | " self._epochs_completed += 1\n", 150 | "\n", 151 | " # # Shuffle the data (maybe)\n", 152 | " # perm = np.arange(self._num_examples)\n", 153 | " # np.random.shuffle(perm)\n", 154 | " # self._images = self._images[perm]\n", 155 | " # self._labels = self._labels[perm]\n", 156 | " # Start next epoch\n", 157 | "\n", 158 | " start = 0\n", 159 | " self._index_in_epoch = batch_size\n", 160 | " assert batch_size <= self._num_examples\n", 161 | " end = self._index_in_epoch\n", 162 | "\n", 163 | " return self._images[start:end], self._labels[start:end], self._ids[start:end], self._cls[start:end]\n", 164 | "\n", 165 | "\n", 166 | "def read_train_sets(train_path, image_size, classes, validation_size=0):\n", 167 | " class DataSets(object):\n", 168 | " pass\n", 169 | " data_sets = DataSets()\n", 170 | "\n", 171 | " images, labels, ids, cls = load_train(train_path, image_size, classes)\n", 172 | " images, labels, ids, cls = shuffle(images, labels, ids, cls) # shuffle the data\n", 173 | "\n", 174 | " if isinstance(validation_size, float):\n", 175 | " validation_size = int(validation_size * images.shape[0])\n", 176 | "\n", 177 | " validation_images = images[:validation_size]\n", 178 | " validation_labels = labels[:validation_size]\n", 179 | " validation_ids = ids[:validation_size]\n", 180 | " validation_cls = cls[:validation_size]\n", 181 | "\n", 182 | " train_images = images[validation_size:]\n", 183 | " train_labels = labels[validation_size:]\n", 184 | " train_ids = ids[validation_size:]\n", 185 | " train_cls = cls[validation_size:]\n", 186 | "\n", 187 | " data_sets.train = DataSet(train_images, train_labels, train_ids, train_cls)\n", 188 | " data_sets.valid = DataSet(validation_images, validation_labels, validation_ids, validation_cls)\n", 189 | "\n", 190 | " return data_sets\n", 191 | "\n", 192 | "\n", 193 | "def read_test_set(test_path, image_size):\n", 194 | " images, ids = load_test(test_path, image_size)\n", 195 | " return images, ids" 196 | ] 197 | }, 198 | { 199 | "cell_type": "markdown", 200 | "metadata": {}, 201 | "source": [ 202 | "## Configuration and Hyperparameters" 203 | ] 204 | }, 205 | { 206 | "cell_type": "code", 207 | "execution_count": 62, 208 | "metadata": { 209 | "collapsed": false 210 | }, 211 | "outputs": [], 212 | "source": [ 213 | "# Convolutional Layer 1.\n", 214 | "filter_size1 = 5 \n", 215 | "num_filters1 = 64\n", 216 | "\n", 217 | "# Convolutional Layer 2.\n", 218 | "filter_size2 = 3\n", 219 | "num_filters2 = 64\n", 220 | "\n", 221 | "# # Convolutional Layer 3.\n", 222 | "# filter_size3 = 5\n", 223 | "# num_filters3 = 128\n", 224 | "\n", 225 | "# Fully-connected layer 1.\n", 226 | "fc1_size = 128 # Number of neurons in fully-connected layer.\n", 227 | "\n", 228 | "# Fully-connected layer 2.\n", 229 | "fc2_size = 128 # Number of neurons in fully-connected layer.\n", 230 | "\n", 231 | "# Number of color channels for the images: 1 channel for gray-scale.\n", 232 | "num_channels = 3\n", 233 | "\n", 234 | "# image dimensions (only squares for now)\n", 235 | "img_size = 64\n", 236 | "\n", 237 | "# Size of image when flattened to a single dimension\n", 238 | "img_size_flat = img_size * img_size * num_channels\n", 239 | "\n", 240 | "# Tuple with height and width of images used to reshape arrays.\n", 241 | "img_shape = (img_size, img_size)\n", 242 | "\n", 243 | "# class info\n", 244 | "classes = ['Sphynx','Siamese','Ragdoll',\n", 245 | " 'Persian','Maine_Coon','British_shorthair','Bombay','Birman','Bengal','Abyssinian']\n", 246 | "\n", 247 | "# classes = ['Sphynx','Siamese',\n", 248 | "# 'Persian','Maine_Coon','British_shorthair']\n", 249 | "\n", 250 | "num_classes = len(classes)\n", 251 | "\n", 252 | "# batch size\n", 253 | "batch_size = 32\n", 254 | "\n", 255 | "# validation split\n", 256 | "validation_size = .2\n", 257 | "\n", 258 | "# how long to wait after validation loss stops improving before terminating training\n", 259 | "early_stopping = None # use None if you don't want to implement early stoping\n", 260 | "\n", 261 | "train_path = 'dataset'\n", 262 | "# test_path = 'test'\n", 263 | "checkpoint_dir = \"ckpoint\"" 264 | ] 265 | }, 266 | { 267 | "cell_type": "code", 268 | "execution_count": null, 269 | "metadata": { 270 | "collapsed": false 271 | }, 272 | "outputs": [], 273 | "source": [] 274 | }, 275 | { 276 | "cell_type": "code", 277 | "execution_count": 63, 278 | "metadata": { 279 | "collapsed": false 280 | }, 281 | "outputs": [ 282 | { 283 | "name": "stdout", 284 | "output_type": "stream", 285 | "text": [ 286 | "Reading training images\n", 287 | "Loading Sphynx files (Index: 0)\n", 288 | "Loading Siamese files (Index: 1)\n", 289 | "Loading Ragdoll files (Index: 2)\n", 290 | "Loading Persian files (Index: 3)\n", 291 | "Loading Maine_Coon files (Index: 4)\n", 292 | "Loading British_shorthair files (Index: 5)\n", 293 | "Loading Bombay files (Index: 6)\n", 294 | "Loading Birman files (Index: 7)\n", 295 | "Loading Bengal files (Index: 8)\n", 296 | "Loading Abyssinian files (Index: 9)\n" 297 | ] 298 | } 299 | ], 300 | "source": [ 301 | "# load training dataset\n", 302 | "data = read_train_sets(train_path, img_size, classes, validation_size=validation_size)\n", 303 | "# test_images, test_ids = read_test_set(test_path, img_size)" 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "execution_count": 64, 309 | "metadata": { 310 | "collapsed": false 311 | }, 312 | "outputs": [ 313 | { 314 | "name": "stdout", 315 | "output_type": "stream", 316 | "text": [ 317 | "Size of:\n", 318 | "- Training-set:\t\t1598\n", 319 | "- Validation:\t399\n" 320 | ] 321 | } 322 | ], 323 | "source": [ 324 | "print(\"Size of:\")\n", 325 | "print(\"- Training-set:\\t\\t{}\".format(len(data.train.labels)))\n", 326 | "# print(\"- Test-set:\\t\\t{}\".format(len(test_images)))\n", 327 | "print(\"- Validation:\\t{}\".format(len(data.valid.labels)))\n", 328 | "# print(images)" 329 | ] 330 | }, 331 | { 332 | "cell_type": "markdown", 333 | "metadata": {}, 334 | "source": [ 335 | "### Helper-function for plotting images" 336 | ] 337 | }, 338 | { 339 | "cell_type": "code", 340 | "execution_count": 65, 341 | "metadata": { 342 | "collapsed": false 343 | }, 344 | "outputs": [], 345 | "source": [ 346 | "\n", 347 | "def plot_images(images, cls_true, cls_pred=None):\n", 348 | " \n", 349 | " if len(images) == 0:\n", 350 | " print(\"no images to show\")\n", 351 | " return \n", 352 | " else:\n", 353 | " random_indices = random.sample(range(len(images)), min(len(images), 9))\n", 354 | " \n", 355 | " \n", 356 | " images, cls_true = zip(*[(images[i], cls_true[i]) for i in random_indices])\n", 357 | " \n", 358 | " # Create figure with 3x3 sub-plots.\n", 359 | " fig, axes = plt.subplots(3, 3)\n", 360 | " fig.subplots_adjust(hspace=0.3, wspace=0.3)\n", 361 | "\n", 362 | " for i, ax in enumerate(axes.flat):\n", 363 | " # Plot image.\n", 364 | " ax.imshow(images[i].reshape(img_size, img_size, num_channels))\n", 365 | "\n", 366 | " # Show true and predicted classes.\n", 367 | " if cls_pred is None:\n", 368 | " xlabel = \"True: {0}\".format(cls_true[i])\n", 369 | " else:\n", 370 | " xlabel = \"True: {0}, Pred: {1}\".format(cls_true[i], cls_pred[i])\n", 371 | "\n", 372 | " # Show the classes as the label on the x-axis.\n", 373 | " ax.set_xlabel(xlabel)\n", 374 | " \n", 375 | " # Remove ticks from the plot.\n", 376 | " ax.set_xticks([])\n", 377 | " ax.set_yticks([])\n", 378 | " \n", 379 | " # Ensure the plot is shown correctly with multiple plots\n", 380 | " # in a single Notebook cell.\n", 381 | " plt.show()" 382 | ] 383 | }, 384 | { 385 | "cell_type": "code", 386 | "execution_count": 66, 387 | "metadata": { 388 | "collapsed": false 389 | }, 390 | "outputs": [ 391 | { 392 | "data": { 393 | "image/png": "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\n", 394 | "text/plain": [ 395 | "" 396 | ] 397 | }, 398 | "metadata": {}, 399 | "output_type": "display_data" 400 | } 401 | ], 402 | "source": [ 403 | "# Get some random images and their labels from the train set.\n", 404 | "\n", 405 | "images, cls_true = data.train.images, data.train.cls\n", 406 | "\n", 407 | "# Plot the images and labels using our helper-function above.\n", 408 | "plot_images(images=images, cls_true=cls_true)" 409 | ] 410 | }, 411 | { 412 | "cell_type": "markdown", 413 | "metadata": {}, 414 | "source": [ 415 | "## TensorFlow Graph" 416 | ] 417 | }, 418 | { 419 | "cell_type": "markdown", 420 | "metadata": {}, 421 | "source": [ 422 | "### Helper-functions for creating new variables" 423 | ] 424 | }, 425 | { 426 | "cell_type": "code", 427 | "execution_count": 67, 428 | "metadata": { 429 | "collapsed": true 430 | }, 431 | "outputs": [], 432 | "source": [ 433 | "def new_weights(shape):\n", 434 | " return tf.Variable(tf.truncated_normal(shape, stddev=0.05))\n", 435 | "def new_biases(length):\n", 436 | " return tf.Variable(tf.constant(0.05, shape=[length]))\n" 437 | ] 438 | }, 439 | { 440 | "cell_type": "markdown", 441 | "metadata": {}, 442 | "source": [ 443 | "### Convolutional Layer" 444 | ] 445 | }, 446 | { 447 | "cell_type": "code", 448 | "execution_count": 68, 449 | "metadata": { 450 | "collapsed": true 451 | }, 452 | "outputs": [], 453 | "source": [ 454 | "def new_conv_layer(input, # The previous layer.\n", 455 | " num_input_channels, # Num. channels in prev. layer.\n", 456 | " filter_size, # Width and height of each filter.\n", 457 | " num_filters, # Number of filters.\n", 458 | " use_pooling=True): # Use 2x2 max-pooling.\n", 459 | "\n", 460 | " # Shape of the filter-weights for the convolution.\n", 461 | " # This format is determined by the TensorFlow API.\n", 462 | " shape = [filter_size, filter_size, num_input_channels, num_filters]\n", 463 | "\n", 464 | " # Create new weights aka. filters with the given shape.\n", 465 | " weights = new_weights(shape=shape)\n", 466 | "\n", 467 | " # Create new biases, one for each filter.\n", 468 | " biases = new_biases(length=num_filters)\n", 469 | "\n", 470 | " # Create the TensorFlow operation for convolution.\n", 471 | " # Note the strides are set to 1 in all dimensions.\n", 472 | " # The first and last stride must always be 1,\n", 473 | " # because the first is for the image-number and\n", 474 | " # the last is for the input-channel.\n", 475 | " # But e.g. strides=[1, 2, 2, 1] would mean that the filter\n", 476 | " # is moved 2 pixels across the x- and y-axis of the image.\n", 477 | " # The padding is set to 'SAME' which means the input image\n", 478 | " # is padded with zeroes so the size of the output is the same.\n", 479 | " layer = tf.nn.conv2d(input=input,\n", 480 | " filter=weights,\n", 481 | " strides=[1, 1, 1, 1],\n", 482 | " padding='SAME')\n", 483 | "\n", 484 | " # Add the biases to the results of the convolution.\n", 485 | " # A bias-value is added to each filter-channel.\n", 486 | " layer += biases\n", 487 | "\n", 488 | " # Use pooling to down-sample the image resolution?\n", 489 | " if use_pooling:\n", 490 | " # This is 2x2 max-pooling, which means that we\n", 491 | " # consider 2x2 windows and select the largest value\n", 492 | " # in each window. Then we move 2 pixels to the next window.\n", 493 | " layer = tf.nn.max_pool(value=layer,\n", 494 | " ksize=[1, 2, 2, 1],\n", 495 | " strides=[1, 2, 2, 1],\n", 496 | " padding='SAME')\n", 497 | "\n", 498 | " # Rectified Linear Unit (ReLU).\n", 499 | " # It calculates max(x, 0) for each input pixel x.\n", 500 | " # This adds some non-linearity to the formula and allows us\n", 501 | " # to learn more complicated functions.\n", 502 | " layer = tf.nn.relu(layer)\n", 503 | "\n", 504 | " # Note that ReLU is normally executed before the pooling,\n", 505 | " # but since relu(max_pool(x)) == max_pool(relu(x)) we can\n", 506 | " # save 75% of the relu-operations by max-pooling first.\n", 507 | "\n", 508 | " # We return both the resulting layer and the filter-weights\n", 509 | " # because we will plot the weights later.\n", 510 | " return layer, weights" 511 | ] 512 | }, 513 | { 514 | "cell_type": "markdown", 515 | "metadata": {}, 516 | "source": [ 517 | "### Flattening a layer" 518 | ] 519 | }, 520 | { 521 | "cell_type": "code", 522 | "execution_count": 69, 523 | "metadata": { 524 | "collapsed": true 525 | }, 526 | "outputs": [], 527 | "source": [ 528 | "def flatten_layer(layer):\n", 529 | " # Get the shape of the input layer.\n", 530 | " layer_shape = layer.get_shape()\n", 531 | "\n", 532 | " # The shape of the input layer is assumed to be:\n", 533 | " # layer_shape == [num_images, img_height, img_width, num_channels]\n", 534 | "\n", 535 | " # The number of features is: img_height * img_width * num_channels\n", 536 | " # We can use a function from TensorFlow to calculate this.\n", 537 | " num_features = layer_shape[1:4].num_elements()\n", 538 | " \n", 539 | " # Reshape the layer to [num_images, num_features].\n", 540 | " # Note that we just set the size of the second dimension\n", 541 | " # to num_features and the size of the first dimension to -1\n", 542 | " # which means the size in that dimension is calculated\n", 543 | " # so the total size of the tensor is unchanged from the reshaping.\n", 544 | " layer_flat = tf.reshape(layer, [-1, num_features])\n", 545 | "\n", 546 | " # The shape of the flattened layer is now:\n", 547 | " # [num_images, img_height * img_width * num_channels]\n", 548 | "\n", 549 | " # Return both the flattened layer and the number of features.\n", 550 | " return layer_flat, num_features" 551 | ] 552 | }, 553 | { 554 | "cell_type": "markdown", 555 | "metadata": {}, 556 | "source": [ 557 | "### Fully-Connected Layer" 558 | ] 559 | }, 560 | { 561 | "cell_type": "code", 562 | "execution_count": 70, 563 | "metadata": { 564 | "collapsed": true 565 | }, 566 | "outputs": [], 567 | "source": [ 568 | "def new_fc_layer(input, # The previous layer.\n", 569 | " num_inputs, # Num. inputs from prev. layer.\n", 570 | " num_outputs, # Num. outputs.\n", 571 | " use_relu=True): # Use Rectified Linear Unit (ReLU)?\n", 572 | "\n", 573 | " # Create new weights and biases.\n", 574 | " weights = new_weights(shape=[num_inputs, num_outputs])\n", 575 | " biases = new_biases(length=num_outputs)\n", 576 | "\n", 577 | " # Calculate the layer as the matrix multiplication of\n", 578 | " # the input and weights, and then add the bias-values.\n", 579 | " layer = tf.matmul(input, weights) + biases\n", 580 | "\n", 581 | " # Use ReLU?\n", 582 | " if use_relu:\n", 583 | " layer = tf.nn.relu(layer)\n", 584 | "\n", 585 | " return layer" 586 | ] 587 | }, 588 | { 589 | "cell_type": "markdown", 590 | "metadata": {}, 591 | "source": [ 592 | "### Placeholder variables" 593 | ] 594 | }, 595 | { 596 | "cell_type": "code", 597 | "execution_count": 71, 598 | "metadata": { 599 | "collapsed": true 600 | }, 601 | "outputs": [], 602 | "source": [ 603 | "x = tf.placeholder(tf.float32, shape=[None, img_size_flat], name='x')\n", 604 | "x_image = tf.reshape(x, [-1, img_size, img_size, num_channels])\n", 605 | "y_true = tf.placeholder(tf.float32, shape=[None, num_classes], name='y_true')\n", 606 | "y_true_cls = tf.argmax(y_true, dimension=1)" 607 | ] 608 | }, 609 | { 610 | "cell_type": "markdown", 611 | "metadata": {}, 612 | "source": [ 613 | "### Convolutional Layer 1" 614 | ] 615 | }, 616 | { 617 | "cell_type": "code", 618 | "execution_count": 72, 619 | "metadata": { 620 | "collapsed": false 621 | }, 622 | "outputs": [ 623 | { 624 | "data": { 625 | "text/plain": [ 626 | "" 627 | ] 628 | }, 629 | "execution_count": 72, 630 | "metadata": {}, 631 | "output_type": "execute_result" 632 | } 633 | ], 634 | "source": [ 635 | "layer_conv1, weights_conv1 = \\\n", 636 | " new_conv_layer(input=x_image,\n", 637 | " num_input_channels=num_channels,\n", 638 | " filter_size=filter_size1,\n", 639 | " num_filters=num_filters1,\n", 640 | " use_pooling=True)\n", 641 | "layer_conv1" 642 | ] 643 | }, 644 | { 645 | "cell_type": "markdown", 646 | "metadata": {}, 647 | "source": [ 648 | "### Convolutional Layers 2 and 3" 649 | ] 650 | }, 651 | { 652 | "cell_type": "code", 653 | "execution_count": 73, 654 | "metadata": { 655 | "collapsed": false 656 | }, 657 | "outputs": [], 658 | "source": [ 659 | "layer_conv2, weights_conv2 = \\\n", 660 | " new_conv_layer(input=layer_conv1,\n", 661 | " num_input_channels=num_filters1,\n", 662 | " filter_size=filter_size2,\n", 663 | " num_filters=num_filters2,\n", 664 | " use_pooling=True)\n", 665 | " \n", 666 | "# layer_conv3, weights_conv3 = \\\n", 667 | "# new_conv_layer(input=layer_conv2,\n", 668 | "# num_input_channels=num_filters2,\n", 669 | "# filter_size=filter_size3,\n", 670 | "# num_filters=num_filters3,\n", 671 | "# use_pooling=True)\n", 672 | "# print(layer_conv3, layer_conv2)" 673 | ] 674 | }, 675 | { 676 | "cell_type": "markdown", 677 | "metadata": {}, 678 | "source": [ 679 | "### Flatten Layer" 680 | ] 681 | }, 682 | { 683 | "cell_type": "code", 684 | "execution_count": 74, 685 | "metadata": { 686 | "collapsed": false 687 | }, 688 | "outputs": [ 689 | { 690 | "name": "stdout", 691 | "output_type": "stream", 692 | "text": [ 693 | "(, 16384)\n" 694 | ] 695 | } 696 | ], 697 | "source": [ 698 | "# layer_flat, num_features = flatten_layer(layer_conv3)\n", 699 | "# print(layer_flat, num_features)\n", 700 | "\n", 701 | "layer_flat, num_features = flatten_layer(layer_conv2)\n", 702 | "print(layer_flat, num_features)" 703 | ] 704 | }, 705 | { 706 | "cell_type": "markdown", 707 | "metadata": {}, 708 | "source": [ 709 | "### Fully-Connected Layer 1" 710 | ] 711 | }, 712 | { 713 | "cell_type": "code", 714 | "execution_count": 75, 715 | "metadata": { 716 | "collapsed": false 717 | }, 718 | "outputs": [ 719 | { 720 | "data": { 721 | "text/plain": [ 722 | "" 723 | ] 724 | }, 725 | "execution_count": 75, 726 | "metadata": {}, 727 | "output_type": "execute_result" 728 | } 729 | ], 730 | "source": [ 731 | "layer_fc1 = new_fc_layer(input=layer_flat,\n", 732 | " num_inputs=num_features,\n", 733 | " num_outputs=fc1_size,\n", 734 | " use_relu=True)\n", 735 | "layer_fc1" 736 | ] 737 | }, 738 | { 739 | "cell_type": "markdown", 740 | "metadata": {}, 741 | "source": [ 742 | "### Fully-Connected Layer 2" 743 | ] 744 | }, 745 | { 746 | "cell_type": "code", 747 | "execution_count": 76, 748 | "metadata": { 749 | "collapsed": false 750 | }, 751 | "outputs": [ 752 | { 753 | "data": { 754 | "text/plain": [ 755 | "" 756 | ] 757 | }, 758 | "execution_count": 76, 759 | "metadata": {}, 760 | "output_type": "execute_result" 761 | } 762 | ], 763 | "source": [ 764 | "layer_fc2 = new_fc_layer(input=layer_fc1,\n", 765 | " num_inputs=fc1_size,\n", 766 | " num_outputs=num_classes,\n", 767 | " use_relu=False)\n", 768 | "layer_fc2" 769 | ] 770 | }, 771 | { 772 | "cell_type": "markdown", 773 | "metadata": {}, 774 | "source": [ 775 | "### Predicted Class" 776 | ] 777 | }, 778 | { 779 | "cell_type": "code", 780 | "execution_count": 77, 781 | "metadata": { 782 | "collapsed": true 783 | }, 784 | "outputs": [], 785 | "source": [ 786 | "y_pred = tf.nn.softmax(layer_fc2)\n", 787 | "y_pred_cls = tf.argmax(y_pred, dimension=1)\n" 788 | ] 789 | }, 790 | { 791 | "cell_type": "markdown", 792 | "metadata": {}, 793 | "source": [ 794 | "### Cost-function to be optimized" 795 | ] 796 | }, 797 | { 798 | "cell_type": "code", 799 | "execution_count": 78, 800 | "metadata": { 801 | "collapsed": true 802 | }, 803 | "outputs": [], 804 | "source": [ 805 | "cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=layer_fc2,\n", 806 | " labels=y_true)\n", 807 | "cost = tf.reduce_mean(cross_entropy)\n", 808 | "optimizer = tf.train.AdamOptimizer(learning_rate=1e-4).minimize(cost)" 809 | ] 810 | }, 811 | { 812 | "cell_type": "markdown", 813 | "metadata": {}, 814 | "source": [ 815 | "### Performance Measures" 816 | ] 817 | }, 818 | { 819 | "cell_type": "code", 820 | "execution_count": 79, 821 | "metadata": { 822 | "collapsed": true 823 | }, 824 | "outputs": [], 825 | "source": [ 826 | "correct_prediction = tf.equal(y_pred_cls, y_true_cls)\n", 827 | "accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))" 828 | ] 829 | }, 830 | { 831 | "cell_type": "markdown", 832 | "metadata": {}, 833 | "source": [ 834 | "## TensorFlow Run" 835 | ] 836 | }, 837 | { 838 | "cell_type": "code", 839 | "execution_count": 80, 840 | "metadata": { 841 | "collapsed": true 842 | }, 843 | "outputs": [], 844 | "source": [ 845 | "session = tf.Session()\n", 846 | "session.run(tf.global_variables_initializer())\n", 847 | "\n", 848 | "train_batch_size = batch_size" 849 | ] 850 | }, 851 | { 852 | "cell_type": "code", 853 | "execution_count": 81, 854 | "metadata": { 855 | "collapsed": true 856 | }, 857 | "outputs": [], 858 | "source": [ 859 | "# def print_progress(epoch, feed_dict_train, feed_dict_validate, val_loss):\n", 860 | "# # Calculate the accuracy on the training-set.\n", 861 | "# acc = session.run(accuracy, feed_dict=feed_dict_train)\n", 862 | "# val_acc = session.run(accuracy, feed_dict=feed_dict_validate)\n", 863 | "# msg = \"Epoch {0} --- Training Accuracy: {1:>6.1%}, Validation Accuracy: {2:>6.1%}, Validation Loss: {3:.3f}\"\n", 864 | "# print(msg.format(epoch + 1, acc, val_acc, val_loss))" 865 | ] 866 | }, 867 | { 868 | "cell_type": "code", 869 | "execution_count": 82, 870 | "metadata": { 871 | "collapsed": true 872 | }, 873 | "outputs": [], 874 | "source": [ 875 | "def print_progress(epoch, feed_dict_train, feed_dict_validate, val_loss):\n", 876 | " # Calculate the accuracy on the training-set.\n", 877 | " acc = session.run(accuracy, feed_dict=feed_dict_train)\n", 878 | " val_acc = session.run(accuracy, feed_dict=feed_dict_validate)\n", 879 | " msg = \"Epoch {0} --- Training Accuracy: {1:>6.1%}, Validation Accuracy: {2:>6.1%}, Validation Loss: {3:.3f}\"\n", 880 | " print(msg.format(epoch + 1, acc, val_acc, val_loss))" 881 | ] 882 | }, 883 | { 884 | "cell_type": "code", 885 | "execution_count": 83, 886 | "metadata": { 887 | "collapsed": false 888 | }, 889 | "outputs": [], 890 | "source": [ 891 | "# Counter for total number of iterations performed so far.\n", 892 | "total_iterations = 0\n", 893 | "\n", 894 | "def optimize(num_iterations):\n", 895 | " # Ensure we update the global variable rather than a local copy.\n", 896 | " global total_iterations\n", 897 | "\n", 898 | " # Start-time used for printing time-usage below.\n", 899 | " start_time = time.time()\n", 900 | " \n", 901 | " best_val_loss = float(\"inf\")\n", 902 | " patience = 0\n", 903 | "\n", 904 | " for i in range(total_iterations,\n", 905 | " total_iterations + num_iterations):\n", 906 | "\n", 907 | " # Get a batch of training examples.\n", 908 | " # x_batch now holds a batch of images and\n", 909 | " # y_true_batch are the true labels for those images.\n", 910 | " x_batch, y_true_batch, _, cls_batch = data.train.next_batch(train_batch_size)\n", 911 | " x_valid_batch, y_valid_batch, _, valid_cls_batch = data.valid.next_batch(train_batch_size)\n", 912 | "\n", 913 | " # Convert shape from [num examples, rows, columns, depth]\n", 914 | " # to [num examples, flattened image shape]\n", 915 | "\n", 916 | " x_batch = x_batch.reshape(train_batch_size, img_size_flat)\n", 917 | " x_valid_batch = x_valid_batch.reshape(train_batch_size, img_size_flat)\n", 918 | "\n", 919 | " # Put the batch into a dict with the proper names\n", 920 | " # for placeholder variables in the TensorFlow graph.\n", 921 | " feed_dict_train = {x: x_batch,\n", 922 | " y_true: y_true_batch}\n", 923 | " \n", 924 | " feed_dict_validate = {x: x_valid_batch,\n", 925 | " y_true: y_valid_batch}\n", 926 | "\n", 927 | " # Run the optimizer using this batch of training data.\n", 928 | " # TensorFlow assigns the variables in feed_dict_train\n", 929 | " # to the placeholder variables and then runs the optimizer.\n", 930 | " session.run(optimizer, feed_dict=feed_dict_train)\n", 931 | " \n", 932 | "\n", 933 | " # Print status at end of each epoch (defined as full pass through training dataset).\n", 934 | " if i % int(data.train.num_examples/batch_size) == 0: \n", 935 | " val_loss = session.run(cost, feed_dict=feed_dict_validate)\n", 936 | " epoch = int(i / int(data.train.num_examples/batch_size))\n", 937 | " \n", 938 | " print_progress(epoch, feed_dict_train, feed_dict_validate, val_loss)\n", 939 | " \n", 940 | " if early_stopping: \n", 941 | " if val_loss < best_val_loss:\n", 942 | " best_val_loss = val_loss\n", 943 | " patience = 0\n", 944 | " else:\n", 945 | " patience += 1\n", 946 | "\n", 947 | " if patience == early_stopping:\n", 948 | " break\n", 949 | "\n", 950 | " # Update the total number of iterations performed.\n", 951 | " total_iterations += num_iterations\n", 952 | "\n", 953 | " # Ending time.\n", 954 | " end_time = time.time()\n", 955 | "\n", 956 | " # Difference between start and end-times.\n", 957 | " time_dif = end_time - start_time\n", 958 | "\n", 959 | " # Print the time-usage.\n", 960 | " print(\"Time elapsed: \" + str(timedelta(seconds=int(round(time_dif)))))" 961 | ] 962 | }, 963 | { 964 | "cell_type": "code", 965 | "execution_count": 84, 966 | "metadata": { 967 | "collapsed": false 968 | }, 969 | "outputs": [ 970 | { 971 | "name": "stdout", 972 | "output_type": "stream", 973 | "text": [ 974 | "Epoch 1 --- Training Accuracy: 18.8%, Validation Accuracy: 9.4%, Validation Loss: 2.390\n", 975 | "Epoch 2 --- Training Accuracy: 31.2%, Validation Accuracy: 18.8%, Validation Loss: 2.235\n", 976 | "Epoch 3 --- Training Accuracy: 31.2%, Validation Accuracy: 18.8%, Validation Loss: 2.211\n", 977 | "Epoch 4 --- Training Accuracy: 37.5%, Validation Accuracy: 34.4%, Validation Loss: 1.952\n", 978 | "Epoch 5 --- Training Accuracy: 40.6%, Validation Accuracy: 31.2%, Validation Loss: 2.116\n", 979 | "Epoch 6 --- Training Accuracy: 40.6%, Validation Accuracy: 31.2%, Validation Loss: 2.048\n", 980 | "Epoch 7 --- Training Accuracy: 43.8%, Validation Accuracy: 34.4%, Validation Loss: 1.828\n", 981 | "Epoch 8 --- Training Accuracy: 43.8%, Validation Accuracy: 40.6%, Validation Loss: 1.669\n", 982 | "Epoch 9 --- Training Accuracy: 50.0%, Validation Accuracy: 15.6%, Validation Loss: 1.940\n", 983 | "Epoch 10 --- Training Accuracy: 53.1%, Validation Accuracy: 18.8%, Validation Loss: 2.271\n", 984 | "Epoch 11 --- Training Accuracy: 50.0%, Validation Accuracy: 43.8%, Validation Loss: 1.602\n", 985 | "Epoch 12 --- Training Accuracy: 56.2%, Validation Accuracy: 28.1%, Validation Loss: 1.995\n", 986 | "Epoch 13 --- Training Accuracy: 56.2%, Validation Accuracy: 31.2%, Validation Loss: 2.142\n", 987 | "Epoch 14 --- Training Accuracy: 59.4%, Validation Accuracy: 46.9%, Validation Loss: 1.493\n", 988 | "Epoch 15 --- Training Accuracy: 62.5%, Validation Accuracy: 18.8%, Validation Loss: 2.058\n", 989 | "Epoch 16 --- Training Accuracy: 65.6%, Validation Accuracy: 37.5%, Validation Loss: 1.673\n", 990 | "Epoch 17 --- Training Accuracy: 71.9%, Validation Accuracy: 37.5%, Validation Loss: 1.814\n", 991 | "Epoch 18 --- Training Accuracy: 75.0%, Validation Accuracy: 43.8%, Validation Loss: 1.883\n", 992 | "Epoch 19 --- Training Accuracy: 78.1%, Validation Accuracy: 34.4%, Validation Loss: 1.806\n", 993 | "Epoch 20 --- Training Accuracy: 81.2%, Validation Accuracy: 46.9%, Validation Loss: 1.692\n", 994 | "Epoch 21 --- Training Accuracy: 81.2%, Validation Accuracy: 28.1%, Validation Loss: 2.072\n", 995 | "Epoch 22 --- Training Accuracy: 81.2%, Validation Accuracy: 34.4%, Validation Loss: 2.356\n", 996 | "Epoch 23 --- Training Accuracy: 84.4%, Validation Accuracy: 46.9%, Validation Loss: 1.588\n", 997 | "Epoch 24 --- Training Accuracy: 84.4%, Validation Accuracy: 25.0%, Validation Loss: 2.265\n", 998 | "Epoch 25 --- Training Accuracy: 84.4%, Validation Accuracy: 34.4%, Validation Loss: 2.349\n", 999 | "Epoch 26 --- Training Accuracy: 90.6%, Validation Accuracy: 40.6%, Validation Loss: 1.693\n", 1000 | "Epoch 27 --- Training Accuracy: 93.8%, Validation Accuracy: 21.9%, Validation Loss: 2.416\n", 1001 | "Epoch 28 --- Training Accuracy: 96.9%, Validation Accuracy: 40.6%, Validation Loss: 2.022\n", 1002 | "Epoch 29 --- Training Accuracy: 93.8%, Validation Accuracy: 34.4%, Validation Loss: 2.067\n", 1003 | "Epoch 30 --- Training Accuracy: 90.6%, Validation Accuracy: 37.5%, Validation Loss: 1.901\n", 1004 | "Epoch 31 --- Training Accuracy: 93.8%, Validation Accuracy: 31.2%, Validation Loss: 2.443\n", 1005 | "Epoch 32 --- Training Accuracy: 93.8%, Validation Accuracy: 40.6%, Validation Loss: 2.396\n", 1006 | "Epoch 33 --- Training Accuracy: 96.9%, Validation Accuracy: 21.9%, Validation Loss: 2.782\n", 1007 | "Epoch 34 --- Training Accuracy: 96.9%, Validation Accuracy: 28.1%, Validation Loss: 2.918\n", 1008 | "Epoch 35 --- Training Accuracy: 96.9%, Validation Accuracy: 43.8%, Validation Loss: 1.987\n", 1009 | "Epoch 36 --- Training Accuracy: 96.9%, Validation Accuracy: 25.0%, Validation Loss: 2.780\n", 1010 | "Epoch 37 --- Training Accuracy: 100.0%, Validation Accuracy: 28.1%, Validation Loss: 3.307\n", 1011 | "Epoch 38 --- Training Accuracy: 100.0%, Validation Accuracy: 34.4%, Validation Loss: 1.902\n", 1012 | "Epoch 39 --- Training Accuracy: 100.0%, Validation Accuracy: 21.9%, Validation Loss: 3.210\n", 1013 | "Epoch 40 --- Training Accuracy: 100.0%, Validation Accuracy: 40.6%, Validation Loss: 2.164\n" 1014 | ] 1015 | }, 1016 | { 1017 | "ename": "KeyboardInterrupt", 1018 | "evalue": "", 1019 | "output_type": "error", 1020 | "traceback": [ 1021 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 1022 | "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", 1023 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0moptimize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnum_iterations\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m10000\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 1024 | "\u001b[0;32m\u001b[0m in \u001b[0;36moptimize\u001b[0;34m(num_iterations)\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0;31m# TensorFlow assigns the variables in feed_dict_train\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0;31m# to the placeholder variables and then runs the optimizer.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 40\u001b[0;31m \u001b[0msession\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moptimizer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfeed_dict_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 41\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 42\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", 1025 | "\u001b[0;32m/Users/ShiyuMu/ENV/lib/python2.7/site-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 765\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 766\u001b[0m result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[0;32m--> 767\u001b[0;31m run_metadata_ptr)\n\u001b[0m\u001b[1;32m 768\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 769\u001b[0m \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 1026 | "\u001b[0;32m/Users/ShiyuMu/ENV/lib/python2.7/site-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36m_run\u001b[0;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 963\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 964\u001b[0m results = self._do_run(handle, final_targets, final_fetches,\n\u001b[0;32m--> 965\u001b[0;31m feed_dict_string, options, run_metadata)\n\u001b[0m\u001b[1;32m 966\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 967\u001b[0m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 1027 | "\u001b[0;32m/Users/ShiyuMu/ENV/lib/python2.7/site-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36m_do_run\u001b[0;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 1013\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1014\u001b[0m return self._do_call(_run_fn, self._session, feed_dict, fetch_list,\n\u001b[0;32m-> 1015\u001b[0;31m target_list, options, run_metadata)\n\u001b[0m\u001b[1;32m 1016\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1017\u001b[0m return self._do_call(_prun_fn, self._session, handle, feed_dict,\n", 1028 | "\u001b[0;32m/Users/ShiyuMu/ENV/lib/python2.7/site-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36m_do_call\u001b[0;34m(self, fn, *args)\u001b[0m\n\u001b[1;32m 1020\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1021\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1022\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1023\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1024\u001b[0m \u001b[0mmessage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 1029 | "\u001b[0;32m/Users/ShiyuMu/ENV/lib/python2.7/site-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36m_run_fn\u001b[0;34m(session, feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[1;32m 1002\u001b[0m return tf_session.TF_Run(session, options,\n\u001b[1;32m 1003\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtarget_list\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1004\u001b[0;31m status, run_metadata)\n\u001b[0m\u001b[1;32m 1005\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1006\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_prun_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 1030 | "\u001b[0;31mKeyboardInterrupt\u001b[0m: " 1031 | ] 1032 | } 1033 | ], 1034 | "source": [ 1035 | "optimize(num_iterations=10000)" 1036 | ] 1037 | }, 1038 | { 1039 | "cell_type": "code", 1040 | "execution_count": 85, 1041 | "metadata": { 1042 | "collapsed": false 1043 | }, 1044 | "outputs": [], 1045 | "source": [ 1046 | "x_test = data.valid.images.reshape(399, img_size_flat)\n", 1047 | "\n", 1048 | "feed_dict_test = {x: x_test,\n", 1049 | " y_true: data.valid.labels}\n", 1050 | "\n", 1051 | "val_loss = session.run(cost, feed_dict=feed_dict_test)\n", 1052 | "\n", 1053 | "val_acc = session.run(accuracy, feed_dict=feed_dict_test)\n" 1054 | ] 1055 | }, 1056 | { 1057 | "cell_type": "code", 1058 | "execution_count": 87, 1059 | "metadata": { 1060 | "collapsed": false 1061 | }, 1062 | "outputs": [], 1063 | "source": [ 1064 | "msg_test = \"Test Accuracy: {0:>6.1%}\"\n", 1065 | "print(msg_test.format(val_acc))\n" 1066 | ] 1067 | }, 1068 | { 1069 | "cell_type": "code", 1070 | "execution_count": null, 1071 | "metadata": { 1072 | "collapsed": true 1073 | }, 1074 | "outputs": [], 1075 | "source": [] 1076 | }, 1077 | { 1078 | "cell_type": "code", 1079 | "execution_count": null, 1080 | "metadata": { 1081 | "collapsed": true 1082 | }, 1083 | "outputs": [], 1084 | "source": [] 1085 | }, 1086 | { 1087 | "cell_type": "code", 1088 | "execution_count": null, 1089 | "metadata": { 1090 | "collapsed": true 1091 | }, 1092 | "outputs": [], 1093 | "source": [] 1094 | }, 1095 | { 1096 | "cell_type": "code", 1097 | "execution_count": null, 1098 | "metadata": { 1099 | "collapsed": true 1100 | }, 1101 | "outputs": [], 1102 | "source": [] 1103 | }, 1104 | { 1105 | "cell_type": "code", 1106 | "execution_count": null, 1107 | "metadata": { 1108 | "collapsed": true 1109 | }, 1110 | "outputs": [], 1111 | "source": [] 1112 | }, 1113 | { 1114 | "cell_type": "code", 1115 | "execution_count": null, 1116 | "metadata": { 1117 | "collapsed": true 1118 | }, 1119 | "outputs": [], 1120 | "source": [] 1121 | }, 1122 | { 1123 | "cell_type": "code", 1124 | "execution_count": null, 1125 | "metadata": { 1126 | "collapsed": true 1127 | }, 1128 | "outputs": [], 1129 | "source": [] 1130 | }, 1131 | { 1132 | "cell_type": "code", 1133 | "execution_count": null, 1134 | "metadata": { 1135 | "collapsed": true 1136 | }, 1137 | "outputs": [], 1138 | "source": [] 1139 | }, 1140 | { 1141 | "cell_type": "code", 1142 | "execution_count": null, 1143 | "metadata": { 1144 | "collapsed": true 1145 | }, 1146 | "outputs": [], 1147 | "source": [] 1148 | } 1149 | ], 1150 | "metadata": { 1151 | "kernelspec": { 1152 | "display_name": "Python 2", 1153 | "language": "python", 1154 | "name": "python2" 1155 | }, 1156 | "language_info": { 1157 | "codemirror_mode": { 1158 | "name": "ipython", 1159 | "version": 2 1160 | }, 1161 | "file_extension": ".py", 1162 | "mimetype": "text/x-python", 1163 | "name": "python", 1164 | "nbconvert_exporter": "python", 1165 | "pygments_lexer": "ipython2", 1166 | "version": "2.7.10" 1167 | } 1168 | }, 1169 | "nbformat": 4, 1170 | "nbformat_minor": 0 1171 | } 1172 | -------------------------------------------------------------------------------- /src_code/method2/README.md: -------------------------------------------------------------------------------- 1 | ## Method CNN with TensorFlow 2 | 3 | Download dataset here: 4 | 5 | https://drive.google.com/open?id=0B1_962u-W17hc205Y0t2c21yUUk 6 | 7 | WARNING: This dataset has different format with the one used in Method one 8 | 9 | To execute this part of code, just run the notebook from the begining. 10 | 11 | You may need two important libraries: 12 | 13 | 1. TensorFlow https://www.tensorflow.org/install/ 14 | 15 | 2. OpenCV http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_setup/py_intro/py_intro.html -------------------------------------------------------------------------------- /src_code/method3/README.md: -------------------------------------------------------------------------------- 1 | # Method 3 Transfer Learning 2 | 3 | In command line, enter: 4 | 5 | `python label_image.py Testdata/Ragdoll_from_Gatil_Ragbelas.jpg` 6 | 7 | This will predict test images using the model we have trained. 8 | 9 | The details about TensorFlow Transfer learning see here: https://www.tensorflow.org/tutorials/image_retraining -------------------------------------------------------------------------------- /src_code/method3/Testdata/15ca602c71ff28821f18a3b11059bc0e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/src_code/method3/Testdata/15ca602c71ff28821f18a3b11059bc0e.jpg -------------------------------------------------------------------------------- /src_code/method3/Testdata/C3A26B2176EB4870E8C7DC1CA3775BEE.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/src_code/method3/Testdata/C3A26B2176EB4870E8C7DC1CA3775BEE.jpg -------------------------------------------------------------------------------- /src_code/method3/Testdata/IMG_2740.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/src_code/method3/Testdata/IMG_2740.JPG -------------------------------------------------------------------------------- /src_code/method3/Testdata/Ragdoll_from_Gatil_Ragbelas.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/src_code/method3/Testdata/Ragdoll_from_Gatil_Ragbelas.jpg -------------------------------------------------------------------------------- /src_code/method3/Testdata/birman cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/src_code/method3/Testdata/birman cat.jpg -------------------------------------------------------------------------------- /src_code/method3/Testdata/cat-senior-landing-hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/src_code/method3/Testdata/cat-senior-landing-hero.jpg -------------------------------------------------------------------------------- /src_code/method3/label_image.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf, sys 2 | 3 | image_path = sys.argv[1] 4 | 5 | # Read in the image_data 6 | image_data = tf.gfile.FastGFile(image_path, 'rb').read() 7 | 8 | # Loads label file, strips off carriage return 9 | label_lines = [line.rstrip() for line 10 | # in tf.gfile.GFile("/tf_files/retrained_labels.txt")] 11 | in tf.gfile.GFile("retrained_labels.txt")] 12 | 13 | # Unpersists graph from file 14 | # with tf.gfile.FastGFile("/tf_files/retrained_graph.pb", 'rb') as f: 15 | with tf.gfile.FastGFile("retrained_graph.pb", 'rb') as f: 16 | graph_def = tf.GraphDef() 17 | graph_def.ParseFromString(f.read()) 18 | _ = tf.import_graph_def(graph_def, name='') 19 | 20 | with tf.Session() as sess: 21 | # Feed the image_data as input to the graph and get first prediction 22 | softmax_tensor = sess.graph.get_tensor_by_name('final_result:0') 23 | 24 | predictions = sess.run(softmax_tensor, \ 25 | {'DecodeJpeg/contents:0': image_data}) 26 | 27 | # Sort to show labels of first prediction in order of confidence 28 | top_k = predictions[0].argsort()[-len(predictions[0]):][::-1] 29 | 30 | for node_id in top_k: 31 | human_string = label_lines[node_id] 32 | score = predictions[0][node_id] 33 | print('%s (score = %.5f)' % (human_string, score)) 34 | -------------------------------------------------------------------------------- /src_code/method3/retrained_graph.pb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BenJamesbabala/Image_Classification_with_5_methods/795741cb86fccd27a72cab73c338b064f02ed9eb/src_code/method3/retrained_graph.pb -------------------------------------------------------------------------------- /src_code/method3/retrained_labels.txt: -------------------------------------------------------------------------------- 1 | maine coon 2 | siamese 3 | british shorthair 4 | bengal 5 | persian 6 | sphynx 7 | ragdoll 8 | abyssinian 9 | birman 10 | bombay 11 | --------------------------------------------------------------------------------