{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Эффективное чтение картинок и получение дополнительных фичей для обучения модели\n\nМетод помогает получить из картинок указаные фичи, при этом читаются картинки последовательно и не забивает полностью оперативную память","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"code","source":"import os\nimport cv2\nimport numpy as np\nimport pandas as pd","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Читаем исходные данные","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('train.csv')\ntest = pd.read_csv('sample_submission.csv')\n\nprint(f'{train.shape=}, {test.shape=}')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Далее реализуем методы, которые получают статичстические показатели по картинке","metadata":{}},{"cell_type":"code","source":"#яркость\ndef brightness(img):\n    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)\n    v = hsv[..., 2].mean()\n    return v / 255 # normalization\n\n#резкость\ndef sharpness_grad_based(img):\n    gradx = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=1)\n    grady = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=1)\n    grad = np.sqrt(gradx * gradx + grady * grady)\n    return grad[1: -1, 1: -1].mean()\n\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Далее в одной функции составляем итоговый pd.Series, в котором будет перечислены все новые фичи по одной картинке","metadata":{}},{"cell_type":"code","source":"base_path = 'SBC22_IQA_dataset'\ndef get_columns_from_image(image: pd.Series, folder):\n    \n    full_path = os.path.join(base_path, folder, image)\n\n    img = cv2.imread(full_path)\n\n    b = brightness(img)\n    s = sharpness_grad_based(img)\n\n    return pd.Series({\n        'brightness':b,\n        'sharpness_grad_based':s\n        })\n    \n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Теперь необходимо применить цикл для каждой картинки, это можно сделать с помощью метода **apply**, который пройдется по каждому файлу и в итоге выдаст новые фичи.\n\nпосле этого метода остается только объединить результат с текущим датасетом с помощью метода **join**","metadata":{}},{"cell_type":"code","source":"train = train.join(train['img_name'].apply(lambda x: get_columns_from_image(x,'train') ))\ntrain.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"полученый результат сохраняем в отдельный csv, и далее можно переходить к обучению","metadata":{}},{"cell_type":"code","source":"train.to_csv('train_full.csv',index=False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"аналогично делаем для тестового набора","metadata":{}},{"cell_type":"code","source":"test = test.join(test['img_name'].apply(lambda x: get_columns_from_image(x,'test') ))\n\ntest.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.to_csv('test_full.csv',index=False)","metadata":{},"execution_count":null,"outputs":[]}]}