Skip to content

Commit 92339de

Browse files
committed
Bugs fixed. Progress bar added to UI.
1 parent 997b596 commit 92339de

File tree

7 files changed

+40
-13
lines changed

7 files changed

+40
-13
lines changed

particleanalyzer/core/ImagePreprocessor.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,14 @@ def preprocess_image(
3737
solution: str,
3838
request: gr.Request,
3939
pbar: tqdm,
40+
pr: tqdm,
4041
sahi_mode: bool,
4142
lang: str,
4243
):
4344
"""Основной метод предварительной обработки изображения."""
4445
self.lang = lang
4546
pbar.set_description(self._get_translation("Загрузка изображения..."))
47+
pr(0.25, desc=self._get_translation("Загрузка изображения..."))
4648
try:
4749
# Обработка шкалы прибора
4850
scale = None

particleanalyzer/core/LLMAnalysis.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,22 @@ def __init__(
1616
self.provider = provider
1717
self.api_key = api_key
1818

19-
if self.api_key.startswith("hf_"):
19+
if api_key and self.api_key.startswith("hf_"):
2020
provider == "huggingface"
2121
self.client = InferenceClient(provider="fireworks-ai", api_key=api_key)
2222
self.model_list = ["deepseek-ai/DeepSeek-V3"]
23-
elif self.api_key.startswith("sk-or-"):
23+
elif api_key and self.api_key.startswith("sk-or-"):
2424
self.client = OpenAI(
2525
base_url="https://openrouter.ai/api/v1",
2626
api_key=api_key,
2727
)
2828
self.model_list = ["deepseek/deepseek-chat:free", "deepseek/deepseek-chat-v3-0324", "google/gemini-2.0-flash-001",
2929
"openai/gpt-4o-mini"]
3030
provider == "openrouter"
31-
else:
31+
elif api_key:
3232
raise ValueError("Неизвестный провайдер. Доступные варианты: 'openrouter', 'huggingface'")
33+
else:
34+
self.model_list = [None]
3335

3436
def _calculate_stats(self, df: pd.DataFrame, num_bins: int = 5) -> Dict[str, Dict]:
3537
"""Вычисляет статистику"""

particleanalyzer/core/ModelManager.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,13 @@ def get_model(self, model_name: str):
7777
"""Возвращает модель по имени"""
7878
if model_name in self.yolo_loader.MODEL_MAPPING:
7979
return self.yolo_loader.get_model(model_name)
80-
elif DETECTRON2_AVAILABLE and model_name in self.detectron_loader.MODEL_CONFIGS:
80+
elif DETECTRON2_AVAILABLE and model_name in self.detectron_loader.MODEL_MAPPING:
8181
return self.detectron_loader.get_config(model_name)
8282
raise ValueError(f"Unknown model: {model_name}")
8383

8484
def get_predictor(self, model_name: str):
8585
"""Для Detectron возвращает готовый predictor"""
86-
if DETECTRON2_AVAILABLE and model_name in self.detectron_loader.MODEL_CONFIGS:
86+
if DETECTRON2_AVAILABLE and model_name in self.detectron_loader.MODEL_MAPPING:
8787
cfg = self.detectron_loader.get_config(model_name)
8888
return DefaultPredictor(cfg)
8989
return None
@@ -92,12 +92,12 @@ def get_model_path(self, model_name: str) -> str:
9292
"""Возвращает путь к модели по её имени"""
9393
if model_name in self.yolo_loader.MODEL_MAPPING:
9494
return self.yolo_loader.get_model_path(model_name)
95-
elif DETECTRON2_AVAILABLE and model_name in self.detectron_loader.MODEL_CONFIGS:
95+
elif DETECTRON2_AVAILABLE and model_name in self.detectron_loader.MODEL_MAPPING:
9696
return self.detectron_loader.get_model_path(model_name)
9797
raise ValueError(f"Model {model_name} not found")
9898

9999
def get_config_path(self, model_name: str) -> str:
100100
"""Возвращает путь к конфигу (только для Detectron)"""
101-
if DETECTRON2_AVAILABLE and model_name in self.detectron_loader.MODEL_CONFIGS:
101+
if DETECTRON2_AVAILABLE and model_name in self.detectron_loader.MODEL_MAPPING:
102102
return self.detectron_loader.get_config_path(model_name)
103103
raise ValueError(f"Config for {model_name} not available")

particleanalyzer/core/ParticleAnalyzer.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from particleanalyzer.core.languages import translations
2727
from particleanalyzer.core.language_context import LanguageContext
2828

29+
2930
lang = "ru"
3031

3132

@@ -124,6 +125,7 @@ def analyze_image(
124125
show_Feret_diametr: bool,
125126
api_key: bool,
126127
request: gr.Request,
128+
pr=gr.Progress()
127129
) -> Tuple:
128130
"""
129131
Основной метод для анализа изображения.
@@ -137,15 +139,14 @@ def analyze_image(
137139
desc=self._get_translation("Подготовка..."),
138140
bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, {rate_fmt}{postfix}]",
139141
)
140-
142+
pr(0, desc=self._get_translation("Подготовка..."))
141143
if (
142144
image["background"] is None
143145
and image["composite"] is None
144146
and not image["layers"]
145147
) and (image2 is None):
146148
gr.Warning(self._get_translation("Ошибка: изображение отсутствует..."))
147149
return self._create_error_return()
148-
149150
image, orig_image, gray_image, scale, scale_factor_glob = (
150151
self.preprocessor.preprocess_image(
151152
image=image,
@@ -154,6 +155,7 @@ def analyze_image(
154155
solution=solution,
155156
request=request,
156157
pbar=pbar,
158+
pr=pr,
157159
sahi_mode=sahi_mode,
158160
lang=self.lang,
159161
)
@@ -180,6 +182,7 @@ def analyze_image(
180182
overlap_height_ratio,
181183
overlap_width_ratio,
182184
pbar,
185+
pr,
183186
orig_image,
184187
gray_image,
185188
scale,
@@ -193,6 +196,8 @@ def analyze_image(
193196
df = pd.DataFrame(particle_data)
194197

195198
pbar.set_description(self._get_translation("Построение таблицы..."))
199+
pr(0.75, desc=self._get_translation("Построение таблицы..."))
200+
196201
builder = StatisticsBuilder(
197202
df,
198203
scale_selector,
@@ -204,9 +209,10 @@ def analyze_image(
204209
pbar.update(1)
205210

206211
pbar.set_description(self._get_translation("Построение графиков..."))
212+
pr(0.9, desc=self._get_translation("Построение графиков..."))
207213
fig = builder.build_distribution_fig(image)
208214
pbar.update(1)
209-
215+
pr(1, desc=self._get_translation("Готово!"))
210216
return (
211217
output_image,
212218
df,
@@ -254,6 +260,7 @@ def _process_with_yolo(
254260
overlap_height_ratio,
255261
overlap_width_ratio,
256262
pbar,
263+
pr,
257264
orig_image,
258265
gray_image,
259266
scale,
@@ -263,6 +270,7 @@ def _process_with_yolo(
263270
"""Обработка с использованием YOLO"""
264271
model = self.model_manager.get_model(model_change)
265272
pbar.set_description(self._get_translation("YOLO обрабатывает изображение..."))
273+
pr(0.5, desc=self._get_translation("YOLO обрабатывает изображение..."))
266274

267275
try:
268276
with torch.no_grad():
@@ -297,6 +305,7 @@ def _process_with_yolo(
297305
pbar.update(1)
298306

299307
pbar.set_description(self._get_translation("Обработка частиц..."))
308+
pr(0.62, desc=self._get_translation("Обработка частиц..."))
300309
output_image = orig_image.copy()
301310
thickness = self._get_scaled_thickness(
302311
output_image.shape[1], output_image.shape[0]
@@ -339,6 +348,7 @@ def _process_with_detectron(
339348
overlap_height_ratio,
340349
overlap_width_ratio,
341350
pbar,
351+
pr,
342352
orig_image,
343353
gray_image,
344354
scale,
@@ -354,6 +364,7 @@ def _process_with_detectron(
354364
pbar.set_description(
355365
self._get_translation("Detectron2 обрабатывает изображение...")
356366
)
367+
pr(0.5, desc=self._get_translation("Detectron2 обрабатывает изображение..."))
357368
try:
358369
predictor = DefaultPredictor(cfg)
359370
results = predictor(image)
@@ -373,6 +384,7 @@ def _process_with_detectron(
373384
pbar.update(1)
374385

375386
pbar.set_description(self._get_translation("Обработка частиц..."))
387+
pr(0.62, desc=self._get_translation("Обработка частиц..."))
376388
output_image = orig_image.copy()
377389
thickness = self._get_scaled_thickness(
378390
output_image.shape[1], output_image.shape[0]
@@ -420,6 +432,7 @@ def _process_with_sahi(
420432
overlap_height_ratio,
421433
overlap_width_ratio,
422434
pbar,
435+
pr,
423436
orig_image,
424437
gray_image,
425438
scale,
@@ -443,6 +456,7 @@ def _process_with_sahi(
443456
)
444457

445458
pbar.set_description(self._get_translation("SAHI обрабатывает изображение..."))
459+
pr(0.5, desc=self._get_translation("SAHI обрабатывает изображение..."))
446460
try:
447461
results = get_sliced_prediction(
448462
image,
@@ -463,6 +477,7 @@ def _process_with_sahi(
463477
pbar.update(1)
464478

465479
pbar.set_description(self._get_translation("Обработка частиц..."))
480+
pr(0.62, desc=self._get_translation("Обработка частиц..."))
466481
output_image = orig_image.copy()
467482
thickness = self._get_scaled_thickness(
468483
output_image.shape[1], output_image.shape[0]

particleanalyzer/core/languages.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
"ИИ-интерпретация SEM-данных": "AI Interpretation of SEM Data",
116116
"Запустить ИИ-анализ": "Launch AI analysis",
117117
"Языковая модель (LLM)": "Language Model (LLM)",
118+
"Готово!": "Ready!",
118119
},
119120
"ru": {
120121
"Подготовка...": "Подготовка...",
@@ -230,6 +231,7 @@
230231
"ИИ-интерпретация SEM-данных": "ИИ-интерпретация SEM-данных",
231232
"Запустить ИИ-анализ": "Запустить ИИ-анализ",
232233
"Языковая модель (LLM)": "Языковая модель (LLM)",
234+
"Готово!": "Готово!",
233235
},
234236
"zh-cn": {
235237
"Подготовка...": "初始化中...",
@@ -344,7 +346,8 @@
344346
"Утолщение": "加厚",
345347
"ИИ-интерпретация SEM-данных": "SEM数据的AI解读",
346348
"Запустить ИИ-анализ": "启动人工智能分析",
347-
"Языковая модель (LLM)": "语言模型(法学硕士)",
349+
"Языковая модель (LLM)": "语言模型(法学硕士)",
350+
"Готово!": "准备好!",
348351
},
349352
"zh-tw": {
350353
"Подготовка...": "初始化中...",
@@ -460,6 +463,7 @@
460463
"ИИ-интерпретация SEM-данных": "SEM數據的AI解讀",
461464
"Запустить ИИ-анализ": "啟動人工智慧分析",
462465
"Языковая модель (LLM)": "語言模型(法學碩士)",
466+
"Готово!": "準備好!",
463467
},
464468
}
465469

particleanalyzer/core/ui.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def create_interface(api_key):
6161
)
6262
with gr.Group(elem_id="gr-head"):
6363
with gr.Row(equal_height=True):
64-
gr.Markdown("# 🔎 ParticleAnalyzer v0.1.26")
64+
gr.Markdown("# 🔎 ParticleAnalyzer v0.1.27")
6565
gr.HTML(
6666
"""
6767
<div style="display: flex; justify-content: flex-end;">
@@ -370,6 +370,7 @@ def create_interface(api_key):
370370
AnnotatedImage_row,
371371
chatbot_row,
372372
],
373+
show_progress_on=output_image
373374
)
374375
# llm_run.click(
375376
# fn=chatbot_visibility, inputs=None, outputs=[chatbot_row2]
@@ -406,6 +407,9 @@ def create_interface(api_key):
406407
solution_and_segment_mode_row,
407408
segment_mode,
408409
],
410+
show_progress="hide",
411+
show_progress_on=slice_row
412+
409413
)
410414

411415
output_image2.select(

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def read_file(filename):
88

99
setup(
1010
name="ParticleAnalyzer",
11-
version="0.1.26",
11+
version="0.1.27",
1212
packages=find_packages(exclude=['tests*']),
1313
package_data={
1414
'particleanalyzer': [

0 commit comments

Comments
 (0)