Deep Learning

✨ Hành trình học deep learning

Giải thích về mô hình Faster RCNN - Phần 2: RPN - giải thích code bằng pytorch


In [1]:
%matplotlib inline
%load_ext autoreload
%autoreload 2
In [2]:
from pycocotools.coco import COCO
import numpy as np
import matplotlib.pyplot as plt
import pylab
pylab.rcParams['figure.figsize'] = (10.0, 8.0)
from scipy.misc import imread
import matplotlib.patches as patches
from torch.utils.data import DataLoader
import cv2
import torch
from torch.autograd import  Variable
from faster_rcnn.utils.images import imshow
from faster_rcnn.fastrcnn.bbox_transform import bbox_transform

Đọc dữ liệu từ MS COCO dataset

In [3]:
import os
import torchvision.transforms as transforms
from faster_rcnn.utils.datasets.mscoco.dataset import CocoData
from faster_rcnn.utils.datasets.data_generator import CocoGenerator
from faster_rcnn.utils.datasets.data_generator import Enqueuer

dataDir = './data/mscoco'
dataType = 'train2014'
annFile='%s/annotations/instances_%s.json'%(dataDir,dataType)
pre_proposal_folder = './data/mscoco/coco_proposals/MCG/'

images_dir = os.path.join(dataDir,'images', dataType)
cap = CocoData(root = images_dir, annFile = annFile)

data_gen = CocoGenerator(data=cap)
queue = Enqueuer(generator=data_gen)
queue.start(max_queue_size=10, workers=2)
t = queue.get()
loading annotations into memory...
Done (t=13.56s)
creating index...
index created!

RPN

Mục đích

  • Do Fast RCNN vẫn phụ thuộc vào Selective search để tính toán các proposal region dẫn đến kết quả tính toán rất chậm
  • RPN dùng để tính toán proposal region mà không cần phụ thuộc vào các thuật toán khác

Cách hoạt động

  • Sử dụng một cửa sổ trượt trên feature map
  • tạo một network nhỏ để tính

    • Phân loạt một anchor có chứa hay không chưa object (Anchor good / bad)
    • Tính toán các trị số của proposal regions (box regression)
  • Vị trí của cửa sổ trượt trên feature map, cho biết thông tin về vị trí của anchor trên ảnh gốc

Input

  • Hình ảnh: là tensor có kích thước

    $[batchsize, dim, im\_height, im\_width]$

  • bounding box:

    $(x_1, y_1, x_2, y_2)$

    • $x_1, y_1$ : tọa độ x,y của điểm trái dưới (lower-left)
    • $x_2, y_2$ : tọa độ x,y của điểm phải trên (top - right)

Output

  • RPN classification (anchor good / bad)
  • RPN regression (anchor -> proposal)

Cùng xem định dạng của một input

In [4]:
data = cap[13499]
im = data['tensor']
gt_boxes =  data['boxes']
image_data = im[0]

print(im.shape)
print(gt_boxes)
torch.Size([1, 3, 600, 800])
[[140.   253.75 185.   430.  ]
 [318.75 247.5  442.5  388.75]
 [397.5  242.5  571.25 395.  ]]

Thử hiển thị ảnh cùng các bounding boxes

In [5]:
imshow(image_data, gt_boxes)