{"cells":[{"cell_type":"code","execution_count":null,"metadata":{"collapsed":false},"outputs":[],"source":"import numpy as np\nnp.random.seed(2016)\n\nimport os\nimport glob\nimport cv2\nimport math\nimport pickle\nimport datetime\nimport pandas as pd\nimport statistics\n\nfrom sklearn.cross_validation import train_test_split\nfrom sklearn.cross_validation import KFold\nfrom keras.models import Sequential\nfrom keras.layers.core import Dense, Dropout, Activation, Flatten\nfrom keras.layers.convolutional import Convolution2D, MaxPooling2D\nfrom keras.utils import np_utils\nfrom keras.models import model_from_json\nfrom sklearn.metrics import log_loss\n\n\ndef get_im(path, img_rows, img_cols):\n    # Load as grayscale\n    img = cv2.imread(path, 0)\n    # Reduce size\n    resized = cv2.resize(img, (img_cols, img_rows))\n    return resized\n\n\ndef load_train(img_rows, img_cols):\n    X_train = []\n    y_train = []\n    print('Read train images')\n    for j in range(10):\n        print('Load folder c{}'.format(j))\n        path = os.path.join('..', 'input', 'imgs', 'train', 'c' + str(j), '*.jpg')\n        files = glob.glob(path)\n        for fl in files:\n            img = get_im(fl, img_rows, img_cols)\n            X_train.append(img)\n            y_train.append(j)\n\n    return X_train, y_train\n\n\ndef load_test(img_rows, img_cols):\n    print('Read test images')\n    path = os.path.join('..', 'input', 'imgs', 'test', '*.jpg')\n    files = glob.glob(path)\n    X_test = []\n    X_test_id = []\n    total = 0\n    thr = math.floor(len(files)/10)\n    for fl in files:\n        flbase = os.path.basename(fl)\n        img = get_im(fl, img_rows, img_cols)\n        X_test.append(img)\n        X_test_id.append(flbase)\n        total += 1\n        if total%thr == 0:\n            print('Read {} images from {}'.format(total, len(files)))\n\n    return X_test, X_test_id\n\n\ndef cache_data(data, path):\n    if os.path.isdir(os.path.dirname(path)):\n        file = open(path, 'wb')\n        pickle.dump(data, file)\n        file.close()\n    else:\n        print('Directory doesnt exists')\n\n\ndef restore_data(path):\n    data = dict()\n    if os.path.isfile(path):\n        file = open(path, 'rb')\n        data = pickle.load(file)\n    return data\n\n\ndef save_model(model):\n    json_string = model.to_json()\n    if not os.path.isdir('cache'):\n        os.mkdir('cache')\n    open(os.path.join('cache', 'architecture.json'), 'w').write(json_string)\n    model.save_weights(os.path.join('cache', 'model_weights.h5'), overwrite=True)\n\n\ndef read_model():\n    model = model_from_json(open(os.path.join('cache', 'architecture.json')).read())\n    model.load_weights(os.path.join('cache', 'model_weights.h5'))\n    return model\n\n\ndef split_validation_set(train, target, test_size):\n    random_state = 51\n    X_train, X_test, y_train, y_test = train_test_split(train, target, test_size=test_size, random_state=random_state)\n    return X_train, X_test, y_train, y_test\n\n\ndef split_validation_set_with_hold_out(train, target, test_size):\n    random_state = 51\n    train, X_test, target, y_test = train_test_split(train, target, test_size=test_size, random_state=random_state)\n    X_train, X_holdout, y_train, y_holdout = train_test_split(train, target, test_size=test_size, random_state=random_state)\n    return X_train, X_test, X_holdout, y_train, y_test, y_holdout\n\n\ndef create_submission(predictions, test_id, loss):\n    result1 = pd.DataFrame(predictions, columns=['c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9'])\n    result1.loc[:, 'img'] = pd.Series(test_id, index=result1.index)\n    now = datetime.datetime.now()\n    if not os.path.isdir('subm'):\n        os.mkdir('subm')\n    suffix = str(round(loss, 6)) + '_' + str(now.strftime(\"%Y-%m-%d-%H-%M\"))\n    sub_file = os.path.join('subm', 'submission_' + suffix + '.csv')\n    result1.to_csv(sub_file, index=False)\n\n\ndef read_and_normalize_train_data(img_rows, img_cols):\n    cache_path = os.path.join('cache', 'train_r_' + str(img_rows) + '_c_' + str(img_cols) + '.dat')\n    if not os.path.isfile(cache_path):\n        train_data, train_target = load_train(img_rows, img_cols)\n        cache_data((train_data, train_target), cache_path)\n    else:\n        print('Restore train from cache!')\n        (train_data, train_target) = restore_data(cache_path)\n\n    train_data = np.array(train_data, dtype=np.uint8)\n    train_target = np.array(train_target, dtype=np.uint8)\n    train_data = train_data.reshape(train_data.shape[0], 1, img_rows, img_cols)\n    train_target = np_utils.to_categorical(train_target, 10)\n    train_data = train_data.astype('float32')\n    train_data /= 255\n    print('Train shape:', train_data.shape)\n    print(train_data.shape[0], 'train samples')\n    return train_data, train_target\n\n\ndef read_and_normalize_test_data(img_rows, img_cols):\n    cache_path = os.path.join('cache', 'test_r_' + str(img_rows) + '_c_' + str(img_cols) + '.dat')\n    if not os.path.isfile(cache_path):\n        test_data, test_id = load_test(img_rows, img_cols)\n        cache_data((test_data, test_id), cache_path)\n    else:\n        print('Restore test from cache!')\n        (test_data, test_id) = restore_data(cache_path)\n\n    test_data = np.array(test_data, dtype=np.uint8)\n    test_data = test_data.reshape(test_data.shape[0], 1, img_rows, img_cols)\n    test_data = test_data.astype('float32')\n    test_data /= 255\n    print('Test shape:', test_data.shape)\n    print(test_data.shape[0], 'test samples')\n    return test_data, test_id\n\n\ndef dict_to_list(d):\n    ret = []\n    for i in d.items():\n        ret.append(i[1])\n    return ret\n\n\ndef merge_several_folds_fast(data, nfolds):\n    a = np.array(data[0])\n    for i in range(1, nfolds):\n        a += np.array(data[i])\n    a /= nfolds\n    return a.tolist()\n\n\ndef run_cross_validation(nfolds=10):\n    # input image dimensions\n    img_rows, img_cols = 24, 32\n    batch_size = 64\n    nb_classes = 10\n    nb_epoch = 1\n    # number of convolutional filters to use\n    nb_filters = 32\n    # size of pooling area for max pooling\n    nb_pool = 2\n    # convolution kernel size\n    nb_conv = 3\n    random_state = 51\n\n    train_data, train_target = read_and_normalize_train_data(img_rows, img_cols)\n    test_data, test_id = read_and_normalize_test_data(img_rows, img_cols)\n\n    yfull_train = dict()\n    yfull_test = []\n    kf = KFold(len(train_data), n_folds=nfolds, shuffle=True, random_state=random_state)\n    num_fold = 0\n    for train_index, test_index in kf:\n        num_fold += 1\n        print('Start KFold number {} from {}'.format(num_fold, nfolds))\n        X_train, X_valid = train_data[train_index], train_data[test_index]\n        Y_train, Y_valid = train_target[train_index], train_target[test_index]\n        print('Split train: ', len(X_train))\n        print('Split valid: ', len(X_valid))\n\n        model = Sequential()\n        model.add(Convolution2D(nb_filters, nb_conv, nb_conv,\n                                border_mode='valid',\n                                input_shape=(1, img_rows, img_cols)))\n        model.add(Activation('relu'))\n        model.add(Convolution2D(nb_filters, nb_conv, nb_conv))\n        model.add(Activation('relu'))\n        model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))\n        model.add(Dropout(0.25))\n\n        model.add(Flatten())\n        model.add(Dense(128))\n        model.add(Activation('relu'))\n        model.add(Dropout(0.5))\n        model.add(Dense(nb_classes))\n        model.add(Activation('softmax'))\n\n        model.compile(loss='categorical_crossentropy', optimizer='adadelta')\n\n        model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch,\n                  show_accuracy=True, verbose=1, validation_data=(X_valid, Y_valid))\n\n        # score = model.evaluate(X_valid, Y_valid, show_accuracy=True, verbose=0)\n        # print('Score log_loss: ', score[0])\n\n        predictions_valid = model.predict(X_valid, batch_size=128, verbose=1)\n        score = log_loss(Y_valid, predictions_valid)\n        print('Score log_loss: ', score)\n\n        # Store valid predictions\n        for i in range(len(test_index)):\n            yfull_train[test_index[i]] = predictions_valid[i]\n\n        # Store test predictions\n        test_prediction = model.predict(test_data, batch_size=128, verbose=1)\n        yfull_test.append(test_prediction)\n\n    score = log_loss(train_target, dict_to_list(yfull_train))\n    print('Final score log_loss: ', score)\n\n    test_res = merge_several_folds_fast(yfull_test, nfolds)\n    create_submission(test_res, test_id, score)"},{"cell_type":"code","execution_count":null,"metadata":{"collapsed":false},"outputs":[],"source":"run_cross_validation(10)"},{"cell_type":"code","execution_count":null,"metadata":{"collapsed":false},"outputs":[],"source":"import pandas as pd\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport cv2\nimport os, glob\n\ndrivers = pd.read_csv('../input/driver_imgs_list.csv')\ntrain_files = [f for f in glob.glob(\"../input/train/*/*.jpg\")]\ntest_files = [\"../input/test/\" + f for f in os.listdir(\"../input/test/\")]\nprint(train_files[:10])\nprint(test_files[:10])"},{"cell_type":"code","execution_count":null,"metadata":{"collapsed":false},"outputs":[],"source":"print(train_files[:1])"},{"cell_type":"code","execution_count":null,"metadata":{"collapsed":false},"outputs":[],"source":"plt.rcParams['figure.figsize'] = (12.0, 12.0)\nplt.subplots_adjust(wspace=0, hspace=0)\n\nc_files = []\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_eye.xml','eye'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_eye_tree_eyeglasses.xml','glasses'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_frontalcatface.xml','frontal'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_frontalcatface_extended.xml','cat ext'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml','alt'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt2.xml','alt2'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt_tree.xml','alt tree'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml','default'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_fullbody.xml','body'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_lefteye_2splits.xml','splits'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_licence_plate_rus_16stages.xml','license'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_lowerbody.xml','lowerbody'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_profileface.xml','profile'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_righteye_2splits.xml','right eye'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_russian_plate_number.xml','russian'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_smile.xml','smile'])\nc_files.append(['/usr/local/share/OpenCV/haarcascades/haarcascade_upperbody.xml','upper'])\nc_files.append(['/usr/local/share/OpenCV/lbpcascades/lbpcascade_frontalcatface.xml','cat frontal'])\nc_files.append(['/usr/local/share/OpenCV/lbpcascades/lbpcascade_frontalface.xml','lbp frontal'])\nc_files.append(['/usr/local/share/OpenCV/lbpcascades/lbpcascade_profileface.xml','lbp profile'])\nc_files.append(['/usr/local/share/OpenCV/lbpcascades/lbpcascade_silverware.xml','silver'])\n\nimport random\nfi = random.choice(train_files)\nprint(fi)\nim = cv2.imread(fi)\nplt.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB)); plt.axis('off')"},{"cell_type":"code","execution_count":null,"metadata":{"collapsed":false},"outputs":[],"source":"i_ = 0\nplt.rcParams['figure.figsize'] = (11.0, 21.0)\nplt.subplots_adjust(wspace=0, hspace=0)\nfor c in c_files:\n    im2 = im.copy()\n    gr_im = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY)\n    fc = cv2.CascadeClassifier(c[0])\n    fr = fc.detectMultiScale(gr_im, scaleFactor=1.1, minNeighbors=2, minSize=(20, 20), flags = cv2.CASCADE_SCALE_IMAGE)\n    if len(fr)>0:\n        for (x, y, w, h) in fr:\n            cv2.rectangle(im2, (x, y), (x+w, y+h), (0, 0, 255), 2)\n        cv2.cvtColor(im2, cv2.COLOR_BGR2RGB)\n    plt.subplot(7, 3, i_+1).set_title(c[1])\n    plt.imshow(cv2.cvtColor(im2, cv2.COLOR_BGR2RGB)); plt.axis('off')\n    i_ += 1"},{"cell_type":"code","execution_count":null,"metadata":{"collapsed":false},"outputs":[],"source":""}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"}},"nbformat":4,"nbformat_minor":0}