Source code for anomalib.utils.sweep.helpers.inference
"""Utils to help compute inference statistics."""# Copyright (C) 2022 Intel Corporation# SPDX-License-Identifier: Apache-2.0importtimefrompathlibimportPathfromtypingimportIterable,List,UnionimportnumpyasnpimporttorchfromomegaconfimportDictConfig,ListConfigfromtorch.utils.dataimportDataLoaderfromanomalib.deployimportOpenVINOInferencer,TorchInferencerfromanomalib.models.componentsimportAnomalyModule
[docs]classMockImageLoader:"""Create mock images for inference on CPU based on the specifics of the original torch test dataset. Uses yield so as to avoid storing everything in the memory. Args: image_size (List[int]): Size of input image total_count (int): Total images in the test dataset """def__init__(self,image_size:List[int],total_count:int):self.total_count=total_countself.image_size=image_sizeself.image=np.ones((*self.image_size,3)).astype(np.uint8)
[docs]def__len__(self):"""Get total count of images."""returnself.total_count
[docs]def__call__(self)->Iterable[np.ndarray]:"""Yield batch of generated images. Args: idx (int): Unused """for_inrange(self.total_count):yieldself.image
[docs]defget_torch_throughput(config:Union[DictConfig,ListConfig],model:AnomalyModule,test_dataset:DataLoader)->float:"""Tests the model on dummy data. Images are passed sequentially to make the comparision with OpenVINO model fair. Args: config (Union[DictConfig, ListConfig]): Model config. model (Path): Model on which inference is called. test_dataset (DataLoader): The test dataset used as a reference for the mock dataset. Returns: float: Inference throughput """torch.set_grad_enabled(False)model.eval()inferencer=TorchInferencer(config,model)torch_dataloader=MockImageLoader(config.dataset.image_size,len(test_dataset))start_time=time.time()# Since we don't care about performance metrics and just the throughput, use mock data.forimageintorch_dataloader():inferencer.predict(image)# get throughputinference_time=time.time()-start_timethroughput=len(test_dataset)/inference_timetorch.set_grad_enabled(True)returnthroughput
[docs]defget_openvino_throughput(config:Union[DictConfig,ListConfig],model_path:Path,test_dataset:DataLoader)->float:"""Runs the generated OpenVINO model on a dummy dataset to get throughput. Args: config (Union[DictConfig, ListConfig]): Model config. model_path (Path): Path to folder containing the OpenVINO models. It then searches `model.xml` in the folder. test_dataset (DataLoader): The test dataset used as a reference for the mock dataset. Returns: float: Inference throughput """inferencer=OpenVINOInferencer(config,model_path/"model.xml",model_path/"meta_data.json")openvino_dataloader=MockImageLoader(config.dataset.image_size,total_count=len(test_dataset))start_time=time.time()# Create test images on CPU. Since we don't care about performance metrics and just the throughput, use mock data.forimageinopenvino_dataloader():inferencer.predict(image)# get throughputinference_time=time.time()-start_timethroughput=len(test_dataset)/inference_timereturnthroughput