fdet-offline

An easy to use face detection module based on MTCNN and RetinaFace algorithms.


Keywords
face, recognition, detection, biometry
License
MIT
Install
pip install fdet-offline==1.0.5

Documentation

FDet-Offline: just like FDet, but offline

Download like this:

pip install fdet-offline --find-links https://download.pytorch.org/whl/torch_stable.html

Package depends on torch-packages not in PyPi.


A version of fdet where you don't have to access the internet to download the weights.

These are the changes:

MTCNN (only works for this model at the moment)

1.

In fdet/mtcnn.py, line 73-76, the url for the MTCNN-weights are listed:

base_url = 'https://github.com/acnazarejr/fdet/releases/download/weights/'
self._pnet = self.__load_model(_PNet, base_url + 'mtcnn_pnet.pt')
self._rnet = self.__load_model(_RNet, base_url + 'mtcnn_rnet.pt')
self._onet = self.__load_model(_ONet, base_url + 'mtcnn_onet.pt')

I downloaded those weights and created packages to import them (because PyPi has a 100MB max on package size, this was the solution).

I put the weights in the directory weights in the package fdet_offline_mtcnn_weights. The function fdet_offline_mtcnn_weights.import_weights takes mtcnn_type as input and returns a partial function of torch.load.

This partial function gets map_location from __load_model.

The previously mentioned fdet/mtcnn.py, line 73-76, now looks like this:

self._pnet = self.__load_model(_PNet, 'pnet')
self._rnet = self.__load_model(_RNet, 'rnet')
self._onet = self.__load_model(_ONet, 'onet')

In fdet/mtcnn.py, what previously was (url was input):

def __load_model(self, net_class: type, url: str) -> torch.nn.Module:
    """Download and construct the models"""
    try:
        state_dict = load_state_dict_from_url(url, map_location=self._device_control)

is now (mtcnn_type is input):

def __load_model(self, net_class: type, mtcnn_type: str) -> torch.nn.Module:
    """Download and construct the models"""
    try:
        load_state_dict = import_weights.load_partial(mtcnn_type)
        state_dict = load_state_dict(map_location=self._device_control)

2.

At fdet/mtcnn.py, line 427:

state_dict = load_state_dict_from_url(url, map_location=self._device_control)

load_state_dict_from_url, returns a torch.load which takes the weight-file as input. I replaced the load_state_dict_from_url with torch.load, and that's it.

That line now states this instead;

state_dict = torch.load(url, map_location=self._device_control)