My custom dataset look like this now
class FotDataset(object):
    def __init__(self, csv_name):
        
        self.dtype = torch.cuda.FloatTensor if torch.cuda.is_available() else torch.FloatTensor
        self.to_tensor = T.ToTensor()
        
        self.df = pd.read_csv(csv_name)
        if len(self.df.columns) < 3:
            self.df = pd.read_csv(csv_name, sep=';')
        
        self.df.columns = [str(i) for i in self.df.columns]
    
    def __len__(self):
        return len(self.df)
    
    def __getitem__(self, idx):
        img_name = self.df.loc[idx, 'img']
        img_path = os.path.join('imgFot',img_name)
        
        image = cv2.imread(img_path)
        
        kpts = np.array(self.df.iloc[idx, 1:]).astype(np.float32).reshape([-1, 3]) # [x, y, visibility]
        h, w = image.shape[:2]
        
        if w < 640:
            image = imutils.resize(image, width=640)
        
        boxes = np.array([0, 0, w, h])
        labels = np.zeros((1, 1), dtype=np.float)
        
        target = {}
        target["boxes"] = torch.from_numpy(boxes).type(self.dtype)
        target["labels"] = torch.from_numpy(labels).type(self.dtype)
        target["keypoints"] = torch.from_numpy(kpts).type(self.dtype)
        
        img = T.ToPILImage()(image).convert('RGB')
        img = self.to_tensor(img)        

        return img, target

And I’m getting the model:
def get_model():
    is_available = torch.cuda.is_available()
    device = torch.device('cuda:0' if is_available else 'cpu')
    dtype = torch.cuda.FloatTensor if is_available else torch.FloatTensor
    model = torchvision.models.detection.keypointrcnn_resnet50_fpn(pretrained=True, min_size=640)
    
    for param in model.parameters():
        param.requires_grad = False
    
    out = nn.ConvTranspose2d(512, 12, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
    model.roi_heads.keypoint_predictor.kps_score_lowres = out
    
    return model, device, dtype

To test the training pipeline:
for img, target in train_loader:
    img = img.type(dtype).to(device)
    
    print(img.size())
    
    boxes = target['boxes']
    labels = target['labels']
    keypoints = target['keypoints']

    print(model(img, [target]))

But I got this error:
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-25-62c932082619> in <module>
      8     keypoints = target['keypoints']
      9 
---> 10     print(model(img, [target]))
     11 

~/anaconda3/lib/python3.7/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    491             result = self._slow_forward(*input, **kwargs)
    492         else:
--> 493             result = self.forward(*input, **kwargs)
    494         for hook in self._forward_hooks.values():
    495             hook_result = hook(self, input, result)

~/anaconda3/lib/python3.7/site-packages/torchvision-0.3.0a0+427633a-py3.7-macosx-10.7-x86_64.egg/torchvision/models/detection/generalized_rcnn.py in forward(self, images, targets)
     50             features = OrderedDict([(0, features)])
     51         proposals, proposal_losses = self.rpn(images, features, targets)
---> 52         detections, detector_losses = self.roi_heads(features, proposals, images.image_sizes, targets)
     53         detections = self.transform.postprocess(detections, images.image_sizes, original_image_sizes)
     54 

~/anaconda3/lib/python3.7/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    491             result = self._slow_forward(*input, **kwargs)
    492         else:
--> 493             result = self.forward(*input, **kwargs)
    494         for hook in self._forward_hooks.values():
    495             hook_result = hook(self, input, result)

~/anaconda3/lib/python3.7/site-packages/torchvision-0.3.0a0+427633a-py3.7-macosx-10.7-x86_64.egg/torchvision/models/detection/roi_heads.py in forward(self, features, proposals, image_shapes, targets)
    527         """
    528         if self.training:
--> 529             proposals, matched_idxs, labels, regression_targets = self.select_training_samples(proposals, targets)
    530 
    531         box_features = self.box_roi_pool(features, proposals, image_shapes)

~/anaconda3/lib/python3.7/site-packages/torchvision-0.3.0a0+427633a-py3.7-macosx-10.7-x86_64.egg/torchvision/models/detection/roi_heads.py in select_training_samples(self, proposals, targets)
    452         matched_idxs, labels = self.assign_targets_to_proposals(proposals, gt_boxes, gt_labels)
    453         # sample a fixed proportion of positive-negative proposals
--> 454         sampled_inds = self.subsample(labels)
    455         matched_gt_boxes = []
    456         num_images = len(proposals)

~/anaconda3/lib/python3.7/site-packages/torchvision-0.3.0a0+427633a-py3.7-macosx-10.7-x86_64.egg/torchvision/models/detection/roi_heads.py in subsample(self, labels)
    417 
    418     def subsample(self, labels):
--> 419         sampled_pos_inds, sampled_neg_inds = self.fg_bg_sampler(labels)
    420         sampled_inds = []
    421         for img_idx, (pos_inds_img, neg_inds_img) in enumerate(

~/anaconda3/lib/python3.7/site-packages/torchvision-0.3.0a0+427633a-py3.7-macosx-10.7-x86_64.egg/torchvision/models/detection/_utils.py in __call__(self, matched_idxs)
     54 
     55             pos_idx_per_image = positive[perm1]
---> 56             neg_idx_per_image = negative[perm2]
     57 
     58             # create binary mask from indices

IndexError: index 3764 is out of bounds for dimension 0 with size 2001

I really need some help to fix this and be able to retrain this model on my data. Even if you are stuck too, any thoughts will be appreciated.