IliaLarchenko commited on
Commit
96a96d9
1 Parent(s): 2403575

added the optional path to the images folder

Browse files
Files changed (5) hide show
  1. README.md +6 -1
  2. configs/augmentations.json +53 -50
  3. src/app.py +52 -41
  4. src/utils.py +10 -3
  5. src/visuals.py +11 -4
README.md CHANGED
@@ -16,6 +16,11 @@ pip install -r requirements.txt
16
  streamlit run src/app.py
17
  ```
18
 
 
 
 
 
 
19
  In your terminal you will see the link to the running local service similar to :
20
  ```console
21
  You can now view your Streamlit app in your browser.
@@ -39,4 +44,4 @@ The interface is very simple and intuitive:
39
  ## Links
40
  * Albumentations library: [github.com/albumentations-team/albumentations](https://github.com/albumentations-team/albumentations)
41
  * Image Source: [pexels.com/royalty-free-images](https://pexels.com/royalty-free-images/)
42
- * Streamlit - framework powering this app [github.com/streamlit/streamlit](https://github.com/streamlit/streamlit)
 
16
  streamlit run src/app.py
17
  ```
18
 
19
+ If you want to work with you own images just replace the last line with:
20
+ ```
21
+ streamlit run src/app.py -- --images_folder PATH_TO_YOUR_IMAGE_FOLDER
22
+ ```
23
+
24
  In your terminal you will see the link to the running local service similar to :
25
  ```console
26
  You can now view your Streamlit app in your browser.
 
44
  ## Links
45
  * Albumentations library: [github.com/albumentations-team/albumentations](https://github.com/albumentations-team/albumentations)
46
  * Image Source: [pexels.com/royalty-free-images](https://pexels.com/royalty-free-images/)
47
+ * Streamlit - framework powering this app [github.com/streamlit/streamlit](https://github.com/streamlit/streamlit)
configs/augmentations.json CHANGED
@@ -507,6 +507,58 @@
507
  "type": "checkbox"
508
  }
509
  ],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
510
  "Posterize": [
511
  {
512
  "defaults_list": [
@@ -1109,54 +1161,5 @@
1109
  "ToGray": [],
1110
  "ToSepia": [],
1111
  "Transpose": [],
1112
- "VerticalFlip": [],
1113
-
1114
-
1115
- "OpticalDistortion": [
1116
- {
1117
- "defaults": [
1118
- -0.3,
1119
- 0.3
1120
- ],
1121
- "limits_list": [
1122
- -2.0,
1123
- 2.0
1124
- ],
1125
- "param_name": "distort_limit",
1126
- "type": "num_interval"
1127
- }, {
1128
- "defaults": [-0.05, 0.05],
1129
- "limits_list": [
1130
- -1.0,
1131
- 1.0
1132
- ],
1133
- "param_name": "shift_limit",
1134
- "type": "num_interval"
1135
- },
1136
- {
1137
- "options_list": [
1138
- 0,
1139
- 1,
1140
- 2,
1141
- 3,
1142
- 4
1143
- ],
1144
- "param_name": "interpolation",
1145
- "type": "radio"
1146
- },
1147
- {
1148
- "options_list": [
1149
- 0,
1150
- 1,
1151
- 2,
1152
- 3,
1153
- 4
1154
- ],
1155
- "param_name": "border_mode",
1156
- "type": "radio"
1157
- },
1158
- {
1159
- "param_name": "value",
1160
- "type": "rgb"
1161
- }]
1162
  }
 
507
  "type": "checkbox"
508
  }
509
  ],
510
+ "OpticalDistortion": [
511
+ {
512
+ "defaults": [
513
+ -0.3,
514
+ 0.3
515
+ ],
516
+ "limits_list": [
517
+ -2.0,
518
+ 2.0
519
+ ],
520
+ "param_name": "distort_limit",
521
+ "type": "num_interval"
522
+ },
523
+ {
524
+ "defaults": [
525
+ -0.05,
526
+ 0.05
527
+ ],
528
+ "limits_list": [
529
+ -1.0,
530
+ 1.0
531
+ ],
532
+ "param_name": "shift_limit",
533
+ "type": "num_interval"
534
+ },
535
+ {
536
+ "options_list": [
537
+ 0,
538
+ 1,
539
+ 2,
540
+ 3,
541
+ 4
542
+ ],
543
+ "param_name": "interpolation",
544
+ "type": "radio"
545
+ },
546
+ {
547
+ "options_list": [
548
+ 0,
549
+ 1,
550
+ 2,
551
+ 3,
552
+ 4
553
+ ],
554
+ "param_name": "border_mode",
555
+ "type": "radio"
556
+ },
557
+ {
558
+ "param_name": "value",
559
+ "type": "rgb"
560
+ }
561
+ ],
562
  "Posterize": [
563
  {
564
  "defaults_list": [
 
1161
  "ToGray": [],
1162
  "ToSepia": [],
1163
  "Transpose": [],
1164
+ "VerticalFlip": []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1165
  }
src/app.py CHANGED
@@ -1,7 +1,9 @@
 
1
  import streamlit as st
2
  import albumentations as A
3
 
4
- from utils import load_augmentations_config
 
5
  from visuals import (
6
  show_transform_control,
7
  select_image,
@@ -9,53 +11,62 @@ from visuals import (
9
  show_docstring,
10
  )
11
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
- # show title
14
- st.title("Demo of Albumentations")
15
-
16
- # select image
17
- image = select_image(path_to_images="images")
18
- placeholder_params = {
19
- "image_width": image.shape[1],
20
- "image_height": image.shape[0],
21
- "image_half_width": int(image.shape[1] / 2),
22
- "image_half_height": int(image.shape[0] / 2),
23
- }
24
 
25
- # load the config
26
- augmentations = load_augmentations_config(
27
- placeholder_params, "configs/augmentations.json"
28
- )
 
 
29
 
30
- # select a transformation
31
- transform_name = st.sidebar.selectbox(
32
- "Select a transformation:", sorted(list(augmentations.keys()))
33
- )
34
 
35
- # select the params values
36
- param_values = show_transform_control(augmentations[transform_name])
 
 
37
 
38
- # apply the transformation to the image
39
- transform = getattr(A, transform_name)(**param_values)
40
- data = A.ReplayCompose([transform])(image=image)
41
- augmented_image = data["image"]
42
 
43
- # TODO add convinient replay compose
44
- # applied_params = data["replay"]["transforms"][0]['params']
45
- # for k,v in applied_params.items():
46
- # applied_params[k] = str(v)
47
- # st.write(applied_params)
48
- # st.write(data["replay"])
49
 
 
 
 
 
 
 
50
 
51
- # show the images
52
- width_original = 400
53
- width_transformed = int(width_original / image.shape[1] * augmented_image.shape[1])
 
 
54
 
55
- st.image(image, caption="Original image", width=width_original)
56
- st.image(augmented_image, caption="Transformed image", width=width_transformed)
57
 
58
- # print additional info
59
- st.code(str(transform))
60
- show_docstring(transform)
61
- show_credentials()
 
1
+ import os
2
  import streamlit as st
3
  import albumentations as A
4
 
5
+
6
+ from utils import load_augmentations_config, get_path_to_the_image
7
  from visuals import (
8
  show_transform_control,
9
  select_image,
 
11
  show_docstring,
12
  )
13
 
14
+ # get the path to images
15
+ path_to_images = get_path_to_the_image()
16
+ if not os.path.isdir(path_to_images):
17
+ st.title("There is no directory: " + path_to_images)
18
+ else:
19
+ status, image = select_image(path_to_images)
20
+ if status == 0:
21
+ st.title("Can't load image from: " + path_to_images)
22
+ else:
23
+ # show title
24
+ st.title("Demo of Albumentations")
25
 
26
+ # select image
 
 
 
 
 
 
 
 
 
 
27
 
28
+ placeholder_params = {
29
+ "image_width": image.shape[1],
30
+ "image_height": image.shape[0],
31
+ "image_half_width": int(image.shape[1] / 2),
32
+ "image_half_height": int(image.shape[0] / 2),
33
+ }
34
 
35
+ # load the config
36
+ augmentations = load_augmentations_config(
37
+ placeholder_params, "configs/augmentations.json"
38
+ )
39
 
40
+ # select a transformation
41
+ transform_name = st.sidebar.selectbox(
42
+ "Select a transformation:", sorted(list(augmentations.keys()))
43
+ )
44
 
45
+ # select the params values
46
+ param_values = show_transform_control(augmentations[transform_name])
 
 
47
 
48
+ # apply the transformation to the image
49
+ transform = getattr(A, transform_name)(**param_values)
50
+ data = A.ReplayCompose([transform])(image=image)
51
+ augmented_image = data["image"]
 
 
52
 
53
+ # TODO add convinient replay compose
54
+ # applied_params = data["replay"]["transforms"][0]['params']
55
+ # for k,v in applied_params.items():
56
+ # applied_params[k] = str(v)
57
+ # st.write(applied_params)
58
+ # st.write(data["replay"])
59
 
60
+ # show the images
61
+ width_original = 400
62
+ width_transformed = int(
63
+ width_original / image.shape[1] * augmented_image.shape[1]
64
+ )
65
 
66
+ st.image(image, caption="Original image", width=width_original)
67
+ st.image(augmented_image, caption="Transformed image", width=width_transformed)
68
 
69
+ # print additional info
70
+ st.code(str(transform))
71
+ show_docstring(transform)
72
+ show_credentials()
src/utils.py CHANGED
@@ -1,10 +1,19 @@
1
  import cv2
2
  import os
3
  import json
 
4
 
5
  import streamlit as st
6
 
7
 
 
 
 
 
 
 
 
 
8
  @st.cache
9
  def get_images_list(path_to_folder: str) -> list:
10
  """Return the list of images from folder
@@ -18,9 +27,7 @@ def get_images_list(path_to_folder: str) -> list:
18
 
19
 
20
  @st.cache
21
- def load_image(
22
- image_name: str, path_to_folder: str = "../images", bgr2rgb: bool = True
23
- ):
24
  """Load the image
25
  Args:
26
  image_name (str): name of the image
 
1
  import cv2
2
  import os
3
  import json
4
+ import argparse
5
 
6
  import streamlit as st
7
 
8
 
9
+ @st.cache
10
+ def get_path_to_the_image():
11
+ parser = argparse.ArgumentParser()
12
+ parser.add_argument("--images_folder", default="images")
13
+ args = parser.parse_args()
14
+ return getattr(args, "images_folder")
15
+
16
+
17
  @st.cache
18
  def get_images_list(path_to_folder: str) -> list:
19
  """Return the list of images from folder
 
27
 
28
 
29
  @st.cache
30
+ def load_image(image_name: str, path_to_folder: str, bgr2rgb: bool = True):
 
 
31
  """Load the image
32
  Args:
33
  image_name (str): name of the image
src/visuals.py CHANGED
@@ -1,3 +1,4 @@
 
1
  import streamlit as st
2
 
3
  from control import param2func
@@ -8,11 +9,17 @@ def show_logo():
8
  st.image(load_image("logo.png", "../images"), format="PNG")
9
 
10
 
11
- def select_image(path_to_images: str = "images"):
12
  image_names_list = get_images_list(path_to_images)
13
- image_name = st.sidebar.selectbox("Select an image:", image_names_list)
14
- image = load_image(image_name, path_to_images)
15
- return image
 
 
 
 
 
 
16
 
17
 
18
  def show_transform_control(transform_params: dict) -> dict:
 
1
+ import cv2
2
  import streamlit as st
3
 
4
  from control import param2func
 
9
  st.image(load_image("logo.png", "../images"), format="PNG")
10
 
11
 
12
+ def select_image(path_to_images: str):
13
  image_names_list = get_images_list(path_to_images)
14
+ if len(image_names_list) < 1:
15
+ return 0, 0
16
+ else:
17
+ try:
18
+ image_name = st.sidebar.selectbox("Select an image:", image_names_list)
19
+ image = load_image(image_name, path_to_images)
20
+ return 1, image
21
+ except cv2.error:
22
+ return 0, 0
23
 
24
 
25
  def show_transform_control(transform_params: dict) -> dict: