diff --git a/.doctrees/DatasetExportWidget.doctree b/.doctrees/DatasetExportWidget.doctree index 458284e..e2d063d 100644 Binary files a/.doctrees/DatasetExportWidget.doctree and b/.doctrees/DatasetExportWidget.doctree differ diff --git a/.doctrees/DatasetOverviewWidget.doctree b/.doctrees/DatasetOverviewWidget.doctree index a0c30ed..18ee2fa 100644 Binary files a/.doctrees/DatasetOverviewWidget.doctree and b/.doctrees/DatasetOverviewWidget.doctree differ diff --git a/.doctrees/ImageTaggerWidget.doctree b/.doctrees/ImageTaggerWidget.doctree index 9427b46..81d629f 100644 Binary files a/.doctrees/ImageTaggerWidget.doctree and b/.doctrees/ImageTaggerWidget.doctree differ diff --git a/.doctrees/SettingsWidget.doctree b/.doctrees/SettingsWidget.doctree index 5ba8533..b144ff6 100644 Binary files a/.doctrees/SettingsWidget.doctree and b/.doctrees/SettingsWidget.doctree differ diff --git a/.doctrees/TagFilterWidget.doctree b/.doctrees/TagFilterWidget.doctree index 37b7a76..69561f4 100644 Binary files a/.doctrees/TagFilterWidget.doctree and b/.doctrees/TagFilterWidget.doctree differ diff --git a/.doctrees/ThumbnailSelectorWidget.doctree b/.doctrees/ThumbnailSelectorWidget.doctree index 729b4b4..e7fbdc5 100644 Binary files a/.doctrees/ThumbnailSelectorWidget.doctree and b/.doctrees/ThumbnailSelectorWidget.doctree differ diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle index a4f856e..8882fb1 100644 Binary files a/.doctrees/environment.pickle and b/.doctrees/environment.pickle differ diff --git a/.doctrees/main.doctree b/.doctrees/main.doctree index 91b8e46..b9546be 100644 Binary files a/.doctrees/main.doctree and b/.doctrees/main.doctree differ diff --git a/.doctrees/module.config.doctree b/.doctrees/module.config.doctree index 490f27a..72c9122 100644 Binary files a/.doctrees/module.config.doctree and b/.doctrees/module.config.doctree differ diff --git a/.doctrees/module.db.doctree b/.doctrees/module.db.doctree index 0114a87..f94f747 100644 Binary files a/.doctrees/module.db.doctree and b/.doctrees/module.db.doctree differ diff --git a/DatasetExportWidget.html b/DatasetExportWidget.html index fdd9b06..8d617fd 100644 --- a/DatasetExportWidget.html +++ b/DatasetExportWidget.html @@ -42,7 +42,7 @@

ベースクラス: QWidget, Ui_DatasetExportWidget

-export_dataset(export_dir, formats)[ソース]
+export_dataset(export_dir)[ソース]
diff --git a/DatasetOverviewWidget.html b/DatasetOverviewWidget.html index f5d0f69..891cf1e 100644 --- a/DatasetOverviewWidget.html +++ b/DatasetOverviewWidget.html @@ -57,7 +57,7 @@
-initialize(cm)[ソース]
+initialize(cm, idm)[ソース]
@@ -65,6 +65,11 @@ load_images(image_files)[ソース]
+
+
+on_filter_applied(filter_conditions)[ソース]
+
+
set_metadata_labels(metadata, image_path)[ソース]
@@ -96,6 +101,11 @@ update_preview(image_path)[ソース]
+
+
+update_thumbnail_selector(image_paths)[ソース]
+
+
diff --git a/ImageTaggerWidget.html b/ImageTaggerWidget.html index e1c5ea2..b936014 100644 --- a/ImageTaggerWidget.html +++ b/ImageTaggerWidget.html @@ -87,11 +87,6 @@ on_dbSearchWidget_filterApplied(filter_conditions)[ソース]
-
-
-on_lowRescheckBox_clicked()[ソース]
-
-
on_pushButtonGenerate_clicked()[ソース]
@@ -130,7 +125,7 @@
-staticMetaObject = PySide6.QtCore.QMetaObject("ImageTaggerWidget" inherits "QWidget": Methods:   #33 type=Slot, signature=on_comboBoxAPI_currentIndexChanged(int), parameters=int   #34 type=Slot, signature=on_comboBoxModel_currentTextChanged()   #35 type=Slot, signature=on_comboBoxTagFormat_currentTextChanged()   #36 type=Slot, signature=on_lowRescheckBox_clicked()   #37 type=Slot, signature=on_dbSearchWidget_filterApplied(QVariantMap), parameters=QVariantMap   #38 type=Slot, signature=single_image_selection(PyObject), parameters=PyObject   #39 type=Slot, signature=multiple_image_selection(QVariantList), parameters=QVariantList   #40 type=Slot, signature=on_textEditMainPrompt_textChanged()   #41 type=Slot, signature=on_textEditAddPrompt_textChanged()   #42 type=Slot, signature=on_pushButtonGenerate_clicked()   #43 type=Slot, signature=on_pushButtonSave_clicked() )
+staticMetaObject = PySide6.QtCore.QMetaObject("ImageTaggerWidget" inherits "QWidget": Methods:   #33 type=Slot, signature=on_comboBoxAPI_currentIndexChanged(int), parameters=int   #34 type=Slot, signature=on_comboBoxModel_currentTextChanged()   #35 type=Slot, signature=on_comboBoxTagFormat_currentTextChanged()   #36 type=Slot, signature=on_dbSearchWidget_filterApplied(QVariantMap), parameters=QVariantMap   #37 type=Slot, signature=single_image_selection(PyObject), parameters=PyObject   #38 type=Slot, signature=multiple_image_selection(QVariantList), parameters=QVariantList   #39 type=Slot, signature=on_textEditMainPrompt_textChanged()   #40 type=Slot, signature=on_textEditAddPrompt_textChanged()   #41 type=Slot, signature=on_pushButtonGenerate_clicked()   #42 type=Slot, signature=on_pushButtonSave_clicked() )
diff --git a/SettingsWidget.html b/SettingsWidget.html index a809348..55f43f7 100644 --- a/SettingsWidget.html +++ b/SettingsWidget.html @@ -142,7 +142,7 @@
-staticMetaObject = PySide6.QtCore.QMetaObject("SettingsWidget" inherits "QWidget": Methods:   #33 type=Slot, signature=on_buttonSave_clicked()   #34 type=Slot, signature=on_buttonSaveAs_clicked() )
+staticMetaObject = PySide6.QtCore.QMetaObject("SettingsWidget" inherits "QWidget": Methods:   #33 type=Slot, signature=on_buttonSave_clicked()   #34 type=Slot, signature=on_buttonSaveAs_clicked()   #35 type=Slot, signature=on_lineEditOpenAiKey_editingFinished()   #36 type=Slot, signature=on_lineEditGoogleVisionKey_editingFinished()   #37 type=Slot, signature=on_lineEditAnthropicKey_editingFinished()   #38 type=Slot, signature=on_lineEditHfUsername_editingFinished()   #39 type=Slot, signature=on_lineEditHfRepoName_editingFinished()   #40 type=Slot, signature=on_lineEditHfToken_editingFinished()   #41 type=Slot, signature=connect_custom_widgets()   #42 type=Slot, signature=on_dirPickerOutput_changed()   #43 type=Slot, signature=on_dirPickerResponse_changed()   #44 type=Slot, signature=on_dirPickerEditedOutput_changed()   #45 type=Slot, signature=on_filePickerLogFile_changed() )
diff --git a/TagFilterWidget.html b/TagFilterWidget.html index 35b645f..8e6472f 100644 --- a/TagFilterWidget.html +++ b/TagFilterWidget.html @@ -122,7 +122,9 @@ filter_text: str, resolution: int, use_and: bool, -count_range: tuple

+count_range: tuple, +include_untagged: bool, +include_nsfw

}

diff --git a/ThumbnailSelectorWidget.html b/ThumbnailSelectorWidget.html index 6fa0bac..d22b9b7 100644 --- a/ThumbnailSelectorWidget.html +++ b/ThumbnailSelectorWidget.html @@ -172,7 +172,7 @@
resizeEvent(event)[ソース]
-

ウィジェットがリサイズされたときにサムネイルのレイアウトを更新します。 +

ウィジェットがリサイズされたときにタイマーをリセットします。 :type event: :param event: リサイズイベント :type event: QResizeEvent

diff --git a/_modules/DatasetExportWidget.html b/_modules/DatasetExportWidget.html index 1fde52f..24d7765 100644 --- a/_modules/DatasetExportWidget.html +++ b/_modules/DatasetExportWidget.html @@ -61,7 +61,7 @@

DatasetExportWidget のソースコード

         self.exportDirectoryPicker.set_label_text("Export Directory:")
         self.exportDirectoryPicker.set_path(self.cm.config['directories']['edited_output'])
         self.exportProgressBar.setVisible(False)
-        self.filterWidget.filterApplied.connect(self.on_filter_applied)
+ self.dbSearchWidget.filterApplied.connect(self.on_filter_applied)
@@ -77,7 +77,7 @@

DatasetExportWidget のソースコード

 
[ドキュメント] def init_date_range(self): - self.filterWidget.count_range_slider.set_date_range()
+ self.dbSearchWidget.count_range_slider.set_date_range()
@@ -88,7 +88,7 @@

DatasetExportWidget のソースコード

         resolution = filter_conditions['resolution']
         use_and = filter_conditions['use_and']
         start_date, end_date = filter_conditions.get('date_range', (None, None))
-        include_untagged=filter_conditions['include_untagged']
+        include_untagged = filter_conditions['include_untagged']
         # 日付範囲の処理
         if start_date is not None and end_date is not None:
             # UTCタイムスタンプをQDateTimeに変換し、ローカルタイムゾーンに設定
@@ -137,21 +137,12 @@ 

DatasetExportWidget のソースコード

             QMessageBox.warning(self, "Warning", "出力先ディレクトリを選択してください")
             return
 
-        export_formats = []
-        if self.checkBoxTxtCap.isChecked():
-            export_formats.append("txt_cap")
-        if self.checkBoxJson.isChecked():
-            export_formats.append("json")
-
-        if not export_formats:
-            QMessageBox.warning(self, "Warning", "出力形式を選択してください")
-            return
-        self.export_dataset(Path(export_directory), export_formats)
+ self.export_dataset(Path(export_directory))
[ドキュメント] - def export_dataset(self, export_dir: Path, formats: list): + def export_dataset(self, export_dir: Path): self.exportButton.setEnabled(False) self.statusLabel.setText("Status: Exporting...") @@ -168,17 +159,20 @@

DatasetExportWidget のソースコード

                 image_id = self.image_path_id_map.get(image_path)
                 if image_id is not None:
                     annotations = self.idm.get_image_annotations(image_id)
+                    if self.latestcheckBox.isChecked():
+                        # 最近のアノテーションのみをフィルタリング
+                        annotations = self.idm.filter_recent_annotations(annotations)
                     image_data = {
                         'path': image_path,
-                        'tags': annotations['tags'],
-                        'captions': annotations['captions']
+                        'tags': annotations.get('tags', []),
+                        'captions': annotations.get('captions', [])
                     }
-                    if "txt_cap" in formats:
+                    if self.checkBoxTxtCap.isChecked():
                         self.fsm.export_dataset_to_txt(image_data, export_dir)
-                    if "json" in formats:
+                    if self.checkBoxJson.isChecked():
                         self.fsm.export_dataset_to_json(image_data, export_dir)
                 else:
-                    self.logger.warning(f"Image ID not found for {image_path}")
+                    self.logger.error(f"Image ID not found for {image_path}")
                     continue  # 次の画像へ
 
                 progress = int((i + 1) / total_images * 100)
diff --git a/_modules/DatasetOverviewWidget.html b/_modules/DatasetOverviewWidget.html
index 9096039..96b8a7b 100644
--- a/_modules/DatasetOverviewWidget.html
+++ b/_modules/DatasetOverviewWidget.html
@@ -34,12 +34,13 @@
   

DatasetOverviewWidget のソースコード

 from pathlib import Path
 
-from PySide6.QtWidgets import QWidget
-from PySide6.QtCore import Signal, Slot
+from PySide6.QtWidgets import QWidget, QMessageBox
+from PySide6.QtCore import Qt, Signal, Slot, QDateTime
 
 from gui_file.DatasetOverviewWidget_ui import Ui_DatasetOverviewWidget
 
 from module.file_sys import FileSystemManager
+from module.db import ImageDatabaseManager
 from module.log import get_logger
 from caption_tags import ImageAnalyzer
 
@@ -60,19 +61,21 @@ 

DatasetOverviewWidget のソースコード

 
         # シグナル/スロット接続
         self.thumbnailSelector.imageSelected.connect(self.update_preview)
+        self.dbSearchWidget.filterApplied.connect(self.on_filter_applied)
 
 
[ドキュメント] - def initialize(self, cm: 'ConfigManager'): - self.cm = cm
+ def initialize(self, cm: 'ConfigManager', idm: 'ImageDatabaseManager'): + self.cm = cm + self.idm = idm
[ドキュメント] def showEvent(self, event): """ウィジェットが表示される際に呼び出されるイベントハンドラ""" - super().showEvent(event) - self.load_images(self.cm.dataset_image_paths)
+ if self.cm.dataset_image_paths: + self.load_images(self.cm.dataset_image_paths)
@@ -87,6 +90,54 @@

DatasetOverviewWidget のソースコード

             self.update_preview(Path(self.image_files[0]))
+
+[ドキュメント] + def on_filter_applied(self, filter_conditions: dict): + filter_type = filter_conditions['filter_type'] + filter_text = filter_conditions['filter_text'] + resolution = filter_conditions['resolution'] + use_and = filter_conditions['use_and'] + start_date, end_date = filter_conditions.get('date_range', (None, None)) + include_untagged = filter_conditions['include_untagged'] + # 日付範囲の処理 + if start_date is not None and end_date is not None: + # UTCタイムスタンプをQDateTimeに変換し、ローカルタイムゾーンに設定 + start_date_qt = QDateTime.fromSecsSinceEpoch(start_date).toLocalTime() + end_date_qt = QDateTime.fromSecsSinceEpoch(end_date).toLocalTime() + + # ローカルタイムゾーンを使用してISO 8601形式の文字列に変換 + start_date = start_date_qt.toString(Qt.ISODate) + end_date = end_date_qt.toString(Qt.ISODate) + + tags = [] + caption = "" + if filter_type == "tags": + # タグはカンマ区切りで複数指定されるため、リストに変換 + tags = [tag.strip() for tag in filter_text.split(',')] + elif filter_type == "caption": + caption = filter_text + + filtered_image_metadata, list_count = self.idm.get_images_by_filter( + tags=tags, + caption=caption, + resolution=resolution, + use_and=use_and, + start_date=start_date, + end_date=end_date, + include_untagged=include_untagged + ) + if not filtered_image_metadata: + self.logger.info(f"検索条件に一致する画像がありませんでした: {filter_type} {filter_text}") + QMessageBox.critical(self, "info", f"検索条件に一致する画像がありませんでした: {filter_type} {filter_text}") + return + + # idとpathの対応だけを取り出す + self.image_path_id_map = {item['image_id']: Path(item['stored_image_path']) for item in filtered_image_metadata} + + # サムネイルセレクターを更新 + self.update_thumbnail_selector(list(self.image_path_id_map.values()))
+ +
[ドキュメント] @Slot(Path) @@ -104,6 +155,13 @@

DatasetOverviewWidget のソースコード

             self.update_annotations(image_path)
+
+[ドキュメント] + def update_thumbnail_selector(self, image_paths: list[Path]): + # サムネイルセレクターに新しい画像リストをロード + self.thumbnailSelector.load_images(image_paths)
+ +
[ドキュメント] def set_metadata_labels(self, metadata, image_path): @@ -147,6 +205,14 @@

DatasetOverviewWidget のソースコード

             captions_text = " | ".join(captions)  # キャプションをパイプで区切って結合
             self.captionTextEdit.setPlainText(captions_text)
 
+        elif annotations is None:
+            # DBkからアノテーション情報を検索
+            image_id = self.idm.detect_duplicate_image(image_path)
+            image_data = self.idm.get_image_annotations(image_id)
+            tags_text = ', '.join([tag_data.get('tag','') for tag_data in image_data['tags']])
+            self.tagsTextEdit.setPlainText(tags_text)
+            captions_text = ', '.join([caption_data.get('caption', '') for caption_data in image_data['captions']])
+            self.captionTextEdit.setPlainText(captions_text)
         else:
             self.tagsTextEdit.clear()
             self.captionTextEdit.clear()
@@ -155,7 +221,7 @@

DatasetOverviewWidget のソースコード

 
[ドキュメント] @staticmethod - def calculate_aspect_ratio(width, height): + def calculate_aspect_ratio(width, height): #TODO: アスペクト比の計算がなにかおかしい def gcd(a, b): while b: a, b = b, a % b @@ -175,11 +241,12 @@

DatasetOverviewWidget のソースコード

     setup_logger(logconf)
     cm = ConfigManager()
     fsm = FileSystemManager()
+    idm = ImageDatabaseManager(cm.config['directories']['database'])
     directory = Path(r"testimg\10_shira")
     image_files: list[Path] = fsm.get_image_files(directory)
     app = QApplication(sys.argv)
     widget = DatasetOverviewWidget()
-    widget.initialize(cm)
+    widget.initialize(cm, idm)
     widget.load_images(image_files)
     widget.show()
     sys.exit(app.exec())
diff --git a/_modules/ImageEditWidget.html b/_modules/ImageEditWidget.html
index a632d7e..fa97703 100644
--- a/_modules/ImageEditWidget.html
+++ b/_modules/ImageEditWidget.html
@@ -68,6 +68,7 @@ 

ImageEditWidget のソースコード

         self.main_window = main_window
         self.target_resolution = self.cm.config['image_processing']['target_resolution']
         self.preferred_resolutions = self.cm.config['preferred_resolutions']
+        self.upscaler = None
         self.comboBoxResizeOption.currentText()
         upscalers = [upscaler['name'] for upscaler in self.cm.upscaler_models.values()]
         self.comboBoxUpscaler.addItems(upscalers)
@@ -91,7 +92,8 @@ 

ImageEditWidget のソースコード

     def showEvent(self, event):
         """ウィジェットが表示される際にメインウィンドウで選択された画像を表示する"""
         super().showEvent(event)
-        self.load_images(self.cm.dataset_image_paths)
+ if self.cm.dataset_image_paths: + self.load_images(self.cm.dataset_image_paths)
@@ -224,17 +226,17 @@

ImageEditWidget のソースコード

         else:
             original_image_metadata = self.idm.get_image_metadata(image_id)
 
-        existing_processed_image = self.idm.check_processed_image_exists(image_id, self.target_resolution)
-        if existing_processed_image:
-            self.logger.info(f"既に処理済みの画像が存在します: {image_file}")
-            return
-
         existing_annotations = ImageAnalyzer.get_existing_annotations(image_file)
         if existing_annotations:
             self.idm.save_annotations(image_id, existing_annotations)
         else:
             self.idm.save_annotations(image_id, {'tags': [], 'captions': []})
 
+        existing_processed_image = self.idm.check_processed_image_exists(image_id, self.target_resolution)
+        if existing_processed_image:
+            self.logger.info(f"指定解像度の画像は保存済みです: {image_file}")
+            return
+
         processed_image = self.ipm.process_image(
             image_file,
             original_image_metadata['has_alpha'],
diff --git a/_modules/ImageEditor.html b/_modules/ImageEditor.html
index bac9b9f..c4af4b5 100644
--- a/_modules/ImageEditor.html
+++ b/_modules/ImageEditor.html
@@ -364,6 +364,7 @@ 

ImageEditor のソースコード

                     x_max, y_max = np.max(x_coords), np.max(y_coords)
 
                     # エリアを検証する必要がなくなり、ここで余分な領域を削るロジックを追加する
+                    # TODO: このロジックは適切かどうかを検討する
                     margin = 5  # 余分に削るピクセル数
                     x_min = max(0, x_min + margin)
                     y_min = max(0, y_min + margin)
diff --git a/_modules/ImageTaggerWidget.html b/_modules/ImageTaggerWidget.html
index 4ce7429..df47208 100644
--- a/_modules/ImageTaggerWidget.html
+++ b/_modules/ImageTaggerWidget.html
@@ -126,19 +126,13 @@ 

ImageTaggerWidget のソースコード

         self.format_name = self.comboBoxTagFormat.currentText()
-
-[ドキュメント] - @Slot() - def on_lowRescheckBox_clicked(self): - self.check_low_res = True
- -
[ドキュメント] def showEvent(self, event): """ウィジェットが表示される際に呼び出されるイベントハンドラ""" super().showEvent(event) - self.load_images(self.cm.dataset_image_paths)
+ if self.cm.dataset_image_paths: + self.load_images(self.cm.dataset_image_paths)
@@ -170,11 +164,19 @@

ImageTaggerWidget のソースコード

         tags = [tag.strip() for tag in filter_text.split(',')]
 
         filtered_images, list_count = self.idm.get_images_by_filter(tags=tags, include_untagged=include_untagged, include_nsfw=include_nsfw)
+
         if not filtered_images:
             self.logger.info(f"Tag に {filter_text} を含む検索結果がありません")
             QMessageBox.critical(self,  "info", f"Tag に {filter_text} を含む検索結果がありません")
 
-        image_list = [Path(image['stored_image_path']) for image in filtered_images]
+        # 重複を除いた画像のリストを作成
+        unique_images = {}
+        for metadata in filtered_images:
+            image_id = metadata['image_id']
+            if image_id not in unique_images:
+                unique_images[image_id] = Path(metadata['stored_image_path'])
+        image_list = list(unique_images.values())
+
         self.ThumbnailSelector.load_images(image_list)
         if image_list:
             self.ThumbnailSelector.select_first_image()
@@ -232,7 +234,7 @@

ImageTaggerWidget のソースコード

             for image_path in self.selected_webp:
                 self.logger.info(f"{image_path.stem}の処理中")
 
-                if self.check_low_res:
+                if self.lowRescheckBox.isChecked():
                     image_id = self.idm.detect_duplicate_image(image_path)
                     if image_id is None:
                         self.logger.info(f"DBに登録されていない画像です。{image_path.name}")
@@ -336,7 +338,7 @@ 

ImageTaggerWidget のソースコード

     logger = get_logger(__name__)
     app = QApplication(sys.argv)
     fsm = FileSystemManager()
-    idm = ImageDatabaseManager()
+    idm = ImageDatabaseManager(cm.config['directories']['database'])
     image_files = fsm.get_image_files(Path(r"testimg\1_img")) # 画像ファイルのディレクトリを指定
     widget = ImageTaggerWidget()
     widget.initialize(cm, idm)
diff --git a/_modules/SettingsWidget.html b/_modules/SettingsWidget.html
index 38a9b39..f8a6e21 100644
--- a/_modules/SettingsWidget.html
+++ b/_modules/SettingsWidget.html
@@ -73,7 +73,7 @@ 

SettingsWidget のソースコード

         }
         for key, picker in directories.items():
             picker.set_label_text(f"{key.capitalize()} Directory")
-            picker.set_path(self.cm.config['directories'][key])
+ picker.set_path(self.cm.config.get('directories', {}).get(key, ""))
@@ -85,7 +85,7 @@

SettingsWidget のソースコード

             'claude_key': self.lineEditAnthropicKey
         }
         for key, widget in api_settings.items():
-            widget.setText(self.cm.config['api'][key])
+ widget.setText(self.cm.config.get('api', {}).get(key, ""))
@@ -97,7 +97,7 @@

SettingsWidget のソースコード

             'token': self.lineEditHfToken
         }
         for key, widget in hf_settings.items():
-            widget.setText(self.cm.config['huggingface'][key])
+ widget.setText(self.cm.config.get('huggingface', {}).get(key, ""))
@@ -136,36 +136,42 @@

SettingsWidget のソースコード

 
 
[ドキュメント] + @Slot() def on_lineEditOpenAiKey_editingFinished(self): self.cm.config['api']['openai_key'] = self.lineEditOpenAiKey.text()
[ドキュメント] + @Slot() def on_lineEditGoogleVisionKey_editingFinished(self): self.cm.config['api']['google_key'] = self.lineEditGoogleVisionKey.text()
[ドキュメント] + @Slot() def on_lineEditAnthropicKey_editingFinished(self): self.cm.config['api']['claude_key'] = self.lineEditAnthropicKey.text()
[ドキュメント] + @Slot() def on_lineEditHfUsername_editingFinished(self): self.cm.config['huggingface']['hf_username'] = self.lineEditHfUsername.text()
[ドキュメント] + @Slot() def on_lineEditHfRepoName_editingFinished(self): self.cm.config['huggingface']['repo_name'] = self.lineEditHfRepoName.text()
[ドキュメント] + @Slot() def on_lineEditHfToken_editingFinished(self): self.cm.config['huggingface']['token'] = self.lineEditHfToken.text()
@@ -178,6 +184,7 @@

SettingsWidget のソースコード

 
 
[ドキュメント] + @Slot() def connect_custom_widgets(self): self.dirPickerOutput.DirectoryPicker.lineEditPicker.textChanged.connect(self.on_dirPickerOutput_changed) self.dirPickerResponse.DirectoryPicker.lineEditPicker.textChanged.connect(self.on_dirPickerResponse_changed) @@ -187,24 +194,28 @@

SettingsWidget のソースコード

 
 
[ドキュメント] + @Slot() def on_dirPickerOutput_changed(self, new_path): self.cm.config['directories']['output'] = new_path
[ドキュメント] + @Slot() def on_dirPickerResponse_changed(self, new_path): self.cm.config['directories']['response_file'] = new_path
[ドキュメント] + @Slot() def on_dirPickerEditedOutput_changed(self, new_path): self.cm.config['directories']['edited_output'] = new_path
[ドキュメント] + @Slot() def on_filePickerLogFile_changed(self, new_path): self.cm.config['log']['file'] = new_path
diff --git a/_modules/TagFilterWidget.html b/_modules/TagFilterWidget.html index f25ae3d..2d14e1f 100644 --- a/_modules/TagFilterWidget.html +++ b/_modules/TagFilterWidget.html @@ -191,7 +191,9 @@

TagFilterWidget のソースコード

         filter_text: str,
         resolution: int,
         use_and: bool,
-        count_range: tuple
+        count_range: tuple,
+        include_untagged: bool,
+        include_nsfw
     }
     """
 
@@ -221,11 +223,14 @@ 

TagFilterWidget のソースコード

     def on_applyFilterButton_clicked(self):
         """フィルター条件を取得して、filterAppliedシグナルを発行"""
         resolution = self.resolutionComboBox.currentText()
-        split_resolution = resolution.split('x')
+        if resolution != 'None': #currentText
+            split_resolution = resolution.split('x')
+        else:
+            split_resolution = 0
         filter_conditions = {
             'filter_type': self.filterTypeComboBox.currentText().lower() if self.filterTypeComboBox.isVisible() else None,
             'filter_text': self.filterLineEdit.text(),
-            'resolution': int(split_resolution[0]) if split_resolution else None,
+            'resolution': int(split_resolution[0]) if split_resolution else 0,
             'use_and': self.andRadioButton.isChecked() if self.andRadioButton.isVisible() else False,
             'count_range': self.count_range_slider.get_range() if self.count_range_slider.isVisible() else None,
             'include_untagged': self.noTagscheckBox.isChecked(),  # タグ情報がない画像を含めるかどうか
diff --git a/_modules/ThumbnailSelectorWidget.html b/_modules/ThumbnailSelectorWidget.html
index edf9aae..4e2d4ab 100644
--- a/_modules/ThumbnailSelectorWidget.html
+++ b/_modules/ThumbnailSelectorWidget.html
@@ -37,7 +37,7 @@ 

ThumbnailSelectorWidget のソースコード

from PySide6.QtWidgets import (QWidget, QGraphicsObject, QGraphicsScene, QGraphicsView, QGraphicsPixmapItem, QVBoxLayout, QApplication, QGraphicsItem) from PySide6.QtGui import QPixmap, QColor, QPen -from PySide6.QtCore import Qt, QSize, Signal, Slot, QRectF +from PySide6.QtCore import Qt, QSize, Signal, Slot, QRectF, QTimer from module.log import get_logger @@ -147,16 +147,22 @@

ThumbnailSelectorWidget のソースコード

self.thumbnail_items = [] self.last_selected_item = None + # リサイズ用のタイマーを初期化 + self.resize_timer = QTimer(self) + self.resize_timer.setSingleShot(True) + self.resize_timer.timeout.connect(self.update_thumbnail_layout) +
[ドキュメント] def resizeEvent(self, event): """ - ウィジェットがリサイズされたときにサムネイルのレイアウトを更新します。 + ウィジェットがリサイズされたときにタイマーをリセットします。 Args: event (QResizeEvent): リサイズイベント """ super().resizeEvent(event) - self.update_thumbnail_layout()
+ # タイマーをリセットし、250ミリ秒後にupdate_thumbnail_layoutを呼び出す + self.resize_timer.start(250)
diff --git a/_modules/gui.html b/_modules/gui.html index c76e81a..765497a 100644 --- a/_modules/gui.html +++ b/_modules/gui.html @@ -91,7 +91,7 @@

gui のソースコード

 
[ドキュメント] def init_managers(self): - self.idm = ImageDatabaseManager() #.db のパスはハードコーディングなので変わらない + self.idm = ImageDatabaseManager(Path(self.cm.config['directories']['database'])) self.fsm = FileSystemManager() self.progress_widget = ProgressWidget() self.progress_controller = Controller(self.progress_widget) @@ -107,7 +107,7 @@

gui のソースコード

     def init_pages(self):
         self.pageImageEdit.initialize(self.cm, self.fsm, self.idm, self)
         self.pageImageTagger.initialize(self.cm, self.idm)
-        self.pageDatasetOverview.initialize(self.cm)
+        self.pageDatasetOverview.initialize(self.cm, self.idm)
         self.pageExport.initialize(self.cm, self.fsm, self.idm)
         self.pageSettings.initialize(self.cm)
@@ -125,6 +125,9 @@

gui のソースコード

     def init_dataset_selector(self):
         self.datasetSelector.set_label_text("データセット:")
         default_conf_path = self.cm.config['directories']['dataset']
+        # default_conf_path が空文字列の場合は何もしない。でないとカレントディクトリ内の画像全部対象とする
+        if default_conf_path == "":
+            return
         self.datasetSelector.set_path(default_conf_path)
         self.cm.dataset_image_paths = FileSystemManager.get_image_files(Path(default_conf_path))
@@ -144,6 +147,9 @@

gui のソースコード

         self.logger.info(f"データセットディレクトリが変更されました: {new_path}")
         self.cm.config['directories']['dataset'] = new_path
         self.cm.dataset_image_paths = FileSystemManager.get_image_files(Path(new_path))
+        # path がない場合は何もしない
+        if not self.cm.dataset_image_paths:
+            return
         # 現在表示されているページを更新するため current_page の load_images メソッドを呼び出す
         current_page = self.contentStackedWidget.currentWidget()
         if hasattr(current_page, 'load_images'):
diff --git a/_modules/gui_file/DatasetExportWidget_ui.html b/_modules/gui_file/DatasetExportWidget_ui.html
index 09625e5..a482a47 100644
--- a/_modules/gui_file/DatasetExportWidget_ui.html
+++ b/_modules/gui_file/DatasetExportWidget_ui.html
@@ -77,12 +77,12 @@ 

gui_file.DatasetExportWidget_ui のソースコード

self.leftPanelLayout = QVBoxLayout(self.leftPanel) self.leftPanelLayout.setObjectName(u"leftPanelLayout") self.leftPanelLayout.setContentsMargins(0, 0, 0, 0) - self.filterWidget = TagFilterWidget(self.leftPanel) - self.filterWidget.setObjectName(u"filterWidget") - self.filterLayout = QVBoxLayout(self.filterWidget) + self.dbSearchWidget = TagFilterWidget(self.leftPanel) + self.dbSearchWidget.setObjectName(u"dbSearchWidget") + self.filterLayout = QVBoxLayout(self.dbSearchWidget) self.filterLayout.setObjectName(u"filterLayout") - self.leftPanelLayout.addWidget(self.filterWidget) + self.leftPanelLayout.addWidget(self.dbSearchWidget) self.thumbnailSelector = ThumbnailSelectorWidget(self.leftPanel) self.thumbnailSelector.setObjectName(u"thumbnailSelector") @@ -142,6 +142,11 @@

gui_file.DatasetExportWidget_ui のソースコード

self.exportLayout.addLayout(self.exportFormatLayout) + self.latestcheckBox = QCheckBox(self.exportGroupBox) + self.latestcheckBox.setObjectName(u"latestcheckBox") + + self.exportLayout.addWidget(self.latestcheckBox, 0, Qt.AlignmentFlag.AlignLeft) + self.exportButton = QPushButton(self.exportGroupBox) self.exportButton.setObjectName(u"exportButton") @@ -181,6 +186,7 @@

gui_file.DatasetExportWidget_ui のソースコード

self.exportFormatLabel.setText(QCoreApplication.translate("DatasetExportWidget", u"Export Format:", None)) self.checkBoxTxtCap.setText(QCoreApplication.translate("DatasetExportWidget", u"txt/caption", None)) self.checkBoxJson.setText(QCoreApplication.translate("DatasetExportWidget", u"metadata.json", None)) + self.latestcheckBox.setText(QCoreApplication.translate("DatasetExportWidget", u"\u6700\u5f8c\u306b\u66f4\u65b0\u3055\u308c\u305f\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3060\u3051\u3092\u51fa\u529b\u3059\u308b", None)) self.exportButton.setText(QCoreApplication.translate("DatasetExportWidget", u"Export Dataset", None)) self.statusLabel.setText(QCoreApplication.translate("DatasetExportWidget", u"Status: Ready", None))
diff --git a/_modules/gui_file/DatasetOverviewWidget_ui.html b/_modules/gui_file/DatasetOverviewWidget_ui.html index 804188f..2c9d0f5 100644 --- a/_modules/gui_file/DatasetOverviewWidget_ui.html +++ b/_modules/gui_file/DatasetOverviewWidget_ui.html @@ -54,6 +54,7 @@

gui_file.DatasetOverviewWidget_ui のソースコード

QVBoxLayout, QWidget) from ImagePreviewWidget import ImagePreviewWidget +from TagFilterWidget import TagFilterWidget from ThumbnailSelectorWidget import ThumbnailSelectorWidget
@@ -64,32 +65,53 @@

gui_file.DatasetOverviewWidget_ui のソースコード

def setupUi(self, DatasetOverviewWidget): if not DatasetOverviewWidget.objectName(): DatasetOverviewWidget.setObjectName(u"DatasetOverviewWidget") - DatasetOverviewWidget.resize(328, 800) + DatasetOverviewWidget.resize(350, 777) + sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(1) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(DatasetOverviewWidget.sizePolicy().hasHeightForWidth()) + DatasetOverviewWidget.setSizePolicy(sizePolicy) + self.verticalLayout_3 = QVBoxLayout(DatasetOverviewWidget) + self.verticalLayout_3.setObjectName(u"verticalLayout_3") self.mainSplitter = QSplitter(DatasetOverviewWidget) self.mainSplitter.setObjectName(u"mainSplitter") - self.mainSplitter.setGeometry(QRect(11, 11, 306, 778)) + sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy1.setHorizontalStretch(2) + sizePolicy1.setVerticalStretch(1) + sizePolicy1.setHeightForWidth(self.mainSplitter.sizePolicy().hasHeightForWidth()) + self.mainSplitter.setSizePolicy(sizePolicy1) self.mainSplitter.setOrientation(Qt.Orientation.Horizontal) self.mainSplitter.setHandleWidth(5) self.infoContainer = QWidget(self.mainSplitter) self.infoContainer.setObjectName(u"infoContainer") - sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(1) - sizePolicy.setVerticalStretch(1) - sizePolicy.setHeightForWidth(self.infoContainer.sizePolicy().hasHeightForWidth()) - self.infoContainer.setSizePolicy(sizePolicy) + sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy2.setHorizontalStretch(0) + sizePolicy2.setVerticalStretch(1) + sizePolicy2.setHeightForWidth(self.infoContainer.sizePolicy().hasHeightForWidth()) + self.infoContainer.setSizePolicy(sizePolicy2) + self.infoContainer.setMinimumSize(QSize(0, 0)) self.verticalLayout_2 = QVBoxLayout(self.infoContainer) self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.dbSearchWidget = TagFilterWidget(self.infoContainer) + self.dbSearchWidget.setObjectName(u"dbSearchWidget") + sizePolicy.setHeightForWidth(self.dbSearchWidget.sizePolicy().hasHeightForWidth()) + self.dbSearchWidget.setSizePolicy(sizePolicy) + + self.verticalLayout_2.addWidget(self.dbSearchWidget) + self.infoSplitter = QSplitter(self.infoContainer) self.infoSplitter.setObjectName(u"infoSplitter") + sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy3.setHorizontalStretch(0) + sizePolicy3.setVerticalStretch(0) + sizePolicy3.setHeightForWidth(self.infoSplitter.sizePolicy().hasHeightForWidth()) + self.infoSplitter.setSizePolicy(sizePolicy3) self.infoSplitter.setOrientation(Qt.Orientation.Vertical) self.metadataGroupBox = QGroupBox(self.infoSplitter) self.metadataGroupBox.setObjectName(u"metadataGroupBox") - sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - sizePolicy1.setHorizontalStretch(0) - sizePolicy1.setVerticalStretch(0) - sizePolicy1.setHeightForWidth(self.metadataGroupBox.sizePolicy().hasHeightForWidth()) - self.metadataGroupBox.setSizePolicy(sizePolicy1) - self.metadataGroupBox.setMinimumSize(QSize(0, 64)) + sizePolicy3.setHeightForWidth(self.metadataGroupBox.sizePolicy().hasHeightForWidth()) + self.metadataGroupBox.setSizePolicy(sizePolicy3) + self.metadataGroupBox.setMinimumSize(QSize(0, 0)) self.metadataLayout = QFormLayout(self.metadataGroupBox) self.metadataLayout.setObjectName(u"metadataLayout") self.fileNameLabel = QLabel(self.metadataGroupBox) @@ -175,11 +197,8 @@

gui_file.DatasetOverviewWidget_ui のソースコード

self.infoSplitter.addWidget(self.metadataGroupBox) self.annotationGroupBox = QGroupBox(self.infoSplitter) self.annotationGroupBox.setObjectName(u"annotationGroupBox") - sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred) - sizePolicy2.setHorizontalStretch(0) - sizePolicy2.setVerticalStretch(0) - sizePolicy2.setHeightForWidth(self.annotationGroupBox.sizePolicy().hasHeightForWidth()) - self.annotationGroupBox.setSizePolicy(sizePolicy2) + sizePolicy3.setHeightForWidth(self.annotationGroupBox.sizePolicy().hasHeightForWidth()) + self.annotationGroupBox.setSizePolicy(sizePolicy3) self.gridLayout_2 = QGridLayout(self.annotationGroupBox) self.gridLayout_2.setObjectName(u"gridLayout_2") self.tagsTextEdit = QTextEdit(self.annotationGroupBox) @@ -211,25 +230,33 @@

gui_file.DatasetOverviewWidget_ui のソースコード

self.mainSplitter.addWidget(self.infoContainer) self.imageContainer = QWidget(self.mainSplitter) self.imageContainer.setObjectName(u"imageContainer") - sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - sizePolicy3.setHorizontalStretch(2) - sizePolicy3.setVerticalStretch(1) - sizePolicy3.setHeightForWidth(self.imageContainer.sizePolicy().hasHeightForWidth()) - self.imageContainer.setSizePolicy(sizePolicy3) + sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy4.setHorizontalStretch(1) + sizePolicy4.setVerticalStretch(2) + sizePolicy4.setHeightForWidth(self.imageContainer.sizePolicy().hasHeightForWidth()) + self.imageContainer.setSizePolicy(sizePolicy4) + self.imageContainer.setMinimumSize(QSize(0, 0)) self.verticalLayout = QVBoxLayout(self.imageContainer) self.verticalLayout.setObjectName(u"verticalLayout") self.ImagePreview = ImagePreviewWidget(self.imageContainer) self.ImagePreview.setObjectName(u"ImagePreview") + sizePolicy3.setHeightForWidth(self.ImagePreview.sizePolicy().hasHeightForWidth()) + self.ImagePreview.setSizePolicy(sizePolicy3) self.verticalLayout.addWidget(self.ImagePreview) self.thumbnailSelector = ThumbnailSelectorWidget(self.imageContainer) self.thumbnailSelector.setObjectName(u"thumbnailSelector") + sizePolicy3.setHeightForWidth(self.thumbnailSelector.sizePolicy().hasHeightForWidth()) + self.thumbnailSelector.setSizePolicy(sizePolicy3) self.verticalLayout.addWidget(self.thumbnailSelector) self.mainSplitter.addWidget(self.imageContainer) + self.verticalLayout_3.addWidget(self.mainSplitter) + + self.retranslateUi(DatasetOverviewWidget) QMetaObject.connectSlotsByName(DatasetOverviewWidget)
diff --git a/_modules/gui_file/TagFilterWidget_ui.html b/_modules/gui_file/TagFilterWidget_ui.html index cf025dd..51a0d59 100644 --- a/_modules/gui_file/TagFilterWidget_ui.html +++ b/_modules/gui_file/TagFilterWidget_ui.html @@ -61,13 +61,19 @@

gui_file.TagFilterWidget_ui のソースコード

def setupUi(self, TagFilterWidget): if not TagFilterWidget.objectName(): TagFilterWidget.setObjectName(u"TagFilterWidget") - TagFilterWidget.resize(400, 300) + TagFilterWidget.resize(269, 277) self.verticalLayout = QVBoxLayout(TagFilterWidget) self.verticalLayout.setObjectName(u"verticalLayout") self.filterGroupBox = QGroupBox(TagFilterWidget) self.filterGroupBox.setObjectName(u"filterGroupBox") - self.filterLayout = QVBoxLayout(self.filterGroupBox) - self.filterLayout.setObjectName(u"filterLayout") + sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.filterGroupBox.sizePolicy().hasHeightForWidth()) + self.filterGroupBox.setSizePolicy(sizePolicy) + self.filterGroupBox.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.vboxLayout = QVBoxLayout(self.filterGroupBox) + self.vboxLayout.setObjectName(u"vboxLayout") self.filterTypeWidget = QWidget(self.filterGroupBox) self.filterTypeWidget.setObjectName(u"filterTypeWidget") self.filterTypeLayout = QHBoxLayout(self.filterTypeWidget) @@ -90,12 +96,12 @@

gui_file.TagFilterWidget_ui のソースコード

self.filterTypeLayout.addWidget(self.andRadioButton) - self.filterLayout.addWidget(self.filterTypeWidget) + self.vboxLayout.addWidget(self.filterTypeWidget) self.filterLineEdit = QLineEdit(self.filterGroupBox) self.filterLineEdit.setObjectName(u"filterLineEdit") - self.filterLayout.addWidget(self.filterLineEdit) + self.vboxLayout.addWidget(self.filterLineEdit) self.taggingFilter = QWidget(self.filterGroupBox) self.taggingFilter.setObjectName(u"taggingFilter") @@ -112,7 +118,7 @@

gui_file.TagFilterWidget_ui のソースコード

self.horizontalLayout_2.addWidget(self.NSFWcheckBox) - self.filterLayout.addWidget(self.taggingFilter) + self.vboxLayout.addWidget(self.taggingFilter) self.countRangeWidget = QWidget(self.filterGroupBox) self.countRangeWidget.setObjectName(u"countRangeWidget") @@ -130,7 +136,7 @@

gui_file.TagFilterWidget_ui のソースコード

self.horizontalLayout.addWidget(self.countRangeSlide) - self.filterLayout.addWidget(self.countRangeWidget) + self.vboxLayout.addWidget(self.countRangeWidget) self.resolutionWidget = QWidget(self.filterGroupBox) self.resolutionWidget.setObjectName(u"resolutionWidget") @@ -145,17 +151,18 @@

gui_file.TagFilterWidget_ui のソースコード

self.resolutionComboBox.addItem("") self.resolutionComboBox.addItem("") self.resolutionComboBox.addItem("") + self.resolutionComboBox.addItem("") self.resolutionComboBox.setObjectName(u"resolutionComboBox") self.resolutionLayout.addWidget(self.resolutionComboBox) - self.filterLayout.addWidget(self.resolutionWidget) + self.vboxLayout.addWidget(self.resolutionWidget) self.applyFilterButton = QPushButton(self.filterGroupBox) self.applyFilterButton.setObjectName(u"applyFilterButton") - self.filterLayout.addWidget(self.applyFilterButton) + self.vboxLayout.addWidget(self.applyFilterButton) self.verticalLayout.addWidget(self.filterGroupBox) @@ -182,9 +189,10 @@

gui_file.TagFilterWidget_ui のソースコード

self.NSFWcheckBox.setText(QCoreApplication.translate("TagFilterWidget", u"NSFW", None)) self.tagUpdateatLabel.setText(QCoreApplication.translate("TagFilterWidget", u"\u30bf\u30b0\u7de8\u96c6\u65e5", None)) self.resolutionLabel.setText(QCoreApplication.translate("TagFilterWidget", u"Resolution:", None)) - self.resolutionComboBox.setItemText(0, QCoreApplication.translate("TagFilterWidget", u"512x512", None)) - self.resolutionComboBox.setItemText(1, QCoreApplication.translate("TagFilterWidget", u"768x768", None)) - self.resolutionComboBox.setItemText(2, QCoreApplication.translate("TagFilterWidget", u"1024x1024", None)) + self.resolutionComboBox.setItemText(0, QCoreApplication.translate("TagFilterWidget", u"None", None)) + self.resolutionComboBox.setItemText(1, QCoreApplication.translate("TagFilterWidget", u"512x512", None)) + self.resolutionComboBox.setItemText(2, QCoreApplication.translate("TagFilterWidget", u"768x768", None)) + self.resolutionComboBox.setItemText(3, QCoreApplication.translate("TagFilterWidget", u"1024x1024", None)) self.applyFilterButton.setText(QCoreApplication.translate("TagFilterWidget", u"Apply Filters", None))
diff --git a/_modules/index.html b/_modules/index.html index c365d04..c2dc334 100644 --- a/_modules/index.html +++ b/_modules/index.html @@ -62,7 +62,7 @@

全モジュールのうち、コードを読めるもの

  • gui_file.ThumbnailSelectorWidget_ui
  • gui_file.filterBoxWidget_ui
  • gui_file.gui_ui
  • -
  • main
  • +
  • logging
  • module.api_utils
  • module.cleanup_txt
  • module.config
  • diff --git a/_modules/logging.html b/_modules/logging.html new file mode 100644 index 0000000..c20bd52 --- /dev/null +++ b/_modules/logging.html @@ -0,0 +1,2446 @@ + + + + + + + logging — lora_dataset_toolsy 1.01 ドキュメント + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    + +

    logging のソースコード

    +# Copyright 2001-2022 by Vinay Sajip. All Rights Reserved.
    +#
    +# Permission to use, copy, modify, and distribute this software and its
    +# documentation for any purpose and without fee is hereby granted,
    +# provided that the above copyright notice appear in all copies and that
    +# both that copyright notice and this permission notice appear in
    +# supporting documentation, and that the name of Vinay Sajip
    +# not be used in advertising or publicity pertaining to distribution
    +# of the software without specific, written prior permission.
    +# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
    +# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
    +# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
    +# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
    +# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
    +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    +
    +"""
    +Logging package for Python. Based on PEP 282 and comments thereto in
    +comp.lang.python.
    +
    +Copyright (C) 2001-2022 Vinay Sajip. All Rights Reserved.
    +
    +To use, simply 'import logging' and log away!
    +"""
    +
    +import sys, os, time, io, re, traceback, warnings, weakref, collections.abc
    +
    +from types import GenericAlias
    +from string import Template
    +from string import Formatter as StrFormatter
    +
    +
    +__all__ = ['BASIC_FORMAT', 'BufferingFormatter', 'CRITICAL', 'DEBUG', 'ERROR',
    +           'FATAL', 'FileHandler', 'Filter', 'Formatter', 'Handler', 'INFO',
    +           'LogRecord', 'Logger', 'LoggerAdapter', 'NOTSET', 'NullHandler',
    +           'StreamHandler', 'WARN', 'WARNING', 'addLevelName', 'basicConfig',
    +           'captureWarnings', 'critical', 'debug', 'disable', 'error',
    +           'exception', 'fatal', 'getLevelName', 'getLogger', 'getLoggerClass',
    +           'info', 'log', 'makeLogRecord', 'setLoggerClass', 'shutdown',
    +           'warn', 'warning', 'getLogRecordFactory', 'setLogRecordFactory',
    +           'lastResort', 'raiseExceptions', 'getLevelNamesMapping',
    +           'getHandlerByName', 'getHandlerNames']
    +
    +import threading
    +
    +__author__  = "Vinay Sajip <vinay_sajip@red-dove.com>"
    +__status__  = "production"
    +# The following module attributes are no longer updated.
    +__version__ = "0.5.1.2"
    +__date__    = "07 February 2010"
    +
    +#---------------------------------------------------------------------------
    +#   Miscellaneous module data
    +#---------------------------------------------------------------------------
    +
    +#
    +#_startTime is used as the base when calculating the relative time of events
    +#
    +_startTime = time.time()
    +
    +#
    +#raiseExceptions is used to see if exceptions during handling should be
    +#propagated
    +#
    +raiseExceptions = True
    +
    +#
    +# If you don't want threading information in the log, set this to False
    +#
    +logThreads = True
    +
    +#
    +# If you don't want multiprocessing information in the log, set this to False
    +#
    +logMultiprocessing = True
    +
    +#
    +# If you don't want process information in the log, set this to False
    +#
    +logProcesses = True
    +
    +#
    +# If you don't want asyncio task information in the log, set this to False
    +#
    +logAsyncioTasks = True
    +
    +#---------------------------------------------------------------------------
    +#   Level related stuff
    +#---------------------------------------------------------------------------
    +#
    +# Default levels and level names, these can be replaced with any positive set
    +# of values having corresponding names. There is a pseudo-level, NOTSET, which
    +# is only really there as a lower limit for user-defined levels. Handlers and
    +# loggers are initialized with NOTSET so that they will log all messages, even
    +# at user-defined levels.
    +#
    +
    +CRITICAL = 50
    +FATAL = CRITICAL
    +ERROR = 40
    +WARNING = 30
    +WARN = WARNING
    +INFO = 20
    +DEBUG = 10
    +NOTSET = 0
    +
    +_levelToName = {
    +    CRITICAL: 'CRITICAL',
    +    ERROR: 'ERROR',
    +    WARNING: 'WARNING',
    +    INFO: 'INFO',
    +    DEBUG: 'DEBUG',
    +    NOTSET: 'NOTSET',
    +}
    +_nameToLevel = {
    +    'CRITICAL': CRITICAL,
    +    'FATAL': FATAL,
    +    'ERROR': ERROR,
    +    'WARN': WARNING,
    +    'WARNING': WARNING,
    +    'INFO': INFO,
    +    'DEBUG': DEBUG,
    +    'NOTSET': NOTSET,
    +}
    +
    +def getLevelNamesMapping():
    +    return _nameToLevel.copy()
    +
    +def getLevelName(level):
    +    """
    +    Return the textual or numeric representation of logging level 'level'.
    +
    +    If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
    +    INFO, DEBUG) then you get the corresponding string. If you have
    +    associated levels with names using addLevelName then the name you have
    +    associated with 'level' is returned.
    +
    +    If a numeric value corresponding to one of the defined levels is passed
    +    in, the corresponding string representation is returned.
    +
    +    If a string representation of the level is passed in, the corresponding
    +    numeric value is returned.
    +
    +    If no matching numeric or string value is passed in, the string
    +    'Level %s' % level is returned.
    +    """
    +    # See Issues #22386, #27937 and #29220 for why it's this way
    +    result = _levelToName.get(level)
    +    if result is not None:
    +        return result
    +    result = _nameToLevel.get(level)
    +    if result is not None:
    +        return result
    +    return "Level %s" % level
    +
    +def addLevelName(level, levelName):
    +    """
    +    Associate 'levelName' with 'level'.
    +
    +    This is used when converting levels to text during message formatting.
    +    """
    +    _acquireLock()
    +    try:    #unlikely to cause an exception, but you never know...
    +        _levelToName[level] = levelName
    +        _nameToLevel[levelName] = level
    +    finally:
    +        _releaseLock()
    +
    +if hasattr(sys, "_getframe"):
    +    currentframe = lambda: sys._getframe(1)
    +else: #pragma: no cover
    +    def currentframe():
    +        """Return the frame object for the caller's stack frame."""
    +        try:
    +            raise Exception
    +        except Exception as exc:
    +            return exc.__traceback__.tb_frame.f_back
    +
    +#
    +# _srcfile is used when walking the stack to check when we've got the first
    +# caller stack frame, by skipping frames whose filename is that of this
    +# module's source. It therefore should contain the filename of this module's
    +# source file.
    +#
    +# Ordinarily we would use __file__ for this, but frozen modules don't always
    +# have __file__ set, for some reason (see Issue #21736). Thus, we get the
    +# filename from a handy code object from a function defined in this module.
    +# (There's no particular reason for picking addLevelName.)
    +#
    +
    +_srcfile = os.path.normcase(addLevelName.__code__.co_filename)
    +
    +# _srcfile is only used in conjunction with sys._getframe().
    +# Setting _srcfile to None will prevent findCaller() from being called. This
    +# way, you can avoid the overhead of fetching caller information.
    +
    +# The following is based on warnings._is_internal_frame. It makes sure that
    +# frames of the import mechanism are skipped when logging at module level and
    +# using a stacklevel value greater than one.
    +def _is_internal_frame(frame):
    +    """Signal whether the frame is a CPython or logging module internal."""
    +    filename = os.path.normcase(frame.f_code.co_filename)
    +    return filename == _srcfile or (
    +        "importlib" in filename and "_bootstrap" in filename
    +    )
    +
    +
    +def _checkLevel(level):
    +    if isinstance(level, int):
    +        rv = level
    +    elif str(level) == level:
    +        if level not in _nameToLevel:
    +            raise ValueError("Unknown level: %r" % level)
    +        rv = _nameToLevel[level]
    +    else:
    +        raise TypeError("Level not an integer or a valid string: %r"
    +                        % (level,))
    +    return rv
    +
    +#---------------------------------------------------------------------------
    +#   Thread-related stuff
    +#---------------------------------------------------------------------------
    +
    +#
    +#_lock is used to serialize access to shared data structures in this module.
    +#This needs to be an RLock because fileConfig() creates and configures
    +#Handlers, and so might arbitrary user threads. Since Handler code updates the
    +#shared dictionary _handlers, it needs to acquire the lock. But if configuring,
    +#the lock would already have been acquired - so we need an RLock.
    +#The same argument applies to Loggers and Manager.loggerDict.
    +#
    +_lock = threading.RLock()
    +
    +def _acquireLock():
    +    """
    +    Acquire the module-level lock for serializing access to shared data.
    +
    +    This should be released with _releaseLock().
    +    """
    +    if _lock:
    +        _lock.acquire()
    +
    +def _releaseLock():
    +    """
    +    Release the module-level lock acquired by calling _acquireLock().
    +    """
    +    if _lock:
    +        _lock.release()
    +
    +
    +# Prevent a held logging lock from blocking a child from logging.
    +
    +if not hasattr(os, 'register_at_fork'):  # Windows and friends.
    +    def _register_at_fork_reinit_lock(instance):
    +        pass  # no-op when os.register_at_fork does not exist.
    +else:
    +    # A collection of instances with a _at_fork_reinit method (logging.Handler)
    +    # to be called in the child after forking.  The weakref avoids us keeping
    +    # discarded Handler instances alive.
    +    _at_fork_reinit_lock_weakset = weakref.WeakSet()
    +
    +    def _register_at_fork_reinit_lock(instance):
    +        _acquireLock()
    +        try:
    +            _at_fork_reinit_lock_weakset.add(instance)
    +        finally:
    +            _releaseLock()
    +
    +    def _after_at_fork_child_reinit_locks():
    +        for handler in _at_fork_reinit_lock_weakset:
    +            handler._at_fork_reinit()
    +
    +        # _acquireLock() was called in the parent before forking.
    +        # The lock is reinitialized to unlocked state.
    +        _lock._at_fork_reinit()
    +
    +    os.register_at_fork(before=_acquireLock,
    +                        after_in_child=_after_at_fork_child_reinit_locks,
    +                        after_in_parent=_releaseLock)
    +
    +
    +#---------------------------------------------------------------------------
    +#   The logging record
    +#---------------------------------------------------------------------------
    +
    +class LogRecord(object):
    +    """
    +    A LogRecord instance represents an event being logged.
    +
    +    LogRecord instances are created every time something is logged. They
    +    contain all the information pertinent to the event being logged. The
    +    main information passed in is in msg and args, which are combined
    +    using str(msg) % args to create the message field of the record. The
    +    record also includes information such as when the record was created,
    +    the source line where the logging call was made, and any exception
    +    information to be logged.
    +    """
    +    def __init__(self, name, level, pathname, lineno,
    +                 msg, args, exc_info, func=None, sinfo=None, **kwargs):
    +        """
    +        Initialize a logging record with interesting information.
    +        """
    +        ct = time.time()
    +        self.name = name
    +        self.msg = msg
    +        #
    +        # The following statement allows passing of a dictionary as a sole
    +        # argument, so that you can do something like
    +        #  logging.debug("a %(a)d b %(b)s", {'a':1, 'b':2})
    +        # Suggested by Stefan Behnel.
    +        # Note that without the test for args[0], we get a problem because
    +        # during formatting, we test to see if the arg is present using
    +        # 'if self.args:'. If the event being logged is e.g. 'Value is %d'
    +        # and if the passed arg fails 'if self.args:' then no formatting
    +        # is done. For example, logger.warning('Value is %d', 0) would log
    +        # 'Value is %d' instead of 'Value is 0'.
    +        # For the use case of passing a dictionary, this should not be a
    +        # problem.
    +        # Issue #21172: a request was made to relax the isinstance check
    +        # to hasattr(args[0], '__getitem__'). However, the docs on string
    +        # formatting still seem to suggest a mapping object is required.
    +        # Thus, while not removing the isinstance check, it does now look
    +        # for collections.abc.Mapping rather than, as before, dict.
    +        if (args and len(args) == 1 and isinstance(args[0], collections.abc.Mapping)
    +            and args[0]):
    +            args = args[0]
    +        self.args = args
    +        self.levelname = getLevelName(level)
    +        self.levelno = level
    +        self.pathname = pathname
    +        try:
    +            self.filename = os.path.basename(pathname)
    +            self.module = os.path.splitext(self.filename)[0]
    +        except (TypeError, ValueError, AttributeError):
    +            self.filename = pathname
    +            self.module = "Unknown module"
    +        self.exc_info = exc_info
    +        self.exc_text = None      # used to cache the traceback text
    +        self.stack_info = sinfo
    +        self.lineno = lineno
    +        self.funcName = func
    +        self.created = ct
    +        self.msecs = int((ct - int(ct)) * 1000) + 0.0  # see gh-89047
    +        self.relativeCreated = (self.created - _startTime) * 1000
    +        if logThreads:
    +            self.thread = threading.get_ident()
    +            self.threadName = threading.current_thread().name
    +        else: # pragma: no cover
    +            self.thread = None
    +            self.threadName = None
    +        if not logMultiprocessing: # pragma: no cover
    +            self.processName = None
    +        else:
    +            self.processName = 'MainProcess'
    +            mp = sys.modules.get('multiprocessing')
    +            if mp is not None:
    +                # Errors may occur if multiprocessing has not finished loading
    +                # yet - e.g. if a custom import hook causes third-party code
    +                # to run when multiprocessing calls import. See issue 8200
    +                # for an example
    +                try:
    +                    self.processName = mp.current_process().name
    +                except Exception: #pragma: no cover
    +                    pass
    +        if logProcesses and hasattr(os, 'getpid'):
    +            self.process = os.getpid()
    +        else:
    +            self.process = None
    +
    +        self.taskName = None
    +        if logAsyncioTasks:
    +            asyncio = sys.modules.get('asyncio')
    +            if asyncio:
    +                try:
    +                    self.taskName = asyncio.current_task().get_name()
    +                except Exception:
    +                    pass
    +
    +    def __repr__(self):
    +        return '<LogRecord: %s, %s, %s, %s, "%s">'%(self.name, self.levelno,
    +            self.pathname, self.lineno, self.msg)
    +
    +    def getMessage(self):
    +        """
    +        Return the message for this LogRecord.
    +
    +        Return the message for this LogRecord after merging any user-supplied
    +        arguments with the message.
    +        """
    +        msg = str(self.msg)
    +        if self.args:
    +            msg = msg % self.args
    +        return msg
    +
    +#
    +#   Determine which class to use when instantiating log records.
    +#
    +_logRecordFactory = LogRecord
    +
    +def setLogRecordFactory(factory):
    +    """
    +    Set the factory to be used when instantiating a log record.
    +
    +    :param factory: A callable which will be called to instantiate
    +    a log record.
    +    """
    +    global _logRecordFactory
    +    _logRecordFactory = factory
    +
    +def getLogRecordFactory():
    +    """
    +    Return the factory to be used when instantiating a log record.
    +    """
    +
    +    return _logRecordFactory
    +
    +def makeLogRecord(dict):
    +    """
    +    Make a LogRecord whose attributes are defined by the specified dictionary,
    +    This function is useful for converting a logging event received over
    +    a socket connection (which is sent as a dictionary) into a LogRecord
    +    instance.
    +    """
    +    rv = _logRecordFactory(None, None, "", 0, "", (), None, None)
    +    rv.__dict__.update(dict)
    +    return rv
    +
    +
    +#---------------------------------------------------------------------------
    +#   Formatter classes and functions
    +#---------------------------------------------------------------------------
    +_str_formatter = StrFormatter()
    +del StrFormatter
    +
    +
    +class PercentStyle(object):
    +
    +    default_format = '%(message)s'
    +    asctime_format = '%(asctime)s'
    +    asctime_search = '%(asctime)'
    +    validation_pattern = re.compile(r'%\(\w+\)[#0+ -]*(\*|\d+)?(\.(\*|\d+))?[diouxefgcrsa%]', re.I)
    +
    +    def __init__(self, fmt, *, defaults=None):
    +        self._fmt = fmt or self.default_format
    +        self._defaults = defaults
    +
    +    def usesTime(self):
    +        return self._fmt.find(self.asctime_search) >= 0
    +
    +    def validate(self):
    +        """Validate the input format, ensure it matches the correct style"""
    +        if not self.validation_pattern.search(self._fmt):
    +            raise ValueError("Invalid format '%s' for '%s' style" % (self._fmt, self.default_format[0]))
    +
    +    def _format(self, record):
    +        if defaults := self._defaults:
    +            values = defaults | record.__dict__
    +        else:
    +            values = record.__dict__
    +        return self._fmt % values
    +
    +    def format(self, record):
    +        try:
    +            return self._format(record)
    +        except KeyError as e:
    +            raise ValueError('Formatting field not found in record: %s' % e)
    +
    +
    +class StrFormatStyle(PercentStyle):
    +    default_format = '{message}'
    +    asctime_format = '{asctime}'
    +    asctime_search = '{asctime'
    +
    +    fmt_spec = re.compile(r'^(.?[<>=^])?[+ -]?#?0?(\d+|{\w+})?[,_]?(\.(\d+|{\w+}))?[bcdefgnosx%]?$', re.I)
    +    field_spec = re.compile(r'^(\d+|\w+)(\.\w+|\[[^]]+\])*$')
    +
    +    def _format(self, record):
    +        if defaults := self._defaults:
    +            values = defaults | record.__dict__
    +        else:
    +            values = record.__dict__
    +        return self._fmt.format(**values)
    +
    +    def validate(self):
    +        """Validate the input format, ensure it is the correct string formatting style"""
    +        fields = set()
    +        try:
    +            for _, fieldname, spec, conversion in _str_formatter.parse(self._fmt):
    +                if fieldname:
    +                    if not self.field_spec.match(fieldname):
    +                        raise ValueError('invalid field name/expression: %r' % fieldname)
    +                    fields.add(fieldname)
    +                if conversion and conversion not in 'rsa':
    +                    raise ValueError('invalid conversion: %r' % conversion)
    +                if spec and not self.fmt_spec.match(spec):
    +                    raise ValueError('bad specifier: %r' % spec)
    +        except ValueError as e:
    +            raise ValueError('invalid format: %s' % e)
    +        if not fields:
    +            raise ValueError('invalid format: no fields')
    +
    +
    +class StringTemplateStyle(PercentStyle):
    +    default_format = '${message}'
    +    asctime_format = '${asctime}'
    +    asctime_search = '${asctime}'
    +
    +    def __init__(self, *args, **kwargs):
    +        super().__init__(*args, **kwargs)
    +        self._tpl = Template(self._fmt)
    +
    +    def usesTime(self):
    +        fmt = self._fmt
    +        return fmt.find('$asctime') >= 0 or fmt.find(self.asctime_search) >= 0
    +
    +    def validate(self):
    +        pattern = Template.pattern
    +        fields = set()
    +        for m in pattern.finditer(self._fmt):
    +            d = m.groupdict()
    +            if d['named']:
    +                fields.add(d['named'])
    +            elif d['braced']:
    +                fields.add(d['braced'])
    +            elif m.group(0) == '$':
    +                raise ValueError('invalid format: bare \'$\' not allowed')
    +        if not fields:
    +            raise ValueError('invalid format: no fields')
    +
    +    def _format(self, record):
    +        if defaults := self._defaults:
    +            values = defaults | record.__dict__
    +        else:
    +            values = record.__dict__
    +        return self._tpl.substitute(**values)
    +
    +
    +BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s"
    +
    +_STYLES = {
    +    '%': (PercentStyle, BASIC_FORMAT),
    +    '{': (StrFormatStyle, '{levelname}:{name}:{message}'),
    +    '$': (StringTemplateStyle, '${levelname}:${name}:${message}'),
    +}
    +
    +class Formatter(object):
    +    """
    +    Formatter instances are used to convert a LogRecord to text.
    +
    +    Formatters need to know how a LogRecord is constructed. They are
    +    responsible for converting a LogRecord to (usually) a string which can
    +    be interpreted by either a human or an external system. The base Formatter
    +    allows a formatting string to be specified. If none is supplied, the
    +    style-dependent default value, "%(message)s", "{message}", or
    +    "${message}", is used.
    +
    +    The Formatter can be initialized with a format string which makes use of
    +    knowledge of the LogRecord attributes - e.g. the default value mentioned
    +    above makes use of the fact that the user's message and arguments are pre-
    +    formatted into a LogRecord's message attribute. Currently, the useful
    +    attributes in a LogRecord are described by:
    +
    +    %(name)s            Name of the logger (logging channel)
    +    %(levelno)s         Numeric logging level for the message (DEBUG, INFO,
    +                        WARNING, ERROR, CRITICAL)
    +    %(levelname)s       Text logging level for the message ("DEBUG", "INFO",
    +                        "WARNING", "ERROR", "CRITICAL")
    +    %(pathname)s        Full pathname of the source file where the logging
    +                        call was issued (if available)
    +    %(filename)s        Filename portion of pathname
    +    %(module)s          Module (name portion of filename)
    +    %(lineno)d          Source line number where the logging call was issued
    +                        (if available)
    +    %(funcName)s        Function name
    +    %(created)f         Time when the LogRecord was created (time.time()
    +                        return value)
    +    %(asctime)s         Textual time when the LogRecord was created
    +    %(msecs)d           Millisecond portion of the creation time
    +    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
    +                        relative to the time the logging module was loaded
    +                        (typically at application startup time)
    +    %(thread)d          Thread ID (if available)
    +    %(threadName)s      Thread name (if available)
    +    %(taskName)s        Task name (if available)
    +    %(process)d         Process ID (if available)
    +    %(message)s         The result of record.getMessage(), computed just as
    +                        the record is emitted
    +    """
    +
    +    converter = time.localtime
    +
    +    def __init__(self, fmt=None, datefmt=None, style='%', validate=True, *,
    +                 defaults=None):
    +        """
    +        Initialize the formatter with specified format strings.
    +
    +        Initialize the formatter either with the specified format string, or a
    +        default as described above. Allow for specialized date formatting with
    +        the optional datefmt argument. If datefmt is omitted, you get an
    +        ISO8601-like (or RFC 3339-like) format.
    +
    +        Use a style parameter of '%', '{' or '$' to specify that you want to
    +        use one of %-formatting, :meth:`str.format` (``{}``) formatting or
    +        :class:`string.Template` formatting in your format string.
    +
    +        .. versionchanged:: 3.2
    +           Added the ``style`` parameter.
    +        """
    +        if style not in _STYLES:
    +            raise ValueError('Style must be one of: %s' % ','.join(
    +                             _STYLES.keys()))
    +        self._style = _STYLES[style][0](fmt, defaults=defaults)
    +        if validate:
    +            self._style.validate()
    +
    +        self._fmt = self._style._fmt
    +        self.datefmt = datefmt
    +
    +    default_time_format = '%Y-%m-%d %H:%M:%S'
    +    default_msec_format = '%s,%03d'
    +
    +    def formatTime(self, record, datefmt=None):
    +        """
    +        Return the creation time of the specified LogRecord as formatted text.
    +
    +        This method should be called from format() by a formatter which
    +        wants to make use of a formatted time. This method can be overridden
    +        in formatters to provide for any specific requirement, but the
    +        basic behaviour is as follows: if datefmt (a string) is specified,
    +        it is used with time.strftime() to format the creation time of the
    +        record. Otherwise, an ISO8601-like (or RFC 3339-like) format is used.
    +        The resulting string is returned. This function uses a user-configurable
    +        function to convert the creation time to a tuple. By default,
    +        time.localtime() is used; to change this for a particular formatter
    +        instance, set the 'converter' attribute to a function with the same
    +        signature as time.localtime() or time.gmtime(). To change it for all
    +        formatters, for example if you want all logging times to be shown in GMT,
    +        set the 'converter' attribute in the Formatter class.
    +        """
    +        ct = self.converter(record.created)
    +        if datefmt:
    +            s = time.strftime(datefmt, ct)
    +        else:
    +            s = time.strftime(self.default_time_format, ct)
    +            if self.default_msec_format:
    +                s = self.default_msec_format % (s, record.msecs)
    +        return s
    +
    +    def formatException(self, ei):
    +        """
    +        Format and return the specified exception information as a string.
    +
    +        This default implementation just uses
    +        traceback.print_exception()
    +        """
    +        sio = io.StringIO()
    +        tb = ei[2]
    +        # See issues #9427, #1553375. Commented out for now.
    +        #if getattr(self, 'fullstack', False):
    +        #    traceback.print_stack(tb.tb_frame.f_back, file=sio)
    +        traceback.print_exception(ei[0], ei[1], tb, None, sio)
    +        s = sio.getvalue()
    +        sio.close()
    +        if s[-1:] == "\n":
    +            s = s[:-1]
    +        return s
    +
    +    def usesTime(self):
    +        """
    +        Check if the format uses the creation time of the record.
    +        """
    +        return self._style.usesTime()
    +
    +    def formatMessage(self, record):
    +        return self._style.format(record)
    +
    +    def formatStack(self, stack_info):
    +        """
    +        This method is provided as an extension point for specialized
    +        formatting of stack information.
    +
    +        The input data is a string as returned from a call to
    +        :func:`traceback.print_stack`, but with the last trailing newline
    +        removed.
    +
    +        The base implementation just returns the value passed in.
    +        """
    +        return stack_info
    +
    +    def format(self, record):
    +        """
    +        Format the specified record as text.
    +
    +        The record's attribute dictionary is used as the operand to a
    +        string formatting operation which yields the returned string.
    +        Before formatting the dictionary, a couple of preparatory steps
    +        are carried out. The message attribute of the record is computed
    +        using LogRecord.getMessage(). If the formatting string uses the
    +        time (as determined by a call to usesTime(), formatTime() is
    +        called to format the event time. If there is exception information,
    +        it is formatted using formatException() and appended to the message.
    +        """
    +        record.message = record.getMessage()
    +        if self.usesTime():
    +            record.asctime = self.formatTime(record, self.datefmt)
    +        s = self.formatMessage(record)
    +        if record.exc_info:
    +            # Cache the traceback text to avoid converting it multiple times
    +            # (it's constant anyway)
    +            if not record.exc_text:
    +                record.exc_text = self.formatException(record.exc_info)
    +        if record.exc_text:
    +            if s[-1:] != "\n":
    +                s = s + "\n"
    +            s = s + record.exc_text
    +        if record.stack_info:
    +            if s[-1:] != "\n":
    +                s = s + "\n"
    +            s = s + self.formatStack(record.stack_info)
    +        return s
    +
    +#
    +#   The default formatter to use when no other is specified
    +#
    +_defaultFormatter = Formatter()
    +
    +class BufferingFormatter(object):
    +    """
    +    A formatter suitable for formatting a number of records.
    +    """
    +    def __init__(self, linefmt=None):
    +        """
    +        Optionally specify a formatter which will be used to format each
    +        individual record.
    +        """
    +        if linefmt:
    +            self.linefmt = linefmt
    +        else:
    +            self.linefmt = _defaultFormatter
    +
    +    def formatHeader(self, records):
    +        """
    +        Return the header string for the specified records.
    +        """
    +        return ""
    +
    +    def formatFooter(self, records):
    +        """
    +        Return the footer string for the specified records.
    +        """
    +        return ""
    +
    +    def format(self, records):
    +        """
    +        Format the specified records and return the result as a string.
    +        """
    +        rv = ""
    +        if len(records) > 0:
    +            rv = rv + self.formatHeader(records)
    +            for record in records:
    +                rv = rv + self.linefmt.format(record)
    +            rv = rv + self.formatFooter(records)
    +        return rv
    +
    +#---------------------------------------------------------------------------
    +#   Filter classes and functions
    +#---------------------------------------------------------------------------
    +
    +class Filter(object):
    +    """
    +    Filter instances are used to perform arbitrary filtering of LogRecords.
    +
    +    Loggers and Handlers can optionally use Filter instances to filter
    +    records as desired. The base filter class only allows events which are
    +    below a certain point in the logger hierarchy. For example, a filter
    +    initialized with "A.B" will allow events logged by loggers "A.B",
    +    "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
    +    initialized with the empty string, all events are passed.
    +    """
    +    def __init__(self, name=''):
    +        """
    +        Initialize a filter.
    +
    +        Initialize with the name of the logger which, together with its
    +        children, will have its events allowed through the filter. If no
    +        name is specified, allow every event.
    +        """
    +        self.name = name
    +        self.nlen = len(name)
    +
    +    def filter(self, record):
    +        """
    +        Determine if the specified record is to be logged.
    +
    +        Returns True if the record should be logged, or False otherwise.
    +        If deemed appropriate, the record may be modified in-place.
    +        """
    +        if self.nlen == 0:
    +            return True
    +        elif self.name == record.name:
    +            return True
    +        elif record.name.find(self.name, 0, self.nlen) != 0:
    +            return False
    +        return (record.name[self.nlen] == ".")
    +
    +class Filterer(object):
    +    """
    +    A base class for loggers and handlers which allows them to share
    +    common code.
    +    """
    +    def __init__(self):
    +        """
    +        Initialize the list of filters to be an empty list.
    +        """
    +        self.filters = []
    +
    +    def addFilter(self, filter):
    +        """
    +        Add the specified filter to this handler.
    +        """
    +        if not (filter in self.filters):
    +            self.filters.append(filter)
    +
    +    def removeFilter(self, filter):
    +        """
    +        Remove the specified filter from this handler.
    +        """
    +        if filter in self.filters:
    +            self.filters.remove(filter)
    +
    +    def filter(self, record):
    +        """
    +        Determine if a record is loggable by consulting all the filters.
    +
    +        The default is to allow the record to be logged; any filter can veto
    +        this by returning a false value.
    +        If a filter attached to a handler returns a log record instance,
    +        then that instance is used in place of the original log record in
    +        any further processing of the event by that handler.
    +        If a filter returns any other true value, the original log record
    +        is used in any further processing of the event by that handler.
    +
    +        If none of the filters return false values, this method returns
    +        a log record.
    +        If any of the filters return a false value, this method returns
    +        a false value.
    +
    +        .. versionchanged:: 3.2
    +
    +           Allow filters to be just callables.
    +
    +        .. versionchanged:: 3.12
    +           Allow filters to return a LogRecord instead of
    +           modifying it in place.
    +        """
    +        for f in self.filters:
    +            if hasattr(f, 'filter'):
    +                result = f.filter(record)
    +            else:
    +                result = f(record) # assume callable - will raise if not
    +            if not result:
    +                return False
    +            if isinstance(result, LogRecord):
    +                record = result
    +        return record
    +
    +#---------------------------------------------------------------------------
    +#   Handler classes and functions
    +#---------------------------------------------------------------------------
    +
    +_handlers = weakref.WeakValueDictionary()  #map of handler names to handlers
    +_handlerList = [] # added to allow handlers to be removed in reverse of order initialized
    +
    +def _removeHandlerRef(wr):
    +    """
    +    Remove a handler reference from the internal cleanup list.
    +    """
    +    # This function can be called during module teardown, when globals are
    +    # set to None. It can also be called from another thread. So we need to
    +    # pre-emptively grab the necessary globals and check if they're None,
    +    # to prevent race conditions and failures during interpreter shutdown.
    +    acquire, release, handlers = _acquireLock, _releaseLock, _handlerList
    +    if acquire and release and handlers:
    +        acquire()
    +        try:
    +            handlers.remove(wr)
    +        except ValueError:
    +            pass
    +        finally:
    +            release()
    +
    +def _addHandlerRef(handler):
    +    """
    +    Add a handler to the internal cleanup list using a weak reference.
    +    """
    +    _acquireLock()
    +    try:
    +        _handlerList.append(weakref.ref(handler, _removeHandlerRef))
    +    finally:
    +        _releaseLock()
    +
    +
    +def getHandlerByName(name):
    +    """
    +    Get a handler with the specified *name*, or None if there isn't one with
    +    that name.
    +    """
    +    return _handlers.get(name)
    +
    +
    +def getHandlerNames():
    +    """
    +    Return all known handler names as an immutable set.
    +    """
    +    result = set(_handlers.keys())
    +    return frozenset(result)
    +
    +
    +class Handler(Filterer):
    +    """
    +    Handler instances dispatch logging events to specific destinations.
    +
    +    The base handler class. Acts as a placeholder which defines the Handler
    +    interface. Handlers can optionally use Formatter instances to format
    +    records as desired. By default, no formatter is specified; in this case,
    +    the 'raw' message as determined by record.message is logged.
    +    """
    +    def __init__(self, level=NOTSET):
    +        """
    +        Initializes the instance - basically setting the formatter to None
    +        and the filter list to empty.
    +        """
    +        Filterer.__init__(self)
    +        self._name = None
    +        self.level = _checkLevel(level)
    +        self.formatter = None
    +        self._closed = False
    +        # Add the handler to the global _handlerList (for cleanup on shutdown)
    +        _addHandlerRef(self)
    +        self.createLock()
    +
    +    def get_name(self):
    +        return self._name
    +
    +    def set_name(self, name):
    +        _acquireLock()
    +        try:
    +            if self._name in _handlers:
    +                del _handlers[self._name]
    +            self._name = name
    +            if name:
    +                _handlers[name] = self
    +        finally:
    +            _releaseLock()
    +
    +    name = property(get_name, set_name)
    +
    +    def createLock(self):
    +        """
    +        Acquire a thread lock for serializing access to the underlying I/O.
    +        """
    +        self.lock = threading.RLock()
    +        _register_at_fork_reinit_lock(self)
    +
    +    def _at_fork_reinit(self):
    +        self.lock._at_fork_reinit()
    +
    +    def acquire(self):
    +        """
    +        Acquire the I/O thread lock.
    +        """
    +        if self.lock:
    +            self.lock.acquire()
    +
    +    def release(self):
    +        """
    +        Release the I/O thread lock.
    +        """
    +        if self.lock:
    +            self.lock.release()
    +
    +    def setLevel(self, level):
    +        """
    +        Set the logging level of this handler.  level must be an int or a str.
    +        """
    +        self.level = _checkLevel(level)
    +
    +    def format(self, record):
    +        """
    +        Format the specified record.
    +
    +        If a formatter is set, use it. Otherwise, use the default formatter
    +        for the module.
    +        """
    +        if self.formatter:
    +            fmt = self.formatter
    +        else:
    +            fmt = _defaultFormatter
    +        return fmt.format(record)
    +
    +    def emit(self, record):
    +        """
    +        Do whatever it takes to actually log the specified logging record.
    +
    +        This version is intended to be implemented by subclasses and so
    +        raises a NotImplementedError.
    +        """
    +        raise NotImplementedError('emit must be implemented '
    +                                  'by Handler subclasses')
    +
    +    def handle(self, record):
    +        """
    +        Conditionally emit the specified logging record.
    +
    +        Emission depends on filters which may have been added to the handler.
    +        Wrap the actual emission of the record with acquisition/release of
    +        the I/O thread lock.
    +
    +        Returns an instance of the log record that was emitted
    +        if it passed all filters, otherwise a false value is returned.
    +        """
    +        rv = self.filter(record)
    +        if isinstance(rv, LogRecord):
    +            record = rv
    +        if rv:
    +            self.acquire()
    +            try:
    +                self.emit(record)
    +            finally:
    +                self.release()
    +        return rv
    +
    +    def setFormatter(self, fmt):
    +        """
    +        Set the formatter for this handler.
    +        """
    +        self.formatter = fmt
    +
    +    def flush(self):
    +        """
    +        Ensure all logging output has been flushed.
    +
    +        This version does nothing and is intended to be implemented by
    +        subclasses.
    +        """
    +        pass
    +
    +    def close(self):
    +        """
    +        Tidy up any resources used by the handler.
    +
    +        This version removes the handler from an internal map of handlers,
    +        _handlers, which is used for handler lookup by name. Subclasses
    +        should ensure that this gets called from overridden close()
    +        methods.
    +        """
    +        #get the module data lock, as we're updating a shared structure.
    +        _acquireLock()
    +        try:    #unlikely to raise an exception, but you never know...
    +            self._closed = True
    +            if self._name and self._name in _handlers:
    +                del _handlers[self._name]
    +        finally:
    +            _releaseLock()
    +
    +    def handleError(self, record):
    +        """
    +        Handle errors which occur during an emit() call.
    +
    +        This method should be called from handlers when an exception is
    +        encountered during an emit() call. If raiseExceptions is false,
    +        exceptions get silently ignored. This is what is mostly wanted
    +        for a logging system - most users will not care about errors in
    +        the logging system, they are more interested in application errors.
    +        You could, however, replace this with a custom handler if you wish.
    +        The record which was being processed is passed in to this method.
    +        """
    +        if raiseExceptions and sys.stderr:  # see issue 13807
    +            t, v, tb = sys.exc_info()
    +            try:
    +                sys.stderr.write('--- Logging error ---\n')
    +                traceback.print_exception(t, v, tb, None, sys.stderr)
    +                sys.stderr.write('Call stack:\n')
    +                # Walk the stack frame up until we're out of logging,
    +                # so as to print the calling context.
    +                frame = tb.tb_frame
    +                while (frame and os.path.dirname(frame.f_code.co_filename) ==
    +                       __path__[0]):
    +                    frame = frame.f_back
    +                if frame:
    +                    traceback.print_stack(frame, file=sys.stderr)
    +                else:
    +                    # couldn't find the right stack frame, for some reason
    +                    sys.stderr.write('Logged from file %s, line %s\n' % (
    +                                     record.filename, record.lineno))
    +                # Issue 18671: output logging message and arguments
    +                try:
    +                    sys.stderr.write('Message: %r\n'
    +                                     'Arguments: %s\n' % (record.msg,
    +                                                          record.args))
    +                except RecursionError:  # See issue 36272
    +                    raise
    +                except Exception:
    +                    sys.stderr.write('Unable to print the message and arguments'
    +                                     ' - possible formatting error.\nUse the'
    +                                     ' traceback above to help find the error.\n'
    +                                    )
    +            except OSError: #pragma: no cover
    +                pass    # see issue 5971
    +            finally:
    +                del t, v, tb
    +
    +    def __repr__(self):
    +        level = getLevelName(self.level)
    +        return '<%s (%s)>' % (self.__class__.__name__, level)
    +
    +class StreamHandler(Handler):
    +    """
    +    A handler class which writes logging records, appropriately formatted,
    +    to a stream. Note that this class does not close the stream, as
    +    sys.stdout or sys.stderr may be used.
    +    """
    +
    +    terminator = '\n'
    +
    +    def __init__(self, stream=None):
    +        """
    +        Initialize the handler.
    +
    +        If stream is not specified, sys.stderr is used.
    +        """
    +        Handler.__init__(self)
    +        if stream is None:
    +            stream = sys.stderr
    +        self.stream = stream
    +
    +    def flush(self):
    +        """
    +        Flushes the stream.
    +        """
    +        self.acquire()
    +        try:
    +            if self.stream and hasattr(self.stream, "flush"):
    +                self.stream.flush()
    +        finally:
    +            self.release()
    +
    +    def emit(self, record):
    +        """
    +        Emit a record.
    +
    +        If a formatter is specified, it is used to format the record.
    +        The record is then written to the stream with a trailing newline.  If
    +        exception information is present, it is formatted using
    +        traceback.print_exception and appended to the stream.  If the stream
    +        has an 'encoding' attribute, it is used to determine how to do the
    +        output to the stream.
    +        """
    +        try:
    +            msg = self.format(record)
    +            stream = self.stream
    +            # issue 35046: merged two stream.writes into one.
    +            stream.write(msg + self.terminator)
    +            self.flush()
    +        except RecursionError:  # See issue 36272
    +            raise
    +        except Exception:
    +            self.handleError(record)
    +
    +    def setStream(self, stream):
    +        """
    +        Sets the StreamHandler's stream to the specified value,
    +        if it is different.
    +
    +        Returns the old stream, if the stream was changed, or None
    +        if it wasn't.
    +        """
    +        if stream is self.stream:
    +            result = None
    +        else:
    +            result = self.stream
    +            self.acquire()
    +            try:
    +                self.flush()
    +                self.stream = stream
    +            finally:
    +                self.release()
    +        return result
    +
    +    def __repr__(self):
    +        level = getLevelName(self.level)
    +        name = getattr(self.stream, 'name', '')
    +        #  bpo-36015: name can be an int
    +        name = str(name)
    +        if name:
    +            name += ' '
    +        return '<%s %s(%s)>' % (self.__class__.__name__, name, level)
    +
    +    __class_getitem__ = classmethod(GenericAlias)
    +
    +
    +class FileHandler(StreamHandler):
    +    """
    +    A handler class which writes formatted logging records to disk files.
    +    """
    +    def __init__(self, filename, mode='a', encoding=None, delay=False, errors=None):
    +        """
    +        Open the specified file and use it as the stream for logging.
    +        """
    +        # Issue #27493: add support for Path objects to be passed in
    +        filename = os.fspath(filename)
    +        #keep the absolute path, otherwise derived classes which use this
    +        #may come a cropper when the current directory changes
    +        self.baseFilename = os.path.abspath(filename)
    +        self.mode = mode
    +        self.encoding = encoding
    +        if "b" not in mode:
    +            self.encoding = io.text_encoding(encoding)
    +        self.errors = errors
    +        self.delay = delay
    +        # bpo-26789: FileHandler keeps a reference to the builtin open()
    +        # function to be able to open or reopen the file during Python
    +        # finalization.
    +        self._builtin_open = open
    +        if delay:
    +            #We don't open the stream, but we still need to call the
    +            #Handler constructor to set level, formatter, lock etc.
    +            Handler.__init__(self)
    +            self.stream = None
    +        else:
    +            StreamHandler.__init__(self, self._open())
    +
    +    def close(self):
    +        """
    +        Closes the stream.
    +        """
    +        self.acquire()
    +        try:
    +            try:
    +                if self.stream:
    +                    try:
    +                        self.flush()
    +                    finally:
    +                        stream = self.stream
    +                        self.stream = None
    +                        if hasattr(stream, "close"):
    +                            stream.close()
    +            finally:
    +                # Issue #19523: call unconditionally to
    +                # prevent a handler leak when delay is set
    +                # Also see Issue #42378: we also rely on
    +                # self._closed being set to True there
    +                StreamHandler.close(self)
    +        finally:
    +            self.release()
    +
    +    def _open(self):
    +        """
    +        Open the current base file with the (original) mode and encoding.
    +        Return the resulting stream.
    +        """
    +        open_func = self._builtin_open
    +        return open_func(self.baseFilename, self.mode,
    +                         encoding=self.encoding, errors=self.errors)
    +
    +    def emit(self, record):
    +        """
    +        Emit a record.
    +
    +        If the stream was not opened because 'delay' was specified in the
    +        constructor, open it before calling the superclass's emit.
    +
    +        If stream is not open, current mode is 'w' and `_closed=True`, record
    +        will not be emitted (see Issue #42378).
    +        """
    +        if self.stream is None:
    +            if self.mode != 'w' or not self._closed:
    +                self.stream = self._open()
    +        if self.stream:
    +            StreamHandler.emit(self, record)
    +
    +    def __repr__(self):
    +        level = getLevelName(self.level)
    +        return '<%s %s (%s)>' % (self.__class__.__name__, self.baseFilename, level)
    +
    +
    +class _StderrHandler(StreamHandler):
    +    """
    +    This class is like a StreamHandler using sys.stderr, but always uses
    +    whatever sys.stderr is currently set to rather than the value of
    +    sys.stderr at handler construction time.
    +    """
    +    def __init__(self, level=NOTSET):
    +        """
    +        Initialize the handler.
    +        """
    +        Handler.__init__(self, level)
    +
    +    @property
    +    def stream(self):
    +        return sys.stderr
    +
    +
    +_defaultLastResort = _StderrHandler(WARNING)
    +lastResort = _defaultLastResort
    +
    +#---------------------------------------------------------------------------
    +#   Manager classes and functions
    +#---------------------------------------------------------------------------
    +
    +class PlaceHolder(object):
    +    """
    +    PlaceHolder instances are used in the Manager logger hierarchy to take
    +    the place of nodes for which no loggers have been defined. This class is
    +    intended for internal use only and not as part of the public API.
    +    """
    +    def __init__(self, alogger):
    +        """
    +        Initialize with the specified logger being a child of this placeholder.
    +        """
    +        self.loggerMap = { alogger : None }
    +
    +    def append(self, alogger):
    +        """
    +        Add the specified logger as a child of this placeholder.
    +        """
    +        if alogger not in self.loggerMap:
    +            self.loggerMap[alogger] = None
    +
    +#
    +#   Determine which class to use when instantiating loggers.
    +#
    +
    +def setLoggerClass(klass):
    +    """
    +    Set the class to be used when instantiating a logger. The class should
    +    define __init__() such that only a name argument is required, and the
    +    __init__() should call Logger.__init__()
    +    """
    +    if klass != Logger:
    +        if not issubclass(klass, Logger):
    +            raise TypeError("logger not derived from logging.Logger: "
    +                            + klass.__name__)
    +    global _loggerClass
    +    _loggerClass = klass
    +
    +def getLoggerClass():
    +    """
    +    Return the class to be used when instantiating a logger.
    +    """
    +    return _loggerClass
    +
    +class Manager(object):
    +    """
    +    There is [under normal circumstances] just one Manager instance, which
    +    holds the hierarchy of loggers.
    +    """
    +    def __init__(self, rootnode):
    +        """
    +        Initialize the manager with the root node of the logger hierarchy.
    +        """
    +        self.root = rootnode
    +        self.disable = 0
    +        self.emittedNoHandlerWarning = False
    +        self.loggerDict = {}
    +        self.loggerClass = None
    +        self.logRecordFactory = None
    +
    +    @property
    +    def disable(self):
    +        return self._disable
    +
    +    @disable.setter
    +    def disable(self, value):
    +        self._disable = _checkLevel(value)
    +
    +    def getLogger(self, name):
    +        """
    +        Get a logger with the specified name (channel name), creating it
    +        if it doesn't yet exist. This name is a dot-separated hierarchical
    +        name, such as "a", "a.b", "a.b.c" or similar.
    +
    +        If a PlaceHolder existed for the specified name [i.e. the logger
    +        didn't exist but a child of it did], replace it with the created
    +        logger and fix up the parent/child references which pointed to the
    +        placeholder to now point to the logger.
    +        """
    +        rv = None
    +        if not isinstance(name, str):
    +            raise TypeError('A logger name must be a string')
    +        _acquireLock()
    +        try:
    +            if name in self.loggerDict:
    +                rv = self.loggerDict[name]
    +                if isinstance(rv, PlaceHolder):
    +                    ph = rv
    +                    rv = (self.loggerClass or _loggerClass)(name)
    +                    rv.manager = self
    +                    self.loggerDict[name] = rv
    +                    self._fixupChildren(ph, rv)
    +                    self._fixupParents(rv)
    +            else:
    +                rv = (self.loggerClass or _loggerClass)(name)
    +                rv.manager = self
    +                self.loggerDict[name] = rv
    +                self._fixupParents(rv)
    +        finally:
    +            _releaseLock()
    +        return rv
    +
    +    def setLoggerClass(self, klass):
    +        """
    +        Set the class to be used when instantiating a logger with this Manager.
    +        """
    +        if klass != Logger:
    +            if not issubclass(klass, Logger):
    +                raise TypeError("logger not derived from logging.Logger: "
    +                                + klass.__name__)
    +        self.loggerClass = klass
    +
    +    def setLogRecordFactory(self, factory):
    +        """
    +        Set the factory to be used when instantiating a log record with this
    +        Manager.
    +        """
    +        self.logRecordFactory = factory
    +
    +    def _fixupParents(self, alogger):
    +        """
    +        Ensure that there are either loggers or placeholders all the way
    +        from the specified logger to the root of the logger hierarchy.
    +        """
    +        name = alogger.name
    +        i = name.rfind(".")
    +        rv = None
    +        while (i > 0) and not rv:
    +            substr = name[:i]
    +            if substr not in self.loggerDict:
    +                self.loggerDict[substr] = PlaceHolder(alogger)
    +            else:
    +                obj = self.loggerDict[substr]
    +                if isinstance(obj, Logger):
    +                    rv = obj
    +                else:
    +                    assert isinstance(obj, PlaceHolder)
    +                    obj.append(alogger)
    +            i = name.rfind(".", 0, i - 1)
    +        if not rv:
    +            rv = self.root
    +        alogger.parent = rv
    +
    +    def _fixupChildren(self, ph, alogger):
    +        """
    +        Ensure that children of the placeholder ph are connected to the
    +        specified logger.
    +        """
    +        name = alogger.name
    +        namelen = len(name)
    +        for c in ph.loggerMap.keys():
    +            #The if means ... if not c.parent.name.startswith(nm)
    +            if c.parent.name[:namelen] != name:
    +                alogger.parent = c.parent
    +                c.parent = alogger
    +
    +    def _clear_cache(self):
    +        """
    +        Clear the cache for all loggers in loggerDict
    +        Called when level changes are made
    +        """
    +
    +        _acquireLock()
    +        for logger in self.loggerDict.values():
    +            if isinstance(logger, Logger):
    +                logger._cache.clear()
    +        self.root._cache.clear()
    +        _releaseLock()
    +
    +#---------------------------------------------------------------------------
    +#   Logger classes and functions
    +#---------------------------------------------------------------------------
    +
    +class Logger(Filterer):
    +    """
    +    Instances of the Logger class represent a single logging channel. A
    +    "logging channel" indicates an area of an application. Exactly how an
    +    "area" is defined is up to the application developer. Since an
    +    application can have any number of areas, logging channels are identified
    +    by a unique string. Application areas can be nested (e.g. an area
    +    of "input processing" might include sub-areas "read CSV files", "read
    +    XLS files" and "read Gnumeric files"). To cater for this natural nesting,
    +    channel names are organized into a namespace hierarchy where levels are
    +    separated by periods, much like the Java or Python package namespace. So
    +    in the instance given above, channel names might be "input" for the upper
    +    level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
    +    There is no arbitrary limit to the depth of nesting.
    +    """
    +    def __init__(self, name, level=NOTSET):
    +        """
    +        Initialize the logger with a name and an optional level.
    +        """
    +        Filterer.__init__(self)
    +        self.name = name
    +        self.level = _checkLevel(level)
    +        self.parent = None
    +        self.propagate = True
    +        self.handlers = []
    +        self.disabled = False
    +        self._cache = {}
    +
    +    def setLevel(self, level):
    +        """
    +        Set the logging level of this logger.  level must be an int or a str.
    +        """
    +        self.level = _checkLevel(level)
    +        self.manager._clear_cache()
    +
    +    def debug(self, msg, *args, **kwargs):
    +        """
    +        Log 'msg % args' with severity 'DEBUG'.
    +
    +        To pass exception information, use the keyword argument exc_info with
    +        a true value, e.g.
    +
    +        logger.debug("Houston, we have a %s", "thorny problem", exc_info=True)
    +        """
    +        if self.isEnabledFor(DEBUG):
    +            self._log(DEBUG, msg, args, **kwargs)
    +
    +    def info(self, msg, *args, **kwargs):
    +        """
    +        Log 'msg % args' with severity 'INFO'.
    +
    +        To pass exception information, use the keyword argument exc_info with
    +        a true value, e.g.
    +
    +        logger.info("Houston, we have a %s", "notable problem", exc_info=True)
    +        """
    +        if self.isEnabledFor(INFO):
    +            self._log(INFO, msg, args, **kwargs)
    +
    +    def warning(self, msg, *args, **kwargs):
    +        """
    +        Log 'msg % args' with severity 'WARNING'.
    +
    +        To pass exception information, use the keyword argument exc_info with
    +        a true value, e.g.
    +
    +        logger.warning("Houston, we have a %s", "bit of a problem", exc_info=True)
    +        """
    +        if self.isEnabledFor(WARNING):
    +            self._log(WARNING, msg, args, **kwargs)
    +
    +    def warn(self, msg, *args, **kwargs):
    +        warnings.warn("The 'warn' method is deprecated, "
    +            "use 'warning' instead", DeprecationWarning, 2)
    +        self.warning(msg, *args, **kwargs)
    +
    +    def error(self, msg, *args, **kwargs):
    +        """
    +        Log 'msg % args' with severity 'ERROR'.
    +
    +        To pass exception information, use the keyword argument exc_info with
    +        a true value, e.g.
    +
    +        logger.error("Houston, we have a %s", "major problem", exc_info=True)
    +        """
    +        if self.isEnabledFor(ERROR):
    +            self._log(ERROR, msg, args, **kwargs)
    +
    +    def exception(self, msg, *args, exc_info=True, **kwargs):
    +        """
    +        Convenience method for logging an ERROR with exception information.
    +        """
    +        self.error(msg, *args, exc_info=exc_info, **kwargs)
    +
    +    def critical(self, msg, *args, **kwargs):
    +        """
    +        Log 'msg % args' with severity 'CRITICAL'.
    +
    +        To pass exception information, use the keyword argument exc_info with
    +        a true value, e.g.
    +
    +        logger.critical("Houston, we have a %s", "major disaster", exc_info=True)
    +        """
    +        if self.isEnabledFor(CRITICAL):
    +            self._log(CRITICAL, msg, args, **kwargs)
    +
    +    def fatal(self, msg, *args, **kwargs):
    +        """
    +        Don't use this method, use critical() instead.
    +        """
    +        self.critical(msg, *args, **kwargs)
    +
    +    def log(self, level, msg, *args, **kwargs):
    +        """
    +        Log 'msg % args' with the integer severity 'level'.
    +
    +        To pass exception information, use the keyword argument exc_info with
    +        a true value, e.g.
    +
    +        logger.log(level, "We have a %s", "mysterious problem", exc_info=True)
    +        """
    +        if not isinstance(level, int):
    +            if raiseExceptions:
    +                raise TypeError("level must be an integer")
    +            else:
    +                return
    +        if self.isEnabledFor(level):
    +            self._log(level, msg, args, **kwargs)
    +
    +    def findCaller(self, stack_info=False, stacklevel=1):
    +        """
    +        Find the stack frame of the caller so that we can note the source
    +        file name, line number and function name.
    +        """
    +        f = currentframe()
    +        #On some versions of IronPython, currentframe() returns None if
    +        #IronPython isn't run with -X:Frames.
    +        if f is None:
    +            return "(unknown file)", 0, "(unknown function)", None
    +        while stacklevel > 0:
    +            next_f = f.f_back
    +            if next_f is None:
    +                ## We've got options here.
    +                ## If we want to use the last (deepest) frame:
    +                break
    +                ## If we want to mimic the warnings module:
    +                #return ("sys", 1, "(unknown function)", None)
    +                ## If we want to be pedantic:
    +                #raise ValueError("call stack is not deep enough")
    +            f = next_f
    +            if not _is_internal_frame(f):
    +                stacklevel -= 1
    +        co = f.f_code
    +        sinfo = None
    +        if stack_info:
    +            with io.StringIO() as sio:
    +                sio.write("Stack (most recent call last):\n")
    +                traceback.print_stack(f, file=sio)
    +                sinfo = sio.getvalue()
    +                if sinfo[-1] == '\n':
    +                    sinfo = sinfo[:-1]
    +        return co.co_filename, f.f_lineno, co.co_name, sinfo
    +
    +    def makeRecord(self, name, level, fn, lno, msg, args, exc_info,
    +                   func=None, extra=None, sinfo=None):
    +        """
    +        A factory method which can be overridden in subclasses to create
    +        specialized LogRecords.
    +        """
    +        rv = _logRecordFactory(name, level, fn, lno, msg, args, exc_info, func,
    +                             sinfo)
    +        if extra is not None:
    +            for key in extra:
    +                if (key in ["message", "asctime"]) or (key in rv.__dict__):
    +                    raise KeyError("Attempt to overwrite %r in LogRecord" % key)
    +                rv.__dict__[key] = extra[key]
    +        return rv
    +
    +    def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False,
    +             stacklevel=1):
    +        """
    +        Low-level logging routine which creates a LogRecord and then calls
    +        all the handlers of this logger to handle the record.
    +        """
    +        sinfo = None
    +        if _srcfile:
    +            #IronPython doesn't track Python frames, so findCaller raises an
    +            #exception on some versions of IronPython. We trap it here so that
    +            #IronPython can use logging.
    +            try:
    +                fn, lno, func, sinfo = self.findCaller(stack_info, stacklevel)
    +            except ValueError: # pragma: no cover
    +                fn, lno, func = "(unknown file)", 0, "(unknown function)"
    +        else: # pragma: no cover
    +            fn, lno, func = "(unknown file)", 0, "(unknown function)"
    +        if exc_info:
    +            if isinstance(exc_info, BaseException):
    +                exc_info = (type(exc_info), exc_info, exc_info.__traceback__)
    +            elif not isinstance(exc_info, tuple):
    +                exc_info = sys.exc_info()
    +        record = self.makeRecord(self.name, level, fn, lno, msg, args,
    +                                 exc_info, func, extra, sinfo)
    +        self.handle(record)
    +
    +    def handle(self, record):
    +        """
    +        Call the handlers for the specified record.
    +
    +        This method is used for unpickled records received from a socket, as
    +        well as those created locally. Logger-level filtering is applied.
    +        """
    +        if self.disabled:
    +            return
    +        maybe_record = self.filter(record)
    +        if not maybe_record:
    +            return
    +        if isinstance(maybe_record, LogRecord):
    +            record = maybe_record
    +        self.callHandlers(record)
    +
    +    def addHandler(self, hdlr):
    +        """
    +        Add the specified handler to this logger.
    +        """
    +        _acquireLock()
    +        try:
    +            if not (hdlr in self.handlers):
    +                self.handlers.append(hdlr)
    +        finally:
    +            _releaseLock()
    +
    +    def removeHandler(self, hdlr):
    +        """
    +        Remove the specified handler from this logger.
    +        """
    +        _acquireLock()
    +        try:
    +            if hdlr in self.handlers:
    +                self.handlers.remove(hdlr)
    +        finally:
    +            _releaseLock()
    +
    +    def hasHandlers(self):
    +        """
    +        See if this logger has any handlers configured.
    +
    +        Loop through all handlers for this logger and its parents in the
    +        logger hierarchy. Return True if a handler was found, else False.
    +        Stop searching up the hierarchy whenever a logger with the "propagate"
    +        attribute set to zero is found - that will be the last logger which
    +        is checked for the existence of handlers.
    +        """
    +        c = self
    +        rv = False
    +        while c:
    +            if c.handlers:
    +                rv = True
    +                break
    +            if not c.propagate:
    +                break
    +            else:
    +                c = c.parent
    +        return rv
    +
    +    def callHandlers(self, record):
    +        """
    +        Pass a record to all relevant handlers.
    +
    +        Loop through all handlers for this logger and its parents in the
    +        logger hierarchy. If no handler was found, output a one-off error
    +        message to sys.stderr. Stop searching up the hierarchy whenever a
    +        logger with the "propagate" attribute set to zero is found - that
    +        will be the last logger whose handlers are called.
    +        """
    +        c = self
    +        found = 0
    +        while c:
    +            for hdlr in c.handlers:
    +                found = found + 1
    +                if record.levelno >= hdlr.level:
    +                    hdlr.handle(record)
    +            if not c.propagate:
    +                c = None    #break out
    +            else:
    +                c = c.parent
    +        if (found == 0):
    +            if lastResort:
    +                if record.levelno >= lastResort.level:
    +                    lastResort.handle(record)
    +            elif raiseExceptions and not self.manager.emittedNoHandlerWarning:
    +                sys.stderr.write("No handlers could be found for logger"
    +                                 " \"%s\"\n" % self.name)
    +                self.manager.emittedNoHandlerWarning = True
    +
    +    def getEffectiveLevel(self):
    +        """
    +        Get the effective level for this logger.
    +
    +        Loop through this logger and its parents in the logger hierarchy,
    +        looking for a non-zero logging level. Return the first one found.
    +        """
    +        logger = self
    +        while logger:
    +            if logger.level:
    +                return logger.level
    +            logger = logger.parent
    +        return NOTSET
    +
    +    def isEnabledFor(self, level):
    +        """
    +        Is this logger enabled for level 'level'?
    +        """
    +        if self.disabled:
    +            return False
    +
    +        try:
    +            return self._cache[level]
    +        except KeyError:
    +            _acquireLock()
    +            try:
    +                if self.manager.disable >= level:
    +                    is_enabled = self._cache[level] = False
    +                else:
    +                    is_enabled = self._cache[level] = (
    +                        level >= self.getEffectiveLevel()
    +                    )
    +            finally:
    +                _releaseLock()
    +            return is_enabled
    +
    +    def getChild(self, suffix):
    +        """
    +        Get a logger which is a descendant to this one.
    +
    +        This is a convenience method, such that
    +
    +        logging.getLogger('abc').getChild('def.ghi')
    +
    +        is the same as
    +
    +        logging.getLogger('abc.def.ghi')
    +
    +        It's useful, for example, when the parent logger is named using
    +        __name__ rather than a literal string.
    +        """
    +        if self.root is not self:
    +            suffix = '.'.join((self.name, suffix))
    +        return self.manager.getLogger(suffix)
    +
    +    def getChildren(self):
    +
    +        def _hierlevel(logger):
    +            if logger is logger.manager.root:
    +                return 0
    +            return 1 + logger.name.count('.')
    +
    +        d = self.manager.loggerDict
    +        _acquireLock()
    +        try:
    +            # exclude PlaceHolders - the last check is to ensure that lower-level
    +            # descendants aren't returned - if there are placeholders, a logger's
    +            # parent field might point to a grandparent or ancestor thereof.
    +            return set(item for item in d.values()
    +                       if isinstance(item, Logger) and item.parent is self and
    +                       _hierlevel(item) == 1 + _hierlevel(item.parent))
    +        finally:
    +            _releaseLock()
    +
    +    def __repr__(self):
    +        level = getLevelName(self.getEffectiveLevel())
    +        return '<%s %s (%s)>' % (self.__class__.__name__, self.name, level)
    +
    +    def __reduce__(self):
    +        if getLogger(self.name) is not self:
    +            import pickle
    +            raise pickle.PicklingError('logger cannot be pickled')
    +        return getLogger, (self.name,)
    +
    +
    +class RootLogger(Logger):
    +    """
    +    A root logger is not that different to any other logger, except that
    +    it must have a logging level and there is only one instance of it in
    +    the hierarchy.
    +    """
    +    def __init__(self, level):
    +        """
    +        Initialize the logger with the name "root".
    +        """
    +        Logger.__init__(self, "root", level)
    +
    +    def __reduce__(self):
    +        return getLogger, ()
    +
    +_loggerClass = Logger
    +
    +class LoggerAdapter(object):
    +    """
    +    An adapter for loggers which makes it easier to specify contextual
    +    information in logging output.
    +    """
    +
    +    def __init__(self, logger, extra=None):
    +        """
    +        Initialize the adapter with a logger and a dict-like object which
    +        provides contextual information. This constructor signature allows
    +        easy stacking of LoggerAdapters, if so desired.
    +
    +        You can effectively pass keyword arguments as shown in the
    +        following example:
    +
    +        adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
    +        """
    +        self.logger = logger
    +        self.extra = extra
    +
    +    def process(self, msg, kwargs):
    +        """
    +        Process the logging message and keyword arguments passed in to
    +        a logging call to insert contextual information. You can either
    +        manipulate the message itself, the keyword args or both. Return
    +        the message and kwargs modified (or not) to suit your needs.
    +
    +        Normally, you'll only need to override this one method in a
    +        LoggerAdapter subclass for your specific needs.
    +        """
    +        kwargs["extra"] = self.extra
    +        return msg, kwargs
    +
    +    #
    +    # Boilerplate convenience methods
    +    #
    +    def debug(self, msg, *args, **kwargs):
    +        """
    +        Delegate a debug call to the underlying logger.
    +        """
    +        self.log(DEBUG, msg, *args, **kwargs)
    +
    +    def info(self, msg, *args, **kwargs):
    +        """
    +        Delegate an info call to the underlying logger.
    +        """
    +        self.log(INFO, msg, *args, **kwargs)
    +
    +    def warning(self, msg, *args, **kwargs):
    +        """
    +        Delegate a warning call to the underlying logger.
    +        """
    +        self.log(WARNING, msg, *args, **kwargs)
    +
    +    def warn(self, msg, *args, **kwargs):
    +        warnings.warn("The 'warn' method is deprecated, "
    +            "use 'warning' instead", DeprecationWarning, 2)
    +        self.warning(msg, *args, **kwargs)
    +
    +    def error(self, msg, *args, **kwargs):
    +        """
    +        Delegate an error call to the underlying logger.
    +        """
    +        self.log(ERROR, msg, *args, **kwargs)
    +
    +    def exception(self, msg, *args, exc_info=True, **kwargs):
    +        """
    +        Delegate an exception call to the underlying logger.
    +        """
    +        self.log(ERROR, msg, *args, exc_info=exc_info, **kwargs)
    +
    +    def critical(self, msg, *args, **kwargs):
    +        """
    +        Delegate a critical call to the underlying logger.
    +        """
    +        self.log(CRITICAL, msg, *args, **kwargs)
    +
    +    def log(self, level, msg, *args, **kwargs):
    +        """
    +        Delegate a log call to the underlying logger, after adding
    +        contextual information from this adapter instance.
    +        """
    +        if self.isEnabledFor(level):
    +            msg, kwargs = self.process(msg, kwargs)
    +            self.logger.log(level, msg, *args, **kwargs)
    +
    +    def isEnabledFor(self, level):
    +        """
    +        Is this logger enabled for level 'level'?
    +        """
    +        return self.logger.isEnabledFor(level)
    +
    +    def setLevel(self, level):
    +        """
    +        Set the specified level on the underlying logger.
    +        """
    +        self.logger.setLevel(level)
    +
    +    def getEffectiveLevel(self):
    +        """
    +        Get the effective level for the underlying logger.
    +        """
    +        return self.logger.getEffectiveLevel()
    +
    +    def hasHandlers(self):
    +        """
    +        See if the underlying logger has any handlers.
    +        """
    +        return self.logger.hasHandlers()
    +
    +    def _log(self, level, msg, args, **kwargs):
    +        """
    +        Low-level log implementation, proxied to allow nested logger adapters.
    +        """
    +        return self.logger._log(level, msg, args, **kwargs)
    +
    +    @property
    +    def manager(self):
    +        return self.logger.manager
    +
    +    @manager.setter
    +    def manager(self, value):
    +        self.logger.manager = value
    +
    +    @property
    +    def name(self):
    +        return self.logger.name
    +
    +    def __repr__(self):
    +        logger = self.logger
    +        level = getLevelName(logger.getEffectiveLevel())
    +        return '<%s %s (%s)>' % (self.__class__.__name__, logger.name, level)
    +
    +    __class_getitem__ = classmethod(GenericAlias)
    +
    +root = RootLogger(WARNING)
    +Logger.root = root
    +Logger.manager = Manager(Logger.root)
    +
    +#---------------------------------------------------------------------------
    +# Configuration classes and functions
    +#---------------------------------------------------------------------------
    +
    +def basicConfig(**kwargs):
    +    """
    +    Do basic configuration for the logging system.
    +
    +    This function does nothing if the root logger already has handlers
    +    configured, unless the keyword argument *force* is set to ``True``.
    +    It is a convenience method intended for use by simple scripts
    +    to do one-shot configuration of the logging package.
    +
    +    The default behaviour is to create a StreamHandler which writes to
    +    sys.stderr, set a formatter using the BASIC_FORMAT format string, and
    +    add the handler to the root logger.
    +
    +    A number of optional keyword arguments may be specified, which can alter
    +    the default behaviour.
    +
    +    filename  Specifies that a FileHandler be created, using the specified
    +              filename, rather than a StreamHandler.
    +    filemode  Specifies the mode to open the file, if filename is specified
    +              (if filemode is unspecified, it defaults to 'a').
    +    format    Use the specified format string for the handler.
    +    datefmt   Use the specified date/time format.
    +    style     If a format string is specified, use this to specify the
    +              type of format string (possible values '%', '{', '$', for
    +              %-formatting, :meth:`str.format` and :class:`string.Template`
    +              - defaults to '%').
    +    level     Set the root logger level to the specified level.
    +    stream    Use the specified stream to initialize the StreamHandler. Note
    +              that this argument is incompatible with 'filename' - if both
    +              are present, 'stream' is ignored.
    +    handlers  If specified, this should be an iterable of already created
    +              handlers, which will be added to the root logger. Any handler
    +              in the list which does not have a formatter assigned will be
    +              assigned the formatter created in this function.
    +    force     If this keyword  is specified as true, any existing handlers
    +              attached to the root logger are removed and closed, before
    +              carrying out the configuration as specified by the other
    +              arguments.
    +    encoding  If specified together with a filename, this encoding is passed to
    +              the created FileHandler, causing it to be used when the file is
    +              opened.
    +    errors    If specified together with a filename, this value is passed to the
    +              created FileHandler, causing it to be used when the file is
    +              opened in text mode. If not specified, the default value is
    +              `backslashreplace`.
    +
    +    Note that you could specify a stream created using open(filename, mode)
    +    rather than passing the filename and mode in. However, it should be
    +    remembered that StreamHandler does not close its stream (since it may be
    +    using sys.stdout or sys.stderr), whereas FileHandler closes its stream
    +    when the handler is closed.
    +
    +    .. versionchanged:: 3.2
    +       Added the ``style`` parameter.
    +
    +    .. versionchanged:: 3.3
    +       Added the ``handlers`` parameter. A ``ValueError`` is now thrown for
    +       incompatible arguments (e.g. ``handlers`` specified together with
    +       ``filename``/``filemode``, or ``filename``/``filemode`` specified
    +       together with ``stream``, or ``handlers`` specified together with
    +       ``stream``.
    +
    +    .. versionchanged:: 3.8
    +       Added the ``force`` parameter.
    +
    +    .. versionchanged:: 3.9
    +       Added the ``encoding`` and ``errors`` parameters.
    +    """
    +    # Add thread safety in case someone mistakenly calls
    +    # basicConfig() from multiple threads
    +    _acquireLock()
    +    try:
    +        force = kwargs.pop('force', False)
    +        encoding = kwargs.pop('encoding', None)
    +        errors = kwargs.pop('errors', 'backslashreplace')
    +        if force:
    +            for h in root.handlers[:]:
    +                root.removeHandler(h)
    +                h.close()
    +        if len(root.handlers) == 0:
    +            handlers = kwargs.pop("handlers", None)
    +            if handlers is None:
    +                if "stream" in kwargs and "filename" in kwargs:
    +                    raise ValueError("'stream' and 'filename' should not be "
    +                                     "specified together")
    +            else:
    +                if "stream" in kwargs or "filename" in kwargs:
    +                    raise ValueError("'stream' or 'filename' should not be "
    +                                     "specified together with 'handlers'")
    +            if handlers is None:
    +                filename = kwargs.pop("filename", None)
    +                mode = kwargs.pop("filemode", 'a')
    +                if filename:
    +                    if 'b' in mode:
    +                        errors = None
    +                    else:
    +                        encoding = io.text_encoding(encoding)
    +                    h = FileHandler(filename, mode,
    +                                    encoding=encoding, errors=errors)
    +                else:
    +                    stream = kwargs.pop("stream", None)
    +                    h = StreamHandler(stream)
    +                handlers = [h]
    +            dfs = kwargs.pop("datefmt", None)
    +            style = kwargs.pop("style", '%')
    +            if style not in _STYLES:
    +                raise ValueError('Style must be one of: %s' % ','.join(
    +                                 _STYLES.keys()))
    +            fs = kwargs.pop("format", _STYLES[style][1])
    +            fmt = Formatter(fs, dfs, style)
    +            for h in handlers:
    +                if h.formatter is None:
    +                    h.setFormatter(fmt)
    +                root.addHandler(h)
    +            level = kwargs.pop("level", None)
    +            if level is not None:
    +                root.setLevel(level)
    +            if kwargs:
    +                keys = ', '.join(kwargs.keys())
    +                raise ValueError('Unrecognised argument(s): %s' % keys)
    +    finally:
    +        _releaseLock()
    +
    +#---------------------------------------------------------------------------
    +# Utility functions at module level.
    +# Basically delegate everything to the root logger.
    +#---------------------------------------------------------------------------
    +
    +def getLogger(name=None):
    +    """
    +    Return a logger with the specified name, creating it if necessary.
    +
    +    If no name is specified, return the root logger.
    +    """
    +    if not name or isinstance(name, str) and name == root.name:
    +        return root
    +    return Logger.manager.getLogger(name)
    +
    +def critical(msg, *args, **kwargs):
    +    """
    +    Log a message with severity 'CRITICAL' on the root logger. If the logger
    +    has no handlers, call basicConfig() to add a console handler with a
    +    pre-defined format.
    +    """
    +    if len(root.handlers) == 0:
    +        basicConfig()
    +    root.critical(msg, *args, **kwargs)
    +
    +def fatal(msg, *args, **kwargs):
    +    """
    +    Don't use this function, use critical() instead.
    +    """
    +    critical(msg, *args, **kwargs)
    +
    +def error(msg, *args, **kwargs):
    +    """
    +    Log a message with severity 'ERROR' on the root logger. If the logger has
    +    no handlers, call basicConfig() to add a console handler with a pre-defined
    +    format.
    +    """
    +    if len(root.handlers) == 0:
    +        basicConfig()
    +    root.error(msg, *args, **kwargs)
    +
    +def exception(msg, *args, exc_info=True, **kwargs):
    +    """
    +    Log a message with severity 'ERROR' on the root logger, with exception
    +    information. If the logger has no handlers, basicConfig() is called to add
    +    a console handler with a pre-defined format.
    +    """
    +    error(msg, *args, exc_info=exc_info, **kwargs)
    +
    +def warning(msg, *args, **kwargs):
    +    """
    +    Log a message with severity 'WARNING' on the root logger. If the logger has
    +    no handlers, call basicConfig() to add a console handler with a pre-defined
    +    format.
    +    """
    +    if len(root.handlers) == 0:
    +        basicConfig()
    +    root.warning(msg, *args, **kwargs)
    +
    +def warn(msg, *args, **kwargs):
    +    warnings.warn("The 'warn' function is deprecated, "
    +        "use 'warning' instead", DeprecationWarning, 2)
    +    warning(msg, *args, **kwargs)
    +
    +def info(msg, *args, **kwargs):
    +    """
    +    Log a message with severity 'INFO' on the root logger. If the logger has
    +    no handlers, call basicConfig() to add a console handler with a pre-defined
    +    format.
    +    """
    +    if len(root.handlers) == 0:
    +        basicConfig()
    +    root.info(msg, *args, **kwargs)
    +
    +def debug(msg, *args, **kwargs):
    +    """
    +    Log a message with severity 'DEBUG' on the root logger. If the logger has
    +    no handlers, call basicConfig() to add a console handler with a pre-defined
    +    format.
    +    """
    +    if len(root.handlers) == 0:
    +        basicConfig()
    +    root.debug(msg, *args, **kwargs)
    +
    +def log(level, msg, *args, **kwargs):
    +    """
    +    Log 'msg % args' with the integer severity 'level' on the root logger. If
    +    the logger has no handlers, call basicConfig() to add a console handler
    +    with a pre-defined format.
    +    """
    +    if len(root.handlers) == 0:
    +        basicConfig()
    +    root.log(level, msg, *args, **kwargs)
    +
    +def disable(level=CRITICAL):
    +    """
    +    Disable all logging calls of severity 'level' and below.
    +    """
    +    root.manager.disable = level
    +    root.manager._clear_cache()
    +
    +def shutdown(handlerList=_handlerList):
    +    """
    +    Perform any cleanup actions in the logging system (e.g. flushing
    +    buffers).
    +
    +    Should be called at application exit.
    +    """
    +    for wr in reversed(handlerList[:]):
    +        #errors might occur, for example, if files are locked
    +        #we just ignore them if raiseExceptions is not set
    +        try:
    +            h = wr()
    +            if h:
    +                try:
    +                    h.acquire()
    +                    # MemoryHandlers might not want to be flushed on close,
    +                    # but circular imports prevent us scoping this to just
    +                    # those handlers.  hence the default to True.
    +                    if getattr(h, 'flushOnClose', True):
    +                        h.flush()
    +                    h.close()
    +                except (OSError, ValueError):
    +                    # Ignore errors which might be caused
    +                    # because handlers have been closed but
    +                    # references to them are still around at
    +                    # application exit.
    +                    pass
    +                finally:
    +                    h.release()
    +        except: # ignore everything, as we're shutting down
    +            if raiseExceptions:
    +                raise
    +            #else, swallow
    +
    +#Let's try and shutdown automatically on application exit...
    +import atexit
    +atexit.register(shutdown)
    +
    +# Null handler
    +
    +class NullHandler(Handler):
    +    """
    +    This handler does nothing. It's intended to be used to avoid the
    +    "No handlers could be found for logger XXX" one-off warning. This is
    +    important for library code, which may contain code to log events. If a user
    +    of the library does not configure logging, the one-off warning might be
    +    produced; to avoid this, the library developer simply needs to instantiate
    +    a NullHandler and add it to the top-level logger of the library module or
    +    package.
    +    """
    +    def handle(self, record):
    +        """Stub."""
    +
    +    def emit(self, record):
    +        """Stub."""
    +
    +    def createLock(self):
    +        self.lock = None
    +
    +    def _at_fork_reinit(self):
    +        pass
    +
    +# Warnings integration
    +
    +_warnings_showwarning = None
    +
    +def _showwarning(message, category, filename, lineno, file=None, line=None):
    +    """
    +    Implementation of showwarnings which redirects to logging, which will first
    +    check to see if the file parameter is None. If a file is specified, it will
    +    delegate to the original warnings implementation of showwarning. Otherwise,
    +    it will call warnings.formatwarning and will log the resulting string to a
    +    warnings logger named "py.warnings" with level logging.WARNING.
    +    """
    +    if file is not None:
    +        if _warnings_showwarning is not None:
    +            _warnings_showwarning(message, category, filename, lineno, file, line)
    +    else:
    +        s = warnings.formatwarning(message, category, filename, lineno, line)
    +        logger = getLogger("py.warnings")
    +        if not logger.handlers:
    +            logger.addHandler(NullHandler())
    +        # bpo-46557: Log str(s) as msg instead of logger.warning("%s", s)
    +        # since some log aggregation tools group logs by the msg arg
    +        logger.warning(str(s))
    +
    +def captureWarnings(capture):
    +    """
    +    If capture is true, redirect all warnings to the logging package.
    +    If capture is False, ensure that warnings are not redirected to logging
    +    but to their original destinations.
    +    """
    +    global _warnings_showwarning
    +    if capture:
    +        if _warnings_showwarning is None:
    +            _warnings_showwarning = warnings.showwarning
    +            warnings.showwarning = _showwarning
    +    else:
    +        if _warnings_showwarning is not None:
    +            warnings.showwarning = _warnings_showwarning
    +            _warnings_showwarning = None
    +
    + +
    + +
    +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/_modules/module/cleanup_txt.html b/_modules/module/cleanup_txt.html index 9624e54..163946a 100644 --- a/_modules/module/cleanup_txt.html +++ b/_modules/module/cleanup_txt.html @@ -38,6 +38,7 @@

    module.cleanup_txt のソースコード

     from typing import Dict, Set
     
     from module import tag_search
    +from module.log import get_logger
     
     HAIR_PATTERNS = {
         'length': re.compile(r'(long|short|medium) hair'),
    @@ -95,7 +96,7 @@ 

    module.cleanup_txt のソースコード

         def __init__(self, db_path: Path):
             self.db_path = db_path
             self.tag_searcher = tag_search.initialize_tag_searcher()
    -        logger = logging.getLogger(__name__)
    +        self.logger = get_logger(__name__)
     
     
    [ドキュメント] @@ -286,7 +287,7 @@

    module.cleanup_txt のソースコード

     [ドキュメント]
     def initialize_tag_cleaner() -> TagCleaner:
         project_root = Path(__file__).resolve().parents[2]
    -    db_path = project_root / "tags_v3.db"
    +    db_path = project_root / 'src' / 'module' / 'genai-tag-db-tools' / 'tags_v3.db'
         return TagCleaner(db_path)
    diff --git a/_modules/module/config.html b/_modules/module/config.html index ccc3ed5..79d3487 100644 --- a/_modules/module/config.html +++ b/_modules/module/config.html @@ -33,12 +33,14 @@

    module.config のソースコード

     import toml
    -from typing import Dict, Any
    +from pathlib import Path
    +from typing import Any
     from copy import deepcopy
     
     # デフォルト設定
     DEFAULT_CONFIG = {
         'directories': {
    +        'database': 'Image_database',
             'dataset': '',
             'output': 'output',
             'edited_output': 'edited_output',
    @@ -77,7 +79,7 @@ 

    module.config のソースコード

     
     
    [ドキュメント] -def load_config(config_file: str = 'processing.toml') -> Dict: +def load_config(config_file: str = 'processing.toml') -> dict: try: with open(config_file, 'r', encoding='utf-8') as f: config = toml.load(f) @@ -93,7 +95,7 @@

    module.config のソースコード

     
     
    [ドキュメント] -def deep_update(d: Dict[str, Any], u: Dict[str, Any]) -> Dict[str, Any]: +def deep_update(d: dict[str, Any], u: dict[str, Any]) -> dict[str, Any]: for k, v in u.items(): if isinstance(v, dict): d[k] = deep_update(d.get(k, {}), v) @@ -104,18 +106,16 @@

    module.config のソースコード

     
     
    [ドキュメント] -def get_config(config_file = 'processing.toml') -> Dict: +def get_config(config_file = 'processing.toml') -> dict: final_config = deepcopy(DEFAULT_CONFIG) loaded_config = load_config(config_file) final_config = deep_update(final_config, loaded_config) - if not final_config['directories']['dataset']: - raise ValueError("'dataset' ディレクトリは設定ファイルで指定する必要があります。") return final_config
    [ドキュメント] -def write_config_file(config_data: Dict[str, Any], file_name: str = "processing.toml"): +def write_config_file(config_data: dict[str, Any], file_name: str = "processing.toml"): """設定をファイルに保存します。""" try: with open(file_name, "w", encoding="utf-8") as f: diff --git a/_modules/module/db.html b/_modules/module/db.html index 3d3efa5..e8d2490 100644 --- a/_modules/module/db.html +++ b/_modules/module/db.html @@ -34,9 +34,11 @@

    module.db のソースコード

     import sqlite3
     import threading
    +import traceback
     import uuid
     import imagehash
     import inspect
    +from pathlib import Path
     from datetime import datetime, timezone, timedelta
     from PIL import Image
     
    @@ -374,9 +376,9 @@ 

    module.db のソースコード

             models = [
                 ('gpt-4o', 'vision', 'OpenAI'),
                 ('gpt-4-turbo', 'vision', 'OpenAI'),
    +            ('gpt-4o-mini', 'vision', 'OpenAI'),
                 ('laion', 'score', ''),
                 ('cafe', 'score', ''),
    -            ('gpt-4o-mini', 'vision', 'OpenAI'),
                 ('gemini-1.5-pro-exp-0801', 'vision', 'Google'),
                 ('gemini-1.5-pro-preview-0409', 'vision', 'Google'),
                 ('gemini-1.0-pro-vision', 'vision', 'Google'),
    @@ -584,7 +586,7 @@ 

    module.db のソースコード

                 if model_id is None:
                     model_id = next((caption.get('model_id') for caption in captions if caption.get('model_id') is not None), None)
                 if model_id is None:
    -                self.logger.warning("model_idはすべてNoneで保存されます。")
    +                self.logger.info("model_idはすべてNoneで保存されます。")
     
             tags_list = [tag_dict.get('tag') for tag_dict in tags]
             caption_list = [caption_dict.get('caption') for caption_dict in captions]
    @@ -972,34 +974,97 @@ 

    module.db のソースコード

                 return [row['id'] for row in rows]
    +
    +[ドキュメント] + def get_original_image(self, image_id: int) -> dict[str, Any]: + """ + 指定されたIDのオリジナル画像のメタデータを取得します。 + + Args: + image_id (int): 取得する画像のID。 + + Returns: + list[dict[str, Any]]: 画像メタデータを含む辞書。画像が見つからない場合はNone。 + + Raises: + sqlite3.Error: データベース操作でエラーが発生した場合。 + """ + query = "SELECT * FROM images WHERE id = ?" + try: + metadata = self.db_manager.fetch_one(query, (image_id,)) + return metadata + except sqlite3.Error as e: + current_method = inspect.currentframe().f_code.co_name + raise sqlite3.Error(f"{current_method} オリジナル画像の取得中にエラーが発生しました: {e}")
    + +
    [ドキュメント] - def get_processed_image(self, image_id: int) -> list[dict[str, Any]]: + def get_processed_image(self, image_id: int, resolution: int = 0, all_data: bool = False) -> Optional[dict[str, Any]]: """ - image_idから関連する全ての処理済み画像のメタデータを取得します。 + image_idとresolutionから関連する処理済み画像のメタデータを取得し、指定した解像度でリサイズされた画像のメタデータを返します。 Args: image_id (int): 元画像のID。 + resolution (int): リサイズ処理の基準にした解像度。0の場合は最も解像度が低い画像を返します。 + all_data (bool): Trueの場合は全ての処理済み画像のメタデータを返します。 Returns: - dict[str, Any]]: 処理済み画像のメタデータのリスト。 + Optional[dict[str, Any]]: 処理済み画像のメタデータを含む辞書。画像が見つからない場合はNone。 Raises: sqlite3.Error: データベース操作でエラーが発生した場合。 """ - query = """ - SELECT * FROM processed_images - WHERE image_id = ? - """ + query = "SELECT * FROM processed_images WHERE image_id = ?" try: - metadata = self.db_manager.fetch_all(query, (image_id,)) - self.logger.debug("ID %s の処理済み画像メタデータを取得しました: %s", image_id, metadata) + # 全ての処理済み画像を取得 + metadata_list = self.db_manager.fetch_all(query, (image_id,)) + if not metadata_list: + return None + self.logger.debug(f"ID {image_id} の処理済み画像メタデータを {len(metadata_list)} 取得しました") + if all_data: + return metadata_list + # resolutionが0の場合は最も解像度が低いものを選択 + if resolution == 0: + metadata = min(metadata_list, key=lambda x: x['width'] * x['height']) + else: + # 指定された解像度に近いものをフィルタリング + metadata = self._filter_by_resolution(metadata_list, resolution) return metadata + except sqlite3.Error as e: current_method = inspect.currentframe().f_code.co_name raise sqlite3.Error(f"{current_method} 処理済み画像の取得中にエラーが発生しました: {e}")
    + def _filter_by_resolution(self, metadata_list: list[dict[str, Any]], resolution: int) -> dict[str, Any]: + """ + 解像度に基づいてメタデータをフィルタリングします。 + + Args: + metadata_list (list[dict[str, Any]]): メタデータの辞書のリスト。 + resolution (int): 解像度。 + + Returns: + dict[str, Any]]: フィルタリングされたメタデータの辞書。解像度が条件に一致するか、 + 指定した解像度に対して誤差が20%以下であるメタデータを返します。 + + """ + for metadata in metadata_list: + width, height = metadata['width'], metadata['height'] + long_side, short_side = max(width, height), min(width, height) + + if long_side == resolution: + return metadata + else: + target_area = resolution * resolution + actual_area = long_side * short_side + error_ratio = abs(target_area - actual_area) / target_area + + if error_ratio <= 0.2: + return metadata + return None +
    [ドキュメント] def get_total_image_count(self) -> int: @@ -1158,9 +1223,13 @@

    module.db のソースコード

         このクラスは、ImageRepositoryを使用して、画像メタデータとアノテーションの
         保存、取得、更新などの操作を行います。
         """
    -    def __init__(self):
    +    def __init__(self, db_dir: Path):
             self.logger = get_logger("ImageDatabaseManager")
    -        img_db_path = Path("Image_database") / "image_database.db"
    +        if Path("Image_database").exists():
    +            Path("Image_database").mkdir(parents=True, exist_ok=True)
    +            Path("Image_database").joinpath("image_database.db").touch()
    +            db_dir = Path("Image_database")
    +        img_db_path = db_dir / "image_database.db"
             tag_db_path = Path("src") / "module" / "genai-tag-db-tools" / "tags_v3.db"
             self.db_manager = SQLiteManager(img_db_path, tag_db_path)
             self.repository = ImageRepository(self.db_manager)
    @@ -1301,30 +1370,15 @@ 

    module.db のソースコード

                 Optional[str]: 長辺が最小の処理済み画像のパス。見つからない場合はNone。
             """
             try:
    -            processed_images = self.repository.get_processed_image(image_id)
    -            if not processed_images:
    +            min_image_metdata = self.repository.get_processed_image(image_id)
    +            if not min_image_metdata:
                     self.logger.warning(f"画像ID {image_id} に対する処理済み画像が見つかりません。")
                     return None
    -
    -            # 長辺が最小の画像を見つける
    -            min_long_edge = float('inf')
    -            min_image_path = None
    -
    -            for image in processed_images:
    -                width = image['width']
    -                height = image['height']
    -                long_edge = max(width, height)
    -
    -                if long_edge < min_long_edge:
    -                    min_long_edge = long_edge
    -                    min_image_path = image['stored_image_path']
    -
    +            min_long_edge = max(min_image_metdata.get('width'), min_image_metdata.get('height'))
    +            min_image_path = min_image_metdata.get('stored_image_path')
                 if min_image_path:
    -                self.logger.info(f"画像ID {image_id} の最小長辺画像({min_long_edge}px)を取得しました。")
    +                self.logger.debug(f"画像ID {image_id} の最小長辺画像({min_long_edge}px)を取得しました。")
                     return min_image_path
    -            else:
    -                self.logger.warning(f"画像ID {image_id} に対する適切な低解像度画像が見つかりません。")
    -                return None
     
             except Exception as e:
                 self.logger.error(f"低解像度画像の取得中にエラーが発生しました: {e}")
    @@ -1358,7 +1412,7 @@ 

    module.db のソースコード

     
     
    [ドキュメント] - def get_processed_metadata(self, image_id: int) -> list[dict[str, Any]]: + def get_processed_metadata(self, image_id: int) -> Optional[list[dict[str, Any]]]: """ 指定された元画像IDに関連する全ての処理済み画像のメタデータを取得します。 @@ -1372,10 +1426,11 @@

    module.db のソースコード

                 Exception: メタデータの取得に失敗した場合。
             """
             try:
    -            processed_images = self.repository.get_processed_image(image_id)
    -            if not processed_images:
    +            metadata_list = self.repository.get_processed_image(image_id, all_data=True)
    +            if not metadata_list:
                     self.logger.info(f"ID {image_id} の元画像に関連する処理済み画像が見つかりません。")
    -            return processed_images
    +                return None
    +            return metadata_list
             except Exception as e:
                 self.logger.error(f"処理済み画像メタデータ取得中にエラーが発生しました: {e}")
                 raise
    @@ -1503,55 +1558,32 @@

    module.db のソースコード

     
             # image_idsの画像のアノテーションを取得、キーワード一致するNSFWが含まれるimage_idを除外
             if not include_nsfw:
    -            exclude_keywords = ['nsfw', 'explicit', 'sex', 'pussy', 'nude', 'penis', 'cum', 'bdsm']  # 除外したいキーワードのリスト
    +            exclude_keywords = ['nsfw', 'explicit', 'sex', 'pussy', 'nude', 'penis', 'cum', 'bdsm', 'explicit']  # 除外したいキーワードのリスト
                 image_ids = self._filter_images_by_exclude_keywords(image_ids, exclude_keywords)
     
             # 画像メタデータの取得
             metadata_list = []
    -        for image_id in image_ids:
    -            metadata = self.repository.get_processed_image(image_id)
    -            metadata_list.extend(metadata)
    -
    -        # 解像度によるフィルタリング
             if resolution != 0:
    -            filtered_metadata_list = self._filter_by_resolution(metadata_list, resolution)
    +            for image_id in image_ids:
    +                metadata = self.repository.get_processed_image(image_id, resolution)
    +                if metadata is not None:
    +                    metadata_list.append(metadata)
             else:
    -            filtered_metadata_list = metadata_list
    -
    -        list_count = len(filtered_metadata_list)
    -        self.logger.info(f"フィルタリング後の画像数: {list_count}")
    -
    -        return filtered_metadata_list, list_count
    + for image_id in image_ids: + metadata = self.repository.get_original_image(image_id) + if metadata is not None: + metadata['image_id'] = image_id + metadata_list.append(metadata) + if not metadata_list: + self.logger.info(f'解像度基準:{resolution} pxの画像はDBに登録されていません') + return None, None - def _filter_by_resolution(self, metadata_list: list[dict[str, Any]], resolution: int) -> list[dict[str, Any]]: - """ - 解像度に基づいてメタデータのリストをフィルタリングします。 - - Args: - metadata_list (list[dict[str, Any]]): メタデータの辞書のリスト。 - resolution (int): ディレクトリの解像度。 - - Returns: - list[dict[str, Any]]: フィルタリングされたメタデータの辞書のリスト。解像度が条件に一致するか、 - 解像度の条件に誤差が0.2以下のメタデータが含まれます。 - - """ - filtered_list = [] - for metadata in metadata_list: - width, height = metadata['width'], metadata['height'] - long_side, short_side = max(width, height), min(width, height) + list_count = len(metadata_list) + self.logger.info(f"フィルタリング後の画像数: {list_count}") - if long_side == resolution: - filtered_list.append(metadata) - else: - target_area = resolution * resolution - actual_area = long_side * short_side - error_ratio = abs(target_area - actual_area) / target_area + return metadata_list, list_count
    - if error_ratio <= 0.2: - filtered_list.append(metadata) - return filtered_list def _filter_images_by_exclude_keywords(self, image_ids: set[int], exclude_keywords: list[str]) -> set[int]: """ @@ -1642,19 +1674,79 @@

    module.db のソースコード

                 Optional[dict]: 処理済み画像が存在する場合はそのメタデータ、存在しない場合はNone
             """
             try:
    -            processed_images = self.repository.get_processed_image(image_id)
    +            processed_image = self.repository.get_processed_image(image_id, target_resolution)
     
    -            for processed_image in processed_images:
    -                width = processed_image['width']
    -                height = processed_image['height']
    -                if width == target_resolution or height == target_resolution:
    -                    return processed_image
    +            if processed_image:
    +                return processed_image
                 self.logger.info(f"ID {image_id} の画像に解像度 {target_resolution} に一致する処理済み画像が見つかりませんでした")
                 return None
             except Exception as e:
    -            self.logger.error(f"処理済み画像のチェック中にエラーが発生しました: {e}")
    +            current_method = inspect.currentframe().f_code.co_name
    +            error_msg = (f"{current_method}: 処理済み画像のチェック中にエラーが発生しました。"
    +                         f" image_id={image_id}, target_resolution={target_resolution}. エラー: {str(e)}")
    +            self.logger.error(error_msg)
    +            self.logger.error(f"トレースバック:\n{traceback.format_exc()}")
                 return None
    -
    + + +
    +[ドキュメント] + def filter_recent_annotations(self, annotations: dict) -> dict: + """ + 最新のアノテーションのみをフィルタリングします。 + + Args: + annotations (dict): 'tags' と 'captions' キーを持つ辞書 + + Returns: + dict: フィルタリングされたアノテーション + """ + # 1. 最新の更新時刻を見つける + latest_update = self._find_latest_update(annotations) + + # 2. 時間範囲を計算 + latest_datetime = datetime.fromisoformat(latest_update) + time_threshold = latest_datetime - timedelta(minutes=5) + self.logger.debug(f"最新の更新時刻 {latest_datetime} から {time_threshold} 以内に更新されたアノテーションをエクスポート") + # 3. 5分以内に更新されたアノテーションのみをフィルタリング + filtered_tags = [ + tag for tag in annotations['tags'] + if 'updated_at' in tag and tag['updated_at'] >= time_threshold + ] + + filtered_captions = [ + caption for caption in annotations['captions'] + if 'updated_at' in caption and caption['updated_at'] >= time_threshold + ] + + return { + 'tags': filtered_tags, + 'captions': filtered_captions + }
    + + + def _find_latest_update(self, annotations: dict) -> str: + """ + アノテーションの中で最新の更新時刻を見つけます。 + + Args: + annotations (dict): 'tags' と 'captions' キーを持つ辞書 + + Returns: + str: 最新の更新時刻(ISO形式の文字列) + """ + all_updates = [] + for tag in annotations['tags']: + if 'updated_at' in tag: + all_updates.append(tag['updated_at']) + for caption in annotations['captions']: + if 'updated_at' in caption: + all_updates.append(caption['updated_at']) + + if not all_updates: + return None # 更新時刻が見つからない場合 + + return max(all_updates)
    diff --git a/_modules/module/file_sys.html b/_modules/module/file_sys.html index 20dc642..f55b8a1 100644 --- a/_modules/module/file_sys.html +++ b/_modules/module/file_sys.html @@ -36,6 +36,7 @@

    module.file_sys のソースコード

     from pathlib import Path
     from typing import Any
     from PIL import Image, ImageCms
    +Image.MAX_IMAGE_PIXELS = 1000000000 #クソデカファイルに対応、ローカルアプリななので攻撃の心配はない
     from io import BytesIO
     import math
     import json
    diff --git a/genindex.html b/genindex.html
    index 23046a9..0bc0d38 100644
    --- a/genindex.html
    +++ b/genindex.html
    @@ -103,8 +103,6 @@ 

    B

      +
    • execute() (module.db.SQLiteManager のメソッド) +
    • executemany() (module.db.SQLiteManager のメソッド)
    • expansion (score_module.musiq_module.Bottleneck の属性) @@ -326,6 +318,8 @@

      F

    • FilePickerWidget (FilePickerWidget のクラス)
    • FileSystemManager (module.file_sys のクラス) +
    • +
    • filter_recent_annotations() (module.db.ImageDatabaseManager のメソッド)
    • filterApplied (TagFilterWidget.TagFilterWidget の属性)
    • @@ -450,6 +444,8 @@

      G

    • get_low_res_image() (module.db.ImageDatabaseManager のメソッド)
    • get_models() (module.db.ImageDatabaseManager のメソッド) +
    • +
    • get_original_image() (module.db.ImageRepository のメソッド)
    • get_processed_image() (module.db.ImageRepository のメソッド)
    • @@ -787,15 +783,6 @@

      L

      M

      + -
      • on_lineEditAnthropicKey_editingFinished() (SettingsWidget.SettingsWidget のメソッド)
      • on_lineEditGoogleVisionKey_editingFinished() (SettingsWidget.SettingsWidget のメソッド) @@ -1040,8 +1029,6 @@

        O

      • on_lineEditHfUsername_editingFinished() (SettingsWidget.SettingsWidget のメソッド)
      • on_lineEditOpenAiKey_editingFinished() (SettingsWidget.SettingsWidget のメソッド) -
      • -
      • on_lowRescheckBox_clicked() (ImageTaggerWidget.ImageTaggerWidget のメソッド)
      • on_path_changed() (DirectoryPickerWidget.DirectoryPickerWidget のメソッド) @@ -1100,8 +1087,6 @@

        P

      • progress_updated (ProgressWidget.Worker の属性), [1] @@ -1123,8 +1108,6 @@

        P

        R

        - + - - - diff --git a/searchindex.js b/searchindex.js index 86e46b4..0b78cb6 100644 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"Contents:": [[30, null]], "DatasetExportWidget module": [[0, null]], "DatasetOverviewWidget module": [[1, null]], "DirectoryPickerWidget module": [[2, null]], "FilePickerWidget module": [[3, null]], "ImageEditWidget module": [[4, null]], "ImageEditor module": [[5, null]], "ImagePreviewWidget module": [[6, null]], "ImageTaggerWidget module": [[7, null]], "Indices and tables": [[30, "indices-and-tables"]], "Module contents": [[15, "module-gui_file"], [32, "module-module"], [38, "module-contents"], [40, "module-contents"], [55, "module-score_module"]], "PickerWidget module": [[8, null]], "ProgressWidget module": [[9, null]], "SettingsWidget module": [[10, null]], "Submodules": [[15, "submodules"], [32, "submodules"], [38, "submodules"], [40, "submodules"], [55, "submodules"]], "Subpackages": [[32, "subpackages"], [38, "subpackages"]], "TagFilterWidget module": [[11, null]], "ThumbnailSelectorWidget module": [[12, null]], "Welcome to AnimeShakitto's documentation!": [[30, "welcome-to-animeshakitto-s-documentation"]], "caption_tags module": [[13, null]], "gui module": [[14, null]], "gui_file package": [[15, null]], "gui_file.DatasetExportWidget_ui module": [[16, null]], "gui_file.DatasetOverviewWidget_ui module": [[17, null]], "gui_file.DirectoryPickerWidget_ui module": [[18, null]], "gui_file.FilePickerWidget_ui module": [[19, null]], "gui_file.ImageEditWidget_ui module": [[20, null]], "gui_file.ImagePreviewWidget_ui module": [[21, null]], "gui_file.ImageTaggerWidget_ui module": [[22, null]], "gui_file.PickerWidget_ui module": [[23, null]], "gui_file.ProgressWidget_ui module": [[24, null]], "gui_file.SettingsWidget_ui module": [[25, null]], "gui_file.TagFilterWidget_ui module": [[26, null]], "gui_file.ThumbnailSelectorWidget_ui module": [[27, null]], "gui_file.filterBoxWidget_ui module": [[28, null]], "gui_file.gui_ui module": [[29, null]], "lora_dataset_toolsy documentation": [[30, null]], "main module": [[31, null]], "module package": [[32, null]], "module.api_utils module": [[33, null]], "module.cleanup_txt module": [[34, null]], "module.config module": [[35, null]], "module.db module": [[36, null]], "module.file_sys module": [[37, null]], "module.genai-tag-db-tools package": [[38, null]], "module.genai-tag-db-tools.CSVToDatabaseProcessor module": [[39, null]], "module.genai-tag-db-tools.gui package": [[40, null]], "module.genai-tag-db-tools.gui.MainWindow module": [[41, null]], "module.genai-tag-db-tools.gui.MainWindow_ui module": [[42, null]], "module.genai-tag-db-tools.gui.TagCleanerWidget module": [[43, null]], "module.genai-tag-db-tools.gui.TagCleanerWidget_ui module": [[44, null]], "module.genai-tag-db-tools.gui.TagRegisterWidget module": [[45, null]], "module.genai-tag-db-tools.gui.TagRegisterWidget_ui module": [[46, null]], "module.genai-tag-db-tools.gui.TagSearchWidget module": [[47, null]], "module.genai-tag-db-tools.gui.TagSearchWidget_ui module": [[48, null]], "module.genai-tag-db-tools.gui.TagStatisticsWidget module": [[49, null]], "module.genai-tag-db-tools.gui.TagStatisticsWidget_ui module": [[50, null]], "module.genai-tag-db-tools.main module": [[51, null]], "module.genai-tag-db-tools.tag_search module": [[52, null]], "module.log module": [[53, null]], "score_module package": [[55, null]], "score_module.clip_aethetic_score module": [[56, null]], "score_module.musiq_module module": [[57, null]], "score_module.rewardfunction_score module": [[58, null]], "score_module.scorer module": [[59, null]], "src": [[54, null]]}, "docnames": ["DatasetExportWidget", "DatasetOverviewWidget", "DirectoryPickerWidget", "FilePickerWidget", "ImageEditWidget", "ImageEditor", "ImagePreviewWidget", "ImageTaggerWidget", "PickerWidget", "ProgressWidget", "SettingsWidget", "TagFilterWidget", "ThumbnailSelectorWidget", "caption_tags", "gui", "gui_file", "gui_file.DatasetExportWidget_ui", "gui_file.DatasetOverviewWidget_ui", "gui_file.DirectoryPickerWidget_ui", "gui_file.FilePickerWidget_ui", "gui_file.ImageEditWidget_ui", "gui_file.ImagePreviewWidget_ui", "gui_file.ImageTaggerWidget_ui", "gui_file.PickerWidget_ui", "gui_file.ProgressWidget_ui", "gui_file.SettingsWidget_ui", "gui_file.TagFilterWidget_ui", "gui_file.ThumbnailSelectorWidget_ui", "gui_file.filterBoxWidget_ui", "gui_file.gui_ui", "index", "main", "module", "module.api_utils", "module.cleanup_txt", "module.config", "module.db", "module.file_sys", "module.genai-tag-db-tools", "module.genai-tag-db-tools.CSVToDatabaseProcessor", "module.genai-tag-db-tools.gui", "module.genai-tag-db-tools.gui.MainWindow", "module.genai-tag-db-tools.gui.MainWindow_ui", "module.genai-tag-db-tools.gui.TagCleanerWidget", "module.genai-tag-db-tools.gui.TagCleanerWidget_ui", "module.genai-tag-db-tools.gui.TagRegisterWidget", "module.genai-tag-db-tools.gui.TagRegisterWidget_ui", "module.genai-tag-db-tools.gui.TagSearchWidget", "module.genai-tag-db-tools.gui.TagSearchWidget_ui", "module.genai-tag-db-tools.gui.TagStatisticsWidget", "module.genai-tag-db-tools.gui.TagStatisticsWidget_ui", "module.genai-tag-db-tools.main", "module.genai-tag-db-tools.tag_search", "module.log", "modules", "score_module", "score_module.clip_aethetic_score", "score_module.musiq_module", "score_module.rewardfunction_score", "score_module.scorer"], "envversion": {"sphinx": 63, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["DatasetExportWidget.rst", "DatasetOverviewWidget.rst", "DirectoryPickerWidget.rst", "FilePickerWidget.rst", "ImageEditWidget.rst", "ImageEditor.rst", "ImagePreviewWidget.rst", "ImageTaggerWidget.rst", "PickerWidget.rst", "ProgressWidget.rst", "SettingsWidget.rst", "TagFilterWidget.rst", "ThumbnailSelectorWidget.rst", "caption_tags.rst", "gui.rst", "gui_file.rst", "gui_file.DatasetExportWidget_ui.rst", "gui_file.DatasetOverviewWidget_ui.rst", "gui_file.DirectoryPickerWidget_ui.rst", "gui_file.FilePickerWidget_ui.rst", "gui_file.ImageEditWidget_ui.rst", "gui_file.ImagePreviewWidget_ui.rst", "gui_file.ImageTaggerWidget_ui.rst", "gui_file.PickerWidget_ui.rst", "gui_file.ProgressWidget_ui.rst", "gui_file.SettingsWidget_ui.rst", "gui_file.TagFilterWidget_ui.rst", "gui_file.ThumbnailSelectorWidget_ui.rst", "gui_file.filterBoxWidget_ui.rst", "gui_file.gui_ui.rst", "index.rst", "main.rst", "module.rst", "module.api_utils.rst", "module.cleanup_txt.rst", "module.config.rst", "module.db.rst", "module.file_sys.rst", "module.genai-tag-db-tools.rst", "module.genai-tag-db-tools.CSVToDatabaseProcessor.rst", "module.genai-tag-db-tools.gui.rst", "module.genai-tag-db-tools.gui.MainWindow.rst", "module.genai-tag-db-tools.gui.MainWindow_ui.rst", "module.genai-tag-db-tools.gui.TagCleanerWidget.rst", "module.genai-tag-db-tools.gui.TagCleanerWidget_ui.rst", "module.genai-tag-db-tools.gui.TagRegisterWidget.rst", "module.genai-tag-db-tools.gui.TagRegisterWidget_ui.rst", "module.genai-tag-db-tools.gui.TagSearchWidget.rst", "module.genai-tag-db-tools.gui.TagSearchWidget_ui.rst", "module.genai-tag-db-tools.gui.TagStatisticsWidget.rst", "module.genai-tag-db-tools.gui.TagStatisticsWidget_ui.rst", "module.genai-tag-db-tools.main.rst", "module.genai-tag-db-tools.tag_search.rst", "module.log.rst", "modules.rst", "score_module.rst", "score_module.clip_aethetic_score.rst", "score_module.musiq_module.rst", "score_module.rewardfunction_score.rst", "score_module.scorer.rst"], "indexentries": {"_is_canceled (progresswidget.worker \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Worker._is_canceled", false]], "add_original_image() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.add_original_image", false]], "add_processed_image() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.add_processed_image", false]], "add_thumbnail_item() (thumbnailselectorwidget.thumbnailselectorwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget.add_thumbnail_item", false]], "aestheticpredictor (score_module.scorer \u306e\u30af\u30e9\u30b9)": [[59, "score_module.scorer.AestheticPredictor", false]], "aestheticscorer (score_module.scorer \u306e\u30af\u30e9\u30b9)": [[59, "score_module.scorer.AestheticScorer", false]], "analyze_image() (caption_tags.imageanalyzer \u306e\u30e1\u30bd\u30c3\u30c9)": [[13, "caption_tags.ImageAnalyzer.analyze_image", false]], "apiclientfactory (module.api_utils \u306e\u30af\u30e9\u30b9)": [[33, "module.api_utils.APIClientFactory", false]], "apierror": [[33, "module.api_utils.APIError", false]], "apiinterface (module.api_utils \u306e\u30af\u30e9\u30b9)": [[33, "module.api_utils.APIInterface", false]], "args (progresswidget.worker \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Worker.args", false]], "auto_crop_image() (imageeditor.autocrop \u306e\u30af\u30e9\u30b9\u30e1\u30bd\u30c3\u30c9)": [[5, "ImageEditor.AutoCrop.auto_crop_image", false]], "autocrop (imageeditor \u306e\u30af\u30e9\u30b9)": [[5, "ImageEditor.AutoCrop", false]], "baseapiclient (module.api_utils \u306e\u30af\u30e9\u30b9)": [[33, "module.api_utils.BaseAPIClient", false]], "batchcontroll (main \u306e\u30af\u30e9\u30b9)": [[31, "main.BatchControll", false]], "bottleneck (score_module.musiq_module \u306e\u30af\u30e9\u30b9)": [[57, "score_module.musiq_module.Bottleneck", false]], "boundingrect() (thumbnailselectorwidget.thumbnailitem \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.ThumbnailItem.boundingRect", false]], "calculate_aspect_ratio() (datasetoverviewwidget.datasetoverviewwidget \u306e\u9759\u7684\u30e1\u30bd\u30c3\u30c9)": [[1, "DatasetOverviewWidget.DatasetOverviewWidget.calculate_aspect_ratio", false]], "calculate_pad_size() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.calculate_pad_size", false]], "calculate_phash() (module.db \u30e2\u30b8\u30e5\u30fc\u30eb)": [[36, "module.db.calculate_phash", false]], "cancel() (progresswidget.worker \u306e\u30e1\u30bd\u30c3\u30c9)": [[9, "ProgressWidget.Worker.cancel", false], [9, "id3", false]], "canceled (progresswidget.progresswidget \u306e\u5c5e\u6027)": [[9, "ProgressWidget.ProgressWidget.canceled", false], [9, "id2", false]], "caption_tags": [[13, "module-caption_tags", false]], "check_hash() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.check_hash", false]], "check_processed_image_exists() (module.db.imagedatabasemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageDatabaseManager.check_processed_image_exists", false]], "check_response() (module.api_utils.apierror \u306e\u30af\u30e9\u30b9\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.APIError.check_response", false]], "claude (module.api_utils \u306e\u30af\u30e9\u30b9)": [[33, "module.api_utils.Claude", false]], "clean_caption() (module.cleanup_txt.tagcleaner \u306e\u9759\u7684\u30e1\u30bd\u30c3\u30c9)": [[34, "module.cleanup_txt.TagCleaner.clean_caption", false]], "clean_format() (module.cleanup_txt.tagcleaner \u306e\u9759\u7684\u30e1\u30bd\u30c3\u30c9)": [[34, "module.cleanup_txt.TagCleaner.clean_format", false]], "clean_tags() (module.cleanup_txt.tagcleaner \u306e\u30e1\u30bd\u30c3\u30c9)": [[34, "module.cleanup_txt.TagCleaner.clean_tags", false]], "cleanup() (progresswidget.controller \u306e\u30e1\u30bd\u30c3\u30c9)": [[9, "ProgressWidget.Controller.cleanup", false], [9, "id0", false]], "clear_metadata() (datasetoverviewwidget.datasetoverviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[1, "DatasetOverviewWidget.DatasetOverviewWidget.clear_metadata", false]], "close() (module.db.sqlitemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.SQLiteManager.close", false]], "closeevent() (gui.mainwindow \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "gui.MainWindow.closeEvent", false]], "collate_fn() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.collate_fn", false]], "config (gui.configmanager \u306e\u5c5e\u6027)": [[14, "gui.ConfigManager.config", false]], "configmanager (gui \u306e\u30af\u30e9\u30b9)": [[14, "gui.ConfigManager", false]], "configure() (pickerwidget.pickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "PickerWidget.PickerWidget.configure", false]], "connect() (module.db.sqlitemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.SQLiteManager.connect", false]], "connect_custom_widgets() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.connect_custom_widgets", false]], "connect_signals() (gui.mainwindow \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "gui.MainWindow.connect_signals", false]], "controller (progresswidget \u306e\u30af\u30e9\u30b9)": [[9, "ProgressWidget.Controller", false]], "copy_file() (module.file_sys.filesystemmanager \u306e\u9759\u7684\u30e1\u30bd\u30c3\u30c9)": [[37, "module.file_sys.FileSystemManager.copy_file", false]], "create_batch_request() (caption_tags.imageanalyzer \u306e\u30e1\u30bd\u30c3\u30c9)": [[13, "caption_tags.ImageAnalyzer.create_batch_request", false]], "create_batch_request() (module.api_utils.openai \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.OpenAI.create_batch_request", false]], "create_batch_request_file() (module.file_sys.filesystemmanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[37, "module.file_sys.FileSystemManager.create_batch_request_file", false]], "create_datalist() (score_module.musiq_module.musiq_score_dataset \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MUSIQ_Score_Dataset.create_datalist", false]], "create_musiq_model() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.Create_MUSIQ_Model", false]], "create_musiq_score_model() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.Create_MUSIQ_SCORE_Model", false]], "create_pos_idx() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.create_pos_idx", false]], "create_tables() (module.db.sqlitemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.SQLiteManager.create_tables", false]], "customgraphicsview (thumbnailselectorwidget \u306e\u30af\u30e9\u30b9)": [[12, "ThumbnailSelectorWidget.CustomGraphicsView", false]], "customrangeslider (tagfilterwidget \u306e\u30af\u30e9\u30b9)": [[11, "TagFilterWidget.CustomRangeSlider", false]], "dataset_dir_changed() (gui.mainwindow \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "gui.MainWindow.dataset_dir_changed", false]], "dataset_image_paths (gui.configmanager \u306e\u5c5e\u6027)": [[14, "gui.ConfigManager.dataset_image_paths", false]], "dataset_loaded (datasetoverviewwidget.datasetoverviewwidget \u306e\u5c5e\u6027)": [[1, "DatasetOverviewWidget.DatasetOverviewWidget.dataset_loaded", false]], "datasetexportwidget": [[0, "module-DatasetExportWidget", false]], "datasetexportwidget (datasetexportwidget \u306e\u30af\u30e9\u30b9)": [[0, "DatasetExportWidget.DatasetExportWidget", false]], "datasetoverviewwidget": [[1, "module-DatasetOverviewWidget", false]], "datasetoverviewwidget (datasetoverviewwidget \u306e\u30af\u30e9\u30b9)": [[1, "DatasetOverviewWidget.DatasetOverviewWidget", false]], "deep_update() (module.config \u30e2\u30b8\u30e5\u30fc\u30eb)": [[35, "module.config.deep_update", false]], "delete_image() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.delete_image", false]], "deselected (thumbnailselectorwidget.thumbnailselectorwidget \u306e\u5c5e\u6027)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget.deselected", false]], "detect_duplicate_image() (module.db.imagedatabasemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageDatabaseManager.detect_duplicate_image", false]], "device (score_module.scorer.aestheticscorer \u306e\u5c5e\u6027)": [[59, "score_module.scorer.AestheticScorer.device", false]], "dict_factory() (module.db.sqlitemanager \u306e\u9759\u7684\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.SQLiteManager.dict_factory", false]], "directorypickerwidget": [[2, "module-DirectoryPickerWidget", false]], "directorypickerwidget (directorypickerwidget \u306e\u30af\u30e9\u30b9)": [[2, "DirectoryPickerWidget.DirectoryPickerWidget", false]], "download_model() (score_module.scorer \u30e2\u30b8\u30e5\u30fc\u30eb)": [[59, "score_module.scorer.download_model", false]], "enable_math() (score_module.musiq_module.encoder_layer \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.Encoder_Layer.enable_math", false]], "enable_math() (score_module.musiq_module.multiheadattention \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MultiHeadAttention.enable_math", false]], "enable_math() (score_module.musiq_module.musiq \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MUSIQ.enable_math", false]], "enable_math() (score_module.musiq_module.musiq_encoder \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MUSIQ_Encoder.enable_math", false]], "enable_math() (score_module.musiq_module.musiq_score_model \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MUSIQ_SCORE_Model.enable_math", false]], "encoder_layer (score_module.musiq_module \u306e\u30af\u30e9\u30b9)": [[57, "score_module.musiq_module.Encoder_Layer", false]], "error_occurred (progresswidget.worker \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Worker.error_occurred", false], [9, "id4", false]], "escape_special_characters() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.escape_special_characters", false]], "execute() (main.batchcontroll \u306e\u30e1\u30bd\u30c3\u30c9)": [[31, "main.BatchControll.execute", false]], "execute() (main.maincontrollbase \u306e\u30e1\u30bd\u30c3\u30c9)": [[31, "main.MainControllBase.execute", false]], "execute() (module.db.sqlitemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.SQLiteManager.execute", false]], "executemany() (module.db.sqlitemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.SQLiteManager.executemany", false]], "expansion (score_module.musiq_module.bottleneck \u306e\u5c5e\u6027)": [[57, "score_module.musiq_module.Bottleneck.expansion", false]], "export_dataset() (datasetexportwidget.datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[0, "DatasetExportWidget.DatasetExportWidget.export_dataset", false]], "export_dataset_to_json() (module.file_sys.filesystemmanager \u306e\u9759\u7684\u30e1\u30bd\u30c3\u30c9)": [[37, "module.file_sys.FileSystemManager.export_dataset_to_json", false]], "export_dataset_to_txt() (module.file_sys.filesystemmanager \u306e\u9759\u7684\u30e1\u30bd\u30c3\u30c9)": [[37, "module.file_sys.FileSystemManager.export_dataset_to_txt", false]], "export_error() (datasetexportwidget.datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[0, "DatasetExportWidget.DatasetExportWidget.export_error", false]], "export_finished() (datasetexportwidget.datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[0, "DatasetExportWidget.DatasetExportWidget.export_finished", false]], "extract_patches() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.extract_patches", false]], "fetch_all() (module.db.sqlitemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.SQLiteManager.fetch_all", false]], "fetch_one() (module.db.sqlitemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.SQLiteManager.fetch_one", false]], "file_size_unit (imageeditwidget.imageeditwidget \u306e\u5c5e\u6027)": [[4, "ImageEditWidget.ImageEditWidget.FILE_SIZE_UNIT", false]], "filepickerwidget": [[3, "module-FilePickerWidget", false]], "filepickerwidget (filepickerwidget \u306e\u30af\u30e9\u30b9)": [[3, "FilePickerWidget.FilePickerWidget", false]], "filesystemmanager (module.file_sys \u306e\u30af\u30e9\u30b9)": [[37, "module.file_sys.FileSystemManager", false]], "filterapplied (tagfilterwidget.tagfilterwidget \u306e\u5c5e\u6027)": [[11, "TagFilterWidget.TagFilterWidget.filterApplied", false]], "find_duplicate_image() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.find_duplicate_image", false]], "find_tag_id() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.find_tag_id", false]], "finished (progresswidget.worker \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Worker.finished", false], [9, "id5", false]], "forward() (score_module.clip_aethetic_score.mlp \u306e\u30e1\u30bd\u30c3\u30c9)": [[56, "score_module.clip_aethetic_score.MLP.forward", false]], "forward() (score_module.musiq_module.bottleneck \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.Bottleneck.forward", false]], "forward() (score_module.musiq_module.encoder_layer \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.Encoder_Layer.forward", false]], "forward() (score_module.musiq_module.mlp \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MLP.forward", false]], "forward() (score_module.musiq_module.multiheadattention \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MultiHeadAttention.forward", false]], "forward() (score_module.musiq_module.musiq \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MUSIQ.forward", false]], "forward() (score_module.musiq_module.musiq_encoder \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MUSIQ_Encoder.forward", false]], "forward() (score_module.musiq_module.musiq_score_model \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MUSIQ_SCORE_Model.forward", false]], "forward() (score_module.musiq_module.poswisefeedforwardnet \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.PoswiseFeedForwardNet.forward", false]], "forward() (score_module.musiq_module.resnetbackbone \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.ResNetBackbone.forward", false]], "forward() (score_module.rewardfunction_score.mlp \u306e\u30e1\u30bd\u30c3\u30c9)": [[58, "score_module.rewardfunction_score.MLP.forward", false]], "forward() (score_module.scorer.aestheticpredictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[59, "score_module.scorer.AestheticPredictor.forward", false]], "from_anthropic_error() (module.api_utils.apierror \u306e\u30af\u30e9\u30b9\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.APIError.from_anthropic_error", false]], "function (progresswidget.worker \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Worker.function", false]], "generate_caption() (module.api_utils.apiinterface \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.APIInterface.generate_caption", false]], "generate_caption() (module.api_utils.claude \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.Claude.generate_caption", false]], "generate_caption() (module.api_utils.google \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.Google.generate_caption", false]], "generate_caption() (module.api_utils.openai \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.OpenAI.generate_caption", false]], "generate_prompt_parts() (module.api_utils.google \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.Google.generate_prompt_parts", false]], "get_api_client() (module.api_utils.apiclientfactory \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.APIClientFactory.get_api_client", false]], "get_attn_pad_mask() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.get_attn_pad_mask", false]], "get_available_models() (imageeditor.upscaler \u306e\u30af\u30e9\u30b9\u30e1\u30bd\u30c3\u30c9)": [[5, "ImageEditor.Upscaler.get_available_models", false]], "get_batch_analysis() (caption_tags.imageanalyzer \u306e\u30e1\u30bd\u30c3\u30c9)": [[13, "caption_tags.ImageAnalyzer.get_batch_analysis", false]], "get_batch_results() (module.api_utils.apiinterface \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.APIInterface.get_batch_results", false]], "get_batch_results() (module.api_utils.claude \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.Claude.get_batch_results", false]], "get_batch_results() (module.api_utils.google \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.Google.get_batch_results", false]], "get_batch_results() (module.api_utils.openai \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.OpenAI.get_batch_results", false]], "get_config() (module.config \u30e2\u30b8\u30e5\u30fc\u30eb)": [[35, "module.config.get_config", false]], "get_connection() (module.db.sqlitemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.SQLiteManager.get_connection", false]], "get_data_list() (score_module.musiq_module.musiq_score_dataset \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MUSIQ_Score_Dataset.get_data_list", false]], "get_existing_annotations() (caption_tags.imageanalyzer \u306e\u9759\u7684\u30e1\u30bd\u30c3\u30c9)": [[13, "caption_tags.ImageAnalyzer.get_existing_annotations", false]], "get_image_annotations() (module.db.imagedatabasemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageDatabaseManager.get_image_annotations", false]], "get_image_annotations() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.get_image_annotations", false]], "get_image_files() (module.file_sys.filesystemmanager \u306e\u9759\u7684\u30e1\u30bd\u30c3\u30c9)": [[37, "module.file_sys.FileSystemManager.get_image_files", false]], "get_image_id_by_name() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.get_image_id_by_name", false]], "get_image_id_by_phash() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.get_image_id_by_phash", false]], "get_image_info() (module.file_sys.filesystemmanager \u306e\u9759\u7684\u30e1\u30bd\u30c3\u30c9)": [[37, "module.file_sys.FileSystemManager.get_image_info", false]], "get_image_metadata() (module.db.imagedatabasemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageDatabaseManager.get_image_metadata", false]], "get_image_metadata() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.get_image_metadata", false]], "get_image_preprocess() (score_module.clip_aethetic_score \u30e2\u30b8\u30e5\u30fc\u30eb)": [[56, "score_module.clip_aethetic_score.get_image_preprocess", false]], "get_image_preprocess() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.get_image_preprocess", false]], "get_image_preprocess() (score_module.rewardfunction_score \u30e2\u30b8\u30e5\u30fc\u30eb)": [[58, "score_module.rewardfunction_score.get_image_preprocess", false]], "get_images_by_caption() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.get_images_by_caption", false]], "get_images_by_filter() (module.db.imagedatabasemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageDatabaseManager.get_images_by_filter", false]], "get_images_by_tag() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.get_images_by_tag", false]], "get_logger() (module.log \u30e2\u30b8\u30e5\u30fc\u30eb)": [[53, "module.log.get_logger", false]], "get_low_res_image() (module.db.imagedatabasemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageDatabaseManager.get_low_res_image", false]], "get_models() (module.db.imagedatabasemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageDatabaseManager.get_models", false]], "get_processed_image() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.get_processed_image", false]], "get_processed_metadata() (module.db.imagedatabasemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageDatabaseManager.get_processed_metadata", false]], "get_property() (score_module.clip_aethetic_score \u30e2\u30b8\u30e5\u30fc\u30eb)": [[56, "score_module.clip_aethetic_score.get_property", false]], "get_property() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.get_property", false]], "get_range() (tagfilterwidget.customrangeslider \u306e\u30e1\u30bd\u30c3\u30c9)": [[11, "TagFilterWidget.CustomRangeSlider.get_range", false]], "get_resize_latents() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.get_resize_latents", false]], "get_score() (score_module.clip_aethetic_score.score_manager \u306e\u30e1\u30bd\u30c3\u30c9)": [[56, "score_module.clip_aethetic_score.Score_Manager.get_score", false]], "get_score() (score_module.musiq_module.score_manager \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.Score_Manager.get_score", false]], "get_score() (score_module.rewardfunction_score.score_manager \u306e\u30e1\u30bd\u30c3\u30c9)": [[58, "score_module.rewardfunction_score.Score_Manager.get_score", false]], "get_selected_images() (thumbnailselectorwidget.thumbnailselectorwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget.get_selected_images", false]], "get_selected_path() (directorypickerwidget.directorypickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[2, "DirectoryPickerWidget.DirectoryPickerWidget.get_selected_path", false]], "get_selected_path() (filepickerwidget.filepickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[3, "FilePickerWidget.FilePickerWidget.get_selected_path", false]], "get_sinusoid_encoding_table() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.get_sinusoid_encoding_table", false]], "get_total_image_count() (module.db.imagedatabasemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageDatabaseManager.get_total_image_count", false]], "get_total_image_count() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.get_total_image_count", false]], "get_untagged_images() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.get_untagged_images", false]], "google (module.api_utils \u306e\u30af\u30e9\u30b9)": [[33, "module.api_utils.Google", false]], "gui": [[14, "module-gui", false]], "gui_file": [[15, "module-gui_file", false]], "gui_file.datasetexportwidget_ui": [[16, "module-gui_file.DatasetExportWidget_ui", false]], "gui_file.datasetoverviewwidget_ui": [[17, "module-gui_file.DatasetOverviewWidget_ui", false]], "gui_file.directorypickerwidget_ui": [[18, "module-gui_file.DirectoryPickerWidget_ui", false]], "gui_file.filepickerwidget_ui": [[19, "module-gui_file.FilePickerWidget_ui", false]], "gui_file.filterboxwidget_ui": [[28, "module-gui_file.filterBoxWidget_ui", false]], "gui_file.gui_ui": [[29, "module-gui_file.gui_ui", false]], "gui_file.imageeditwidget_ui": [[20, "module-gui_file.ImageEditWidget_ui", false]], "gui_file.imagepreviewwidget_ui": [[21, "module-gui_file.ImagePreviewWidget_ui", false]], "gui_file.imagetaggerwidget_ui": [[22, "module-gui_file.ImageTaggerWidget_ui", false]], "gui_file.pickerwidget_ui": [[23, "module-gui_file.PickerWidget_ui", false]], "gui_file.progresswidget_ui": [[24, "module-gui_file.ProgressWidget_ui", false]], "gui_file.settingswidget_ui": [[25, "module-gui_file.SettingsWidget_ui", false]], "gui_file.tagfilterwidget_ui": [[26, "module-gui_file.TagFilterWidget_ui", false]], "gui_file.thumbnailselectorwidget_ui": [[27, "module-gui_file.ThumbnailSelectorWidget_ui", false]], "handle_item_selection() (thumbnailselectorwidget.thumbnailselectorwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget.handle_item_selection", false]], "handle_processing_result() (imageeditwidget.imageeditwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[4, "ImageEditWidget.ImageEditWidget.handle_processing_result", false]], "image_extensions (module.file_sys.filesystemmanager \u306e\u5c5e\u6027)": [[37, "module.file_sys.FileSystemManager.image_extensions", false]], "imageanalyzer (caption_tags \u306e\u30af\u30e9\u30b9)": [[13, "caption_tags.ImageAnalyzer", false]], "imagedatabasemanager (module.db \u306e\u30af\u30e9\u30b9)": [[36, "module.db.ImageDatabaseManager", false]], "imageeditor": [[5, "module-ImageEditor", false]], "imageeditwidget": [[4, "module-ImageEditWidget", false]], "imageeditwidget (imageeditwidget \u306e\u30af\u30e9\u30b9)": [[4, "ImageEditWidget.ImageEditWidget", false]], "imagepreviewwidget": [[6, "module-ImagePreviewWidget", false]], "imagepreviewwidget (imagepreviewwidget \u306e\u30af\u30e9\u30b9)": [[6, "ImagePreviewWidget.ImagePreviewWidget", false]], "imageprocessingmanager (imageeditor \u306e\u30af\u30e9\u30b9)": [[5, "ImageEditor.ImageProcessingManager", false]], "imageprocessor (imageeditor \u306e\u30af\u30e9\u30b9)": [[5, "ImageEditor.ImageProcessor", false]], "imagerepository (module.db \u306e\u30af\u30e9\u30b9)": [[36, "module.db.ImageRepository", false]], "imageselected (thumbnailselectorwidget.thumbnailselectorwidget \u306e\u5c5e\u6027)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget.imageSelected", false]], "imagetaggerwidget": [[7, "module-ImageTaggerWidget", false]], "imagetaggerwidget (imagetaggerwidget \u306e\u30af\u30e9\u30b9)": [[7, "ImageTaggerWidget.ImageTaggerWidget", false]], "init_dataset_selector() (gui.mainwindow \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "gui.MainWindow.init_dataset_selector", false]], "init_date_range() (datasetexportwidget.datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[0, "DatasetExportWidget.DatasetExportWidget.init_date_range", false]], "init_managers() (gui.mainwindow \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "gui.MainWindow.init_managers", false]], "init_pages() (gui.mainwindow \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "gui.MainWindow.init_pages", false]], "init_statusbar() (gui.mainwindow \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "gui.MainWindow.init_statusbar", false]], "init_ui() (datasetexportwidget.datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[0, "DatasetExportWidget.DatasetExportWidget.init_ui", false]], "init_ui() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.init_ui", false]], "initialize() (caption_tags.imageanalyzer \u306e\u30e1\u30bd\u30c3\u30c9)": [[13, "caption_tags.ImageAnalyzer.initialize", false]], "initialize() (datasetexportwidget.datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[0, "DatasetExportWidget.DatasetExportWidget.initialize", false]], "initialize() (datasetoverviewwidget.datasetoverviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[1, "DatasetOverviewWidget.DatasetOverviewWidget.initialize", false]], "initialize() (imageeditwidget.imageeditwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[4, "ImageEditWidget.ImageEditWidget.initialize", false]], "initialize() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.initialize", false]], "initialize() (module.api_utils.apiclientfactory \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.APIClientFactory.initialize", false]], "initialize() (module.file_sys.filesystemmanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[37, "module.file_sys.FileSystemManager.initialize", false]], "initialize() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.initialize", false]], "initialize_api_settings() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.initialize_api_settings", false]], "initialize_directory_pickers() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.initialize_directory_pickers", false]], "initialize_huggingface_settings() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.initialize_huggingface_settings", false]], "initialize_log_settings() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.initialize_log_settings", false]], "initialize_processing() (imageeditwidget.imageeditwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[4, "ImageEditWidget.ImageEditWidget.initialize_processing", false]], "initialize_tag_cleaner() (module.cleanup_txt \u30e2\u30b8\u30e5\u30fc\u30eb)": [[34, "module.cleanup_txt.initialize_tag_cleaner", false]], "initialize_ui() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.initialize_ui", false]], "input_size (score_module.scorer.aestheticpredictor \u306e\u5c5e\u6027)": [[59, "score_module.scorer.AestheticPredictor.input_size", false]], "insert_models() (module.db.sqlitemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.SQLiteManager.insert_models", false]], "isselected() (thumbnailselectorwidget.thumbnailitem \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.ThumbnailItem.isSelected", false]], "itemclicked (thumbnailselectorwidget.customgraphicsview \u306e\u5c5e\u6027)": [[12, "ThumbnailSelectorWidget.CustomGraphicsView.itemClicked", false]], "kwargs (progresswidget.worker \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Worker.kwargs", false]], "load_config() (module.config \u30e2\u30b8\u30e5\u30fc\u30eb)": [[35, "module.config.load_config", false]], "load_config_from_file() (gui.configmanager \u306e\u9759\u7684\u30e1\u30bd\u30c3\u30c9)": [[14, "gui.ConfigManager.load_config_from_file", false]], "load_dataset() (score_module.musiq_module.musiq_score_dataset \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MUSIQ_Score_Dataset.load_dataset", false]], "load_image() (imagepreviewwidget.imagepreviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[6, "ImagePreviewWidget.ImagePreviewWidget.load_image", false]], "load_images() (datasetoverviewwidget.datasetoverviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[1, "DatasetOverviewWidget.DatasetOverviewWidget.load_images", false]], "load_images() (imageeditwidget.imageeditwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[4, "ImageEditWidget.ImageEditWidget.load_images", false]], "load_images() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.load_images", false]], "load_images() (thumbnailselectorwidget.thumbnailselectorwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget.load_images", false]], "load_img() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.load_img", false]], "logger (caption_tags.imageanalyzer \u306e\u5c5e\u6027)": [[13, "caption_tags.ImageAnalyzer.logger", false]], "logger (imageeditor.imageprocessor \u306e\u5c5e\u6027)": [[5, "ImageEditor.ImageProcessor.logger", false]], "logger (module.file_sys.filesystemmanager \u306e\u5c5e\u6027)": [[37, "module.file_sys.FileSystemManager.logger", false]], "logger (progresswidget.controller \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Controller.logger", false]], "logger (progresswidget.progresswidget \u306e\u5c5e\u6027)": [[9, "ProgressWidget.ProgressWidget.logger", false]], "logger (progresswidget.worker \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Worker.logger", false]], "main": [[31, "module-main", false]], "maincontrollbase (main \u306e\u30af\u30e9\u30b9)": [[31, "main.MainControllBase", false]], "mainwindow (gui \u306e\u30af\u30e9\u30b9)": [[14, "gui.MainWindow", false]], "merge_hdf5() (score_module.musiq_module.musiq_score_dataset \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MUSIQ_Score_Dataset.merge_hdf5", false]], "mlp (score_module.clip_aethetic_score \u306e\u30af\u30e9\u30b9)": [[56, "score_module.clip_aethetic_score.MLP", false]], "mlp (score_module.musiq_module \u306e\u30af\u30e9\u30b9)": [[57, "score_module.musiq_module.MLP", false]], "mlp (score_module.rewardfunction_score \u306e\u30af\u30e9\u30b9)": [[58, "score_module.rewardfunction_score.MLP", false]], "model_paths (imageeditor.upscaler \u306e\u5c5e\u6027)": [[5, "ImageEditor.Upscaler.MODEL_PATHS", false]], "module": [[0, "module-DatasetExportWidget", false], [1, "module-DatasetOverviewWidget", false], [2, "module-DirectoryPickerWidget", false], [3, "module-FilePickerWidget", false], [4, "module-ImageEditWidget", false], [5, "module-ImageEditor", false], [6, "module-ImagePreviewWidget", false], [7, "module-ImageTaggerWidget", false], [8, "module-PickerWidget", false], [9, "module-ProgressWidget", false], [10, "module-SettingsWidget", false], [11, "module-TagFilterWidget", false], [12, "module-ThumbnailSelectorWidget", false], [13, "module-caption_tags", false], [14, "module-gui", false], [15, "module-gui_file", false], [16, "module-gui_file.DatasetExportWidget_ui", false], [17, "module-gui_file.DatasetOverviewWidget_ui", false], [18, "module-gui_file.DirectoryPickerWidget_ui", false], [19, "module-gui_file.FilePickerWidget_ui", false], [20, "module-gui_file.ImageEditWidget_ui", false], [21, "module-gui_file.ImagePreviewWidget_ui", false], [22, "module-gui_file.ImageTaggerWidget_ui", false], [23, "module-gui_file.PickerWidget_ui", false], [24, "module-gui_file.ProgressWidget_ui", false], [25, "module-gui_file.SettingsWidget_ui", false], [26, "module-gui_file.TagFilterWidget_ui", false], [27, "module-gui_file.ThumbnailSelectorWidget_ui", false], [28, "module-gui_file.filterBoxWidget_ui", false], [29, "module-gui_file.gui_ui", false], [31, "module-main", false], [32, "module-module", false], [33, "module-module.api_utils", false], [34, "module-module.cleanup_txt", false], [35, "module-module.config", false], [36, "module-module.db", false], [37, "module-module.file_sys", false], [53, "module-module.log", false], [55, "module-score_module", false], [56, "module-score_module.clip_aethetic_score", false], [57, "module-score_module.musiq_module", false], [58, "module-score_module.rewardfunction_score", false], [59, "module-score_module.scorer", false]], "module.api_utils": [[33, "module-module.api_utils", false]], "module.cleanup_txt": [[34, "module-module.cleanup_txt", false]], "module.config": [[35, "module-module.config", false]], "module.db": [[36, "module-module.db", false]], "module.file_sys": [[37, "module-module.file_sys", false]], "module.log": [[53, "module-module.log", false]], "mousepressevent() (thumbnailselectorwidget.customgraphicsview \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.CustomGraphicsView.mousePressEvent", false]], "multiheadattention (score_module.musiq_module \u306e\u30af\u30e9\u30b9)": [[57, "score_module.musiq_module.MultiHeadAttention", false]], "multiple_image_selection() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.multiple_image_selection", false]], "multipleimagesselected (thumbnailselectorwidget.thumbnailselectorwidget \u306e\u5c5e\u6027)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget.multipleImagesSelected", false]], "musiq (score_module.musiq_module \u306e\u30af\u30e9\u30b9)": [[57, "score_module.musiq_module.MUSIQ", false]], "musiq_encoder (score_module.musiq_module \u306e\u30af\u30e9\u30b9)": [[57, "score_module.musiq_module.MUSIQ_Encoder", false]], "musiq_score_dataset (score_module.musiq_module \u306e\u30af\u30e9\u30b9)": [[57, "score_module.musiq_module.MUSIQ_Score_Dataset", false]], "musiq_score_model (score_module.musiq_module \u306e\u30af\u30e9\u30b9)": [[57, "score_module.musiq_module.MUSIQ_SCORE_Model", false]], "normalize_color_profile() (imageeditor.imageprocessor \u306e\u9759\u7684\u30e1\u30bd\u30c3\u30c9)": [[5, "ImageEditor.ImageProcessor.normalize_color_profile", false]], "normalized() (score_module.clip_aethetic_score \u30e2\u30b8\u30e5\u30fc\u30eb)": [[56, "score_module.clip_aethetic_score.normalized", false]], "normalized() (score_module.scorer \u30e2\u30b8\u30e5\u30fc\u30eb)": [[59, "score_module.scorer.normalized", false]], "on_applyfilterbutton_clicked() (tagfilterwidget.tagfilterwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[11, "TagFilterWidget.TagFilterWidget.on_applyFilterButton_clicked", false]], "on_buttonsave_clicked() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.on_buttonSave_clicked", false]], "on_buttonsaveas_clicked() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.on_buttonSaveAs_clicked", false]], "on_cancelbutton_clicked() (progresswidget.progresswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[9, "ProgressWidget.ProgressWidget.on_cancelButton_clicked", false]], "on_comboboxapi_currentindexchanged() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.on_comboBoxAPI_currentIndexChanged", false]], "on_comboboxloglevel_currentindexchanged() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.on_comboBoxLogLevel_currentIndexChanged", false]], "on_comboboxmodel_currenttextchanged() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.on_comboBoxModel_currentTextChanged", false]], "on_comboboxresizeoption_currentindexchanged() (imageeditwidget.imageeditwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[4, "ImageEditWidget.ImageEditWidget.on_comboBoxResizeOption_currentIndexChanged", false]], "on_comboboxtagformat_currenttextchanged() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.on_comboBoxTagFormat_currentTextChanged", false]], "on_comboboxupscaler_currentindexchanged() (imageeditwidget.imageeditwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[4, "ImageEditWidget.ImageEditWidget.on_comboBoxUpscaler_currentIndexChanged", false]], "on_dbsearchwidget_filterapplied() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.on_dbSearchWidget_filterApplied", false]], "on_dirpickereditedoutput_changed() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.on_dirPickerEditedOutput_changed", false]], "on_dirpickeroutput_changed() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.on_dirPickerOutput_changed", false]], "on_dirpickerresponse_changed() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.on_dirPickerResponse_changed", false]], "on_error() (progresswidget.controller \u306e\u30e1\u30bd\u30c3\u30c9)": [[9, "ProgressWidget.Controller.on_error", false]], "on_exportbutton_clicked() (datasetexportwidget.datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[0, "DatasetExportWidget.DatasetExportWidget.on_exportButton_clicked", false]], "on_filepickerlogfile_changed() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.on_filePickerLogFile_changed", false]], "on_filter_applied() (datasetexportwidget.datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[0, "DatasetExportWidget.DatasetExportWidget.on_filter_applied", false]], "on_history_item_selected() (directorypickerwidget.directorypickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[2, "DirectoryPickerWidget.DirectoryPickerWidget.on_history_item_selected", false]], "on_history_item_selected() (filepickerwidget.filepickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[3, "FilePickerWidget.FilePickerWidget.on_history_item_selected", false]], "on_history_item_selected() (pickerwidget.pickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "PickerWidget.PickerWidget.on_history_item_selected", false]], "on_lineeditanthropickey_editingfinished() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.on_lineEditAnthropicKey_editingFinished", false]], "on_lineeditgooglevisionkey_editingfinished() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.on_lineEditGoogleVisionKey_editingFinished", false]], "on_lineedithfreponame_editingfinished() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.on_lineEditHfRepoName_editingFinished", false]], "on_lineedithftoken_editingfinished() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.on_lineEditHfToken_editingFinished", false]], "on_lineedithfusername_editingfinished() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.on_lineEditHfUsername_editingFinished", false]], "on_lineeditopenaikey_editingfinished() (settingswidget.settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[10, "SettingsWidget.SettingsWidget.on_lineEditOpenAiKey_editingFinished", false]], "on_lowrescheckbox_clicked() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.on_lowRescheckBox_clicked", false]], "on_path_changed() (directorypickerwidget.directorypickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[2, "DirectoryPickerWidget.DirectoryPickerWidget.on_path_changed", false]], "on_path_changed() (filepickerwidget.filepickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[3, "FilePickerWidget.FilePickerWidget.on_path_changed", false]], "on_pushbuttongenerate_clicked() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.on_pushButtonGenerate_clicked", false]], "on_pushbuttonsave_clicked() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.on_pushButtonSave_clicked", false]], "on_pushbuttonstartprocess_clicked() (imageeditwidget.imageeditwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[4, "ImageEditWidget.ImageEditWidget.on_pushButtonStartProcess_clicked", false]], "on_tablewidgetimagelist_itemselectionchanged() (imageeditwidget.imageeditwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[4, "ImageEditWidget.ImageEditWidget.on_tableWidgetImageList_itemSelectionChanged", false]], "on_texteditaddprompt_textchanged() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.on_textEditAddPrompt_textChanged", false]], "on_texteditmainprompt_textchanged() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.on_textEditMainPrompt_textChanged", false]], "on_thumbnailselector_imageselected() (datasetexportwidget.datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[0, "DatasetExportWidget.DatasetExportWidget.on_thumbnailSelector_imageSelected", false]], "on_worker_finished() (progresswidget.controller \u306e\u30e1\u30bd\u30c3\u30c9)": [[9, "ProgressWidget.Controller.on_worker_finished", false]], "openai (module.api_utils \u306e\u30af\u30e9\u30b9)": [[33, "module.api_utils.OpenAI", false]], "paint() (thumbnailselectorwidget.thumbnailitem \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.ThumbnailItem.paint", false]], "pickerwidget": [[8, "module-PickerWidget", false]], "pickerwidget (pickerwidget \u306e\u30af\u30e9\u30b9)": [[8, "PickerWidget.PickerWidget", false]], "poswisefeedforwardnet (score_module.musiq_module \u306e\u30af\u30e9\u30b9)": [[57, "score_module.musiq_module.PoswiseFeedForwardNet", false]], "print_datacount() (score_module.musiq_module.musiq_score_dataset \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MUSIQ_Score_Dataset.print_datacount", false]], "print_datacount_score() (score_module.musiq_module.musiq_score_dataset \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MUSIQ_Score_Dataset.print_datacount_score", false]], "print_dict() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.print_dict", false]], "process_all_images() (imageeditwidget.imageeditwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[4, "ImageEditWidget.ImageEditWidget.process_all_images", false]], "process_image() (imageeditor.imageprocessingmanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[5, "ImageEditor.ImageProcessingManager.process_image", false]], "process_image() (imageeditwidget.imageeditwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[4, "ImageEditWidget.ImageEditWidget.process_image", false]], "process_image() (main.maincontrollbase \u306e\u30e1\u30bd\u30c3\u30c9)": [[31, "main.MainControllBase.process_image", false]], "progress_updated (progresswidget.worker \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Worker.progress_updated", false], [9, "id6", false]], "progress_widget (progresswidget.controller \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Controller.progress_widget", false]], "progresswidget": [[9, "module-ProgressWidget", false]], "progresswidget (progresswidget \u306e\u30af\u30e9\u30b9)": [[9, "ProgressWidget.ProgressWidget", false]], "realtimecontroll (main \u306e\u30af\u30e9\u30b9)": [[31, "main.RealtimeControll", false]], "register_original_image() (module.db.imagedatabasemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageDatabaseManager.register_original_image", false]], "register_processed_image() (module.db.imagedatabasemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageDatabaseManager.register_processed_image", false]], "resize_image() (imageeditor.imageprocessor \u306e\u30e1\u30bd\u30c3\u30c9)": [[5, "ImageEditor.ImageProcessor.resize_image", false]], "resize_image() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.resize_image", false]], "resize_img_resos() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.resize_img_resos", false]], "resizecontroll (main \u306e\u30af\u30e9\u30b9)": [[31, "main.ResizeControll", false]], "resizeevent() (imagepreviewwidget.imagepreviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[6, "ImagePreviewWidget.ImagePreviewWidget.resizeEvent", false]], "resizeevent() (thumbnailselectorwidget.thumbnailselectorwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget.resizeEvent", false]], "resnet50_backbone() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.resnet50_backbone", false]], "resnetbackbone (score_module.musiq_module \u306e\u30af\u30e9\u30b9)": [[57, "score_module.musiq_module.ResNetBackbone", false]], "retranslateui() (gui_file.datasetexportwidget_ui.ui_datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[16, "gui_file.DatasetExportWidget_ui.Ui_DatasetExportWidget.retranslateUi", false]], "retranslateui() (gui_file.datasetoverviewwidget_ui.ui_datasetoverviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[17, "gui_file.DatasetOverviewWidget_ui.Ui_DatasetOverviewWidget.retranslateUi", false]], "retranslateui() (gui_file.directorypickerwidget_ui.ui_directorypickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[18, "gui_file.DirectoryPickerWidget_ui.Ui_DirectoryPickerWidget.retranslateUi", false]], "retranslateui() (gui_file.filepickerwidget_ui.ui_filepickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[19, "gui_file.FilePickerWidget_ui.Ui_FilePickerWidget.retranslateUi", false]], "retranslateui() (gui_file.filterboxwidget_ui.ui_filterboxwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[28, "gui_file.filterBoxWidget_ui.Ui_filterBoxWidget.retranslateUi", false]], "retranslateui() (gui_file.gui_ui.ui_mainwindow \u306e\u30e1\u30bd\u30c3\u30c9)": [[29, "gui_file.gui_ui.Ui_mainWindow.retranslateUi", false]], "retranslateui() (gui_file.imageeditwidget_ui.ui_imageeditwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "gui_file.ImageEditWidget_ui.Ui_ImageEditWidget.retranslateUi", false]], "retranslateui() (gui_file.imagepreviewwidget_ui.ui_imagepreviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[21, "gui_file.ImagePreviewWidget_ui.Ui_ImagePreviewWidget.retranslateUi", false]], "retranslateui() (gui_file.imagetaggerwidget_ui.ui_imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[22, "gui_file.ImageTaggerWidget_ui.Ui_ImageTaggerWidget.retranslateUi", false]], "retranslateui() (gui_file.pickerwidget_ui.ui_pickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "gui_file.PickerWidget_ui.Ui_PickerWidget.retranslateUi", false]], "retranslateui() (gui_file.progresswidget_ui.ui_progresswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[24, "gui_file.ProgressWidget_ui.Ui_ProgressWidget.retranslateUi", false]], "retranslateui() (gui_file.settingswidget_ui.ui_settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[25, "gui_file.SettingsWidget_ui.Ui_SettingsWidget.retranslateUi", false]], "retranslateui() (gui_file.tagfilterwidget_ui.ui_tagfilterwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[26, "gui_file.TagFilterWidget_ui.Ui_TagFilterWidget.retranslateUi", false]], "retranslateui() (gui_file.thumbnailselectorwidget_ui.ui_thumbnailselectorwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[27, "gui_file.ThumbnailSelectorWidget_ui.Ui_ThumbnailSelectorWidget.retranslateUi", false]], "retry_after() (module.api_utils.apierror \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.APIError.retry_after", false]], "round_to_steps() (score_module.musiq_module \u30e2\u30b8\u30e5\u30fc\u30eb)": [[57, "score_module.musiq_module.round_to_steps", false]], "run() (progresswidget.worker \u306e\u30e1\u30bd\u30c3\u30c9)": [[9, "ProgressWidget.Worker.run", false], [9, "id7", false]], "save_annotations() (module.db.imagedatabasemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageDatabaseManager.save_annotations", false]], "save_annotations() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.save_annotations", false]], "save_batch_request() (module.file_sys.filesystemmanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[37, "module.file_sys.FileSystemManager.save_batch_request", false]], "save_dataset() (score_module.musiq_module.musiq_score_dataset \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.MUSIQ_Score_Dataset.save_dataset", false]], "save_original_image() (module.file_sys.filesystemmanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[37, "module.file_sys.FileSystemManager.save_original_image", false]], "save_processed_image() (module.file_sys.filesystemmanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[37, "module.file_sys.FileSystemManager.save_processed_image", false]], "save_score() (module.db.imagedatabasemanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageDatabaseManager.save_score", false]], "save_score() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.save_score", false]], "save_to_db() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.save_to_db", false]], "save_toml_config() (module.file_sys.filesystemmanager \u306e\u9759\u7684\u30e1\u30bd\u30c3\u30c9)": [[37, "module.file_sys.FileSystemManager.save_toml_config", false]], "scale_to_value() (tagfilterwidget.customrangeslider \u306e\u30e1\u30bd\u30c3\u30c9)": [[11, "TagFilterWidget.CustomRangeSlider.scale_to_value", false]], "score() (score_module.scorer.aestheticscorer \u306e\u30e1\u30bd\u30c3\u30c9)": [[59, "score_module.scorer.AestheticScorer.score", false]], "score_manager (score_module.clip_aethetic_score \u306e\u30af\u30e9\u30b9)": [[56, "score_module.clip_aethetic_score.Score_Manager", false]], "score_manager (score_module.musiq_module \u306e\u30af\u30e9\u30b9)": [[57, "score_module.musiq_module.Score_Manager", false]], "score_manager (score_module.rewardfunction_score \u306e\u30af\u30e9\u30b9)": [[58, "score_module.rewardfunction_score.Score_Manager", false]], "score_module": [[55, "module-score_module", false]], "score_module.clip_aethetic_score": [[56, "module-score_module.clip_aethetic_score", false]], "score_module.musiq_module": [[57, "module-score_module.musiq_module", false]], "score_module.rewardfunction_score": [[58, "module-score_module.rewardfunction_score", false]], "score_module.scorer": [[59, "module-score_module.scorer", false]], "select_file() (filepickerwidget.filepickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[3, "FilePickerWidget.FilePickerWidget.select_file", false]], "select_file() (pickerwidget.pickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "PickerWidget.PickerWidget.select_file", false]], "select_first_image() (thumbnailselectorwidget.thumbnailselectorwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget.select_first_image", false]], "select_folder() (directorypickerwidget.directorypickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[2, "DirectoryPickerWidget.DirectoryPickerWidget.select_folder", false]], "select_folder() (pickerwidget.pickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "PickerWidget.PickerWidget.select_folder", false]], "select_range() (thumbnailselectorwidget.thumbnailselectorwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget.select_range", false]], "set_button_text() (pickerwidget.pickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "PickerWidget.PickerWidget.set_button_text", false]], "set_date_range() (tagfilterwidget.customrangeslider \u306e\u30e1\u30bd\u30c3\u30c9)": [[11, "TagFilterWidget.CustomRangeSlider.set_date_range", false]], "set_image_data() (module.api_utils.apiinterface \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.APIInterface.set_image_data", false]], "set_image_data() (module.api_utils.baseapiclient \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.BaseAPIClient.set_image_data", false]], "set_label_text() (directorypickerwidget.directorypickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[2, "DirectoryPickerWidget.DirectoryPickerWidget.set_label_text", false]], "set_label_text() (filepickerwidget.filepickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[3, "FilePickerWidget.FilePickerWidget.set_label_text", false]], "set_label_text() (pickerwidget.pickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "PickerWidget.PickerWidget.set_label_text", false]], "set_metadata_labels() (datasetoverviewwidget.datasetoverviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[1, "DatasetOverviewWidget.DatasetOverviewWidget.set_metadata_labels", false]], "set_path() (directorypickerwidget.directorypickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[2, "DirectoryPickerWidget.DirectoryPickerWidget.set_path", false]], "set_path() (filepickerwidget.filepickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[3, "FilePickerWidget.FilePickerWidget.set_path", false]], "set_range() (tagfilterwidget.customrangeslider \u306e\u30e1\u30bd\u30c3\u30c9)": [[11, "TagFilterWidget.CustomRangeSlider.set_range", false]], "setselected() (thumbnailselectorwidget.thumbnailitem \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.ThumbnailItem.setSelected", false]], "settingswidget": [[10, "module-SettingsWidget", false]], "settingswidget (settingswidget \u306e\u30af\u30e9\u30b9)": [[10, "SettingsWidget.SettingsWidget", false]], "setup_logger() (module.log \u30e2\u30b8\u30e5\u30fc\u30eb)": [[53, "module.log.setup_logger", false]], "setup_slider() (tagfilterwidget.tagfilterwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[11, "TagFilterWidget.TagFilterWidget.setup_slider", false]], "setup_ui() (tagfilterwidget.customrangeslider \u306e\u30e1\u30bd\u30c3\u30c9)": [[11, "TagFilterWidget.CustomRangeSlider.setup_ui", false]], "setupui() (gui_file.datasetexportwidget_ui.ui_datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[16, "gui_file.DatasetExportWidget_ui.Ui_DatasetExportWidget.setupUi", false]], "setupui() (gui_file.datasetoverviewwidget_ui.ui_datasetoverviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[17, "gui_file.DatasetOverviewWidget_ui.Ui_DatasetOverviewWidget.setupUi", false]], "setupui() (gui_file.directorypickerwidget_ui.ui_directorypickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[18, "gui_file.DirectoryPickerWidget_ui.Ui_DirectoryPickerWidget.setupUi", false]], "setupui() (gui_file.filepickerwidget_ui.ui_filepickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[19, "gui_file.FilePickerWidget_ui.Ui_FilePickerWidget.setupUi", false]], "setupui() (gui_file.filterboxwidget_ui.ui_filterboxwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[28, "gui_file.filterBoxWidget_ui.Ui_filterBoxWidget.setupUi", false]], "setupui() (gui_file.gui_ui.ui_mainwindow \u306e\u30e1\u30bd\u30c3\u30c9)": [[29, "gui_file.gui_ui.Ui_mainWindow.setupUi", false]], "setupui() (gui_file.imageeditwidget_ui.ui_imageeditwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "gui_file.ImageEditWidget_ui.Ui_ImageEditWidget.setupUi", false]], "setupui() (gui_file.imagepreviewwidget_ui.ui_imagepreviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[21, "gui_file.ImagePreviewWidget_ui.Ui_ImagePreviewWidget.setupUi", false]], "setupui() (gui_file.imagetaggerwidget_ui.ui_imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[22, "gui_file.ImageTaggerWidget_ui.Ui_ImageTaggerWidget.setupUi", false]], "setupui() (gui_file.pickerwidget_ui.ui_pickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "gui_file.PickerWidget_ui.Ui_PickerWidget.setupUi", false]], "setupui() (gui_file.progresswidget_ui.ui_progresswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[24, "gui_file.ProgressWidget_ui.Ui_ProgressWidget.setupUi", false]], "setupui() (gui_file.settingswidget_ui.ui_settingswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[25, "gui_file.SettingsWidget_ui.Ui_SettingsWidget.setupUi", false]], "setupui() (gui_file.tagfilterwidget_ui.ui_tagfilterwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[26, "gui_file.TagFilterWidget_ui.Ui_TagFilterWidget.setupUi", false]], "setupui() (gui_file.thumbnailselectorwidget_ui.ui_thumbnailselectorwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[27, "gui_file.ThumbnailSelectorWidget_ui.Ui_ThumbnailSelectorWidget.setupUi", false]], "showevent() (datasetoverviewwidget.datasetoverviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[1, "DatasetOverviewWidget.DatasetOverviewWidget.showEvent", false]], "showevent() (imageeditwidget.imageeditwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[4, "ImageEditWidget.ImageEditWidget.showEvent", false]], "showevent() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.showEvent", false]], "single_image_selection() (imagetaggerwidget.imagetaggerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[7, "ImageTaggerWidget.ImageTaggerWidget.single_image_selection", false]], "some_long_process() (gui.mainwindow \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "gui.MainWindow.some_long_process", false]], "split_jsonl() (module.file_sys.filesystemmanager \u306e\u30e1\u30bd\u30c3\u30c9)": [[37, "module.file_sys.FileSystemManager.split_jsonl", false]], "sqlitemanager (module.db \u306e\u30af\u30e9\u30b9)": [[36, "module.db.SQLiteManager", false]], "start_batch_processing() (module.api_utils.apiinterface \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.APIInterface.start_batch_processing", false]], "start_batch_processing() (module.api_utils.claude \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.Claude.start_batch_processing", false]], "start_batch_processing() (module.api_utils.google \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.Google.start_batch_processing", false]], "start_batch_processing() (module.api_utils.openai \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.OpenAI.start_batch_processing", false]], "start_process() (progresswidget.controller \u306e\u30e1\u30bd\u30c3\u30c9)": [[9, "ProgressWidget.Controller.start_process", false], [9, "id1", false]], "start_processing() (main \u30e2\u30b8\u30e5\u30fc\u30eb)": [[31, "main.start_processing", false]], "staticmetaobject (datasetexportwidget.datasetexportwidget \u306e\u5c5e\u6027)": [[0, "DatasetExportWidget.DatasetExportWidget.staticMetaObject", false]], "staticmetaobject (datasetoverviewwidget.datasetoverviewwidget \u306e\u5c5e\u6027)": [[1, "DatasetOverviewWidget.DatasetOverviewWidget.staticMetaObject", false]], "staticmetaobject (directorypickerwidget.directorypickerwidget \u306e\u5c5e\u6027)": [[2, "DirectoryPickerWidget.DirectoryPickerWidget.staticMetaObject", false]], "staticmetaobject (filepickerwidget.filepickerwidget \u306e\u5c5e\u6027)": [[3, "FilePickerWidget.FilePickerWidget.staticMetaObject", false]], "staticmetaobject (gui.mainwindow \u306e\u5c5e\u6027)": [[14, "gui.MainWindow.staticMetaObject", false]], "staticmetaobject (imageeditwidget.imageeditwidget \u306e\u5c5e\u6027)": [[4, "ImageEditWidget.ImageEditWidget.staticMetaObject", false]], "staticmetaobject (imagepreviewwidget.imagepreviewwidget \u306e\u5c5e\u6027)": [[6, "ImagePreviewWidget.ImagePreviewWidget.staticMetaObject", false]], "staticmetaobject (imagetaggerwidget.imagetaggerwidget \u306e\u5c5e\u6027)": [[7, "ImageTaggerWidget.ImageTaggerWidget.staticMetaObject", false]], "staticmetaobject (pickerwidget.pickerwidget \u306e\u5c5e\u6027)": [[8, "PickerWidget.PickerWidget.staticMetaObject", false]], "staticmetaobject (progresswidget.controller \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Controller.staticMetaObject", false]], "staticmetaobject (progresswidget.progresswidget \u306e\u5c5e\u6027)": [[9, "ProgressWidget.ProgressWidget.staticMetaObject", false]], "staticmetaobject (progresswidget.worker \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Worker.staticMetaObject", false]], "staticmetaobject (settingswidget.settingswidget \u306e\u5c5e\u6027)": [[10, "SettingsWidget.SettingsWidget.staticMetaObject", false]], "staticmetaobject (tagfilterwidget.customrangeslider \u306e\u5c5e\u6027)": [[11, "TagFilterWidget.CustomRangeSlider.staticMetaObject", false]], "staticmetaobject (tagfilterwidget.tagfilterwidget \u306e\u5c5e\u6027)": [[11, "TagFilterWidget.TagFilterWidget.staticMetaObject", false]], "staticmetaobject (thumbnailselectorwidget.customgraphicsview \u306e\u5c5e\u6027)": [[12, "ThumbnailSelectorWidget.CustomGraphicsView.staticMetaObject", false]], "staticmetaobject (thumbnailselectorwidget.thumbnailitem \u306e\u5c5e\u6027)": [[12, "ThumbnailSelectorWidget.ThumbnailItem.staticMetaObject", false]], "staticmetaobject (thumbnailselectorwidget.thumbnailselectorwidget \u306e\u5c5e\u6027)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget.staticMetaObject", false]], "status_updated (progresswidget.worker \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Worker.status_updated", false], [9, "id8", false]], "supported_vision_models (module.api_utils.claude \u306e\u5c5e\u6027)": [[33, "module.api_utils.Claude.SUPPORTED_VISION_MODELS", false]], "supported_vision_models (module.api_utils.google \u306e\u5c5e\u6027)": [[33, "module.api_utils.Google.SUPPORTED_VISION_MODELS", false]], "supported_vision_models (module.api_utils.openai \u306e\u5c5e\u6027)": [[33, "module.api_utils.OpenAI.SUPPORTED_VISION_MODELS", false]], "tagcleaner (module.cleanup_txt \u306e\u30af\u30e9\u30b9)": [[34, "module.cleanup_txt.TagCleaner", false]], "tagfilterwidget": [[11, "module-TagFilterWidget", false]], "tagfilterwidget (tagfilterwidget \u306e\u30af\u30e9\u30b9)": [[11, "TagFilterWidget.TagFilterWidget", false]], "thread (progresswidget.controller \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Controller.thread", false]], "thumbnail_size (imageeditwidget.imageeditwidget \u306e\u5c5e\u6027)": [[4, "ImageEditWidget.ImageEditWidget.THUMBNAIL_SIZE", false]], "thumbnailitem (thumbnailselectorwidget \u306e\u30af\u30e9\u30b9)": [[12, "ThumbnailSelectorWidget.ThumbnailItem", false]], "thumbnailselectorwidget": [[12, "module-ThumbnailSelectorWidget", false]], "thumbnailselectorwidget (thumbnailselectorwidget \u306e\u30af\u30e9\u30b9)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget", false]], "to_cpu() (score_module.clip_aethetic_score.score_manager \u306e\u30e1\u30bd\u30c3\u30c9)": [[56, "score_module.clip_aethetic_score.Score_Manager.to_cpu", false]], "to_cpu() (score_module.musiq_module.score_manager \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.Score_Manager.to_cpu", false]], "to_cpu() (score_module.rewardfunction_score.score_manager \u306e\u30e1\u30bd\u30c3\u30c9)": [[58, "score_module.rewardfunction_score.Score_Manager.to_cpu", false]], "to_dict() (module.api_utils.apierror \u306e\u30e1\u30bd\u30c3\u30c9)": [[33, "module.api_utils.APIError.to_dict", false]], "to_gpu() (score_module.clip_aethetic_score.score_manager \u306e\u30e1\u30bd\u30c3\u30c9)": [[56, "score_module.clip_aethetic_score.Score_Manager.to_gpu", false]], "to_gpu() (score_module.musiq_module.score_manager \u306e\u30e1\u30bd\u30c3\u30c9)": [[57, "score_module.musiq_module.Score_Manager.to_gpu", false]], "to_gpu() (score_module.rewardfunction_score.score_manager \u306e\u30e1\u30bd\u30c3\u30c9)": [[58, "score_module.rewardfunction_score.Score_Manager.to_gpu", false]], "ui_datasetexportwidget (gui_file.datasetexportwidget_ui \u306e\u30af\u30e9\u30b9)": [[16, "gui_file.DatasetExportWidget_ui.Ui_DatasetExportWidget", false]], "ui_datasetoverviewwidget (gui_file.datasetoverviewwidget_ui \u306e\u30af\u30e9\u30b9)": [[17, "gui_file.DatasetOverviewWidget_ui.Ui_DatasetOverviewWidget", false]], "ui_directorypickerwidget (gui_file.directorypickerwidget_ui \u306e\u30af\u30e9\u30b9)": [[18, "gui_file.DirectoryPickerWidget_ui.Ui_DirectoryPickerWidget", false]], "ui_filepickerwidget (gui_file.filepickerwidget_ui \u306e\u30af\u30e9\u30b9)": [[19, "gui_file.FilePickerWidget_ui.Ui_FilePickerWidget", false]], "ui_filterboxwidget (gui_file.filterboxwidget_ui \u306e\u30af\u30e9\u30b9)": [[28, "gui_file.filterBoxWidget_ui.Ui_filterBoxWidget", false]], "ui_imageeditwidget (gui_file.imageeditwidget_ui \u306e\u30af\u30e9\u30b9)": [[20, "gui_file.ImageEditWidget_ui.Ui_ImageEditWidget", false]], "ui_imagepreviewwidget (gui_file.imagepreviewwidget_ui \u306e\u30af\u30e9\u30b9)": [[21, "gui_file.ImagePreviewWidget_ui.Ui_ImagePreviewWidget", false]], "ui_imagetaggerwidget (gui_file.imagetaggerwidget_ui \u306e\u30af\u30e9\u30b9)": [[22, "gui_file.ImageTaggerWidget_ui.Ui_ImageTaggerWidget", false]], "ui_mainwindow (gui_file.gui_ui \u306e\u30af\u30e9\u30b9)": [[29, "gui_file.gui_ui.Ui_mainWindow", false]], "ui_pickerwidget (gui_file.pickerwidget_ui \u306e\u30af\u30e9\u30b9)": [[23, "gui_file.PickerWidget_ui.Ui_PickerWidget", false]], "ui_progresswidget (gui_file.progresswidget_ui \u306e\u30af\u30e9\u30b9)": [[24, "gui_file.ProgressWidget_ui.Ui_ProgressWidget", false]], "ui_settingswidget (gui_file.settingswidget_ui \u306e\u30af\u30e9\u30b9)": [[25, "gui_file.SettingsWidget_ui.Ui_SettingsWidget", false]], "ui_tagfilterwidget (gui_file.tagfilterwidget_ui \u306e\u30af\u30e9\u30b9)": [[26, "gui_file.TagFilterWidget_ui.Ui_TagFilterWidget", false]], "ui_thumbnailselectorwidget (gui_file.thumbnailselectorwidget_ui \u306e\u30af\u30e9\u30b9)": [[27, "gui_file.ThumbnailSelectorWidget_ui.Ui_ThumbnailSelectorWidget", false]], "update_annotations() (datasetoverviewwidget.datasetoverviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[1, "DatasetOverviewWidget.DatasetOverviewWidget.update_annotations", false]], "update_export_progress() (datasetexportwidget.datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[0, "DatasetExportWidget.DatasetExportWidget.update_export_progress", false]], "update_history() (pickerwidget.pickerwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "PickerWidget.PickerWidget.update_history", false]], "update_image_count_label() (datasetexportwidget.datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[0, "DatasetExportWidget.DatasetExportWidget.update_image_count_label", false]], "update_image_metadata() (module.db.imagerepository \u306e\u30e1\u30bd\u30c3\u30c9)": [[36, "module.db.ImageRepository.update_image_metadata", false]], "update_labels() (tagfilterwidget.customrangeslider \u306e\u30e1\u30bd\u30c3\u30c9)": [[11, "TagFilterWidget.CustomRangeSlider.update_labels", false]], "update_metadata() (datasetoverviewwidget.datasetoverviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[1, "DatasetOverviewWidget.DatasetOverviewWidget.update_metadata", false]], "update_preview() (datasetoverviewwidget.datasetoverviewwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[1, "DatasetOverviewWidget.DatasetOverviewWidget.update_preview", false]], "update_progress() (progresswidget.progresswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[9, "ProgressWidget.ProgressWidget.update_progress", false]], "update_selection() (thumbnailselectorwidget.thumbnailselectorwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget.update_selection", false]], "update_status() (progresswidget.progresswidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[9, "ProgressWidget.ProgressWidget.update_status", false]], "update_thumbnail_layout() (thumbnailselectorwidget.thumbnailselectorwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "ThumbnailSelectorWidget.ThumbnailSelectorWidget.update_thumbnail_layout", false]], "update_thumbnail_selector() (datasetexportwidget.datasetexportwidget \u306e\u30e1\u30bd\u30c3\u30c9)": [[0, "DatasetExportWidget.DatasetExportWidget.update_thumbnail_selector", false]], "upscale_image() (imageeditor.upscaler \u306e\u30af\u30e9\u30b9\u30e1\u30bd\u30c3\u30c9)": [[5, "ImageEditor.Upscaler.upscale_image", false]], "upscaler (imageeditor \u306e\u30af\u30e9\u30b9)": [[5, "ImageEditor.Upscaler", false]], "valuechanged (tagfilterwidget.customrangeslider \u306e\u5c5e\u6027)": [[11, "TagFilterWidget.CustomRangeSlider.valueChanged", false]], "worker (progresswidget \u306e\u30af\u30e9\u30b9)": [[9, "ProgressWidget.Worker", false]], "worker (progresswidget.controller \u306e\u5c5e\u6027)": [[9, "ProgressWidget.Controller.worker", false]], "write_config_file() (module.config \u30e2\u30b8\u30e5\u30fc\u30eb)": [[35, "module.config.write_config_file", false]]}, "objects": {"": [[0, 0, 0, "-", "DatasetExportWidget"], [1, 0, 0, "-", "DatasetOverviewWidget"], [2, 0, 0, "-", "DirectoryPickerWidget"], [3, 0, 0, "-", "FilePickerWidget"], [4, 0, 0, "-", "ImageEditWidget"], [5, 0, 0, "-", "ImageEditor"], [6, 0, 0, "-", "ImagePreviewWidget"], [7, 0, 0, "-", "ImageTaggerWidget"], [8, 0, 0, "-", "PickerWidget"], [9, 0, 0, "-", "ProgressWidget"], [10, 0, 0, "-", "SettingsWidget"], [11, 0, 0, "-", "TagFilterWidget"], [12, 0, 0, "-", "ThumbnailSelectorWidget"], [13, 0, 0, "-", "caption_tags"], [14, 0, 0, "-", "gui"], [15, 0, 0, "-", "gui_file"], [31, 0, 0, "-", "main"], [32, 0, 0, "-", "module"], [55, 0, 0, "-", "score_module"]], "DatasetExportWidget": [[0, 1, 1, "", "DatasetExportWidget"]], "DatasetExportWidget.DatasetExportWidget": [[0, 2, 1, "", "export_dataset"], [0, 2, 1, "", "export_error"], [0, 2, 1, "", "export_finished"], [0, 2, 1, "", "init_date_range"], [0, 2, 1, "", "init_ui"], [0, 2, 1, "", "initialize"], [0, 2, 1, "", "on_exportButton_clicked"], [0, 2, 1, "", "on_filter_applied"], [0, 2, 1, "", "on_thumbnailSelector_imageSelected"], [0, 3, 1, "", "staticMetaObject"], [0, 2, 1, "", "update_export_progress"], [0, 2, 1, "", "update_image_count_label"], [0, 2, 1, "", "update_thumbnail_selector"]], "DatasetOverviewWidget": [[1, 1, 1, "", "DatasetOverviewWidget"]], "DatasetOverviewWidget.DatasetOverviewWidget": [[1, 2, 1, "", "calculate_aspect_ratio"], [1, 2, 1, "", "clear_metadata"], [1, 3, 1, "", "dataset_loaded"], [1, 2, 1, "", "initialize"], [1, 2, 1, "", "load_images"], [1, 2, 1, "", "set_metadata_labels"], [1, 2, 1, "", "showEvent"], [1, 3, 1, "", "staticMetaObject"], [1, 2, 1, "", "update_annotations"], [1, 2, 1, "", "update_metadata"], [1, 2, 1, "", "update_preview"]], "DirectoryPickerWidget": [[2, 1, 1, "", "DirectoryPickerWidget"]], "DirectoryPickerWidget.DirectoryPickerWidget": [[2, 2, 1, "", "get_selected_path"], [2, 2, 1, "", "on_history_item_selected"], [2, 2, 1, "", "on_path_changed"], [2, 2, 1, "", "select_folder"], [2, 2, 1, "", "set_label_text"], [2, 2, 1, "", "set_path"], [2, 3, 1, "", "staticMetaObject"]], "FilePickerWidget": [[3, 1, 1, "", "FilePickerWidget"]], "FilePickerWidget.FilePickerWidget": [[3, 2, 1, "", "get_selected_path"], [3, 2, 1, "", "on_history_item_selected"], [3, 2, 1, "", "on_path_changed"], [3, 2, 1, "", "select_file"], [3, 2, 1, "", "set_label_text"], [3, 2, 1, "", "set_path"], [3, 3, 1, "", "staticMetaObject"]], "ImageEditWidget": [[4, 1, 1, "", "ImageEditWidget"]], "ImageEditWidget.ImageEditWidget": [[4, 3, 1, "", "FILE_SIZE_UNIT"], [4, 3, 1, "", "THUMBNAIL_SIZE"], [4, 2, 1, "", "handle_processing_result"], [4, 2, 1, "", "initialize"], [4, 2, 1, "", "initialize_processing"], [4, 2, 1, "", "load_images"], [4, 2, 1, "", "on_comboBoxResizeOption_currentIndexChanged"], [4, 2, 1, "", "on_comboBoxUpscaler_currentIndexChanged"], [4, 2, 1, "", "on_pushButtonStartProcess_clicked"], [4, 2, 1, "", "on_tableWidgetImageList_itemSelectionChanged"], [4, 2, 1, "", "process_all_images"], [4, 2, 1, "", "process_image"], [4, 2, 1, "", "showEvent"], [4, 3, 1, "", "staticMetaObject"]], "ImageEditor": [[5, 1, 1, "", "AutoCrop"], [5, 1, 1, "", "ImageProcessingManager"], [5, 1, 1, "", "ImageProcessor"], [5, 1, 1, "", "Upscaler"]], "ImageEditor.AutoCrop": [[5, 2, 1, "", "auto_crop_image"]], "ImageEditor.ImageProcessingManager": [[5, 2, 1, "", "process_image"]], "ImageEditor.ImageProcessor": [[5, 3, 1, "", "logger"], [5, 2, 1, "", "normalize_color_profile"], [5, 2, 1, "", "resize_image"]], "ImageEditor.Upscaler": [[5, 3, 1, "", "MODEL_PATHS"], [5, 2, 1, "", "get_available_models"], [5, 2, 1, "", "upscale_image"]], "ImagePreviewWidget": [[6, 1, 1, "", "ImagePreviewWidget"]], "ImagePreviewWidget.ImagePreviewWidget": [[6, 2, 1, "", "load_image"], [6, 2, 1, "", "resizeEvent"], [6, 3, 1, "", "staticMetaObject"]], "ImageTaggerWidget": [[7, 1, 1, "", "ImageTaggerWidget"]], "ImageTaggerWidget.ImageTaggerWidget": [[7, 2, 1, "", "init_ui"], [7, 2, 1, "", "initialize"], [7, 2, 1, "", "load_images"], [7, 2, 1, "", "multiple_image_selection"], [7, 2, 1, "", "on_comboBoxAPI_currentIndexChanged"], [7, 2, 1, "", "on_comboBoxModel_currentTextChanged"], [7, 2, 1, "", "on_comboBoxTagFormat_currentTextChanged"], [7, 2, 1, "", "on_dbSearchWidget_filterApplied"], [7, 2, 1, "", "on_lowRescheckBox_clicked"], [7, 2, 1, "", "on_pushButtonGenerate_clicked"], [7, 2, 1, "", "on_pushButtonSave_clicked"], [7, 2, 1, "", "on_textEditAddPrompt_textChanged"], [7, 2, 1, "", "on_textEditMainPrompt_textChanged"], [7, 2, 1, "", "save_to_db"], [7, 2, 1, "", "showEvent"], [7, 2, 1, "", "single_image_selection"], [7, 3, 1, "", "staticMetaObject"]], "PickerWidget": [[8, 1, 1, "", "PickerWidget"]], "PickerWidget.PickerWidget": [[8, 2, 1, "", "configure"], [8, 2, 1, "", "on_history_item_selected"], [8, 2, 1, "", "select_file"], [8, 2, 1, "", "select_folder"], [8, 2, 1, "", "set_button_text"], [8, 2, 1, "", "set_label_text"], [8, 3, 1, "", "staticMetaObject"], [8, 2, 1, "", "update_history"]], "ProgressWidget": [[9, 1, 1, "", "Controller"], [9, 1, 1, "", "ProgressWidget"], [9, 1, 1, "", "Worker"]], "ProgressWidget.Controller": [[9, 2, 1, "id0", "cleanup"], [9, 3, 1, "", "logger"], [9, 2, 1, "", "on_error"], [9, 2, 1, "", "on_worker_finished"], [9, 3, 1, "", "progress_widget"], [9, 2, 1, "id1", "start_process"], [9, 3, 1, "", "staticMetaObject"], [9, 3, 1, "", "thread"], [9, 3, 1, "", "worker"]], "ProgressWidget.ProgressWidget": [[9, 3, 1, "id2", "canceled"], [9, 3, 1, "", "logger"], [9, 2, 1, "", "on_cancelButton_clicked"], [9, 3, 1, "", "staticMetaObject"], [9, 2, 1, "", "update_progress"], [9, 2, 1, "", "update_status"]], "ProgressWidget.Worker": [[9, 3, 1, "", "_is_canceled"], [9, 3, 1, "", "args"], [9, 2, 1, "id3", "cancel"], [9, 3, 1, "id4", "error_occurred"], [9, 3, 1, "id5", "finished"], [9, 3, 1, "", "function"], [9, 3, 1, "", "kwargs"], [9, 3, 1, "", "logger"], [9, 3, 1, "id6", "progress_updated"], [9, 2, 1, "id7", "run"], [9, 3, 1, "", "staticMetaObject"], [9, 3, 1, "id8", "status_updated"]], "SettingsWidget": [[10, 1, 1, "", "SettingsWidget"]], "SettingsWidget.SettingsWidget": [[10, 2, 1, "", "connect_custom_widgets"], [10, 2, 1, "", "initialize"], [10, 2, 1, "", "initialize_api_settings"], [10, 2, 1, "", "initialize_directory_pickers"], [10, 2, 1, "", "initialize_huggingface_settings"], [10, 2, 1, "", "initialize_log_settings"], [10, 2, 1, "", "initialize_ui"], [10, 2, 1, "", "on_buttonSaveAs_clicked"], [10, 2, 1, "", "on_buttonSave_clicked"], [10, 2, 1, "", "on_comboBoxLogLevel_currentIndexChanged"], [10, 2, 1, "", "on_dirPickerEditedOutput_changed"], [10, 2, 1, "", "on_dirPickerOutput_changed"], [10, 2, 1, "", "on_dirPickerResponse_changed"], [10, 2, 1, "", "on_filePickerLogFile_changed"], [10, 2, 1, "", "on_lineEditAnthropicKey_editingFinished"], [10, 2, 1, "", "on_lineEditGoogleVisionKey_editingFinished"], [10, 2, 1, "", "on_lineEditHfRepoName_editingFinished"], [10, 2, 1, "", "on_lineEditHfToken_editingFinished"], [10, 2, 1, "", "on_lineEditHfUsername_editingFinished"], [10, 2, 1, "", "on_lineEditOpenAiKey_editingFinished"], [10, 3, 1, "", "staticMetaObject"]], "TagFilterWidget": [[11, 1, 1, "", "CustomRangeSlider"], [11, 1, 1, "", "TagFilterWidget"]], "TagFilterWidget.CustomRangeSlider": [[11, 2, 1, "", "get_range"], [11, 2, 1, "", "scale_to_value"], [11, 2, 1, "", "set_date_range"], [11, 2, 1, "", "set_range"], [11, 2, 1, "", "setup_ui"], [11, 3, 1, "", "staticMetaObject"], [11, 2, 1, "", "update_labels"], [11, 3, 1, "", "valueChanged"]], "TagFilterWidget.TagFilterWidget": [[11, 3, 1, "", "filterApplied"], [11, 2, 1, "", "on_applyFilterButton_clicked"], [11, 2, 1, "", "setup_slider"], [11, 3, 1, "", "staticMetaObject"]], "ThumbnailSelectorWidget": [[12, 1, 1, "", "CustomGraphicsView"], [12, 1, 1, "", "ThumbnailItem"], [12, 1, 1, "", "ThumbnailSelectorWidget"]], "ThumbnailSelectorWidget.CustomGraphicsView": [[12, 3, 1, "", "itemClicked"], [12, 2, 1, "", "mousePressEvent"], [12, 3, 1, "", "staticMetaObject"]], "ThumbnailSelectorWidget.ThumbnailItem": [[12, 2, 1, "", "boundingRect"], [12, 2, 1, "", "isSelected"], [12, 2, 1, "", "paint"], [12, 2, 1, "", "setSelected"], [12, 3, 1, "", "staticMetaObject"]], "ThumbnailSelectorWidget.ThumbnailSelectorWidget": [[12, 2, 1, "", "add_thumbnail_item"], [12, 3, 1, "", "deselected"], [12, 2, 1, "", "get_selected_images"], [12, 2, 1, "", "handle_item_selection"], [12, 3, 1, "", "imageSelected"], [12, 2, 1, "", "load_images"], [12, 3, 1, "", "multipleImagesSelected"], [12, 2, 1, "", "resizeEvent"], [12, 2, 1, "", "select_first_image"], [12, 2, 1, "", "select_range"], [12, 3, 1, "", "staticMetaObject"], [12, 2, 1, "", "update_selection"], [12, 2, 1, "", "update_thumbnail_layout"]], "caption_tags": [[13, 1, 1, "", "ImageAnalyzer"]], "caption_tags.ImageAnalyzer": [[13, 2, 1, "", "analyze_image"], [13, 2, 1, "", "create_batch_request"], [13, 2, 1, "", "get_batch_analysis"], [13, 2, 1, "", "get_existing_annotations"], [13, 2, 1, "", "initialize"], [13, 3, 1, "", "logger"]], "gui": [[14, 1, 1, "", "ConfigManager"], [14, 1, 1, "", "MainWindow"]], "gui.ConfigManager": [[14, 3, 1, "", "config"], [14, 3, 1, "", "dataset_image_paths"], [14, 2, 1, "", "load_config_from_file"]], "gui.MainWindow": [[14, 2, 1, "", "closeEvent"], [14, 2, 1, "", "connect_signals"], [14, 2, 1, "", "dataset_dir_changed"], [14, 2, 1, "", "init_dataset_selector"], [14, 2, 1, "", "init_managers"], [14, 2, 1, "", "init_pages"], [14, 2, 1, "", "init_statusbar"], [14, 2, 1, "", "some_long_process"], [14, 3, 1, "", "staticMetaObject"]], "gui_file": [[16, 0, 0, "-", "DatasetExportWidget_ui"], [17, 0, 0, "-", "DatasetOverviewWidget_ui"], [18, 0, 0, "-", "DirectoryPickerWidget_ui"], [19, 0, 0, "-", "FilePickerWidget_ui"], [20, 0, 0, "-", "ImageEditWidget_ui"], [21, 0, 0, "-", "ImagePreviewWidget_ui"], [22, 0, 0, "-", "ImageTaggerWidget_ui"], [23, 0, 0, "-", "PickerWidget_ui"], [24, 0, 0, "-", "ProgressWidget_ui"], [25, 0, 0, "-", "SettingsWidget_ui"], [26, 0, 0, "-", "TagFilterWidget_ui"], [27, 0, 0, "-", "ThumbnailSelectorWidget_ui"], [28, 0, 0, "-", "filterBoxWidget_ui"], [29, 0, 0, "-", "gui_ui"]], "gui_file.DatasetExportWidget_ui": [[16, 1, 1, "", "Ui_DatasetExportWidget"]], "gui_file.DatasetExportWidget_ui.Ui_DatasetExportWidget": [[16, 2, 1, "", "retranslateUi"], [16, 2, 1, "", "setupUi"]], "gui_file.DatasetOverviewWidget_ui": [[17, 1, 1, "", "Ui_DatasetOverviewWidget"]], "gui_file.DatasetOverviewWidget_ui.Ui_DatasetOverviewWidget": [[17, 2, 1, "", "retranslateUi"], [17, 2, 1, "", "setupUi"]], "gui_file.DirectoryPickerWidget_ui": [[18, 1, 1, "", "Ui_DirectoryPickerWidget"]], "gui_file.DirectoryPickerWidget_ui.Ui_DirectoryPickerWidget": [[18, 2, 1, "", "retranslateUi"], [18, 2, 1, "", "setupUi"]], "gui_file.FilePickerWidget_ui": [[19, 1, 1, "", "Ui_FilePickerWidget"]], "gui_file.FilePickerWidget_ui.Ui_FilePickerWidget": [[19, 2, 1, "", "retranslateUi"], [19, 2, 1, "", "setupUi"]], "gui_file.ImageEditWidget_ui": [[20, 1, 1, "", "Ui_ImageEditWidget"]], "gui_file.ImageEditWidget_ui.Ui_ImageEditWidget": [[20, 2, 1, "", "retranslateUi"], [20, 2, 1, "", "setupUi"]], "gui_file.ImagePreviewWidget_ui": [[21, 1, 1, "", "Ui_ImagePreviewWidget"]], "gui_file.ImagePreviewWidget_ui.Ui_ImagePreviewWidget": [[21, 2, 1, "", "retranslateUi"], [21, 2, 1, "", "setupUi"]], "gui_file.ImageTaggerWidget_ui": [[22, 1, 1, "", "Ui_ImageTaggerWidget"]], "gui_file.ImageTaggerWidget_ui.Ui_ImageTaggerWidget": [[22, 2, 1, "", "retranslateUi"], [22, 2, 1, "", "setupUi"]], "gui_file.PickerWidget_ui": [[23, 1, 1, "", "Ui_PickerWidget"]], "gui_file.PickerWidget_ui.Ui_PickerWidget": [[23, 2, 1, "", "retranslateUi"], [23, 2, 1, "", "setupUi"]], "gui_file.ProgressWidget_ui": [[24, 1, 1, "", "Ui_ProgressWidget"]], "gui_file.ProgressWidget_ui.Ui_ProgressWidget": [[24, 2, 1, "", "retranslateUi"], [24, 2, 1, "", "setupUi"]], "gui_file.SettingsWidget_ui": [[25, 1, 1, "", "Ui_SettingsWidget"]], "gui_file.SettingsWidget_ui.Ui_SettingsWidget": [[25, 2, 1, "", "retranslateUi"], [25, 2, 1, "", "setupUi"]], "gui_file.TagFilterWidget_ui": [[26, 1, 1, "", "Ui_TagFilterWidget"]], "gui_file.TagFilterWidget_ui.Ui_TagFilterWidget": [[26, 2, 1, "", "retranslateUi"], [26, 2, 1, "", "setupUi"]], "gui_file.ThumbnailSelectorWidget_ui": [[27, 1, 1, "", "Ui_ThumbnailSelectorWidget"]], "gui_file.ThumbnailSelectorWidget_ui.Ui_ThumbnailSelectorWidget": [[27, 2, 1, "", "retranslateUi"], [27, 2, 1, "", "setupUi"]], "gui_file.filterBoxWidget_ui": [[28, 1, 1, "", "Ui_filterBoxWidget"]], "gui_file.filterBoxWidget_ui.Ui_filterBoxWidget": [[28, 2, 1, "", "retranslateUi"], [28, 2, 1, "", "setupUi"]], "gui_file.gui_ui": [[29, 1, 1, "", "Ui_mainWindow"]], "gui_file.gui_ui.Ui_mainWindow": [[29, 2, 1, "", "retranslateUi"], [29, 2, 1, "", "setupUi"]], "main": [[31, 1, 1, "", "BatchControll"], [31, 1, 1, "", "MainControllBase"], [31, 1, 1, "", "RealtimeControll"], [31, 1, 1, "", "ResizeControll"], [31, 4, 1, "", "start_processing"]], "main.BatchControll": [[31, 2, 1, "", "execute"]], "main.MainControllBase": [[31, 2, 1, "", "execute"], [31, 2, 1, "", "process_image"]], "module": [[33, 0, 0, "-", "api_utils"], [34, 0, 0, "-", "cleanup_txt"], [35, 0, 0, "-", "config"], [36, 0, 0, "-", "db"], [37, 0, 0, "-", "file_sys"], [53, 0, 0, "-", "log"]], "module.api_utils": [[33, 1, 1, "", "APIClientFactory"], [33, 5, 1, "", "APIError"], [33, 1, 1, "", "APIInterface"], [33, 1, 1, "", "BaseAPIClient"], [33, 1, 1, "", "Claude"], [33, 1, 1, "", "Google"], [33, 1, 1, "", "OpenAI"]], "module.api_utils.APIClientFactory": [[33, 2, 1, "", "get_api_client"], [33, 2, 1, "", "initialize"]], "module.api_utils.APIError": [[33, 2, 1, "", "check_response"], [33, 2, 1, "", "from_anthropic_error"], [33, 2, 1, "", "retry_after"], [33, 2, 1, "", "to_dict"]], "module.api_utils.APIInterface": [[33, 2, 1, "", "generate_caption"], [33, 2, 1, "", "get_batch_results"], [33, 2, 1, "", "set_image_data"], [33, 2, 1, "", "start_batch_processing"]], "module.api_utils.BaseAPIClient": [[33, 2, 1, "", "set_image_data"]], "module.api_utils.Claude": [[33, 3, 1, "", "SUPPORTED_VISION_MODELS"], [33, 2, 1, "", "generate_caption"], [33, 2, 1, "", "get_batch_results"], [33, 2, 1, "", "start_batch_processing"]], "module.api_utils.Google": [[33, 3, 1, "", "SUPPORTED_VISION_MODELS"], [33, 2, 1, "", "generate_caption"], [33, 2, 1, "", "generate_prompt_parts"], [33, 2, 1, "", "get_batch_results"], [33, 2, 1, "", "start_batch_processing"]], "module.api_utils.OpenAI": [[33, 3, 1, "", "SUPPORTED_VISION_MODELS"], [33, 2, 1, "", "create_batch_request"], [33, 2, 1, "", "generate_caption"], [33, 2, 1, "", "get_batch_results"], [33, 2, 1, "", "start_batch_processing"]], "module.cleanup_txt": [[34, 1, 1, "", "TagCleaner"], [34, 4, 1, "", "initialize_tag_cleaner"]], "module.cleanup_txt.TagCleaner": [[34, 2, 1, "", "clean_caption"], [34, 2, 1, "", "clean_format"], [34, 2, 1, "", "clean_tags"]], "module.config": [[35, 4, 1, "", "deep_update"], [35, 4, 1, "", "get_config"], [35, 4, 1, "", "load_config"], [35, 4, 1, "", "write_config_file"]], "module.db": [[36, 1, 1, "", "ImageDatabaseManager"], [36, 1, 1, "", "ImageRepository"], [36, 1, 1, "", "SQLiteManager"], [36, 4, 1, "", "calculate_phash"]], "module.db.ImageDatabaseManager": [[36, 2, 1, "", "check_processed_image_exists"], [36, 2, 1, "", "detect_duplicate_image"], [36, 2, 1, "", "get_image_annotations"], [36, 2, 1, "", "get_image_metadata"], [36, 2, 1, "", "get_images_by_filter"], [36, 2, 1, "", "get_low_res_image"], [36, 2, 1, "", "get_models"], [36, 2, 1, "", "get_processed_metadata"], [36, 2, 1, "", "get_total_image_count"], [36, 2, 1, "", "register_original_image"], [36, 2, 1, "", "register_processed_image"], [36, 2, 1, "", "save_annotations"], [36, 2, 1, "", "save_score"]], "module.db.ImageRepository": [[36, 2, 1, "", "add_original_image"], [36, 2, 1, "", "add_processed_image"], [36, 2, 1, "", "delete_image"], [36, 2, 1, "", "escape_special_characters"], [36, 2, 1, "", "find_duplicate_image"], [36, 2, 1, "", "find_tag_id"], [36, 2, 1, "", "get_image_annotations"], [36, 2, 1, "", "get_image_id_by_name"], [36, 2, 1, "", "get_image_id_by_phash"], [36, 2, 1, "", "get_image_metadata"], [36, 2, 1, "", "get_images_by_caption"], [36, 2, 1, "", "get_images_by_tag"], [36, 2, 1, "", "get_processed_image"], [36, 2, 1, "", "get_total_image_count"], [36, 2, 1, "", "get_untagged_images"], [36, 2, 1, "", "save_annotations"], [36, 2, 1, "", "save_score"], [36, 2, 1, "", "update_image_metadata"]], "module.db.SQLiteManager": [[36, 2, 1, "", "close"], [36, 2, 1, "", "connect"], [36, 2, 1, "", "create_tables"], [36, 2, 1, "", "dict_factory"], [36, 2, 1, "", "execute"], [36, 2, 1, "", "executemany"], [36, 2, 1, "", "fetch_all"], [36, 2, 1, "", "fetch_one"], [36, 2, 1, "", "get_connection"], [36, 2, 1, "", "insert_models"]], "module.file_sys": [[37, 1, 1, "", "FileSystemManager"]], "module.file_sys.FileSystemManager": [[37, 2, 1, "", "copy_file"], [37, 2, 1, "", "create_batch_request_file"], [37, 2, 1, "", "export_dataset_to_json"], [37, 2, 1, "", "export_dataset_to_txt"], [37, 2, 1, "", "get_image_files"], [37, 2, 1, "", "get_image_info"], [37, 3, 1, "", "image_extensions"], [37, 2, 1, "", "initialize"], [37, 3, 1, "", "logger"], [37, 2, 1, "", "save_batch_request"], [37, 2, 1, "", "save_original_image"], [37, 2, 1, "", "save_processed_image"], [37, 2, 1, "", "save_toml_config"], [37, 2, 1, "", "split_jsonl"]], "module.log": [[53, 4, 1, "", "get_logger"], [53, 4, 1, "", "setup_logger"]], "score_module": [[56, 0, 0, "-", "clip_aethetic_score"], [57, 0, 0, "-", "musiq_module"], [58, 0, 0, "-", "rewardfunction_score"], [59, 0, 0, "-", "scorer"]], "score_module.clip_aethetic_score": [[56, 1, 1, "", "MLP"], [56, 1, 1, "", "Score_Manager"], [56, 4, 1, "", "get_image_preprocess"], [56, 4, 1, "", "get_property"], [56, 4, 1, "", "normalized"]], "score_module.clip_aethetic_score.MLP": [[56, 2, 1, "", "forward"]], "score_module.clip_aethetic_score.Score_Manager": [[56, 2, 1, "", "get_score"], [56, 2, 1, "", "to_cpu"], [56, 2, 1, "", "to_gpu"]], "score_module.musiq_module": [[57, 1, 1, "", "Bottleneck"], [57, 4, 1, "", "Create_MUSIQ_Model"], [57, 4, 1, "", "Create_MUSIQ_SCORE_Model"], [57, 1, 1, "", "Encoder_Layer"], [57, 1, 1, "", "MLP"], [57, 1, 1, "", "MUSIQ"], [57, 1, 1, "", "MUSIQ_Encoder"], [57, 1, 1, "", "MUSIQ_SCORE_Model"], [57, 1, 1, "", "MUSIQ_Score_Dataset"], [57, 1, 1, "", "MultiHeadAttention"], [57, 1, 1, "", "PoswiseFeedForwardNet"], [57, 1, 1, "", "ResNetBackbone"], [57, 1, 1, "", "Score_Manager"], [57, 4, 1, "", "calculate_pad_size"], [57, 4, 1, "", "check_hash"], [57, 4, 1, "", "collate_fn"], [57, 4, 1, "", "create_pos_idx"], [57, 4, 1, "", "extract_patches"], [57, 4, 1, "", "get_attn_pad_mask"], [57, 4, 1, "", "get_image_preprocess"], [57, 4, 1, "", "get_property"], [57, 4, 1, "", "get_resize_latents"], [57, 4, 1, "", "get_sinusoid_encoding_table"], [57, 4, 1, "", "load_img"], [57, 4, 1, "", "print_dict"], [57, 4, 1, "", "resize_image"], [57, 4, 1, "", "resize_img_resos"], [57, 4, 1, "", "resnet50_backbone"], [57, 4, 1, "", "round_to_steps"]], "score_module.musiq_module.Bottleneck": [[57, 3, 1, "", "expansion"], [57, 2, 1, "", "forward"]], "score_module.musiq_module.Encoder_Layer": [[57, 2, 1, "", "enable_math"], [57, 2, 1, "", "forward"]], "score_module.musiq_module.MLP": [[57, 2, 1, "", "forward"]], "score_module.musiq_module.MUSIQ": [[57, 2, 1, "", "enable_math"], [57, 2, 1, "", "forward"]], "score_module.musiq_module.MUSIQ_Encoder": [[57, 2, 1, "", "enable_math"], [57, 2, 1, "", "forward"]], "score_module.musiq_module.MUSIQ_SCORE_Model": [[57, 2, 1, "", "enable_math"], [57, 2, 1, "", "forward"]], "score_module.musiq_module.MUSIQ_Score_Dataset": [[57, 2, 1, "", "create_datalist"], [57, 2, 1, "", "get_data_list"], [57, 2, 1, "", "load_dataset"], [57, 2, 1, "", "merge_hdf5"], [57, 2, 1, "", "print_datacount"], [57, 2, 1, "", "print_datacount_score"], [57, 2, 1, "", "save_dataset"]], "score_module.musiq_module.MultiHeadAttention": [[57, 2, 1, "", "enable_math"], [57, 2, 1, "", "forward"]], "score_module.musiq_module.PoswiseFeedForwardNet": [[57, 2, 1, "", "forward"]], "score_module.musiq_module.ResNetBackbone": [[57, 2, 1, "", "forward"]], "score_module.musiq_module.Score_Manager": [[57, 2, 1, "", "get_score"], [57, 2, 1, "", "to_cpu"], [57, 2, 1, "", "to_gpu"]], "score_module.rewardfunction_score": [[58, 1, 1, "", "MLP"], [58, 1, 1, "", "Score_Manager"], [58, 4, 1, "", "get_image_preprocess"]], "score_module.rewardfunction_score.MLP": [[58, 2, 1, "", "forward"]], "score_module.rewardfunction_score.Score_Manager": [[58, 2, 1, "", "get_score"], [58, 2, 1, "", "to_cpu"], [58, 2, 1, "", "to_gpu"]], "score_module.scorer": [[59, 1, 1, "", "AestheticPredictor"], [59, 1, 1, "", "AestheticScorer"], [59, 4, 1, "", "download_model"], [59, 4, 1, "", "normalized"]], "score_module.scorer.AestheticPredictor": [[59, 2, 1, "", "forward"], [59, 3, 1, "", "input_size"]], "score_module.scorer.AestheticScorer": [[59, 3, 1, "", "device"], [59, 2, 1, "", "score"]]}, "objnames": {"0": ["py", "module", "Python \u30e2\u30b8\u30e5\u30fc\u30eb"], "1": ["py", "class", "Python \u30af\u30e9\u30b9"], "2": ["py", "method", "Python \u30e1\u30bd\u30c3\u30c9"], "3": ["py", "attribute", "Python \u306e\u5c5e\u6027"], "4": ["py", "function", "Python \u306e\u95a2\u6570"], "5": ["py", "exception", "Python \u4f8b\u5916"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:function", "5": "py:exception"}, "terms": {"\":": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 14], "\"gpt": 33, "\"\u3002": 33, "%y": 36, "')": [5, 36, 57], "',": [5, 13, 33, 36, 37], "'.": 37, "':": [5, 13, 36], "']": [33, 37], "'auto": 57, "'avg": [56, 58], "'captions": [], "'claude": 33, "'cuda": 59, "'e": 13, "'emb": [56, 58], "'gemini": 33, "'gpt": 33, "'id": 36, "'md5": 57, "'musiq": 57, "'p": 5, "'processing": [31, 35], "'realesrgan": 5, "'rgb": 5, "'s": [56, 57, 58], "'same": 57, "'select": 8, "'tags": [13, 36], "'tf": 57, "'unknown": 34, "'}": 36, "(\"": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 14], "('": [5, 36], "()": [0, 1, 4, 7, 9, 10, 11, 12, 15, 32, 54, 55, 56, 57, 58], "(b": 57, "(image": 13, "(int": [0, 7, 9, 11], "(pyobject": [0, 1, 6, 7, 12], "(qgraphicspixmapitem": 12, "(qstring": [0, 9], "(qvariantlist": [7, 12], "(qvariantmap": [7, 11], "(status": 9, "(str": 9, "(value": 9, "(vision": [13, 36], "),": [0, 1, 6, 7, 9, 11, 12], ").": 57, "):": [9, 11], ")>": [5, 13, 37], ")}": 5, ")\u3001": 36, ")\u3002": 33, "*'": 36, "*,": 12, "*args": [9, 56, 57, 58], "*kwargs": [9, 56, 57, 58], "*patch": 57, ",\n'": [13, 36], ",\nupscaler": 36, ",\n{": 36, ", (": 57, ", other": 57, "-%": 36, "--": [5, 9, 13, 31, 33, 36, 37, 56, 57, 58], "->": 57, "-db": [32, 54], "-exp": 33, "-mini": 33, "-preview": 33, "-tag": [32, 54], "-tools": [32, 54], "-vision": 33, "-win": 5, "-x": 5, "..": 36, "...": 36, "./": 57, "._": 54, ".add": [32, 54], ".analyze": 54, ".api": [32, 54], ".args": 54, ".array": 59, ".auto": 54, ".boundingrect": 54, ".calculate": 54, ".cancel": 54, ".canceled": 54, ".check": 32, ".clean": 32, ".cleanup": [32, 54], ".clear": 54, ".clip": [54, 55], ".close": 32, ".closeevent": 54, ".config": [32, 54], ".configure": 54, ".connect": [32, 54], ".copy": 32, ".create": [32, 54, 55], ".csvtodatabaseprocessor": [32, 38], ".dataset": 54, ".datasetexportwidget": [15, 54], ".datasetoverviewwidget": [15, 54], ".db": [32, 54], ".delete": 32, ".deselected": 54, ".detect": 32, ".device": 55, ".dict": 32, ".directorypickerwidget": [15, 54], ".enable": 55, ".error": 54, ".escape": 32, ".execute": [32, 54], ".executemany": 32, ".expansion": 55, ".export": [32, 54], ".extract": 57, ".fetch": 32, ".file": [32, 54], ".filepickerwidget": [15, 54], ".filterapplied": 54, ".filterboxwidget": [15, 54], ".find": 32, ".finished": 54, ".forward": [55, 56, 57, 58], ".from": 32, ".function": 54, ".genai": [32, 54], ".generate": 32, ".get": [32, 54, 55], ".gui": [15, 32, 38, 54], ".handle": 54, ".image": [5, 32, 37, 57], ".imageeditwidget": [15, 54], ".imagepreviewwidget": [15, 54], ".imageselected": 54, ".imagetaggerwidget": [15, 54], ".init": 54, ".initialize": [32, 54], ".input": 55, ".insert": 32, ".isselected": 54, ".itemclicked": 54, ".keyboardmodifier": 12, ".kwargs": 54, ".load": [54, 55], ".log": [32, 54], ".logger": [32, 54], ".main": [32, 38], ".mainwindow": [38, 40], ".merge": 55, ".model": 54, ".module": [56, 57, 58], ".mousepressevent": 54, ".multiple": 54, ".multipleimagesselected": 54, ".musiq": [54, 55], ".nn": [56, 57, 58], ".normalize": 54, ".on": 54, ".paint": 54, ".pickerwidget": [15, 54], ".print": 55, ".process": 54, ".progress": 54, ".progresswidget": [15, 54], ".pth": 5, ".qmetaobject": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 14], ".register": 32, ".resize": 54, ".resizeevent": 54, ".retranslateui": 15, ".retry": 32, ".rewardfunction": [54, 55], ".run": 54, ".save": [32, 54, 55], ".scale": 54, ".score": 55, ".scorer": [54, 55], ".select": 54, ".set": [32, 54], ".setselected": 54, ".settingswidget": [15, 54], ".setup": 54, ".setupui": 15, ".showevent": 54, ".single": 54, ".some": 54, ".split": 32, ".start": [32, 54], ".staticmetaobject": 54, ".status": 54, ".supported": 32, ".tag": [32, 38], ".tagcleanerwidget": [38, 40], ".tagfilterwidget": [15, 54], ".tagregisterwidget": [38, 40], ".tagsearchwidget": [38, 40], ".tagstatisticswidget": [38, 40], ".tensor": 57, ".thread": 54, ".thumbnail": 54, ".thumbnailselectorwidget": [15, 54], ".to": [32, 55], ".toml": [31, 35], ".update": [32, 54], ".upscale": 54, ".valuechanged": 54, ".view": 57, ".webp": 7, ".worker": 54, "/models": 5, "/realesrgan": 5, "2\u3064": [11, 37], "4o": 33, "4plus": 5, ":%": 36, ":(": 36, ":/": 5, ":param": [7, 12, 33, 34, 59], "": [5, 13, 37], ")}": 5, ")\u3001": 36, ")\u3002": 33, "*'": 36, "*,": 12, "*args": [9, 56, 57, 58], "*kwargs": [9, 56, 57, 58], "*patch": 57, ",\n'": [13, 36], ",\nupscaler": 36, ",\n{": 36, ", (": 57, ", other": 57, "-%": 36, "--": [5, 9, 13, 33, 36, 37, 56, 57, 58], "->": 57, "-db": [32, 54], "-exp": 33, "-mini": 33, "-preview": 33, "-tag": [32, 54], "-tools": [32, 54], "-vision": 33, "-win": 5, "-x": 5, "..": 36, "...": 36, "./": 57, "._": 54, ".add": [32, 54], ".analyze": 54, ".api": [32, 54], ".args": 54, ".array": 59, ".auto": 54, ".boundingrect": 54, ".calculate": 54, ".cancel": 54, ".canceled": 54, ".check": 32, ".clean": 32, ".cleanup": [32, 54], ".clear": 54, ".clip": [54, 55], ".close": 32, ".closeevent": 54, ".config": [32, 54], ".configure": 54, ".connect": [32, 54], ".copy": 32, ".create": [32, 54, 55], ".csvtodatabaseprocessor": [32, 38], ".dataset": 54, ".datasetexportwidget": [15, 54], ".datasetoverviewwidget": [15, 54], ".db": [32, 54], ".delete": 32, ".deselected": 54, ".detect": 32, ".device": 55, ".dict": 32, ".directorypickerwidget": [15, 54], ".enable": 55, ".error": 54, ".escape": 32, ".execute": 32, ".executemany": 32, ".expansion": 55, ".export": [32, 54], ".extract": 57, ".fetch": 32, ".file": [32, 54], ".filepickerwidget": [15, 54], ".filter": 32, ".filterapplied": 54, ".filterboxwidget": [15, 54], ".find": 32, ".finished": 54, ".forward": [55, 56, 57, 58], ".from": 32, ".function": 54, ".genai": [32, 54], ".generate": 32, ".get": [32, 54, 55], ".gui": [15, 32, 38, 54], ".handle": 54, ".image": [5, 32, 37, 57], ".imageeditwidget": [15, 54], ".imagepreviewwidget": [15, 54], ".imageselected": 54, ".imagetaggerwidget": [15, 54], ".init": 54, ".initialize": [32, 54], ".input": 55, ".insert": 32, ".isselected": 54, ".itemclicked": 54, ".keyboardmodifier": 12, ".kwargs": 54, ".load": [54, 55], ".log": [32, 54], ".logger": [32, 54], ".main": [32, 38], ".mainwindow": [38, 40], ".merge": 55, ".model": 54, ".module": [56, 57, 58], ".mousepressevent": 54, ".multiple": 54, ".multipleimagesselected": 54, ".musiq": [54, 55], ".nn": [56, 57, 58], ".normalize": 54, ".on": 54, ".paint": 54, ".pickerwidget": [15, 54], ".print": 55, ".process": 54, ".progress": 54, ".progresswidget": [15, 54], ".pth": 5, ".qmetaobject": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 14], ".register": 32, ".resize": 54, ".resizeevent": 54, ".retranslateui": 15, ".retry": 32, ".rewardfunction": [54, 55], ".run": 54, ".save": [32, 54, 55], ".scale": 54, ".score": 55, ".scorer": [54, 55], ".select": 54, ".set": [32, 54], ".setselected": 54, ".settingswidget": [15, 54], ".setup": 54, ".setupui": 15, ".showevent": 54, ".single": 54, ".some": 54, ".split": 32, ".start": [32, 54], ".staticmetaobject": 54, ".status": 54, ".supported": 32, ".tag": [32, 38], ".tagcleanerwidget": [38, 40], ".tagfilterwidget": [15, 54], ".tagregisterwidget": [38, 40], ".tagsearchwidget": [38, 40], ".tagstatisticswidget": [38, 40], ".tensor": 57, ".thread": 54, ".thumbnail": 54, ".thumbnailselectorwidget": [15, 54], ".to": [32, 55], ".toml": 35, ".update": [32, 54], ".upscale": 54, ".valuechanged": 54, ".view": 57, ".webp": 7, ".worker": 54, "/models": 5, "/realesrgan": 5, "2\u3064": [11, 37], "4o": 33, "4plus": 5, ":%": 36, ":(": 36, ":/": 5, ":param": [7, 12, 33, 34, 59], "
      • resize_img_resos() (score_module.musiq_module モジュール) -
      • -
      • ResizeControll (main のクラス)
      • resizeEvent() (ImagePreviewWidget.ImagePreviewWidget のメソッド) @@ -1322,11 +1303,11 @@

        S

      • setup_logger() (module.log モジュール)
      • setup_slider() (TagFilterWidget.TagFilterWidget のメソッド) -
      • -
      • setup_ui() (TagFilterWidget.CustomRangeSlider のメソッド)
      • @@ -162,7 +164,6 @@

        src

        ImageTaggerWidget.on_comboBoxModel_currentTextChanged()
      • ImageTaggerWidget.on_comboBoxTagFormat_currentTextChanged()
      • ImageTaggerWidget.on_dbSearchWidget_filterApplied()
      • -
      • ImageTaggerWidget.on_lowRescheckBox_clicked()
      • ImageTaggerWidget.on_pushButtonGenerate_clicked()
      • ImageTaggerWidget.on_pushButtonSave_clicked()
      • ImageTaggerWidget.on_textEditAddPrompt_textChanged()
      • @@ -414,21 +415,7 @@

        src

        Module contents -
      • main module -
      • +
      • main module
      • module package
        • Subpackages
          • module.genai-tag-db-tools package
              diff --git a/objects.inv b/objects.inv index f8a6c62..670ec53 100644 Binary files a/objects.inv and b/objects.inv differ diff --git a/py-modindex.html b/py-modindex.html index dc7f1a2..85d0d24 100644 --- a/py-modindex.html +++ b/py-modindex.html @@ -194,11 +194,6 @@

              Pythonモジュール索引

      •  
        m
        - main -