{"cells":[{"metadata":{"_uuid":"5796c2253aaf2ca204796d11a7fb30bed69ccd61"},"cell_type":"markdown","source":"# Bu çalışma Histopatolojik Kanser Tespiti sorununa çözüm sunuyor. Derin Öğrenme kullanarak lenf dokularının histopatolojik taramalarındaki metastatik(tümor) dokuyu tanımlayarak kanser tespiti ile görevli olduğumuz önemli bir bilgisayar görme sorunudur."},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"markdown","source":"# 1. Modules\n\n* [glob](https://docs.python.org/3/library/glob.html) eşleşen dosya adlarını kolayca bulmak için\n* [numpy](https://www.numpy.org/) - matris ve matematik modülü\n* [pandas](https://pandas.pydata.org/) - veri yapıları ve analizleri için güçlü bir modül\n* [keras](https://keras.io/) - TensorFlow kullanımını kolaylaştırmak, kolay şekilde bir üst düzey derin öğrenme API.\n* [cv2](https://opencv-python-tutro****als.readthedocs.io/en/latest/py_tutorials/py_setup/py_intro/py_intro.html#intro) - görüntü işleme için (yalnızca görüntüleri yüklemek için kullanacağız)\n* [tqdm](https://tqdm.github.io/) - minimalist ancak güçlü ve kullanımı kolay bir ilerleme çubuğu\n* [matplotlib](https://matplotlib.org/) - Bir çizim modülü"},{"metadata":{"trusted":true,"_uuid":"89515c262b9716ead7f4902e924e4744d7d8130a"},"cell_type":"code","source":"#Modülleri yükleyin\nfrom glob import glob \nimport numpy as np\nimport pandas as pd\nimport keras,cv2,os\n\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, BatchNormalization, Activation\nfrom keras.layers import Conv2D, MaxPool2D\n\nfrom tqdm import tqdm_notebook,trange\nimport matplotlib.pyplot as plt\n\nimport gc #çöp toplama, elimizdeki tüm RAM'i korumamız gerekiyor","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"89f0b8d6439c876464b9e44062852a9eb747426f"},"cell_type":"markdown","source":"# 2. Problem okuma ve veri\nTeknik olarak, yapılacak işlemin amacı görüntüler için ikili bir sınıflandırma görevidir, yani görüntüleri iki sınıfa ayırmak istiyoruz. Pratik olarak, 96x96 piksel çözünürlüğe sahip lenf düğümü dokusunun mikroskopik görüntüleri sağlanmıştır ve görüntülerin görüntünün 32x32 merkez bölgesinde metastatik kanser dokusu gösterip göstermediğini belirten bir olasılık sağlamalıyız.\n\nEğitim için yaklaşık 220.000 etiketli resim ve yaklaşık 57.000 test setini oluşturuyor.\n\nVerileri yükleyerek ve bazı resimlere göz atarak başlayalım."},{"metadata":{"trusted":true,"_uuid":"5053f430de595e2d8d07d95a92242b557ccb1b8d"},"cell_type":"markdown","source":"# 3. Verileri yükleme\n'Train_path' klasöründeki tüm dosyaların yolunu içeren bir panda veri çerçevesi oluşturarak başlayacağız ve ardından sağlanan csv dosyasındaki eşleşen etiketleri okuyacağız.\n\n## Etiketleri ve dosya adlarını yükle"},{"metadata":{"trusted":true,"_uuid":"e32fb867eea587c9ac2aa0ba1883223d76f3325c"},"cell_type":"code","source":"#verileri eğitmek ve test etmek için yollar belirme\npath = \"../input/\" # çalıştırırken bu yolu uyarla\n\ntrain_path = path + 'train/'\ntest_path = path + 'test/'\n\ndf = pd.DataFrame({'path': glob(os.path.join(train_path,'*.tif'))}) # dosya adlarını yükle\ndf['id'] = df.path.map(lambda x: x.split('/')[3].split(\".\")[0]) # 'id' de sadece dosya isimlerini sakla\nlabels = pd.read_csv(path+\"train_labels.csv\") # verilen etiketleri okuyun\ndf = df.merge(labels, on = \"id\") # etiketleri ve dosya yollarını birleştir\ndf.head(5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3859fffec087e71acda3cc992290245152759829"},"cell_type":"markdown","source":"## Görüntüleri yükle\n\nŞimdi, resimlerden bazılarını yükleyeceğiz. [GPU'lu etkileşimli çekirdekler] (https://www.kaggle.com/docs/kernels#the-kernels-environment) şu anda yaklaşık 14 GB RAM sunduğundan, resimleri uint8 biçiminde tutmaya özen göstereceğiz (örn. Piksel değerleri, bellek ayak izini azaltmak için 0 ile 255) arasındaki tamsayılardır. Görüntülerin işlenmesi çoğu zaman onları ek alan gerektirecek şekilde float32'ye dönüştürmeyi gerektirir.\n"},{"metadata":{"trusted":true,"_uuid":"47f0117e296b687bd36a784865996863e72cd076"},"cell_type":"code","source":"def load_data(N,df):\n    \"\"\" This functions loads N images using the data df\n    \"\"\"\n    # görüntüler için bir dizi dizisi ayırma (N, 96x96px, 3 kanal, 0 - 255 değer)\n    X = np.zeros([N,96,96,3],dtype=np.uint8) \n    #etiketleri de bir numpy dizisine dönüştür\n    y = np.squeeze(df.as_matrix(columns=['label']))[0:N]\n    #görüntüleri tek tek okumak, tdqm dizüstü bilgisayar bir ilerleme çubuğu gösteriyor\n    for i, row in tqdm_notebook(df.iterrows(), total=N):\n        if i == N:\n            break\n        X[i] = cv2.imread(row['path'])\n          \n    return X,y","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# yükle 10k imge\nN=10000\nX,y = load_data(N=N,df=df)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 4.  Veri Analizi\n\n\n## Bazı örnek görüntüleri atanmış etiketleriyle birlikte çizimi (0 - kanser hücresi değil, 1 - kanser hücresi):"},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = plt.figure(figsize=(10, 4), dpi=150)\nnp.random.seed(100) #örnekleme\nfor plotNr,idx in enumerate(np.random.randint(0,N,8)):\n    ax = fig.add_subplot(2, 8//2, plotNr+1, xticks=[], yticks=[]) #\n    plt.imshow(X[idx]) \n    ax.set_title('Label: ' + str(y[idx])) ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Çoğu insan için (benim gibi), hangi görüntülerin kanser hücreleri içerdiğini ayırt etmenin kolay bir yolu yoktur. Bu nedenle, veriler hakkında daha derinlemesine bilgi edinmek için [çeşitli şeyler] (https://www.nature.com/articles/nmeth.4397.pdf) var.\n\n## Veri dağılımına bakmaya başlayalım\n\nSınıfların yoğunluğuna bakarak başlayacağız."},{"metadata":{"trusted":true},"cell_type":"code","source":"N = df[\"path\"].size # get the number of images in the training data set\nX,y = load_data(N=N,df=df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Collect garbage\npositives_samples = None\nnegative_samples = None\ngc.collect();","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"training_portion = 0.8 # Specify training/validation ratio\nsplit_idx = int(np.round(training_portion * y.shape[0])) #Compute split idx\n\nnp.random.seed(42) #set the seed to ensure reproducibility\n\n#shuffle\nidx = np.arange(y.shape[0])\nnp.random.shuffle(idx)\nX = X[idx]\ny = y[idx]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Model Yapımı**"},{"metadata":{"trusted":true},"cell_type":"code","source":"kernel_size = (3,3)\npool_size= (2,2)\nfirst_filters = 32\nsecond_filters = 64\nthird_filters = 128\n\ndropout_conv = 0.3\ndropout_dense = 0.5\n\nmodel = Sequential()\n\nmodel.add(Conv2D(first_filters, kernel_size, input_shape = (96, 96, 3)))\nmodel.add(BatchNormalization())\nmodel.add(Activation(\"relu\"))\nmodel.add(Conv2D(first_filters, kernel_size, use_bias=False))\nmodel.add(BatchNormalization())\nmodel.add(Activation(\"relu\"))\nmodel.add(MaxPool2D(pool_size = pool_size)) \nmodel.add(Dropout(dropout_conv))\n\n#conv block 2\nmodel.add(Conv2D(second_filters, kernel_size, use_bias=False))\nmodel.add(BatchNormalization())\nmodel.add(Activation(\"relu\"))\nmodel.add(Conv2D(second_filters, kernel_size, use_bias=False))\nmodel.add(BatchNormalization())\nmodel.add(Activation(\"relu\"))\nmodel.add(MaxPool2D(pool_size = pool_size))\nmodel.add(Dropout(dropout_conv))\n\n#conv block 3\nmodel.add(Conv2D(third_filters, kernel_size, use_bias=False))\nmodel.add(BatchNormalization())\nmodel.add(Activation(\"relu\"))\nmodel.add(Conv2D(third_filters, kernel_size, use_bias=False))\nmodel.add(BatchNormalization())\nmodel.add(Activation(\"relu\"))\nmodel.add(MaxPool2D(pool_size = pool_size))\nmodel.add(Dropout(dropout_conv))\n\n\nmodel.add(Flatten())\nmodel.add(Dense(256, use_bias=False))\nmodel.add(BatchNormalization())\nmodel.add(Activation(\"relu\"))\nmodel.add(Dropout(dropout_dense))\n\n#finally convert to values of 0 to 1 using the sigmoid activation function\nmodel.add(Dense(1, activation = \"sigmoid\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_size = 50\n\nmodel.compile(loss=keras.losses.binary_crossentropy,\n              optimizer=keras.optimizers.Adam(0.001), \n              metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs = 3\nfor epoch in range(epochs):\n    \n    iterations = np.floor(split_idx / batch_size).astype(int) \n    loss,acc = 0,0\n    with trange(iterations) as t: \n        for i in t:\n            start_idx = i * batch_size \n            x_batch = X[start_idx:start_idx+batch_size] \n            y_batch = y[start_idx:start_idx+batch_size] \n\n            metrics = model.train_on_batch(x_batch, y_batch) \n\n            loss = loss + metrics[0] \n            acc = acc + metrics[1] \n            t.set_description('Running training epoch ' + str(epoch)) \n            t.set_postfix(loss=\"%.2f\" % round(loss / (i+1),2),acc=\"%.2f\" % round(acc / (i+1),2)) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"iterations = np.floor((y.shape[0]-split_idx) / batch_size).astype(int) \nloss,acc = 0,0 \nwith trange(iterations) as t: #display a progress bar\n    for i in t:\n        start_idx = i * batch_size \n        x_batch = X[start_idx:start_idx+batch_size] \n        y_batch = y[start_idx:start_idx+batch_size] \n        \n        metrics = model.test_on_batch(x_batch, y_batch) \n        \n        loss = loss + metrics[0] \n        acc = acc + metrics[1] #compute running accuracy\n        t.set_description('Running training') #set progressbar title\n        t.set_description('Running validation')\n        t.set_postfix(loss=\"%.2f\" % round(loss / (i+1),2),acc=\"%.2f\" % round(acc / (i+1),2))\n        \nprint(\"Validation loss:\",loss / iterations)\nprint(\"Validation accuracy:\",acc / iterations)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = None\ny = None\ngc.collect();","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"base_test_dir = path + 'test/' \ntest_files = glob(os.path.join(base_test_dir,'*.tif')) \nsubmission = pd.DataFrame() \nfile_batch = 5000 \nmax_idx = len(test_files) \nfor idx in range(0, max_idx, file_batch): \n    print(\"Indexes: %i - %i\"%(idx, idx+file_batch))\n    test_df = pd.DataFrame({'path': test_files[idx:idx+file_batch]}) \n    test_df['id'] = test_df.path.map(lambda x: x.split('/')[3].split(\".\")[0]) #\n    test_df['image'] = test_df['path'].map(cv2.imread) \n    K_test = np.stack(test_df[\"image\"].values) \n    predictions = model.predict(K_test,verbose = 1) \n    test_df['label'] = predictions \n    submission = pd.concat([submission, test_df[[\"id\", \"label\"]]])\nsubmission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.to_csv(\"submission.csv\", index = False, header = True) #create the submission file","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}