{"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":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 1.0 | IMPORTANDO AS BIBLIOTECAS NECESSÁRIAS","metadata":{}},{"cell_type":"code","source":"pip install selectivesearch","metadata":{"execution":{"iopub.status.busy":"2023-03-27T11:21:27.450687Z","iopub.execute_input":"2023-03-27T11:21:27.451113Z","iopub.status.idle":"2023-03-27T11:21:44.010143Z","shell.execute_reply.started":"2023-03-27T11:21:27.451072Z","shell.execute_reply":"2023-03-27T11:21:44.008626Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import selectivesearch\nimport cv2\nimport numpy as np\nimport glob\nimport os\nfrom keras.applications.vgg19 import VGG19\nfrom keras.layers import Flatten, Dense\nfrom keras.models import Model\nfrom keras.preprocessing.image import ImageDataGenerator\n","metadata":{"execution":{"iopub.status.busy":"2023-03-27T11:21:44.015087Z","iopub.execute_input":"2023-03-27T11:21:44.015488Z","iopub.status.idle":"2023-03-27T11:21:55.390974Z","shell.execute_reply.started":"2023-03-27T11:21:44.015454Z","shell.execute_reply":"2023-03-27T11:21:55.389447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2.0 | Implementando o Selective Search\n   ****Para Detecção de regiões de interesse nas imagems.****\n\n    ","metadata":{}},{"cell_type":"code","source":"def selective_search(image):\n    regions = selectivesearch.selective_search(image, scale=500, sigma=0.9, min_size=10)\n    boxes = []\n    for r in regions:\n        if r['rect'] in boxes:\n            continue\n        boxes.append(r['rect'])\n    return boxes\n\ndef extract_regions(image_path, output_path):\n    image = cv2.imread(image_path)\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    boxes = selective_search(image)\n    for i, box in enumerate(boxes):\n        x, y, w, h = box\n        region = image[y:y+h, x:x+w]\n        region_path = os.path.join(output_path, f'{os.path.basename(image_path)}_{i}.jpg')\n        cv2.imwrite(region_path, region)\n\ndef create_dataset(input_path, output_path):\n    if not os.path.exists(output_path):\n        os.makedirs(output_path)\n    for image_path in glob.glob(os.path.join(input_path, '*.jpg')):\n        extract_regions(image_path, output_path)\n    ","metadata":{"execution":{"iopub.status.busy":"2023-03-27T11:21:55.392700Z","iopub.execute_input":"2023-03-27T11:21:55.393706Z","iopub.status.idle":"2023-03-27T11:21:55.406416Z","shell.execute_reply.started":"2023-03-27T11:21:55.393646Z","shell.execute_reply":"2023-03-27T11:21:55.404754Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3.0 | Extraindo as regiões de interesse e criando um conjunto de dados com as informações","metadata":{}},{"cell_type":"code","source":"images_path = 'dogs-vs-cats/train/*.jpg'\noutput_path = 'regions/train'\n#output_path = 'regions/test'\n\n\nif not os.path.exists(output_path):\n    os.makedirs(output_path)\n\nfor image_path in glob.glob(images_path):\n    image_name = os.path.basename(image_path)\n    regions = extract_regions(image_path)\n    for i, region in enumerate(regions):\n        region_name = f'{image_name}_{i}.jpg'\n        region_path = os.path.join(output_path, region_name)\n        cv2.imwrite(region_path, region)","metadata":{"execution":{"iopub.status.busy":"2023-03-27T11:21:55.408795Z","iopub.execute_input":"2023-03-27T11:21:55.409137Z","iopub.status.idle":"2023-03-27T11:21:55.418075Z","shell.execute_reply.started":"2023-03-27T11:21:55.409105Z","shell.execute_reply":"2023-03-27T11:21:55.416641Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 4.0 | Utilizando o conjunto de dados para treinar a rede neural convolucional com a VGG-19 para classificar as imagens","metadata":{}},{"cell_type":"code","source":"num_classes = 2\ninput_shape = (224, 224, 3)\n\nbase_model = VGG19(weights='imagenet', include_top=False, input_shape=input_shape)\n\nx = base_model.output\nx = Flatten()(x)\nx = Dense(256, activation='relu')(x)\npredictions = Dense(num_classes, activation='softmax')(x)\n\nmodel = Model(inputs=base_model.input, outputs=predictions)\n\nfor layer in base_model.layers:\n    layer.trainable = False\n\nmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n\ntrain_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)\ntest_datagen = ImageDataGenerator(rescale=1./255)\n\ntrain_generator = train_datagen.flow_from_directory('/kaggle/working/train', target_size=input_shape[:2], batch_size=32, class_mode='categorical')\ntest_generator = test_datagen.flow_from_directory('/kaggle/working/test1', target_size=input_shape[:2], batch_size=32, class_mode='categorical')\n\nmodel.fit_generator(train_generator, steps_per_epoch=train_generator.samples//train_generator.batch_size, epochs=10, validation_data=test_generator, validation_steps=test_generator.samples//test_generator.batch_size)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 5.0 | Avaliando a precisão da rede Neural","metadata":{}},{"cell_type":"code","source":"test_loss, test_acc = model.evaluate_generator(test_generator, steps=test_generator.samples//test_generator.batch_size)\n\nprint(f'Test accuracy: {test_acc}')","metadata":{"execution":{"iopub.status.busy":"2023-03-27T11:21:57.877038Z","iopub.status.idle":"2023-03-27T11:21:57.877609Z","shell.execute_reply.started":"2023-03-27T11:21:57.877376Z","shell.execute_reply":"2023-03-27T11:21:57.877403Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}