{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import cv2\nimport numpy as np\nimport pandas as pd\nimport shutil\nimport os\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D,MaxPooling2D,GlobalAveragePooling2D,Dense,Flatten,Dropout,AvgPool2D\nfrom keras.layers.normalization import BatchNormalization\nfrom keras.constraints import unit_norm","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels=pd.read_csv('../input/dog-breed-identification/labels.csv')\nlabels.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"breeds=list(labels['breed'].unique())\nlen(breeds)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## dividing the train data into different folders according to their breed names\nos.mkdir('/kaggle/working/new_train')\n\nfor i in range(len(labels)):\n    if labels['breed'][i] not in os.listdir('/kaggle/working/new_train'):\n        os.mkdir('/kaggle/working/new_train/'+labels['breed'][i])\n    shutil.copy('../input/dog-breed-identification/train/'+labels['id'][i]+'.jpg', '/kaggle/working/new_train/'+labels['breed'][i])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.python.keras.preprocessing.image import ImageDataGenerator\n\nimage_size=224  #for the inception model\nimage_path='/kaggle/working/new_train/'\n\ntrain_datagen=ImageDataGenerator(\n                        rescale=1./255,\n                        validation_split=0.1,\n                        horizontal_flip=True,\n                        width_shift_range=0.2,\n                        height_shift_range=0.2,\n                        shear_range=0.2,\n                        rotation_range=40,\n                        fill_mode='nearest'\n                        )\n\ntrain_generator=train_datagen.flow_from_directory(\n                        image_path, \n                        target_size=(image_size,image_size),\n                        subset='training',\n                        shuffle=True,\n                        batch_size=128,\n                        class_mode='categorical'\n                        )\n\nvalid_datagen=ImageDataGenerator(\n                        validation_split=0.1,\n                        rescale=1./255\n                        )\n\nvalid_generator=valid_datagen.flow_from_directory(\n                        image_path, \n                        target_size=(image_size,image_size),\n                        subset='validation',\n                        shuffle=False,\n                        batch_size=128,\n                        class_mode='categorical'\n                        )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x,y = train_generator.next()\nlabels = (train_generator.class_indices)\nlabels = dict((v,k) for k,v in labels.items())\nfor i in range(0,10):\n    image = x[i]\n    plt.imshow(image)\n    c=0\n    for i in y[i]:\n        if i==0:\n            c+=1\n        else:break\n    label=labels[c]\n    label=label.replace('_',' ')\n    label=label.lower()\n    plt.title(label)\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.applications.inception_v3 import InceptionV3\n\n#using pre-trained weights for the inception model\nlocal_weights_file = '../input/keras-pretrained-models/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5'\nInception = InceptionV3(input_shape = (224,224,3), \n                                include_top = False, \n                                weights = local_weights_file)\n\n#building a sequential model with inception layer base and only an average pooling layer before the output layer\n\nmodel2=Sequential()\nmodel2.add(Inception)\n\nmodel2.add(GlobalAveragePooling2D())\nmodel2.add(Dense(512,activation='relu'))\nmodel2.add(Dropout(0.2))\nmodel2.add(Dense(len(breeds),activation='softmax'))\n\nmodel2.layers[0].trainable=False\n\nmodel2.compile(optimizer='sgd',\n             loss='categorical_crossentropy',\n             metrics=['accuracy']\n             )\n\nmodel2.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"callback=tf.keras.callbacks.EarlyStopping(monitor='loss',patience=5,min_delta=0,mode='auto',restore_best_weights=False,baseline=None)\n\nhistory=model2.fit_generator(train_generator,\n                   steps_per_epoch=73,\n                   epochs=100,\n                   validation_data=valid_generator,\n                   validation_steps=8,\n                   callbacks=[callback])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.mkdir('/kaggle/working/models/')\nmodel2.save('/kaggle/working/models/my_dog_model.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def plot_model(history):\n    fig,(ax1,ax2)=plt.subplots(1,2,figsize=(12,4))\n    fig.suptitle('Model Accuracy and Loss')\n\n    ax1.plot(history.history['accuracy'])\n    ax1.plot(history.history['val_accuracy'])\n    ax1.title.set_text('Accuracy')\n    ax1.set_ylabel('Accuracy')\n    ax1.set_xlabel('Epoch')\n    ax1.legend(['Train','Valid'],loc=4)\n\n    ax2.plot(history.history['loss'])\n    ax2.plot(history.history['val_loss'])\n    ax2.title.set_text('Loss')\n    ax2.set_ylabel('Loss')\n    ax2.set_xlabel('Epoch')\n    ax2.legend(['Train','Valid'],loc=1)\n\n    fig.show()\n\nplot_model(history)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.mkdir('/kaggle/working/new_test')\nos.mkdir('/kaggle/working/new_test/test')\ntest_images=os.listdir('../input/dog-breed-identification/test/')\n\nfor i in range(len(test_images)):\n    shutil.copy('../input/dog-breed-identification/test/'+test_images[i],'/kaggle/working/new_test/test')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_generator = valid_datagen.flow_from_directory(\n    '/kaggle/working/new_test/',\n    target_size=(224,224),\n    color_mode=\"rgb\",\n    batch_size=32,\n    class_mode=None,\n    shuffle=False\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_generator.reset()\npred=model2.predict_generator(test_generator,verbose=1,steps=10357/32)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"n = len(labels)\nn_class = len(breeds)  \nclass_to_num = dict(zip(breeds, range(n_class)))\nnum_to_class = dict(zip(range(n_class), breeds))\n\ndf2 = pd.read_csv('../input/dog-breed-identification/sample_submission.csv')\n\nfor b in breeds:\n    df2[b] = pred[:,class_to_num[b]]\n\ndf2.to_csv('pred.csv', index=None)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predicted_class_indices=np.argmax(pred,axis=1)\n\nlabels = (train_generator.class_indices)\nlabels = dict((v,k) for k,v in labels.items())\npredictions = [labels[k] for k in predicted_class_indices]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from cv2 import imread\nfrom keras.applications.inception_v3 import preprocess_input\n\ndef predict(url, filename):\n    # download and save\n    os.system(\"curl -s {} -o {}\".format(url, filename))\n    img = Image.open(filename)\n    img = img.convert('RGB')\n    img = img.resize((image_size,image_size))\n    img.save(filename)\n    # show image\n    plt.figure(figsize=(4, 4))\n    plt.imshow(img)\n    plt.axis('off')\n    # predict\n    img = imread(filename)\n    img = preprocess_input(img)\n    probs = model2.predict(np.expand_dims(img, axis=0))\n    \n    dict1={}\n    for i,j in enumerate(probs[0]):\n        dict1[i]=j\n    \n    a=max(dict1.keys(), key=(lambda k: dict1[k]))\n    predicted_breed=breeds[a]\n    print(predicted_breed)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predict(\"https://s3.amazonaws.com/cdn-origin-etr.akc.org/wp-content/uploads/2017/11/12224329/Shih-Tzu-On-White-01.jpg\",\n                     \"test_image_1.jpg\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predict(\"https://vetstreet.brightspotcdn.com/dims4/default/d742db0/2147483647/thumbnail/645x380/quality/90/?url=https%3A%2F%2Fvetstreet-brightspot.s3.amazonaws.com%2F98%2Fd98250a0d311e0a2380050568d634f%2Ffile%2FGolden-Retriever-3-645mk062411.jpg\",\n                     \"test_image_1.jpg\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predict(\"https://i.pinimg.com/originals/18/59/c2/1859c289470c3fddd8be3d07bf8982b6.jpg\",\n                     \"test_image_1.jpg\")","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}