InSono / models /__init__.py
MilicMilos
Replace medical image segmentation model with a new framework
8122dbe
from models.monai_inference import segment_with_monai, is_monai_available, load_monai_model
import logging
logger = logging.getLogger(__name__)
def is_segmentation_available():
return is_monai_available()
def preload_model():
return load_monai_model()
def segment_image(image, click_x, click_y):
if image is None or image.size == 0:
return {
'success': False,
'error': 'invalid_image',
'error_type': 'ValueError',
'message': 'Invalid or empty image provided for segmentation.',
}
logger.info(f"Segmentation request: click=({click_x},{click_y}), image shape={image.shape}")
if not is_monai_available():
return {
'success': False,
'error': 'model_unavailable',
'error_type': 'RuntimeError',
'message': 'MONAI segmentation model is not available. Please check that all dependencies are installed.',
}
try:
result = segment_with_monai(image, click_x, click_y)
if result is None:
logger.error("MONAI returned None — inference failed")
return {
'success': False,
'error': 'segmentation_failed',
'error_type': 'InferenceError',
'message': 'AI segmentation failed to produce results. Check server logs for details.',
}
if len(result) == 0:
logger.warning("MONAI returned empty mask list")
return {
'success': False,
'error': 'no_masks',
'error_type': 'EmptyResult',
'message': 'No structures were detected at the clicked location. Try clicking on a different area of the image.',
}
total_area = sum(m['area'] for m in result)
if total_area == 0:
logger.warning("MONAI returned masks but all have zero area")
return {
'success': False,
'error': 'empty_masks',
'error_type': 'EmptyMasks',
'message': 'The model detected the area but could not create a meaningful mask. Try clicking on a more distinct region.',
}
logger.info(f"Segmentation successful: {len(result)} masks, total area={total_area}")
return {
'success': True,
'masks': result,
'method': 'monai'
}
except Exception as e:
logger.error(f"Segmentation failed with exception: {e}")
import traceback
traceback.print_exc()
return {
'success': False,
'error': 'segmentation_unavailable',
'error_type': type(e).__name__,
'message': f'AI segmentation encountered an error: {str(e)}',
}