Spaces:
Build error
Build error
Merge pull request #1 from umyuu/feature/0.0.1
Browse files- 01-installation.bat +10 -0
- README.md +26 -1
- requirements.txt +75 -0
- run.bat +7 -0
- src/__init__.py +0 -0
- src/app.py +71 -0
01-installation.bat
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@echo on
|
| 2 |
+
|
| 3 |
+
cd %~dp0
|
| 4 |
+
|
| 5 |
+
python -m venv venv
|
| 6 |
+
call venv\Scripts\activate
|
| 7 |
+
|
| 8 |
+
pip install -r requirements.txt
|
| 9 |
+
|
| 10 |
+
TIMEOUT /T 10
|
README.md
CHANGED
|
@@ -1 +1,26 @@
|
|
| 1 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# saliencymap
|
| 2 |
+
## Introduction
|
| 3 |
+
gradioを使って、opencv-contribパッケージのcv2.saliency.StaticSaliencySpectralResidualを呼び出すサンプルプログラムです。
|
| 4 |
+
私は画像処理についてはまだ初心者ですが、興味を持っています。
|
| 5 |
+
以下から導入方法です。
|
| 6 |
+
|
| 7 |
+
## 1. 仮想環境(venv)に必要ライブラリのインストール
|
| 8 |
+
- リポジトリ直下にある以下のバッチを実行する。
|
| 9 |
+
~~~
|
| 10 |
+
01-installation.bat
|
| 11 |
+
~~~
|
| 12 |
+
> **NOTE**
|
| 13 |
+
仮想環境の名称は「venv」で作成します。
|
| 14 |
+
|
| 15 |
+
## 2. 実行
|
| 16 |
+
- リポジトリ直下にある以下のバッチを実行する。
|
| 17 |
+
~~~
|
| 18 |
+
run.bat
|
| 19 |
+
~~~
|
| 20 |
+
> **NOTE**
|
| 21 |
+
> デフォルトポートは9999です。
|
| 22 |
+
> 他のポート番号例えば8888に変更したい場合は、run.bat内の以下の行を書き換えてください。
|
| 23 |
+
> python src\app.py --server_port 8888
|
| 24 |
+
|
| 25 |
+
## Source code License.
|
| 26 |
+
[MIT License](LICENSE)
|
requirements.txt
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
aiofiles==23.2.1
|
| 2 |
+
altair==5.3.0
|
| 3 |
+
annotated-types==0.6.0
|
| 4 |
+
anyio==4.3.0
|
| 5 |
+
attrs==23.2.0
|
| 6 |
+
certifi==2024.2.2
|
| 7 |
+
charset-normalizer==3.3.2
|
| 8 |
+
click==8.1.7
|
| 9 |
+
colorama==0.4.6
|
| 10 |
+
contourpy==1.2.1
|
| 11 |
+
cycler==0.12.1
|
| 12 |
+
dnspython==2.6.1
|
| 13 |
+
email_validator==2.1.1
|
| 14 |
+
exceptiongroup==1.2.1
|
| 15 |
+
fastapi==0.111.0
|
| 16 |
+
fastapi-cli==0.0.2
|
| 17 |
+
ffmpy==0.3.2
|
| 18 |
+
filelock==3.14.0
|
| 19 |
+
fonttools==4.51.0
|
| 20 |
+
fsspec==2024.3.1
|
| 21 |
+
gradio==4.28.3
|
| 22 |
+
gradio_client==0.16.0
|
| 23 |
+
h11==0.14.0
|
| 24 |
+
httpcore==1.0.5
|
| 25 |
+
httptools==0.6.1
|
| 26 |
+
httpx==0.27.0
|
| 27 |
+
huggingface-hub==0.23.0
|
| 28 |
+
idna==3.7
|
| 29 |
+
importlib_resources==6.4.0
|
| 30 |
+
Jinja2==3.1.3
|
| 31 |
+
jsonschema==4.22.0
|
| 32 |
+
jsonschema-specifications==2023.12.1
|
| 33 |
+
kiwisolver==1.4.5
|
| 34 |
+
markdown-it-py==3.0.0
|
| 35 |
+
MarkupSafe==2.1.5
|
| 36 |
+
matplotlib==3.8.4
|
| 37 |
+
mdurl==0.1.2
|
| 38 |
+
numpy==1.26.4
|
| 39 |
+
opencv-python==4.9.0.80
|
| 40 |
+
opencv-contrib-python==4.9.0.80
|
| 41 |
+
orjson==3.10.2
|
| 42 |
+
packaging==24.0
|
| 43 |
+
pandas==2.2.2
|
| 44 |
+
pillow==10.3.0
|
| 45 |
+
pydantic==2.7.1
|
| 46 |
+
pydantic_core==2.18.2
|
| 47 |
+
pydub==0.25.1
|
| 48 |
+
Pygments==2.17.2
|
| 49 |
+
pyparsing==3.1.2
|
| 50 |
+
python-dateutil==2.9.0.post0
|
| 51 |
+
python-dotenv==1.0.1
|
| 52 |
+
python-multipart==0.0.9
|
| 53 |
+
pytz==2024.1
|
| 54 |
+
PyYAML==6.0.1
|
| 55 |
+
referencing==0.35.1
|
| 56 |
+
requests==2.31.0
|
| 57 |
+
rich==13.7.1
|
| 58 |
+
rpds-py==0.18.0
|
| 59 |
+
ruff==0.4.2
|
| 60 |
+
semantic-version==2.10.0
|
| 61 |
+
shellingham==1.5.4
|
| 62 |
+
six==1.16.0
|
| 63 |
+
sniffio==1.3.1
|
| 64 |
+
starlette==0.37.2
|
| 65 |
+
tomlkit==0.12.0
|
| 66 |
+
toolz==0.12.1
|
| 67 |
+
tqdm==4.66.4
|
| 68 |
+
typer==0.12.3
|
| 69 |
+
typing_extensions==4.11.0
|
| 70 |
+
tzdata==2024.1
|
| 71 |
+
ujson==5.9.0
|
| 72 |
+
urllib3==2.2.1
|
| 73 |
+
uvicorn==0.29.0
|
| 74 |
+
watchfiles==0.21.0
|
| 75 |
+
websockets==11.0.3
|
run.bat
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@echo on
|
| 2 |
+
|
| 3 |
+
cd %~dp0
|
| 4 |
+
call venv\Scripts\activate
|
| 5 |
+
python src\app.py --server_port 9999
|
| 6 |
+
|
| 7 |
+
TIMEOUT /T 10
|
src/__init__.py
ADDED
|
File without changes
|
src/app.py
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""
|
| 3 |
+
SaliencyMapDemo
|
| 4 |
+
"""
|
| 5 |
+
import argparse
|
| 6 |
+
import cv2
|
| 7 |
+
import gradio as gr
|
| 8 |
+
import numpy as np
|
| 9 |
+
import sys
|
| 10 |
+
|
| 11 |
+
PROGRAM_NAME = 'SaliencyMapDemo'
|
| 12 |
+
__version__ = '0.0.1'
|
| 13 |
+
|
| 14 |
+
def compute_saliency(image: np.ndarray):
|
| 15 |
+
# OpenCVのsaliencyを作成
|
| 16 |
+
saliency = cv2.saliency.StaticSaliencySpectralResidual_create()
|
| 17 |
+
# 画像の顕著性を計算
|
| 18 |
+
success, saliencyMap = saliency.computeSaliency(image)
|
| 19 |
+
|
| 20 |
+
if success:
|
| 21 |
+
# 顕著性マップをカラーマップに変換
|
| 22 |
+
saliencyMap = (saliencyMap * 255).astype("uint8")
|
| 23 |
+
saliencyMap = cv2.applyColorMap(saliencyMap, cv2.COLORMAP_JET)
|
| 24 |
+
# 元の画像とカラーマップを重ね合わせ
|
| 25 |
+
overlay = cv2.addWeighted(image, 0.5, saliencyMap, 0.5, 0)
|
| 26 |
+
return overlay
|
| 27 |
+
else:
|
| 28 |
+
return image # エラーが発生した場合は元の画像を返す
|
| 29 |
+
|
| 30 |
+
def main(args):
|
| 31 |
+
"""
|
| 32 |
+
Entry Point
|
| 33 |
+
"""
|
| 34 |
+
with gr.Blocks() as demo:
|
| 35 |
+
gr.Markdown(
|
| 36 |
+
"""
|
| 37 |
+
# Saliency Map demo.
|
| 38 |
+
1. inputタブで画像を選択します。
|
| 39 |
+
2. Submitボタンを押します。※外部送信していません。ローカルで完結しています。
|
| 40 |
+
3. 結果がoverlayタブに表示されます。
|
| 41 |
+
""")
|
| 42 |
+
|
| 43 |
+
submit_button = gr.Button("submit")
|
| 44 |
+
|
| 45 |
+
with gr.Row():
|
| 46 |
+
with gr.Tab("input"):
|
| 47 |
+
image_input = gr.Image()
|
| 48 |
+
with gr.Tab("overlay"):
|
| 49 |
+
image_overlay = gr.Image()
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
submit_button.click(compute_saliency, inputs=image_input, outputs=image_overlay)
|
| 53 |
+
sys.version
|
| 54 |
+
gr.Markdown(
|
| 55 |
+
f"""
|
| 56 |
+
Python {sys.version}
|
| 57 |
+
App {__version__}
|
| 58 |
+
""")
|
| 59 |
+
demo.queue(default_concurrency_limit=5).launch(max_file_size=args.max_file_size, server_port=args.server_port)
|
| 60 |
+
|
| 61 |
+
if __name__ == "__main__":
|
| 62 |
+
"""
|
| 63 |
+
コマンドライン引数の解析
|
| 64 |
+
"""
|
| 65 |
+
parser = argparse.ArgumentParser(prog=PROGRAM_NAME, description="SaliencyMapDemo")
|
| 66 |
+
parser.add_argument('--server_port', type=int, default=9999, help="Gradio server port")
|
| 67 |
+
parser.add_argument('--max_file_size', type=int, default=20 * gr.FileSize.MB, help="Gradio max file size")
|
| 68 |
+
parser.add_argument('--version', action='version', version='%(prog)s {0}'.format(__version__))
|
| 69 |
+
|
| 70 |
+
main(parser.parse_args())
|
| 71 |
+
|