{
  "id": 124182,
  "title": "How to use facenet-pytorch to crop faces from a frame?",
  "url": "/competitions/deepfake-detection-challenge/discussion/124182",
  "author_name": "",
  "post_date": "2020-01-02T12:54:06.037935900Z",
  "votes": 7,
  "comment_count": 12,
  "views": 0,
  "content": "<p>I learned something about facenet-pytorch from timesler's <a href=\"https://www.kaggle.com/timesler/facial-recognition-model-in-pytorch\">kernel</a>\nAnd I find it is much faster than dlib. But I still can't figure out the data type in it.\nframe is a ndarray whose shape is (1080, 1920, 3)\nAfter \n<code>faces = mtcnn(frames)</code>\nfaces[0] becomes a tensor whose shape is torch.Size([3, 160, 160])</p>\n\n<p>How can I transfrom the tensor to a simple ndarray?(I guess it should be [160, 160, 3], dtype=uint8). I mean what if I just want to use the facenet-pytorch to crop faces from a frame, and then the ndarray can be the input of my network.</p>\n\n<p>Thanks for any opinion!</p>",
  "messages": [
    {
      "id": "708579",
      "postDate": "01/02/2020 12:54:06",
      "content": "<p>I learned something about facenet-pytorch from timesler's <a href=\"https://www.kaggle.com/timesler/facial-recognition-model-in-pytorch\">kernel</a>\nAnd I find it is much faster than dlib. But I still can't figure out the data type in it.\nframe is a ndarray whose shape is (1080, 1920, 3)\nAfter \n<code>faces = mtcnn(frames)</code>\nfaces[0] becomes a tensor whose shape is torch.Size([3, 160, 160])</p>\n\n<p>How can I transfrom the tensor to a simple ndarray?(I guess it should be [160, 160, 3], dtype=uint8). I mean what if I just want to use the facenet-pytorch to crop faces from a frame, and then the ndarray can be the input of my network.</p>\n\n<p>Thanks for any opinion!</p>",
      "rawMarkdown": "I learned something about facenet-pytorch from timesler's [kernel](https://www.kaggle.com/timesler/facial-recognition-model-in-pytorch)\nAnd I find it is much faster than dlib. But I still can't figure out the data type in it.\nframe is a ndarray whose shape is (1080, 1920, 3)\nAfter \n`faces = mtcnn(frames)`\nfaces[0] becomes a tensor whose shape is torch.Size([3, 160, 160])\n\nHow can I transfrom the tensor to a simple ndarray?(I guess it should be [160, 160, 3], dtype=uint8). I mean what if I just want to use the facenet-pytorch to crop faces from a frame, and then the ndarray can be the input of my network.\n\nThanks for any opinion!",
      "votes": null
    },
    {
      "id": "708591",
      "postDate": "01/02/2020 13:05:02",
      "content": "<p><a href=\"https://pytorch.org/docs/stable/torch.html#torch.transpose\">https://pytorch.org/docs/stable/torch.html#torch.transpose</a>\nor .numpy().transpose([1,2,0])  # channels last</p>",
      "rawMarkdown": "https://pytorch.org/docs/stable/torch.html#torch.transpose\nor .numpy().transpose([1,2,0])  # channels last",
      "votes": null
    },
    {
      "id": "708600",
      "postDate": "01/02/2020 13:18:13",
      "content": "<p>Thank you.\nAfter <code>.numpy().transpose([1,2,0]</code> the shape seems right!\nBut the tensor's value is between -1 and 0, I've tried <code>plt.imshow((255 * face_numpy).astype(int) + 255)</code> and <code>plt.imshow((-255 * face_numpy).astype(int))</code>. But neither looks right.</p>",
      "rawMarkdown": "Thank you.\nAfter `.numpy().transpose([1,2,0]` the shape seems right!\nBut the tensor's value is between -1 and 0, I've tried `plt.imshow((255 * face_numpy).astype(int) + 255)` and `plt.imshow((-255 * face_numpy).astype(int)) `. But neither looks right.",
      "votes": null
    },
    {
      "id": "708687",
      "postDate": "01/02/2020 14:50:41",
      "content": "<p>By default, the MTCNN module of <code>facenet-pytorch</code> applies some fixed image standardization to faces before returning so they are well suited for the package's face recognition model.</p>\n\n<p>If you want to get out images that look more normal to the human eye, you have a few options:</p>\n\n<p><strong>1. Prevent standardization:</strong></p>\n\n<ul>\n<li><p>For one face per frame:</p>\n\n<p>```\nmtcnn = MTCNN(post_process=False, device='cuda:0')\nfaces = mtcnn(frames) # returns a list of one face per frame</p>\n\n<p>face = faces[0]</p>\n\n<p>plt.imshow(face.permute(1, 2, 0).int().numpy())\n```</p></li>\n<li><p>For all detected faces per frame:</p>\n\n<p>```\nmtcnn = MTCNN(post_process=False, keep_all=True, device='cuda:0')\nfaces = mtcnn(frames) # returns a list of 4D tensors (num_faces x 3 x M x N)</p>\n\n<p>face = faces[0][0]</p>\n\n<p>plt.imshow(face.permute(1, 2, 0).int().numpy())\n```</p></li>\n</ul>\n\n<p><strong>2. Use bounding boxes directly:</strong></p>\n\n<p>This method has the advantage that the faces are returned at the resolution and aspect ratio of the face in the original image.</p>\n\n<ul>\n<li><p>Just bounding boxes and probabilities:</p>\n\n<p>```\nmtcnn = MTCNN(device='cuda:0')\nboxes, probs = mtcnn.detect(frames)</p>\n\n<p>frame = frames[0]\nbox = boxes[0][0]</p>\n\n<p>plt.imshow(frame.crop(box))\n```</p></li>\n<li><p>With facial landmarks:</p>\n\n<p>```\nmtcnn = MTCNN(device='cuda:0')\nboxes, probs, landmarks = mtcnn.detect(frames, landmarks=True)</p>\n\n<p>frame = frames[0]\nbox = boxes[0][0]\nlandmark = landmarks[0][0]</p>\n\n<p>plt.imshow(frame.crop(box))\nplt.scatter(landmark[:, 0] - box[0], landmark[:, 1] - box[1])\n```</p></li>\n</ul>\n\n<p><strong>3. Use saved image (saved image is not normalized):</strong></p>\n\n<ul>\n<li><p>For one face only:</p>\n\n<p><code>\nmtcnn = MTCNN(device='cuda:0')\nfaces = mtcnn(frames, save_path=[f'frame_{i}_face.jpg' for i in range(len(frames))])\n</code></p></li>\n<li><p>For all detected faces:</p>\n\n<p><code>\nmtcnn = MTCNN(keep_all=True, device='cuda:0')\nfaces = mtcnn(frames, save_path=[f'frame_{i}_face.jpg' for i in range(len(frames))])\n</code></p></li>\n</ul>\n\n<p>Disclaimer: I'm the package author :)</p>",
      "rawMarkdown": "By default, the MTCNN module of `facenet-pytorch` applies some fixed image standardization to faces before returning so they are well suited for the package's face recognition model.\n\nIf you want to get out images that look more normal to the human eye, you have a few options:\n\n**1. Prevent standardization:**\n\n* For one face per frame:\n    \n    ```\n    mtcnn = MTCNN(post_process=False, device='cuda:0')\n    faces = mtcnn(frames) # returns a list of one face per frame\n    \n    face = faces[0]\n    \n    plt.imshow(face.permute(1, 2, 0).int().numpy())\n    ```\n    \n* For all detected faces per frame:\n    \n    ```\n    mtcnn = MTCNN(post_process=False, keep_all=True, device='cuda:0')\n    faces = mtcnn(frames) # returns a list of 4D tensors (num_faces x 3 x M x N)\n    \n    face = faces[0][0]\n    \n    plt.imshow(face.permute(1, 2, 0).int().numpy())\n    ```\n\n**2. Use bounding boxes directly:**\n\nThis method has the advantage that the faces are returned at the resolution and aspect ratio of the face in the original image.\n\n* Just bounding boxes and probabilities:\n    \n    ```\n    mtcnn = MTCNN(device='cuda:0')\n    boxes, probs = mtcnn.detect(frames)\n    \n    frame = frames[0]\n    box = boxes[0][0]\n        \n    plt.imshow(frame.crop(box))\n    ```\n    \n* With facial landmarks:\n    \n    ```\n    mtcnn = MTCNN(device='cuda:0')\n    boxes, probs, landmarks = mtcnn.detect(frames, landmarks=True)\n    \n    frame = frames[0]\n    box = boxes[0][0]\n    landmark = landmarks[0][0]\n    \n    plt.imshow(frame.crop(box))\n    plt.scatter(landmark[:, 0] - box[0], landmark[:, 1] - box[1])\n    ```\n\n**3. Use saved image (saved image is not normalized):**\n\n* For one face only:\n    \n    ```\n    mtcnn = MTCNN(device='cuda:0')\n    faces = mtcnn(frames, save_path=[f'frame_{i}_face.jpg' for i in range(len(frames))])\n    ```\n    \n* For all detected faces:\n    \n    ```\n    mtcnn = MTCNN(keep_all=True, device='cuda:0')\n    faces = mtcnn(frames, save_path=[f'frame_{i}_face.jpg' for i in range(len(frames))])\n    ```\n\nDisclaimer: I'm the package author :)",
      "votes": null
    },
    {
      "id": "708776",
      "postDate": "01/02/2020 17:11:48",
      "content": "<p>Thank you and your great job!\nMy issue is solved. I would read your github in detail later.\nYou are really helpful, thanks again!</p>",
      "rawMarkdown": "Thank you and your great job!\nMy issue is solved. I would read your github in detail later.\nYou are really helpful, thanks again!",
      "votes": null
    },
    {
      "id": "709039",
      "postDate": "01/03/2020 00:56:52",
      "content": "<p>Here's a more detailed guide to MTCNN with <code>facenet-pytorch</code>: <a href=\"https://www.kaggle.com/timesler/guide-to-mtcnn-in-facenet-pytorch\">Guide to MTCNN in facenet-pytorch</a></p>",
      "rawMarkdown": "Here's a more detailed guide to MTCNN with `facenet-pytorch`: [Guide to MTCNN in facenet-pytorch](https://www.kaggle.com/timesler/guide-to-mtcnn-in-facenet-pytorch)",
      "votes": null
    },
    {
      "id": "722011",
      "postDate": "01/18/2020 01:48:58",
      "content": "<p>Is there a reasonable way to keep the detected faces separate (face 1 series, face 2 series) rather than mixing them?</p>",
      "rawMarkdown": "Is there a reasonable way to keep the detected faces separate (face 1 series, face 2 series) rather than mixing them?",
      "votes": null
    },
    {
      "id": "722869",
      "postDate": "01/19/2020 08:26:42",
      "content": "<p>Anyone knows how to use facenet-pytorch in kaggle notebooks?</p>",
      "rawMarkdown": "Anyone knows how to use facenet-pytorch in kaggle notebooks?",
      "votes": null
    },
    {
      "id": "722891",
      "postDate": "01/19/2020 09:10:38",
      "content": "<p>You can use the dataset for facenet-pytorch. Like in the following notebook:</p>\n\n<p><a href=\"https://www.kaggle.com/timesler/facial-recognition-model-in-pytorch\">https://www.kaggle.com/timesler/facial-recognition-model-in-pytorch</a></p>",
      "rawMarkdown": "You can use the dataset for facenet-pytorch. Like in the following notebook:\n\nhttps://www.kaggle.com/timesler/facial-recognition-model-in-pytorch",
      "votes": null
    },
    {
      "id": "722921",
      "postDate": "01/19/2020 10:02:37",
      "content": "<p>I see \"No custom packages enabled in your submission notebook\" in this page <a href=\"https://www.kaggle.com/c/deepfake-detection-challenge/overview/code-requirements\">https://www.kaggle.com/c/deepfake-detection-challenge/overview/code-requirements</a>. Does the \"facenet-pytorch\" belong to custom packages？</p>",
      "rawMarkdown": "I see \"No custom packages enabled in your submission notebook\" in this page https://www.kaggle.com/c/deepfake-detection-challenge/overview/code-requirements. Does the \"facenet-pytorch\" belong to custom packages？",
      "votes": null
    },
    {
      "id": "722932",
      "postDate": "01/19/2020 10:19:17",
      "content": "<p>I'm not exactly sure what \"custom packages\" refers to, but I believe normal python packages made available via kaggle datasets are fine. You should use the dataset linked below. </p>\n\n<p><a href=\"https://www.kaggle.com/timesler/facenet-pytorch-vggface2\">https://www.kaggle.com/timesler/facenet-pytorch-vggface2</a></p>",
      "rawMarkdown": "I'm not exactly sure what \"custom packages\" refers to, but I believe normal python packages made available via kaggle datasets are fine. You should use the dataset linked below. \n\nhttps://www.kaggle.com/timesler/facenet-pytorch-vggface2",
      "votes": null
    },
    {
      "id": "722936",
      "postDate": "01/19/2020 10:25:03",
      "content": "<p><a href=\"https://www.kaggle.com/c/deepfake-detection-challenge/discussion/121343#693869\">This comment</a> clarifies what a \"custom package\" is. </p>",
      "rawMarkdown": "[This comment](https://www.kaggle.com/c/deepfake-detection-challenge/discussion/121343#693869) clarifies what a \"custom package\" is.",
      "votes": null
    },
    {
      "id": "722944",
      "postDate": "01/19/2020 10:40:08",
      "content": "<p>Thank you very much!</p>",
      "rawMarkdown": "Thank you very much!",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 708591,
      "author_name": "hmendonca",
      "author_url": "",
      "post_date": "01/02/2020 13:05:02",
      "content": "<p><a href=\"https://pytorch.org/docs/stable/torch.html#torch.transpose\">https://pytorch.org/docs/stable/torch.html#torch.transpose</a>\nor .numpy().transpose([1,2,0])  # channels last</p>",
      "votes": null,
      "replies": [
        {
          "id": 708600,
          "author_name": "feifeizaici",
          "author_url": "",
          "post_date": "01/02/2020 13:18:13",
          "content": "<p>Thank you.\nAfter <code>.numpy().transpose([1,2,0]</code> the shape seems right!\nBut the tensor's value is between -1 and 0, I've tried <code>plt.imshow((255 * face_numpy).astype(int) + 255)</code> and <code>plt.imshow((-255 * face_numpy).astype(int))</code>. But neither looks right.</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 708687,
          "author_name": "timesler",
          "author_url": "",
          "post_date": "01/02/2020 14:50:41",
          "content": "<p>By default, the MTCNN module of <code>facenet-pytorch</code> applies some fixed image standardization to faces before returning so they are well suited for the package's face recognition model.</p>\n\n<p>If you want to get out images that look more normal to the human eye, you have a few options:</p>\n\n<p><strong>1. Prevent standardization:</strong></p>\n\n<ul>\n<li><p>For one face per frame:</p>\n\n<p>```\nmtcnn = MTCNN(post_process=False, device='cuda:0')\nfaces = mtcnn(frames) # returns a list of one face per frame</p>\n\n<p>face = faces[0]</p>\n\n<p>plt.imshow(face.permute(1, 2, 0).int().numpy())\n```</p></li>\n<li><p>For all detected faces per frame:</p>\n\n<p>```\nmtcnn = MTCNN(post_process=False, keep_all=True, device='cuda:0')\nfaces = mtcnn(frames) # returns a list of 4D tensors (num_faces x 3 x M x N)</p>\n\n<p>face = faces[0][0]</p>\n\n<p>plt.imshow(face.permute(1, 2, 0).int().numpy())\n```</p></li>\n</ul>\n\n<p><strong>2. Use bounding boxes directly:</strong></p>\n\n<p>This method has the advantage that the faces are returned at the resolution and aspect ratio of the face in the original image.</p>\n\n<ul>\n<li><p>Just bounding boxes and probabilities:</p>\n\n<p>```\nmtcnn = MTCNN(device='cuda:0')\nboxes, probs = mtcnn.detect(frames)</p>\n\n<p>frame = frames[0]\nbox = boxes[0][0]</p>\n\n<p>plt.imshow(frame.crop(box))\n```</p></li>\n<li><p>With facial landmarks:</p>\n\n<p>```\nmtcnn = MTCNN(device='cuda:0')\nboxes, probs, landmarks = mtcnn.detect(frames, landmarks=True)</p>\n\n<p>frame = frames[0]\nbox = boxes[0][0]\nlandmark = landmarks[0][0]</p>\n\n<p>plt.imshow(frame.crop(box))\nplt.scatter(landmark[:, 0] - box[0], landmark[:, 1] - box[1])\n```</p></li>\n</ul>\n\n<p><strong>3. Use saved image (saved image is not normalized):</strong></p>\n\n<ul>\n<li><p>For one face only:</p>\n\n<p><code>\nmtcnn = MTCNN(device='cuda:0')\nfaces = mtcnn(frames, save_path=[f'frame_{i}_face.jpg' for i in range(len(frames))])\n</code></p></li>\n<li><p>For all detected faces:</p>\n\n<p><code>\nmtcnn = MTCNN(keep_all=True, device='cuda:0')\nfaces = mtcnn(frames, save_path=[f'frame_{i}_face.jpg' for i in range(len(frames))])\n</code></p></li>\n</ul>\n\n<p>Disclaimer: I'm the package author :)</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 708776,
          "author_name": "feifeizaici",
          "author_url": "",
          "post_date": "01/02/2020 17:11:48",
          "content": "<p>Thank you and your great job!\nMy issue is solved. I would read your github in detail later.\nYou are really helpful, thanks again!</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 709039,
      "author_name": "timesler",
      "author_url": "",
      "post_date": "01/03/2020 00:56:52",
      "content": "<p>Here's a more detailed guide to MTCNN with <code>facenet-pytorch</code>: <a href=\"https://www.kaggle.com/timesler/guide-to-mtcnn-in-facenet-pytorch\">Guide to MTCNN in facenet-pytorch</a></p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 722011,
      "author_name": "notthatrkelly",
      "author_url": "",
      "post_date": "01/18/2020 01:48:58",
      "content": "<p>Is there a reasonable way to keep the detected faces separate (face 1 series, face 2 series) rather than mixing them?</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 722869,
      "author_name": "alazycoder",
      "author_url": "",
      "post_date": "01/19/2020 08:26:42",
      "content": "<p>Anyone knows how to use facenet-pytorch in kaggle notebooks?</p>",
      "votes": null,
      "replies": [
        {
          "id": 722891,
          "author_name": "timesler",
          "author_url": "",
          "post_date": "01/19/2020 09:10:38",
          "content": "<p>You can use the dataset for facenet-pytorch. Like in the following notebook:</p>\n\n<p><a href=\"https://www.kaggle.com/timesler/facial-recognition-model-in-pytorch\">https://www.kaggle.com/timesler/facial-recognition-model-in-pytorch</a></p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 722921,
          "author_name": "alazycoder",
          "author_url": "",
          "post_date": "01/19/2020 10:02:37",
          "content": "<p>I see \"No custom packages enabled in your submission notebook\" in this page <a href=\"https://www.kaggle.com/c/deepfake-detection-challenge/overview/code-requirements\">https://www.kaggle.com/c/deepfake-detection-challenge/overview/code-requirements</a>. Does the \"facenet-pytorch\" belong to custom packages？</p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 722932,
          "author_name": "timesler",
          "author_url": "",
          "post_date": "01/19/2020 10:19:17",
          "content": "<p>I'm not exactly sure what \"custom packages\" refers to, but I believe normal python packages made available via kaggle datasets are fine. You should use the dataset linked below. </p>\n\n<p><a href=\"https://www.kaggle.com/timesler/facenet-pytorch-vggface2\">https://www.kaggle.com/timesler/facenet-pytorch-vggface2</a></p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 722936,
          "author_name": "timesler",
          "author_url": "",
          "post_date": "01/19/2020 10:25:03",
          "content": "<p><a href=\"https://www.kaggle.com/c/deepfake-detection-challenge/discussion/121343#693869\">This comment</a> clarifies what a \"custom package\" is. </p>",
          "votes": null,
          "replies": []
        },
        {
          "id": 722944,
          "author_name": "alazycoder",
          "author_url": "",
          "post_date": "01/19/2020 10:40:08",
          "content": "<p>Thank you very much!</p>",
          "votes": null,
          "replies": []
        }
      ]
    }
  ],
  "raw_markdown_by_id": {
    "708579": "I learned something about facenet-pytorch from timesler's [kernel](https://www.kaggle.com/timesler/facial-recognition-model-in-pytorch)\nAnd I find it is much faster than dlib. But I still can't figure out the data type in it.\nframe is a ndarray whose shape is (1080, 1920, 3)\nAfter \n`faces = mtcnn(frames)`\nfaces[0] becomes a tensor whose shape is torch.Size([3, 160, 160])\n\nHow can I transfrom the tensor to a simple ndarray?(I guess it should be [160, 160, 3], dtype=uint8). I mean what if I just want to use the facenet-pytorch to crop faces from a frame, and then the ndarray can be the input of my network.\n\nThanks for any opinion!",
    "708591": "https://pytorch.org/docs/stable/torch.html#torch.transpose\nor .numpy().transpose([1,2,0])  # channels last",
    "708600": "Thank you.\nAfter `.numpy().transpose([1,2,0]` the shape seems right!\nBut the tensor's value is between -1 and 0, I've tried `plt.imshow((255 * face_numpy).astype(int) + 255)` and `plt.imshow((-255 * face_numpy).astype(int)) `. But neither looks right.",
    "708687": "By default, the MTCNN module of `facenet-pytorch` applies some fixed image standardization to faces before returning so they are well suited for the package's face recognition model.\n\nIf you want to get out images that look more normal to the human eye, you have a few options:\n\n**1. Prevent standardization:**\n\n* For one face per frame:\n    \n    ```\n    mtcnn = MTCNN(post_process=False, device='cuda:0')\n    faces = mtcnn(frames) # returns a list of one face per frame\n    \n    face = faces[0]\n    \n    plt.imshow(face.permute(1, 2, 0).int().numpy())\n    ```\n    \n* For all detected faces per frame:\n    \n    ```\n    mtcnn = MTCNN(post_process=False, keep_all=True, device='cuda:0')\n    faces = mtcnn(frames) # returns a list of 4D tensors (num_faces x 3 x M x N)\n    \n    face = faces[0][0]\n    \n    plt.imshow(face.permute(1, 2, 0).int().numpy())\n    ```\n\n**2. Use bounding boxes directly:**\n\nThis method has the advantage that the faces are returned at the resolution and aspect ratio of the face in the original image.\n\n* Just bounding boxes and probabilities:\n    \n    ```\n    mtcnn = MTCNN(device='cuda:0')\n    boxes, probs = mtcnn.detect(frames)\n    \n    frame = frames[0]\n    box = boxes[0][0]\n        \n    plt.imshow(frame.crop(box))\n    ```\n    \n* With facial landmarks:\n    \n    ```\n    mtcnn = MTCNN(device='cuda:0')\n    boxes, probs, landmarks = mtcnn.detect(frames, landmarks=True)\n    \n    frame = frames[0]\n    box = boxes[0][0]\n    landmark = landmarks[0][0]\n    \n    plt.imshow(frame.crop(box))\n    plt.scatter(landmark[:, 0] - box[0], landmark[:, 1] - box[1])\n    ```\n\n**3. Use saved image (saved image is not normalized):**\n\n* For one face only:\n    \n    ```\n    mtcnn = MTCNN(device='cuda:0')\n    faces = mtcnn(frames, save_path=[f'frame_{i}_face.jpg' for i in range(len(frames))])\n    ```\n    \n* For all detected faces:\n    \n    ```\n    mtcnn = MTCNN(keep_all=True, device='cuda:0')\n    faces = mtcnn(frames, save_path=[f'frame_{i}_face.jpg' for i in range(len(frames))])\n    ```\n\nDisclaimer: I'm the package author :)",
    "708776": "Thank you and your great job!\nMy issue is solved. I would read your github in detail later.\nYou are really helpful, thanks again!",
    "709039": "Here's a more detailed guide to MTCNN with `facenet-pytorch`: [Guide to MTCNN in facenet-pytorch](https://www.kaggle.com/timesler/guide-to-mtcnn-in-facenet-pytorch)",
    "722011": "Is there a reasonable way to keep the detected faces separate (face 1 series, face 2 series) rather than mixing them?",
    "722869": "Anyone knows how to use facenet-pytorch in kaggle notebooks?",
    "722891": "You can use the dataset for facenet-pytorch. Like in the following notebook:\n\nhttps://www.kaggle.com/timesler/facial-recognition-model-in-pytorch",
    "722921": "I see \"No custom packages enabled in your submission notebook\" in this page https://www.kaggle.com/c/deepfake-detection-challenge/overview/code-requirements. Does the \"facenet-pytorch\" belong to custom packages？",
    "722932": "I'm not exactly sure what \"custom packages\" refers to, but I believe normal python packages made available via kaggle datasets are fine. You should use the dataset linked below. \n\nhttps://www.kaggle.com/timesler/facenet-pytorch-vggface2",
    "722936": "[This comment](https://www.kaggle.com/c/deepfake-detection-challenge/discussion/121343#693869) clarifies what a \"custom package\" is.",
    "722944": "Thank you very much!"
  },
  "source": "meta"
}