{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport cv2\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt\nimport sys\n\n%matplotlib inline\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true,"scrolled":false},"cell_type":"code","source":"home = \"../input\"\ntrainHome = home+\"/train\"\ntestHome = home+\"/test\"\nprint(\"Total train images:\",len(os.listdir(trainHome)))\nprint(\"Total test images:\",len(os.listdir(testHome)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3fe5d5d48cd418a9655b8e41b0bb06e3ef8a94cb","collapsed":true},"cell_type":"code","source":"classes = [1 if fileName.split(\".\")[0]==\"dog\" else 0 for fileName in os.listdir(trainHome)]\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":false,"_uuid":"c7cba6249ef99de95e06934a92788f4a8648e3a1"},"cell_type":"code","source":"print(\"Total train examples:\",len(classes))\nprint(\"Total dogs:\",np.sum(classes))\nprint(\"Total cats:\",len(classes)-np.sum(classes))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"09728b6f06646a1c43effe734260394cec8ad85e","collapsed":true},"cell_type":"code","source":"def fetchImage(imagePath,imgShape):\n    frame = cv2.imread(imagePath,cv2.IMREAD_COLOR)\n    frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)\n    frame = cv2.resize(frame,(imgShape[0],imgShape[1]))\n    #frame = frame if isNormalized==False else frame/255.0\n    return frame\n\ndef fetchImgData(home,imageShape,isTrain=True,isNormalized=False):\n    imgNames = os.listdir(home)\n    X = []\n    Y = []\n    for imgName in tqdm(imgNames):\n        frame = fetchImage(home+\"/\"+imgName,imgShape)\n        X.append(frame)\n        if isTrain==True:\n            imgClassName = imgName.split(\".\")[0]\n            imgClass = 1 if imgClassName==\"dog\" else 0\n            Y.append(imgClass)\n    X = np.array(X)\n    Y = np.array(Y)\n    return X,Y\n\ndef fetchBatch(home,imgNamesList,batch_num,batch_size,imgShape):\n    imgNames = imgNamesList[batch_num*batch_size : (batch_num+1)*batch_size]\n    X = []\n    Y = []\n    for imgName in imgNames:\n        frame = fetchImage(home+\"/\"+imgName,imgShape)\n        X.append(frame)\n        imgClassName = imgName.split(\".\")[0]\n        imgClass = 1 if imgClassName==\"dog\" else 0\n        Y.append(imgClass)\n    return np.array(X), np.array(Y)\n\ndef shuffle(lst):\n    result = []\n    first = lst[0]\n    indicies = np.random.permutation(np.arange(len(lst[0])))\n    for l in lst:\n        l = np.array(l)[indicies]\n        result.append(l)\n    return result","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f4665d461c1cf77324eed5870881780325c99254","collapsed":true},"cell_type":"code","source":"imgShape = (200,200,3)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5205605df09d5b0c622168726f066eb9cba2250e","collapsed":true},"cell_type":"code","source":"#X_train,Y_train = fetchImgData(trainHome,imgShape,isTrain=True,isNormalized=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8a801161f7bb1d18edd57c7d647c3c004380460d","scrolled":true},"cell_type":"code","source":"trainImgNames = shuffle([os.listdir(trainHome)])[0]\nX_train,Y_train = fetchBatch(trainHome,trainImgNames,0,5,imgShape)\nfix,ax = plt.subplots(nrows=1,ncols=5,figsize=(20,3))\nfor i,img in enumerate(X_train):\n    ax[i].imshow(img)\n    \n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b9853ac30bc1b6fab78ce5eb851e55447c114739"},"cell_type":"code","source":"from keras.models import Sequential,Model\nfrom keras.applications.resnet50 import ResNet50\nfrom keras.layers import Dense,Input,Flatten\nfrom keras.utils import to_categorical","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"665b94b3388d40895077e2d361b56c2c3b42ddb4","scrolled":true},"cell_type":"code","source":"modelResnet = ResNet50(include_top=False,weights=\"imagenet\",input_shape=imgShape)\nresnetLayers = modelResnet.layers\nprint(\"Num layers Resnet50:\",len(resnetLayers))\n\n#print([layer.trainable for layer in resnetLayers])\n#for layer in resnetLayers[:-10]:\n#    layer.trainable=False\n#print([layer.trainable for layer in resnetLayers])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1c7ffa30690ac14bd524fbd25327f19f71b56aa1","scrolled":true},"cell_type":"code","source":"# RESNET model.\ninput_ = Input(shape=imgShape)\nout = modelResnet(input_)\nout = Flatten()(out)\ndense = Dense(2)(out)\n\nmodel = Model(inputs=[input_],outputs=[dense])\nprint(\"Final model summary\")\nprint(model.summary())\n\nmodel.compile(optimizer=\"adam\",loss=\"categorical_crossentropy\",metrics=[\"accuracy\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"a9252eafcf6212a89dfc8c9818944e6ed2a7201c"},"cell_type":"code","source":"# CUSTOM Model.\n\nfrom keras.layers import Conv2D,MaxPool2D,Dense,Activation,GlobalAvgPool2D,BatchNormalization\nfrom keras.layers import Input,Dropout\n\n\ninput_ = Input(shape=imgShape)\nlayer = Conv2D(32,(3,3),padding=\"same\",activation=\"relu\")(input_)\nlayer = MaxPool2D(pool_size=(2,2),strides=(2,2),padding=\"same\")(layer)\nlayer = Dropout(0.3)(layer)\n\nlayer = BatchNormalization()(layer)\nlayer = Conv2D(64,(3,3),padding=\"same\",activation=\"relu\")(layer)\nlayer = MaxPool2D(pool_size=(2,2),strides=(2,2),padding=\"same\")(layer)\nlayer = Dropout(0.3)(layer)\n\nlayer = BatchNormalization()(layer)\nlayer = Conv2D(128,(3,3),padding=\"same\",activation=\"relu\")(layer)\nlayer = MaxPool2D(pool_size=(2,2),strides=(2,2),padding=\"same\")(layer)\nlayer = Dropout(0.3)(layer)\n\nlayer = BatchNormalization()(layer)\nlayer = Conv2D(256,(3,3),padding=\"same\",activation=\"relu\")(layer)\nlayer = MaxPool2D(pool_size=(2,2),strides=(2,2),padding=\"same\")(layer)\nlayer = Dropout(0.3)(layer)\n\nlayer = BatchNormalization()(layer)\nlayer = Conv2D(512,(3,3),padding=\"same\",activation=\"relu\")(layer)\nlayer = MaxPool2D(pool_size=(2,2),strides=(2,2),padding=\"same\")(layer)\nlayer = Dropout(0.3)(layer)\n\nlayer = GlobalAvgPool2D()(layer)\nout = Dense(2,activation=\"softmax\")(layer)\n\nmodel = Model(inputs = input_, outputs=out)\nprint(\"Final model summary\")\nprint(model.summary())\n\nmodel.compile(optimizer=\"adam\",loss=\"categorical_crossentropy\",metrics=[\"accuracy\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5e721da585954e2ebda46a105ceb0a11acf7aef9"},"cell_type":"code","source":"imgNames = shuffle([os.listdir(trainHome)])[0]\nvalLen = int(len(imgNames)*0.1)\n\nvalImgNames = imgNames[:valLen]\ntrainImgNames = imgNames[valLen:]\nprint(\"Total train images:\",len(trainImgNames))\nprint(\"Total val images:\",len(valImgNames))\n\nbatch_size=16\nepochs = 10\nnum_batches = int(len(trainImgNames)/batch_size)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a1c9dfcc6b7933d39fa4f45bec9ad1d568b6312e","collapsed":true},"cell_type":"code","source":"X_val,Y_val = fetchBatch(trainHome,valImgNames,0,len(valImgNames),imgShape)\nX_val = X_val.astype(np.float32)/ 255.0\nY_val = to_categorical(Y_val,num_classes=2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"d3d6622902b5fab03156b794f5f19764e741d694"},"cell_type":"code","source":"hist={\n    \"loss\":[],\n    \"acc\":[],\n    \"val_loss\":[],\n    \"val_acc\":[]\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2b2386f6b9e5fc5728431fce4f0930568d8d7186","scrolled":true},"cell_type":"code","source":"\nfor i_epoch in range(epochs):\n    for i_batch in range(num_batches):\n        X,Y = fetchBatch(trainHome,trainImgNames,i_batch,batch_size,imgShape)\n        X = X.astype(np.float32) / 255.0\n        Y = to_categorical(Y,num_classes=2)\n        model.train_on_batch(X,Y)\n        loss,acc = model.evaluate(X,Y,verbose=0)\n        sys.stdout.write(\"\\r{}/{} Epoch {}/{} loss: {} acc: {}\".format(i_batch+1,num_batches,i_epoch+1,epochs,loss,acc))\n    val_loss,val_acc = model.evaluate(X_val,Y_val,verbose=0)\n    sys.stdout.write(\"Epoch {}/{} loss: {} acc: {} val_loss: {} val_acc: {}\".format(i_epoch+1,epochs,loss,acc,val_loss,val_acc))\n    sys.stdout.write(\"\\n\")\n    hist[\"loss\"].append(loss)\n    hist[\"acc\"].append(acc)\n    hist[\"val_loss\"].append(val_loss)\n    hist[\"val_acc\"].append(val_acc)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f5c849381f27af343b9e8d9515710a0d8b08dc31"},"cell_type":"code","source":"fig,ax = plt.subplots(nrows=1,ncols=2,figsize=(15,5))\n\nax[0].plot(hist[\"loss\"],label=\"loss\")\nax[0].plot(hist[\"val_loss\"],label=\"val_loss\")\nax[0].legend(loc=\"upper left\")\nax[0].set_xlabel(\"Epochs\")\nax[0].set_ylabel(\"Loss values\")\n\nax[1].plot(hist[\"acc\"],label=\"acc\")\nax[1].plot(hist[\"val_acc\"],label=\"val_acc\")\nax[1].legend(loc=\"upper left\")\nax[1].set_xlabel(\"Epochs\")\nax[1].set_ylabel(\"Acc values\")\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"881ed9fd6933a8d4652bc34ab66783ed3534b3b8"},"cell_type":"code","source":"testImgNames = sorted(os.listdir(testHome))\nprint(\"Total test imgs\",len(testImgNames))\nprint(testImgNames[:10])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c19e39ac9bac52e280187e40e491b61535ae126a"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"70d0802299f36f4a406bfc2083763a45f27445fe"},"cell_type":"code","source":"X_test = [fetchImage(testHome+\"/\"+testImgName,imgShape) for testImgName in tqdm(testImgNames)]\nX_test = np.array(X_test,dtype=np.float32) / 255.0","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d52245eae19b0ab45c44fa5e09fc1c38b5bdb737"},"cell_type":"code","source":"X_test.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"b3ffad3fefe4ae2d3d6192e611c857a32f329f42"},"cell_type":"code","source":"preds = model.predict(X_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7b760f6a296a5474da0f4c62fe53abdc3011d9a1"},"cell_type":"code","source":"print(preds[0,0],preds[0,1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"14a095f60cedbacc73727e70f73885b14bb973b5"},"cell_type":"code","source":"fig = plt.figure(figsize=(25,20))\nfor i,img in enumerate(X_test[:50]):\n    plt.subplot(5,10,i+1)\n    plt.imshow(img)\n    #print(\"Cat:{0:.2f} Dog:{0:.2f}\".format(preds[i,0],preds[i,1]),\"Dog:{0:.2f}\".format(preds[i,1]))\n    sortProbs = np.argsort(preds[i])\n    class_ , prob = (\"Dog\",preds[i,1]) if sortProbs[1]==1 else (\"Cat\",preds[i,0])\n    text = class_+\":{0:.2f}\".format(prob)\n    #text = \"Cat:{0:.2f}\".format(preds[i,0])+\" Dog:{0:.2f}\".format(preds[i,1])\n    #print(text)\n    plt.title(text)\n    #plt.text(10,10,text,fontsize=12)\n    #plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"29350c55deb53d8b4f00e395706ec132278cc2cf"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"5d698769e0dd82d8ec62d76c6ae7d58cf89197ee"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"fb4ad91cc2e134d20ecf47c2031ed2cb06b400c9"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}