33 KiB
33 KiB
In [1]:
import warnings
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
import os
from tqdm import tqdmIn [2]:
# Import outputs of each selected models
# yolo = pd.read_csv('../input/vinbigdatastack/yolov5.csv')
# detectron = pd.read_csv('../input/vinbigdatastack/detectron2.csv')
# fasterrcnn = pd.read_csv('../input/vinbigdatastack/fasterrcnn.csv')
yolo = pd.read_csv('../input/ensample/submission0.175.csv')
detectron = pd.read_csv('../input/ensample/submission_0.2.csv')
fasterrcnn = pd.read_csv('../input/ensample/submission_2class filter.csv')
image_ids = yolo.image_id.values[0;31m---------------------------------------------------------------------------[0m [0;31mFileNotFoundError[0m Traceback (most recent call last) [0;32m<ipython-input-2-7dcdf4de33b8>[0m in [0;36m<module>[0;34m[0m [1;32m 3[0m [0;31m# detectron = pd.read_csv('../input/vinbigdatastack/detectron2.csv')[0m[0;34m[0m[0;34m[0m[0;34m[0m[0m [1;32m 4[0m [0;31m# fasterrcnn = pd.read_csv('../input/vinbigdatastack/fasterrcnn.csv')[0m[0;34m[0m[0;34m[0m[0;34m[0m[0m [0;32m----> 5[0;31m [0myolo[0m [0;34m=[0m [0mpd[0m[0;34m.[0m[0mread_csv[0m[0;34m([0m[0;34m'../input/ensample/submission0.175.csv'[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 6[0m [0mdetectron[0m [0;34m=[0m [0mpd[0m[0;34m.[0m[0mread_csv[0m[0;34m([0m[0;34m'../input/ensample/submission_0.2.csv'[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [1;32m 7[0m [0mfasterrcnn[0m [0;34m=[0m [0mpd[0m[0;34m.[0m[0mread_csv[0m[0;34m([0m[0;34m'../input/ensample/submission_2class filter.csv'[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0;32m/opt/conda/lib/python3.7/site-packages/pandas/io/parsers.py[0m in [0;36mread_csv[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options)[0m [1;32m 603[0m [0mkwds[0m[0;34m.[0m[0mupdate[0m[0;34m([0m[0mkwds_defaults[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [1;32m 604[0m [0;34m[0m[0m [0;32m--> 605[0;31m [0;32mreturn[0m [0m_read[0m[0;34m([0m[0mfilepath_or_buffer[0m[0;34m,[0m [0mkwds[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 606[0m [0;34m[0m[0m [1;32m 607[0m [0;34m[0m[0m [0;32m/opt/conda/lib/python3.7/site-packages/pandas/io/parsers.py[0m in [0;36m_read[0;34m(filepath_or_buffer, kwds)[0m [1;32m 455[0m [0;34m[0m[0m [1;32m 456[0m [0;31m# Create the parser.[0m[0;34m[0m[0;34m[0m[0;34m[0m[0m [0;32m--> 457[0;31m [0mparser[0m [0;34m=[0m [0mTextFileReader[0m[0;34m([0m[0mfilepath_or_buffer[0m[0;34m,[0m [0;34m**[0m[0mkwds[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 458[0m [0;34m[0m[0m [1;32m 459[0m [0;32mif[0m [0mchunksize[0m [0;32mor[0m [0miterator[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m [0;32m/opt/conda/lib/python3.7/site-packages/pandas/io/parsers.py[0m in [0;36m__init__[0;34m(self, f, engine, **kwds)[0m [1;32m 812[0m [0mself[0m[0;34m.[0m[0moptions[0m[0;34m[[0m[0;34m"has_index_names"[0m[0;34m][0m [0;34m=[0m [0mkwds[0m[0;34m[[0m[0;34m"has_index_names"[0m[0;34m][0m[0;34m[0m[0;34m[0m[0m [1;32m 813[0m [0;34m[0m[0m [0;32m--> 814[0;31m [0mself[0m[0;34m.[0m[0m_engine[0m [0;34m=[0m [0mself[0m[0;34m.[0m[0m_make_engine[0m[0;34m([0m[0mself[0m[0;34m.[0m[0mengine[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 815[0m [0;34m[0m[0m [1;32m 816[0m [0;32mdef[0m [0mclose[0m[0;34m([0m[0mself[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m [0;32m/opt/conda/lib/python3.7/site-packages/pandas/io/parsers.py[0m in [0;36m_make_engine[0;34m(self, engine)[0m [1;32m 1043[0m ) [1;32m 1044[0m [0;31m# error: Too many arguments for "ParserBase"[0m[0;34m[0m[0;34m[0m[0;34m[0m[0m [0;32m-> 1045[0;31m [0;32mreturn[0m [0mmapping[0m[0;34m[[0m[0mengine[0m[0;34m][0m[0;34m([0m[0mself[0m[0;34m.[0m[0mf[0m[0;34m,[0m [0;34m**[0m[0mself[0m[0;34m.[0m[0moptions[0m[0;34m)[0m [0;31m# type: ignore[call-arg][0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 1046[0m [0;34m[0m[0m [1;32m 1047[0m [0;32mdef[0m [0m_failover_to_python[0m[0;34m([0m[0mself[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m [0;32m/opt/conda/lib/python3.7/site-packages/pandas/io/parsers.py[0m in [0;36m__init__[0;34m(self, src, **kwds)[0m [1;32m 1860[0m [0;34m[0m[0m [1;32m 1861[0m [0;31m# open handles[0m[0;34m[0m[0;34m[0m[0;34m[0m[0m [0;32m-> 1862[0;31m [0mself[0m[0;34m.[0m[0m_open_handles[0m[0;34m([0m[0msrc[0m[0;34m,[0m [0mkwds[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 1863[0m [0;32massert[0m [0mself[0m[0;34m.[0m[0mhandles[0m [0;32mis[0m [0;32mnot[0m [0;32mNone[0m[0;34m[0m[0;34m[0m[0m [1;32m 1864[0m [0;32mfor[0m [0mkey[0m [0;32min[0m [0;34m([0m[0;34m"storage_options"[0m[0;34m,[0m [0;34m"encoding"[0m[0;34m,[0m [0;34m"memory_map"[0m[0;34m,[0m [0;34m"compression"[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m [0;32m/opt/conda/lib/python3.7/site-packages/pandas/io/parsers.py[0m in [0;36m_open_handles[0;34m(self, src, kwds)[0m [1;32m 1361[0m [0mcompression[0m[0;34m=[0m[0mkwds[0m[0;34m.[0m[0mget[0m[0;34m([0m[0;34m"compression"[0m[0;34m,[0m [0;32mNone[0m[0;34m)[0m[0;34m,[0m[0;34m[0m[0;34m[0m[0m [1;32m 1362[0m [0mmemory_map[0m[0;34m=[0m[0mkwds[0m[0;34m.[0m[0mget[0m[0;34m([0m[0;34m"memory_map"[0m[0;34m,[0m [0;32mFalse[0m[0;34m)[0m[0;34m,[0m[0;34m[0m[0;34m[0m[0m [0;32m-> 1363[0;31m [0mstorage_options[0m[0;34m=[0m[0mkwds[0m[0;34m.[0m[0mget[0m[0;34m([0m[0;34m"storage_options"[0m[0;34m,[0m [0;32mNone[0m[0;34m)[0m[0;34m,[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 1364[0m ) [1;32m 1365[0m [0;34m[0m[0m [0;32m/opt/conda/lib/python3.7/site-packages/pandas/io/common.py[0m in [0;36mget_handle[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)[0m [1;32m 642[0m [0mencoding[0m[0;34m=[0m[0mioargs[0m[0;34m.[0m[0mencoding[0m[0;34m,[0m[0;34m[0m[0;34m[0m[0m [1;32m 643[0m [0merrors[0m[0;34m=[0m[0merrors[0m[0;34m,[0m[0;34m[0m[0;34m[0m[0m [0;32m--> 644[0;31m [0mnewline[0m[0;34m=[0m[0;34m""[0m[0;34m,[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 645[0m ) [1;32m 646[0m [0;32melse[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m [0;31mFileNotFoundError[0m: [Errno 2] No such file or directory: '../input/ensample/submission0.175.csv'
In [3]:
def getitem(dataframe, img_id):
"""
Parameters
----------
dataframe : pd.DataFrame
img_id : str
Returns
-------
Dictionary of radiographic observations
"""
pred = list(dataframe.loc[dataframe.image_id == img_id, "PredictionString"])[0].split(' ')
nb_elm = len(pred)//6
output = {}
for elm in range(nb_elm):
output[f'elm_{elm}'] = pred[elm*6 : (elm+1)*6]
return output
def sortDictByProba(dict_):
"""
Parameters
----------
dict_ : dict, Dictionary of radiographic observations
Returns
-------
Dictionary of radiographic observations sorted by probabilities
"""
for key in dict_.keys():
dict_[key] = list(map(lambda x: float(x), dict_[key]))
# item[1][1] corresponds to the second element of the value (the confidence of the class identified)
return {k: v for k, v in sorted(dict_.items(), key=lambda item: item[1][1], reverse = True)}
def getHighestProba(*list_of_dicts, n=3):
"""
Parameters
----------
list_of_dicts : list[dict], List of dictionaries containing radiographic observations
n : int, keep n highest elements of each list_of_dicts at most
Returns
-------
Dict of merged top3 confidence interval in each dict of list_of_dicts
"""
output = {}
for index, dict_ in enumerate(list_of_dicts):
dict_length = len(dict_)
for i in range(dict_length):
if i < n:
output[f"elm_{i}_dict_{index}"] =list(dict_.values())[i]
return output
def getUnique(dict_):
"""
Parameters
----------
dict_ : dict, Dictionary of radiographic observations
Returns
-------
List of unique class_id, list of duplicates class_id
"""
dict_length = len(dict_)
classes_non_unique = [list(dict_.values())[index][0] for index in range(dict_length)]
classes_unique = list(set(classes_non_unique))
uniques, counts = np.unique(classes_non_unique, return_counts=True)
duplicates = uniques[counts > 1]
singles = np.setdiff1d(classes_unique, duplicates)
return singles, duplicates
def getKeysByValue(dictOfElements, valueToFind):
"""
Parameters
----------
dictOfElements : dict, Dictionary of radiographic observations
valueToFind : int, corresponds to class_id
Returns
-------
List of keys of dictOfElements that contain valueToFind
"""
output = list()
listOfItems = dictOfElements.items()
for item in listOfItems:
if item[1][0] == valueToFind:
output.append(item[0])
return output
def getListKeysByValue(dictOfElements, valuesToFind):
"""
Parameters
----------
dictOfElements : dict, Dictionary of radiographic observations
valuesToFind : list[int], list of class_id
Returns
-------
List of lists of keys of dictOfElements for each value in valuesToFind
"""
output = []
for value in valuesToFind:
output.append(getKeysByValue(dictOfElements, value))
return output
def averaging(from_dict, single_keys, dupl_keys):
"""
Parameters
----------
from_dict : dict, dictionary to be filtered
single_keys : list[str], list of keys that should be infered
dupl_keys : list[str], list of class_id
Returns
-------
A filtered dictionary with averaged probs and boxes
"""
output = {}
# Infer single keys
if len(np.ravel(single_keys)) != 0:
for single in np.ravel(single_keys):
output[single] = from_dict[single]
# For each duplicates, get index of all occurences and average boxing
if len(np.ravel(dupl_keys)) != 0:
for index, list_of_duplicate_class in enumerate(dupl_keys):
probs = []
boxing1 = []
boxing2 = []
boxing3 = []
boxing4 = []
for elm in list_of_duplicate_class:
probs.append(from_dict[elm][1])
boxing1.append(from_dict[elm][2])
boxing2.append(from_dict[elm][3])
boxing3.append(from_dict[elm][4])
boxing4.append(from_dict[elm][5])
output[f"elm_{index}"] = [from_dict[list_of_duplicate_class[0]][0],
np.mean(probs),
np.mean(boxing1),
np.mean(boxing2),
np.mean(boxing3),
np.mean(boxing4)]
return output
def toString(pred_list):
"""
Parameters
----------
list_final : list[int], list of all radiographic observations
Returns
-------
A string which fits with the expected output
"""
castedList = []
for index, elm in enumerate(pred_list):
if index%6 == 0:
castedList.append(str(int(elm)))
else:
castedList.append(str(elm))
output = " ".join(castedList)
return outputIn [4]:
def main():
output = pd.DataFrame(columns = ["image_id", "PredictionString"])
for image_id in tqdm(image_ids):
# For each model, get PredictionString of image_id as a dict
fasterrcnn_pred = getitem(fasterrcnn, image_id)
detectron_pred = getitem(detectron, image_id)
yolo_pred = getitem(yolo, image_id)
# Sort dicts by proba
sorted_fasterrcnn = sortDictByProba(fasterrcnn_pred)
sorted_detectron = sortDictByProba(detectron_pred)
sorted_yolo = sortDictByProba(yolo_pred)
# Filter dicts into one dict with at most top n probs
highest_probs = getHighestProba(sorted_fasterrcnn,
sorted_detectron,
sorted_yolo,
n = 3)
# Get keys of unique and duplicates values in the filtered dict
singles, duplicates = getUnique(highest_probs)
single_keys = getListKeysByValue(highest_probs, singles)
dupl_keys = getListKeysByValue(highest_probs, duplicates)
# Apply averaging strategy
stacked_dict = averaging(highest_probs, single_keys, dupl_keys)
# Put string in right format
prediction_int = np.ravel(list(stacked_dict.values()))
prediction_string = toString(prediction_int)
output = output.append({"image_id": image_id,
"PredictionString": prediction_string},
ignore_index=True)
return outputIn [5]:
final_sub = main()
final_sub.to_csv("submission.csv", index=False)[0;31m---------------------------------------------------------------------------[0m [0;31mNameError[0m Traceback (most recent call last) [0;32m<ipython-input-5-27cf38391b15>[0m in [0;36m<module>[0;34m[0m [0;32m----> 1[0;31m [0mfinal_sub[0m [0;34m=[0m [0mmain[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 2[0m [0mfinal_sub[0m[0;34m.[0m[0mto_csv[0m[0;34m([0m[0;34m"submission.csv"[0m[0;34m,[0m [0mindex[0m[0;34m=[0m[0;32mFalse[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0;32m<ipython-input-4-dec6ed9bcdff>[0m in [0;36mmain[0;34m()[0m [1;32m 3[0m [0moutput[0m [0;34m=[0m [0mpd[0m[0;34m.[0m[0mDataFrame[0m[0;34m([0m[0mcolumns[0m [0;34m=[0m [0;34m[[0m[0;34m"image_id"[0m[0;34m,[0m [0;34m"PredictionString"[0m[0;34m][0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [1;32m 4[0m [0;34m[0m[0m [0;32m----> 5[0;31m [0;32mfor[0m [0mimage_id[0m [0;32min[0m [0mtqdm[0m[0;34m([0m[0mimage_ids[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 6[0m [0;34m[0m[0m [1;32m 7[0m [0;31m# For each model, get PredictionString of image_id as a dict[0m[0;34m[0m[0;34m[0m[0;34m[0m[0m [0;31mNameError[0m: name 'image_ids' is not defined