<jupyter_start><jupyter_text>Đọc dữ liệu từ MS COCO dataset<jupyter_code>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, sorted_index=sorted_index, batch_size=3)
queue = Enqueuer(generator=data_gen)
queue.start(max_queue_size=10, workers=2)
t = queue.get()<jupyter_output>loading annotations into memory...
Done (t=10.07s)
creating index...
index created!<jupyter_text>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<jupyter_code>blobs = t.next()
max_height = np.max([blob['tensor'].shape[2] for blob in blobs])
max_width = np.max([blob['tensor'].shape[3] for blob in blobs])
batch_tensor = torch.Tensor(3, 3, max_height, max_width).fill_(0).type_as(blob['tensor'])
for i, blob in enumerate(blobs):
    shape = blob['tensor'].shape
    batch_tensor[i,:, :shape[2], :shape[3] ]= blob['tensor']
total_boxes = 0
batch_boxes = np.empty((0, 4))
batch_boxes_index = np.empty((0,), dtype=np.int)

for i, blob in enumerate(blobs):
    total_boxes = blob['boxes'].shape[0]
    batch_boxes = np.vstack((batch_boxes, blob['boxes']))
    a =  np.zeros((total_boxes , ), dtype=np.int)
    a.fill(i)
    batch_boxes_index = np.concatenate((batch_boxes_index, a), axis=0)
    
print batch_boxes_index
print batch_boxes<jupyter_output>[0 0 1 1 1 2 2]
[[  48.57142857  465.71428571  537.14285714 1774.28571429]
 [ 220.         1065.71428571  382.85714286 1771.42857143]
 [ 326.76056338  315.49295775  394.36619718  580.28169014]
 [  76.05633803  290.14084507  242.25352113  788.73239437]
 [  11.26760563    8.45070423  585.91549296 1769.01408451]
 [ 178.125       221.875       287.5         975.        ]
 [ 321.875       334.375       434.375       984.375     ]]<jupyter_text>Thử hiển thị ảnh cùng các bounding boxes<jupyter_code>blobs[0]['boxes']
imshow(batch_tensor[0], blobs[0]['boxes'])
imshow(batch_tensor[1], blobs[1]['boxes'])
imshow(batch_tensor[2], blobs[2]['boxes'])
from faster_rcnn.faster_rcnn import  RPN
rpn_network = RPN()
rpn_network.cuda()<jupyter_output>/opt/conda/envs/pytorch/lib/python2.7/site-packages/torch/nn/parallel/data_parallel.py:24: UserWarning: 
    There is an imbalance between your GPUs. You may want to exclude GPU 0 which
    has less than 75% of the memory or cores of GPU 1. You can do so by setting
    the device_ids argument to DataParallel, or by setting the CUDA_VISIBLE_DEVICES
    environment variable.
  warnings.warn(imbalance_warn.format(device_ids[min_pos], device_ids[max_pos]))<jupyter_text>Tính toán feed-forwardChúng ta sử dụng một ảnh có kích thước đầu vào là  `(width , height) = (600, 800)`Input:    - im_data :         kích thước : (batch_size, dim, witdh, height)    - ground_boxes:         kích thước (n, 4)          Tính `cnn features`  Sử dụng mạng CNN đã được train trên Imagenet, cụ thể là VGG16 để tính toán `cnn features`<jupyter_code># convert tensor to variable
x = Variable(batch_tensor).cuda()
cnn_feature = rpn_network.features(x)<jupyter_output><empty_output><jupyter_text>Chúng ta nhận được cnn_features có kích thước là  (37 , 50)<jupyter_code>print cnn_feature.shape
print x.shape
feature_height, feature_width = cnn_feature.shape[2], cnn_feature.shape[3]
im_height, im_width = x.shape[2] , x.shape[3]
batch_size = cnn_feature.shape[0]<jupyter_output><empty_output><jupyter_text>Nhận xétSau khi feed-forward một lần đối với ảnh gốc, thu được convolutional features của ảnh đó. Ví dụ với một hình ảnh có kích thước $600 * 800 * 3$, ta sẽ thu được convolutional features với kích thước $37 * 50 * 512$. Kích thước của features bị giảm nhỏ khoảng 16 lần $\frac{600}{37}$.  AnchorTargerLayerSau khi thu được Convolutional Feature, chúng ta sẽ cùng tìm hiểu về AnchorTargetLayer. Vai trò của AnchorTargetlayer    Gán cho anchor tương ứng với ground-truth boxes.     Tạo ra nhãn tương ứng cho từng anchor (bằng cách tính toán IOU)    Tính giá trị mục tiêu của bounding-box regressionTính toán đầu ra của RPN- rpn_labels : (HxWxA, 1), for each anchor, 0 denotes bg, 1 fg, -1 dontcare- rpn_bbox_targets: (HxWxA, 4), distances of the anchors to the gt_boxes(may contains some transform) that are the regression objectives- rpn_bbox_inside_weights: (HxWxA, 4) weights of each boxes, mainly accepts hyper param in cfg- rpn_bbox_outside_weights: (HxWxA, 4) used to balance the fg/bg, beacuse the numbers of bgs and fgs mays significiantly different<jupyter_code>from faster_rcnn.rpn_msr.anchor_target_layer_2 import AnchorTargerLayer
anchor_target_layer = AnchorTargerLayer(feat_stride=[16,], anchor_scales=[8, 16 ,32])<jupyter_output><empty_output><jupyter_text>Tạo các anchor tương ứng với vị trí ảnh tại vị trí [0. , 0. , 0., 0.]<jupyter_code>features, rpn_bbox_pred, rpn_cls_score =  rpn_network._computer_forward(x)
im_info = torch.Tensor([[im_height, im_width]])
batch_boxes_index = torch.Tensor(batch_boxes_index)
batch_boxes = torch.Tensor(batch_boxes).numpy()



all_anchors = anchor_target_layer._create_anchors(feature_height, feature_width)
total_anchors = all_anchors.shape[0]

# only keep anchors inside the image
inside_anchors, inside_anchor_indexes = anchor_target_layer._filter_outside_anchors(
    all_anchors, im_height, im_width)
print all_anchors.shape
print inside_anchors.shape
inside_anchors.shape
inside_anchor_indexes.shape
print batch_boxes
print batch_boxes_index
target = anchor_target_layer.calculate_target(inside_anchors, batch_size, inside_anchor_indexes, batch_boxes, batch_boxes_index.numpy())

result = anchor_target_layer((rpn_cls_score, torch.Tensor(batch_boxes), im_info, batch_boxes_index))
print(result[0][0].shape)
print target[0].shape
print target[1].shape
print result[0][1].numpy() == 1
print all_anchors.shape
i = 2
imshow(batch_tensor[i], blobs[i]['boxes'] ,inside_anchors[target[0][i] == 1] )
# imshow(batch_tensor[i], blobs[i]['boxes'] ,all_anchors[result[0][i].numpy() == 0] )<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10429703796412182, 'fraction_numerical': 0.05284383256848839, 'mean_word_length': 5.008354218880535, 'pattern_counts': {'":': 0, '<': 26, '<?xml version=': 0, '>': 27, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '228152', 'license': 'MIT', 'n_tokens_mistral': 3132, 'n_tokens_neox': 2904, 'n_words': 718, 'path': 'notebooks/RPN Module BatchSize.ipynb', 'repo_name': 'anhlt/faster_rcnn', 'size': '7191'}