AI / app.py
HavajOrtho's picture
Update app.py
a1d71e6 verified
import gradio as gr
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import io
from pyceph.pyceph import predict
def process_image(image):
"""
Обрабатывает изображение и возвращает результат с отмеченными точками
"""
if image is None:
return None, "Пожалуйста, загрузите изображение"
# Сохраняем временное изображение
temp_path = "temp_input.jpg"
image.save(temp_path)
# Получаем предсказания
try:
results = predict(image_src=temp_path, device='cpu')
# Создаем изображение с точками
fig, ax = plt.subplots(figsize=(10, 10))
ax.imshow(image)
# Рисуем точки и подписи
landmarks_text = []
for landmark_dict in results:
for name, (x, y) in landmark_dict.items():
ax.plot(x, y, 'ro', markersize=8)
ax.text(x, y, name, fontsize=8, color='yellow',
bbox=dict(boxstyle='round,pad=0.3', facecolor='black', alpha=0.5))
landmarks_text.append(f"{name}: ({x}, {y})")
ax.axis('off')
plt.tight_layout()
# Конвертируем в изображение
buf = io.BytesIO()
plt.savefig(buf, format='png', bbox_inches='tight', dpi=150)
buf.seek(0)
result_image = Image.open(buf)
plt.close()
# Форматируем текст с координатами
landmarks_output = "\n".join(landmarks_text)
return result_image, landmarks_output
except Exception as e:
return None, f"Ошибка обработки: {str(e)}"
# Создаем интерфейс Gradio
with gr.Blocks(title="Py-Ceph: Цефалометрический анализ") as demo:
gr.Markdown("""
# 🦷 Py-Ceph: Определение цефалометрических точек
Загрузите боковой рентгеновский снимок черепа (цефалограмму),
и модель автоматически определит 19 анатомических точек.
Основано на [py-ceph](https://github.com/zhangted/py-ceph)
""")
with gr.Row():
with gr.Column():
input_image = gr.Image(type="pil", label="Загрузите цефалограмму")
submit_btn = gr.Button("Анализировать", variant="primary")
with gr.Column():
output_image = gr.Image(label="Результат с точками")
output_text = gr.Textbox(label="Координаты точек", lines=20)
submit_btn.click(
fn=process_image,
inputs=input_image,
outputs=[output_image, output_text]
)
gr.Markdown("""
### Определяемые точки:
Sella, Nasion, Orbitale, Porion, Subspinale, Supramentale, Pogonion,
Menton, Gnathion, Gonion, Incision Inferius, Incision Superius,
Upper Lip, Lower Lip, Subnasale, Soft Tissue Pogonion,
Posterior Nasal Spine, Anterior Nasal Spine, Articulare
""")
if __name__ == "__main__":
demo.launch()