Spaces:
Sleeping
Sleeping
umyuu
commited on
Commit
·
46c8ce2
1
Parent(s):
b76540e
リファクタリング
Browse files- src/__init__.py +1 -1
- src/args_parser.py +1 -1
- src/reporter.py +1 -1
- src/saliency.py +23 -9
- src/utils.py +17 -10
src/__init__.py
CHANGED
|
@@ -9,7 +9,7 @@ from src.utils import get_package_version
|
|
| 9 |
|
| 10 |
__all__ = ["LocalTimeFormatter"]
|
| 11 |
|
| 12 |
-
PROGRAM_NAME = 'SaliencyMapDemo'
|
| 13 |
__version__ = get_package_version()
|
| 14 |
|
| 15 |
|
|
|
|
| 9 |
|
| 10 |
__all__ = ["LocalTimeFormatter"]
|
| 11 |
|
| 12 |
+
PROGRAM_NAME: str = 'SaliencyMapDemo'
|
| 13 |
__version__ = get_package_version()
|
| 14 |
|
| 15 |
|
src/args_parser.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
# -*- coding: utf-8 -*-
|
| 2 |
"""コマンドライン引数の解析"""
|
| 3 |
from argparse import ArgumentParser, BooleanOptionalAction
|
| 4 |
-
from
|
| 5 |
|
| 6 |
|
| 7 |
def parse_args():
|
|
|
|
| 1 |
# -*- coding: utf-8 -*-
|
| 2 |
"""コマンドライン引数の解析"""
|
| 3 |
from argparse import ArgumentParser, BooleanOptionalAction
|
| 4 |
+
from . import PROGRAM_NAME, get_package_version
|
| 5 |
|
| 6 |
|
| 7 |
def parse_args():
|
src/reporter.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
| 1 |
# -*- coding: utf-8 -*-
|
| 2 |
"""
|
| 3 |
-
Reporter
|
| 4 |
ログハンドラーが重複登録されるのを防ぐために1箇所で生成してログハンドラーを返します。
|
| 5 |
Example:
|
| 6 |
from src.reporter import log
|
|
@@ -27,6 +26,7 @@ class Reporter:
|
|
| 27 |
|
| 28 |
def __new__(cls):
|
| 29 |
"""
|
|
|
|
| 30 |
"""
|
| 31 |
# インスタンスがまだ存在しない場合は新たに作成します。
|
| 32 |
if not cls._instance:
|
|
|
|
| 1 |
# -*- coding: utf-8 -*-
|
| 2 |
"""
|
|
|
|
| 3 |
ログハンドラーが重複登録されるのを防ぐために1箇所で生成してログハンドラーを返します。
|
| 4 |
Example:
|
| 5 |
from src.reporter import log
|
|
|
|
| 26 |
|
| 27 |
def __new__(cls):
|
| 28 |
"""
|
| 29 |
+
インスタンスの生成を制御します。
|
| 30 |
"""
|
| 31 |
# インスタンスがまだ存在しない場合は新たに作成します。
|
| 32 |
if not cls._instance:
|
src/saliency.py
CHANGED
|
@@ -8,7 +8,8 @@ import cv2
|
|
| 8 |
|
| 9 |
class SaliencyMap:
|
| 10 |
"""
|
| 11 |
-
|
|
|
|
| 12 |
Example:
|
| 13 |
from src.saliency import SaliencyMap
|
| 14 |
|
|
@@ -19,6 +20,15 @@ class SaliencyMap:
|
|
| 19 |
self,
|
| 20 |
algorithm: Literal["SpectralResidual", "FineGrained"] = "SpectralResidual",
|
| 21 |
):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
self.algorithm = algorithm
|
| 23 |
# OpenCVのsaliencyを作成します。
|
| 24 |
if algorithm == "SpectralResidual":
|
|
@@ -28,17 +38,16 @@ class SaliencyMap:
|
|
| 28 |
|
| 29 |
def compute(self, image: np.ndarray) -> Tuple[bool, Any]:
|
| 30 |
"""
|
| 31 |
-
|
| 32 |
|
| 33 |
Parameters:
|
| 34 |
image: 入力画像
|
| 35 |
|
| 36 |
Returns:
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
"""
|
| 41 |
-
# 画像の顕著性を計算します。
|
| 42 |
return self.saliency.computeSaliency(image)
|
| 43 |
|
| 44 |
|
|
@@ -48,19 +57,24 @@ def convert_colormap(
|
|
| 48 |
colormap_name: Literal["jet", "hot", "turbo"] = "jet"
|
| 49 |
):
|
| 50 |
"""
|
| 51 |
-
|
| 52 |
|
| 53 |
Parameters:
|
| 54 |
image: 入力画像
|
| 55 |
saliency_map: 顕著性マップ
|
| 56 |
colormap_name: カラーマップの種類
|
|
|
|
|
|
|
|
|
|
| 57 |
|
| 58 |
Returns:
|
| 59 |
-
np.ndarray:
|
| 60 |
"""
|
| 61 |
maps = {"jet": cv2.COLORMAP_JET, "hot": cv2.COLORMAP_HOT, "turbo": cv2.COLORMAP_TURBO}
|
|
|
|
|
|
|
| 62 |
if colormap_name not in maps:
|
| 63 |
-
raise ValueError(colormap_name)
|
| 64 |
|
| 65 |
# 顕著性マップをカラーマップに変換
|
| 66 |
saliency_map = (saliency_map * 255).astype("uint8")
|
|
|
|
| 8 |
|
| 9 |
class SaliencyMap:
|
| 10 |
"""
|
| 11 |
+
画像から顕著性マップを計算するクラス。
|
| 12 |
+
|
| 13 |
Example:
|
| 14 |
from src.saliency import SaliencyMap
|
| 15 |
|
|
|
|
| 20 |
self,
|
| 21 |
algorithm: Literal["SpectralResidual", "FineGrained"] = "SpectralResidual",
|
| 22 |
):
|
| 23 |
+
"""
|
| 24 |
+
SaliencyMapオブジェクトを初期化します。
|
| 25 |
+
|
| 26 |
+
Parameters:
|
| 27 |
+
algorithm: 使用する顕著性マップアルゴリズムの種類。
|
| 28 |
+
有効なアルゴリズムについてはOpenCVのドキュメントを参照してください。
|
| 29 |
+
https://docs.opencv.org/4.9.0/d8/d65/group__saliency.html
|
| 30 |
+
|
| 31 |
+
"""
|
| 32 |
self.algorithm = algorithm
|
| 33 |
# OpenCVのsaliencyを作成します。
|
| 34 |
if algorithm == "SpectralResidual":
|
|
|
|
| 38 |
|
| 39 |
def compute(self, image: np.ndarray) -> Tuple[bool, Any]:
|
| 40 |
"""
|
| 41 |
+
入力画像から顕著性マップを計算します。
|
| 42 |
|
| 43 |
Parameters:
|
| 44 |
image: 入力画像
|
| 45 |
|
| 46 |
Returns:
|
| 47 |
+
Tuple[bool, Any]: 顕著性マップの計算結果。
|
| 48 |
+
bool値がTrueの場合は計算成功、Falseの場合は失敗。
|
| 49 |
+
顕著性マップのデータ。
|
| 50 |
"""
|
|
|
|
| 51 |
return self.saliency.computeSaliency(image)
|
| 52 |
|
| 53 |
|
|
|
|
| 57 |
colormap_name: Literal["jet", "hot", "turbo"] = "jet"
|
| 58 |
):
|
| 59 |
"""
|
| 60 |
+
入力画像と顕著性マップを合成し、指定されたカラーマップを適用します。
|
| 61 |
|
| 62 |
Parameters:
|
| 63 |
image: 入力画像
|
| 64 |
saliency_map: 顕著性マップ
|
| 65 |
colormap_name: カラーマップの種類
|
| 66 |
+
"jet": Jetカラーマップ
|
| 67 |
+
"hot": Hotカラーマップ
|
| 68 |
+
"turbo": Turboカラーマップ
|
| 69 |
|
| 70 |
Returns:
|
| 71 |
+
np.ndarray: 合成された画像 (RGBA形式)
|
| 72 |
"""
|
| 73 |
maps = {"jet": cv2.COLORMAP_JET, "hot": cv2.COLORMAP_HOT, "turbo": cv2.COLORMAP_TURBO}
|
| 74 |
+
|
| 75 |
+
# colormap_nameが有効かどうかをチェック
|
| 76 |
if colormap_name not in maps:
|
| 77 |
+
raise ValueError(f"Invalid colormap name: {colormap_name}")
|
| 78 |
|
| 79 |
# 顕著性マップをカラーマップに変換
|
| 80 |
saliency_map = (saliency_map * 255).astype("uint8")
|
src/utils.py
CHANGED
|
@@ -6,7 +6,7 @@ import time
|
|
| 6 |
|
| 7 |
def get_package_version() -> str:
|
| 8 |
"""
|
| 9 |
-
|
| 10 |
"""
|
| 11 |
return '0.0.8'
|
| 12 |
|
|
@@ -29,18 +29,20 @@ class Stopwatch:
|
|
| 29 |
@property
|
| 30 |
def elapsed(self) -> float:
|
| 31 |
"""
|
| 32 |
-
|
|
|
|
|
|
|
|
|
|
| 33 |
"""
|
| 34 |
if self._is_running:
|
| 35 |
-
|
| 36 |
-
self._elapsed = end_time - self._start_time
|
| 37 |
|
| 38 |
return self._elapsed
|
| 39 |
|
| 40 |
@property
|
| 41 |
def is_running(self) -> bool:
|
| 42 |
"""
|
| 43 |
-
|
| 44 |
"""
|
| 45 |
return self._is_running
|
| 46 |
|
|
@@ -53,9 +55,12 @@ class Stopwatch:
|
|
| 53 |
self._is_running = True
|
| 54 |
|
| 55 |
@classmethod
|
| 56 |
-
def start_new(cls):
|
| 57 |
"""
|
| 58 |
-
|
|
|
|
|
|
|
|
|
|
| 59 |
"""
|
| 60 |
stopwatch = Stopwatch()
|
| 61 |
stopwatch.start()
|
|
@@ -63,10 +68,12 @@ class Stopwatch:
|
|
| 63 |
|
| 64 |
def stop(self) -> float:
|
| 65 |
"""
|
| 66 |
-
|
|
|
|
|
|
|
|
|
|
| 67 |
"""
|
| 68 |
if self._is_running:
|
| 69 |
-
|
| 70 |
-
self._elapsed = end_time - self._start_time
|
| 71 |
self._is_running = False
|
| 72 |
return self._elapsed
|
|
|
|
| 6 |
|
| 7 |
def get_package_version() -> str:
|
| 8 |
"""
|
| 9 |
+
バージョン情報を取得します。
|
| 10 |
"""
|
| 11 |
return '0.0.8'
|
| 12 |
|
|
|
|
| 29 |
@property
|
| 30 |
def elapsed(self) -> float:
|
| 31 |
"""
|
| 32 |
+
計測中の経過時間を取得します。
|
| 33 |
+
|
| 34 |
+
Returns:
|
| 35 |
+
float: 計測中の経過時間(小数秒)
|
| 36 |
"""
|
| 37 |
if self._is_running:
|
| 38 |
+
self._elapsed = time.perf_counter() - self._start_time
|
|
|
|
| 39 |
|
| 40 |
return self._elapsed
|
| 41 |
|
| 42 |
@property
|
| 43 |
def is_running(self) -> bool:
|
| 44 |
"""
|
| 45 |
+
計測が実行中であるかどうかを取得します
|
| 46 |
"""
|
| 47 |
return self._is_running
|
| 48 |
|
|
|
|
| 55 |
self._is_running = True
|
| 56 |
|
| 57 |
@classmethod
|
| 58 |
+
def start_new(cls) -> 'Stopwatch':
|
| 59 |
"""
|
| 60 |
+
新しいストップウォッチを生成し、計測を開始します。
|
| 61 |
+
|
| 62 |
+
Returns:
|
| 63 |
+
Stopwatch: 新しいストップウォッチオブジェクト
|
| 64 |
"""
|
| 65 |
stopwatch = Stopwatch()
|
| 66 |
stopwatch.start()
|
|
|
|
| 68 |
|
| 69 |
def stop(self) -> float:
|
| 70 |
"""
|
| 71 |
+
計測を終了し、経過時間を返します。
|
| 72 |
+
|
| 73 |
+
Returns:
|
| 74 |
+
float: 計測中の経過時間
|
| 75 |
"""
|
| 76 |
if self._is_running:
|
| 77 |
+
self._elapsed = time.perf_counter() - self._start_time
|
|
|
|
| 78 |
self._is_running = False
|
| 79 |
return self._elapsed
|