-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #10 from hv0905/indexer
Refactor indexing to a standalone service and decouple of local directories
- Loading branch information
Showing
14 changed files
with
116 additions
and
103 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,28 +0,0 @@ | ||
from .transformers_service import TransformersService | ||
from .vector_db_context import VectorDbContext | ||
from ..config import config, environment | ||
|
||
transformers_service = TransformersService() | ||
db_context = VectorDbContext() | ||
ocr_service = None | ||
|
||
if environment.local_indexing: | ||
match config.ocr_search.ocr_module: | ||
case "easyocr": | ||
from .ocr_services import EasyOCRService | ||
|
||
ocr_service = EasyOCRService() | ||
case "easypaddleocr": | ||
from .ocr_services import EasyPaddleOCRService | ||
|
||
ocr_service = EasyPaddleOCRService() | ||
case "paddleocr": | ||
from .ocr_services import PaddleOCRService | ||
|
||
ocr_service = PaddleOCRService() | ||
case _: | ||
raise NotImplementedError(f"OCR module {config.ocr_search.ocr_module} not implemented.") | ||
else: | ||
from .ocr_services import DisabledOCRService | ||
|
||
ocr_service = DisabledOCRService() | ||
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
from PIL import Image | ||
|
||
from app.Models.img_data import ImageData | ||
from app.Services.ocr_services import OCRService | ||
from app.Services.transformers_service import TransformersService | ||
from app.Services.vector_db_context import VectorDbContext | ||
from app.config import config | ||
|
||
|
||
class IndexService: | ||
def __init__(self, ocr_service: OCRService, transformers_service: TransformersService, db_context: VectorDbContext): | ||
self._ocr_service = ocr_service | ||
self._transformers_service = transformers_service | ||
self._db_context = db_context | ||
|
||
def _prepare_image(self, image: Image.Image, image_data: ImageData, skip_ocr=False): | ||
image_data.width = image.width | ||
image_data.height = image.height | ||
image_data.aspect_ratio = float(image.width) / image.height | ||
|
||
if image.mode != 'RGB': | ||
image = image.convert('RGB') # to reduce convert in next steps | ||
image_data.image_vector = self._transformers_service.get_image_vector(image) | ||
if not skip_ocr and config.ocr_search.enable: | ||
image_data.ocr_text = self._ocr_service.ocr_interface(image) | ||
if image_data.ocr_text != "": | ||
image_data.text_contain_vector = self._transformers_service.get_bert_vector(image_data.ocr_text) | ||
else: | ||
image_data.ocr_text = None | ||
|
||
async def index_image(self, image: Image.Image, image_data: ImageData, skip_ocr=False): | ||
self._prepare_image(image, image_data, skip_ocr) | ||
await self._db_context.insertItems([image_data]) | ||
|
||
async def index_image_batch(self, image: list[Image.Image], image_data: list[ImageData], skip_ocr=False): | ||
for i in range(len(image)): | ||
self._prepare_image(image[i], image_data[i], skip_ocr) | ||
await self._db_context.insertItems(image_data) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
from .index_service import IndexService | ||
from .transformers_service import TransformersService | ||
from .vector_db_context import VectorDbContext | ||
from ..config import config, environment | ||
|
||
transformers_service = TransformersService() | ||
db_context = VectorDbContext() | ||
ocr_service = None | ||
|
||
if environment.local_indexing: | ||
match config.ocr_search.ocr_module: | ||
case "easyocr": | ||
from .ocr_services import EasyOCRService | ||
|
||
ocr_service = EasyOCRService() | ||
case "easypaddleocr": | ||
from .ocr_services import EasyPaddleOCRService | ||
|
||
ocr_service = EasyPaddleOCRService() | ||
case "paddleocr": | ||
from .ocr_services import PaddleOCRService | ||
|
||
ocr_service = PaddleOCRService() | ||
case _: | ||
raise NotImplementedError(f"OCR module {config.ocr_search.ocr_module} not implemented.") | ||
else: | ||
from .ocr_services import DisabledOCRService | ||
|
||
ocr_service = DisabledOCRService() | ||
|
||
index_service = IndexService(ocr_service, transformers_service, db_context) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
# Requirements for development and testing | ||
|
||
pytest | ||
pylint |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
from pathlib import Path | ||
|
||
from loguru import logger | ||
|
||
|
||
def gather_valid_files(root: Path, pattern: str = '**/*.*'): | ||
for item in root.glob(pattern): | ||
if item.suffix in ['.jpg', '.png', '.jpeg', '.jfif', '.webp', '.gif']: | ||
yield item | ||
else: | ||
logger.warning("Unsupported file type: {}. Skip...", item.suffix) |