def process (self, image_list):
        """
        Args:
            image_list: list of tuples, where first element is an image_name,
                second element is a dictionary with the hand bounding_boxes 
                as well as other information
        """
        hand_mesh_list = []
        print('Extracting hand pose and hand mesh...')
        for image_name, hand_info in tqdm(image_list):
            save_name = os.path.join(self.cache_loc,
                    ('#'.join(image_name.split('/')[-3:])[:-self.extension_length])+'.pkl')
            
            if os.path.exists(save_name) and not self.overwrite:
                with open(save_name, 'rb')  as f :
                    hand_mesh_list.append(pickle.load(f))   
            else:
                hand_mesh = {}
                # crop the image for the left hand
                # pass through the model
                for which_hand in ['left', 'right']:
                    if which_hand in hand_info:
                        image_raw = cv2.imread(image_name)
                        # cropping the hand
                        crop = image_raw[int(hand_info[which_hand]['top_y']):int(hand_info[which_hand]['bottom_y'])+1, 
                                    int(hand_info[which_hand]['left_x']):int(hand_info[which_hand]['right_x'])+1, :]
                        frame= preprocess_frame(crop)
                        img = Image.fromarray(frame.copy())
                        hand_crop = cv2.resize(np.array(img), (256, 256)) 
                        
                        if which_hand == 'left':
                            hand_image = prepare_input(hand_crop, flip_left_right=False)
                        elif which_hand == 'right':
                            hand_image= prepare_input(hand_crop, flip_left_right=True)

                        output = self.forward_pass_3d(self.model, hand_image)
                        verts = output['verts'].cpu().detach().numpy()[0]
                        joints = output['joints'].cpu().detach().numpy()[0]
                        hand_mesh[which_hand] = {'verts': verts, 'joints': joints}
                
                hand_mesh_list.append(hand_mesh)
                # save into cache
                with open(save_name, 'wb') as f:
                    pickle.dump(hand_mesh, f)
        return hand_mesh_list                
    model = reload_model(args.resume, opts, no_beta=args.no_beta)

    model.eval()

    print("Input image is processed flipped and unflipped "
          "(as left and right hand), both outputs are displayed")

    # load faces of hand
    with open("misc/mano/MANO_RIGHT.pkl", "rb") as p_f:
        mano_right_data = pickle.load(p_f, encoding="latin1")
        faces = mano_right_data["f"]

    fig = plt.figure(figsize=(4, 4))
    fig.clf()
    frame = cv2.imread(args.image_path)
    frame = preprocess_frame(frame)
    input_image = prepare_input(frame)
    cv2.imshow("input", frame)
    img = Image.fromarray(frame.copy())
    hand_crop = cv2.resize(np.array(img), (256, 256))

    noflip_hand_image = prepare_input(hand_crop, flip_left_right=False)
    flip_hand_image = prepare_input(hand_crop, flip_left_right=True)
    noflip_output = forward_pass_3d(model, noflip_hand_image)
    flip_output = forward_pass_3d(model, flip_hand_image)
    flip_verts = flip_output["verts"].cpu().detach().numpy()[0]
    noflip_verts = noflip_output["verts"].cpu().detach().numpy()[0]
    ax = fig.add_subplot(1, 2, 1, projection="3d")
    ax.title.set_text("unflipped input")
    displaymano.add_mesh(ax, flip_verts, faces, flip_x=True)
    if "objpoints3d" in flip_output: