diff --git a/coverage.xml b/coverage.xml
index a192f38c9f4f3289c70da398eccad5bc853ae433..52c3943d7d48cc62a290d9e209359537cc8cdf3b 100644
--- a/coverage.xml
+++ b/coverage.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" ?>
-<coverage version="7.4.3" timestamp="1709057158290" lines-valid="1992" lines-covered="1309" line-rate="0.6571" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
+<coverage version="7.4.3" timestamp="1709058031280" lines-valid="1992" lines-covered="1309" line-rate="0.6571" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
 	<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.4.3 -->
 	<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
 	<sources>
@@ -1066,9 +1066,9 @@
 					<methods/>
 					<lines>
 						<line number="1" hits="1"/>
-						<line number="3" hits="1"/>
-						<line number="5" hits="1"/>
-						<line number="7" hits="1"/>
+						<line number="2" hits="1"/>
+						<line number="4" hits="1"/>
+						<line number="6" hits="1"/>
 						<line number="8" hits="1"/>
 						<line number="9" hits="1"/>
 						<line number="10" hits="1"/>
diff --git a/semantic_router/encoders/vit.py b/semantic_router/encoders/vit.py
index c696e60d1b8a97fc140850affc99033006a39200..5b9da669796e25315c71a98afb2cd3223abb75c6 100644
--- a/semantic_router/encoders/vit.py
+++ b/semantic_router/encoders/vit.py
@@ -1,14 +1,14 @@
-from typing import Any, List, Optional, Union
+from typing import Any, List, Optional
 
 from pydantic.v1 import PrivateAttr
 
 from semantic_router.encoders import BaseEncoder
+from semantic_router.utils.logger import logger
 
 try:
-    from PIL.Image import Image
+    from PIL import Image
 except ImportError:
-    pass
-PILImage = Union[Any, "Image"]
+    logger.warning("Pillow is not installed. Install it with `pip install pillow`")
 
 
 class VitEncoder(BaseEncoder):
@@ -66,20 +66,20 @@ class VitEncoder(BaseEncoder):
 
         return processor, model
 
-    def _process_images(self, images: List[PILImage]):
+    def _process_images(self, images: List[Any]):
         rgb_images = [self._ensure_rgb(img) for img in images]
         processed_images = self._processor(images=rgb_images, return_tensors="pt")
         processed_images = processed_images.to(self.device)
         return processed_images
 
-    def _ensure_rgb(self, img: PILImage):
+    def _ensure_rgb(self, img: Any):
         rgbimg = Image.new("RGB", img.size)
         rgbimg.paste(img)
         return rgbimg
 
     def __call__(
         self,
-        imgs: List[PILImage],
+        imgs: List[Any],
         batch_size: int = 32,
     ) -> List[List[float]]:
         all_embeddings = []