{"cells":[{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"60543b9c-6597-8207-5342-e648fe400afb"},"outputs":[],"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)\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\nfrom subprocess import check_output\nprint(check_output([\"ls\", \"../input\"]).decode(\"utf8\"))\n\n# Any results you write to the current directory are saved as output."},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"a7111749-9f88-65d5-87b4-1e6087b24aec"},"outputs":[],"source":"from PIL import ImageFilter, ImageStat, Image, ImageDraw\nfrom multiprocessing import Pool, cpu_count\nfrom sklearn.preprocessing import LabelEncoder\nimport pandas as pd\nimport numpy as np\nimport glob\nimport cv2\ndef im_multi(path):\n      try:\n        im_stats_im_ = Image.open(path)\n        return [path, {'size': im_stats_im_.size}]\n     except:\n        print(path)\n        return [path, {'size': [0,0]}]\n\ndef im_stats(im_stats_df):\n    im_stats_d = {}\n    p = Pool(cpu_count())\n    ret = p.map(im_multi, im_stats_df['path'])\n    for i in range(len(ret)):\n        im_stats_d[ret[i][0]] = ret[i][1]\n    im_stats_df['size'] = im_stats_df['path'].map(lambda x: ' '.join(str(s) for s in im_stats_d[x]['size']))\n    return im_stats_df\n\ndef get_im_cv2(path):\n    img = cv2.imread(path)\n    resized = cv2.resize(img, (64, 64), cv2.INTER_LINEAR) #use cv2.resize(img, (64, 64), cv2.INTER_LINEAR)\n    return [path, resized]\n\ndef normalize_image_features(paths):\n    imf_d = {}\n    p = Pool(cpu_count())\n    ret = p.map(get_im_cv2, paths)\n    for i in range(len(ret)):\n        imf_d[ret[i][0]] = ret[i][1]\n    ret = []\n    fdata = [imf_d[f] for f in paths]\n    fdata = np.array(fdata, dtype=np.uint8)\n    fdata = fdata.transpose((0, 3, 1, 2))\n    fdata = fdata.astype('float32')\n    fdata = fdata / 255\n    return fdata\n\ntrain = glob.glob('../input/train/**/*.jpg') + glob.glob('../input/additional/**/*.jpg')\ntrain = pd.DataFrame([[p.split('/')[3],p.split('/')[4],p] for p in train], columns = ['type','image','path'])[::5] #limit for Kaggle Demo\ntrain = im_stats(train)\ntrain = train[train['size'] != '0 0'].reset_index(drop=True) #remove bad images\ntrain_data = normalize_image_features(train['path'])\nnp.save('train.npy', train_data, allow_pickle=True, fix_imports=True)\n\nle = LabelEncoder()\ntrain_target = le.fit_transform(train['type'].values)\nprint(le.classes_) #in case not 1 to 3 order\nnp.save('train_target.npy', train_target, allow_pickle=True, fix_imports=True)\n\ntest = glob.glob('../input/test/*.jpg')\ntest = pd.DataFrame([[p.split('/')[3],p] for p in test], columns = ['image','path']) #[::20] #limit for Kaggle Demo\ntest_data = normalize_image_features(test['path'])\nnp.save('test.npy', test_data, allow_pickle=True, fix_imports=True)\n\ntest_id = test.image.values\nnp.save('test_id.npy', test_id, allow_pickle=True, fix_imports=True)"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"ce1ed4ef-3c7c-100a-5fdc-327985527f61"},"outputs":[],"source":"from PIL import ImageFilter, ImageStat, Image, ImageDraw\nfrom multiprocessing import Pool, cpu_count\nfrom sklearn.preprocessing import LabelEncoder\nimport pandas as pd\nimport numpy as np\nimport glob\nimport cv2\ndef im_multi(path):\n    try:\n        im_stats_im_ = Image.open(path)\n        return [path, {'size': im_stats_im_.size}]\n    except:\n        print(path)\n        return [path, {'size': [0,0]}]\ndef im_stats(im_stats_df):\n    im_stats_d = {}\n    p = Pool(cpu_count())\n    ret = p.map(im_multi, im_stats_df['path'])\n    for i in range(len(ret)):\n        im_stats_d[ret[i][0]] = ret[i][1]\n    im_stats_df['size'] = im_stats_df['path'].map(lambda x: ' '.join(str(s) for s in im_stats_d[x]['size']))\n    return im_stats_df\ndef get_im_cv2(path):\n    img = cv2.imread(path)\n    resized = cv2.resize(img, (64, 64), cv2.INTER_LINEAR) #use cv2.resize(img, (64, 64), cv2.INTER_LINEAR)\n    return [path, resized]\ndef normalize_image_features(paths):\n    imf_d = {}\n    p = Pool(cpu_count())\n    ret = p.map(get_im_cv2, paths)\n    for i in range(len(ret)):\n        imf_d[ret[i][0]] = ret[i][1]\n    ret = []\n    fdata = [imf_d[f] for f in paths]\n    fdata = np.array(fdata, dtype=np.uint8)\n    fdata = fdata.transpose((0, 3, 1, 2))\n    fdata = fdata.astype('float32')\n    fdata = fdata / 255\n    return fdata\n\ntrain = glob.glob('../input/train/**/*.jpg') + glob.glob('../input/additional/**/*.jpg')\ntrain = pd.DataFrame([[p.split('/')[3],p.split('/')[4],p] for p in train], columns = ['type','image','path'])[::5] #limit for Kaggle Demo\ntrain = im_stats(train)\ntrain = train[train['size'] != '0 0'].reset_index(drop=True) #remove bad images\ntrain_data = normalize_image_features(train['path'])\nnp.save('train.npy', train_data, allow_pickle=True, fix_imports=True)\n\nle = LabelEncoder()\ntrain_target = le.fit_transform(train['type'].values)\nprint(le.classes_) #in case not 1 to 3 order\nnp.save('train_target.npy', train_target, allow_pickle=True, fix_imports=True)\n\ntest = glob.glob('../input/test/*.jpg')\ntest = pd.DataFrame([[p.split('/')[3],p] for p in test], columns = ['image','path']) #[::20] #limit for Kaggle Demo\ntest_data = normalize_image_features(test['path'])\nnp.save('test.npy', test_data, allow_pickle=True, fix_imports=True)\n\ntest_id = test.image.values\nnp.save('test_id.npy', test_id, allow_pickle=True, fix_imports=True)"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"89dcd480-cd1e-58e8-3b91-330298b8b8b0"},"outputs":[],"source":"from keras.wrappers.scikit_learn import KerasClassifier\nfrom keras.models import Sequential\nfrom keras.layers.core import Dense, Dropout, Flatten, Activation\nfrom keras.layers.convolutional import Convolution2D, ZeroPadding2D, MaxPooling2D\nfrom keras import optimizers\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.model_selection import train_test_split\nfrom keras import backend as K\nK.set_image_dim_ordering('th')\nK.set_floatx('float32')\n\nimport pandas as pd\nimport numpy as np\nnp.random.seed(17)\n\ntrain_data = np.load('train.npy')\ntrain_target = np.load('train_target.npy')\n\nx_train,x_val_train,y_train,y_val_train = train_test_split(train_data,train_target,test_size=0.4, random_state=17)\n\ndef create_model(opt_='adamax'):\n    model = Sequential()\n    model.add(Convolution2D(4, 3, 3, activation='relu', dim_ordering='th', input_shape=(3, 64, 64))) #use input_shape=(3, 64, 64)\n    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), dim_ordering='th'))\n    model.add(Convolution2D(8, 3, 3, activation='relu', dim_ordering='th'))\n    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), dim_ordering='th'))\n    model.add(Dropout(0.2))\n\n    model.add(Flatten())\n    model.add(Dense(12, activation='tanh'))\n    model.add(Dropout(0.1))\n    model.add(Dense(3, activation='softmax'))\n    model.compile(optimizer=opt_, loss='sparse_categorical_crossentropy', metrics=['accuracy']) \n    return model\ndatagen = ImageDataGenerator(rotation_range=0.3, zoom_range=0.3)\ndatagen.fit(train_data)\n\nmodel = create_model()\nmodel.fit_generator(datagen.flow(x_train,y_train, batch_size=15, shuffle=True), nb_epoch=100, samples_per_epoch=len(x_train), verbose=20, validation_data=(x_val_train, y_val_train))\n\ntest_data = np.load('test.npy')\ntest_id = np.load('test_id.npy')\n"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"88dd738d-085a-797b-0ab6-2e9177310ebe"},"outputs":[],"source":"\ntest_data"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"b66c7fa1-2955-f50b-6884-c7a8e89fd2c1"},"outputs":[],"source":"pred = model.predict_proba(test_data)\npred\n"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"bcc606cf-db62-6ad4-04fe-ad1c66e2482e"},"outputs":[],"source":"df = pd.DataFrame(pred, columns=['Type_1','Type_2','Type_3'])\ndf"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"28866b72-329d-989e-0948-221183363101"},"outputs":[],"source":"train = glob.glob('../input/train/**/*.jpg') + glob.glob('../input/additional/**/*.jpg')\ntrain"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"fd043092-aa55-70e0-53d9-f606dc83805a"},"outputs":[],"source":""}],"metadata":{"_change_revision":0,"_is_fork":false,"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.0"}},"nbformat":4,"nbformat_minor":0}