{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport gc\nimport time\nprint(os.listdir(\"../input/airbus-ship-detection\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train=pd.read_csv('../input/airbus-ship-detection/train_ship_segmentations_v2.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 做0,1标注分类"},{"metadata":{"trusted":true},"cell_type":"code","source":"train['exist_ship'] = train['EncodedPixels'].fillna(0)\ntrain.loc[train['exist_ship']!=0,'exist_ship']=1\ndel train['EncodedPixels']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(len(train['ImageId']))\nprint(train['ImageId'].value_counts().shape[0])\ntrain_gp = train.groupby('ImageId').sum().reset_index()\ntrain_gp.loc[train_gp['exist_ship']>0,'exist_ship']=1","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 合并多船图片"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_gb = train.groupby(['ImageId']).sum().reset_index()\ntrain_gb.loc[train_gb['exist_ship']>0, 'exist_ship'] = 1","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 平衡正负样本"},{"metadata":{"trusted":true},"cell_type":"code","source":"print(train_gb['exist_ship'].value_counts())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_gb = train_gb.sort_values(by='exist_ship')\ntrain_gb = train_gb.drop(train.index[0:100000])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_0 = train_gb[train_gb['exist_ship']==0].sample(24000,random_state=100)\ntrain_0_15 = train_0.iloc[0:5000]#0,15000\ntrain_1 = train_gb[train_gb['exist_ship']==1].sample(20000,random_state=100)\ntrain_1_15 = train_1.iloc[0:5000]#0,15000\ntest_0 = train_0.iloc[500:1200]#15000，23000\ntest_1 = train_1.iloc[500:800]#15000，18000\ntrain_sample =pd.concat([train_0_15,train_1_15])\ntest_sample =pd.concat([test_0,test_1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_path = '../input/airbus-ship-detection/train_v2/'\ntest_path = '../input/airbus-ship-detection/test_v2/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = np.empty(shape=(len(train_sample), 256,256,3),dtype=np.uint8)\ny = np.empty(shape=len(train_sample),dtype=np.uint8)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from PIL import Image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for index, image in enumerate(train_sample['ImageId']):\n    image_array= Image.open(train_path + image).resize((256,256)).convert('RGB')\n    X[index] = image_array\n    y[index]=train_sample[train_sample['ImageId']==image]['exist_ship'].iloc[0]\n\nprint(X.shape)\nprint(y.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_X = np.empty(shape=(len(test_sample), 256,256,3),dtype=np.uint8)\ntest_Y = np.empty(shape=len(test_sample),dtype=np.uint8)\nfor index, image in enumerate(test_sample['ImageId']):\n    image_array= Image.open(train_path + image).resize((256,256)).convert('RGB')\n    test_X[index] = image_array\n    test_Y[index]=test_sample[test_sample['ImageId']==image]['exist_ship'].iloc[0]\n\nprint(test_X.shape)\nprint(test_Y.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.preprocessing import OneHotEncoder\ntargets =y.reshape(len(y),-1)\nenc = OneHotEncoder()\nenc.fit(targets)\ny = enc.transform(targets).toarray()\nprint(y.shape)\n\ntargetss =test_Y.reshape(len(test_Y),-1)\nenc1 = OneHotEncoder()\nenc1.fit(targetss)\ntest_Y = enc1.transform(targetss).toarray()\nprint(test_Y.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import keras.applications","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dir(keras.applications)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.applications.resnet50 import ResNet50 as ResModel","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.applications.resnet50 import ResNet50 as ResModel\n#from keras.applications.vgg16 import VGG16 as VGG16Model\nimg_width, img_height = 256, 256\nmodel = ResModel(weights = 'imagenet', include_top=False, input_shape = (img_width, img_height, 3))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.layers import Dropout, Flatten, Dense, GlobalAveragePooling2D\nfrom keras.models import Sequential, Model \nfrom keras import backend as K\nfor layer in model.layers:\n    layer.trainable = False\n\nx = model.output\nx = Flatten()(x)\nx = Dense(1024, activation=\"relu\")(x)\nx = Dropout(0.5)(x)\nx = Dense(1024, activation=\"relu\")(x)\npredictions = Dense(2, activation=\"softmax\")(x)\n\n# creating the final model \nmodel_final = Model(input = model.input, output = predictions)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def recall(y_true, y_pred):\n    # Calculates the recall召回率\n    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))\n    recall = true_positives / (possible_positives + K.epsilon())\n    return recall\ndef precision(y_true, y_pred):\n    #\"\"\"精确率\"\"\"\n    tp= K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))  # true positives\n    pp= K.sum(K.round(K.clip(y_pred, 0, 1))) # predicted positives\n    precision = tp/ (pp+ K.epsilon())\n    return precision\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras import optimizers\nepochs = 10\nlrate = 0.001\ndecay = lrate/epochs\n#adam = optimizers.Adam(lr=lrate,beta_1=0.9, beta_2=0.999, decay=decay)\nsgd = optimizers.SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False)\nmodel_final.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=[precision, recall])\nmodel_final.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_final.fit(X, y, epochs=10, batch_size=50)\n#score = model_final.evaluate(test_X, test_Y, batch_size=50)\n\nmodel_final.save('ResNet_transfer_ship.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"gc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"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.7.5"}},"nbformat":4,"nbformat_minor":1}