corn / streamlit_app.py
TopCoderTv's picture
Upload streamlit_app.py
95bd39c verified
import streamlit as st
import moduls.Texture as texture
from PIL import Image
import mmcv
import moduls.model
from moduls.texture_for_point import texture_transformation_1
from main import model
import numpy as np
import cv2
import os
from streamlit_image_select import image_select
from streamlit_image_annotation import pointdet
from moduls.conturs import conturs_on_image
from streamlit_image_comparison import image_comparison
from moduls.settings import path_for_streamlit
st.set_page_config(layout="wide")
@st.cache_data
def load_image(image_file):
img = Image.open(image_file)
img = mmcv.imread(np.array(img))
return img
def save_file_st(path_file):
file_name = path_file.name
img = load_image(path_file)
im = Image.fromarray(img)
output_filename = 'processing.jpg'
im.save(output_filename)
return output_filename
@st.dialog("Выбор текстуры пола", width = 'large')
def select_floor(img_list_1, image_1, img_list):
tex_floor = image_select("Выбор текстуры пола", img_list_1, return_value= 'index')
if st.button("Выбрать"):
st.session_state.json_list[0] = img_list[tex_floor]
modificate_image('floor')
st.session_state.select_floor = [tex_floor]
st.rerun()
@st.dialog("Выбор текстуры стен", width = 'large')
def select_wall(img_list_1, image_1, img_list):
tex_wall = image_select("Выбор текстуры стен", img_list_1, return_value= 'index')
if st.button("Выбрать"):
st.session_state.json_list[1] = img_list[tex_wall]
modificate_image('wall')
st.session_state.select_wall = [tex_wall]
st.rerun()
@st.dialog("Выбор текстуры потолка", width = 'large')
def select_ceiling(img_list_1, image_1, img_list):
tex_ceiling = image_select("Выбор текстуры потолка", img_list_1, return_value= 'index')
if st.button("Выбрать"):
st.session_state.json_list[2] = img_list[tex_ceiling]
modificate_image('ceiling')
st.session_state.select_ceiling = [tex_ceiling]
st.rerun()
def points_sorter(points):
messages_list = ['Недостаточно точек. Добавьте точек!',
'Точек не четное количество. Добавьте или уберите точку!',
'Точек слишком много. Уберите лишние точки!',
'Точки успешно отсортированы!',
'Пол или потолок имеют обратную перспективу. Скорректируйте точки!']
print('len(points)', len(points))
print(points)
if (num_points := len(points)) < 6:
return [], []
elif num_points%2 != 0:
return [], []
elif num_points > 8:
return [], []
else:
# Сортируем список по y, а при равных y по х
sorted_list = sorted(points, key=lambda k: [k[1], k[0]])
print('sorted_list', sorted_list)
# Делим список пополам и сортируем по x
ceiling_points = sorted(sorted_list[:num_points//2], key=lambda k: [k[0], k[1]])
floor_points = sorted(sorted_list[num_points//2:], key=lambda k: [k[0], k[1]])
bad_points = []
print('ceiling_points, floor_points', ceiling_points, floor_points)
# Проверяем направление перспективы потолка
if ceiling_points[0][1] > ceiling_points[1][1]:
bad_points.append(ceiling_points[0])
bad_points.append(ceiling_points[1])
if ceiling_points[-1][1] > ceiling_points[-2][1]:
bad_points.append(ceiling_points[-1])
bad_points.append(ceiling_points[-2])
# Проверем направление перспективы пола
if floor_points[0][1] < floor_points[1][1]:
bad_points.append(floor_points[0])
bad_points.append(floor_points[1])
if floor_points[-1][1] < floor_points[-2][1]:
bad_points.append(floor_points[-1])
bad_points.append(floor_points[-2])
c_f_point = [ceiling_points, floor_points]
return c_f_point
#if len(bad_points) != 0:
# return ceiling_points, floor_points
#else:
# return ceiling_points, floor_points
#@st.dialog('Определение углов комнаты', width='large')
def corner_change_2(image_path):
list_1 = ['Угол']
list_label_1 = []
list_label_2 = []
list_point_1 = []
list_point_2 = []
if 'ceiling_point' in st.session_state and 'floor_point' in st.session_state and st.session_state.ceiling_point is not None and st.session_state.floor_point is not None:
list_point_1 = st.session_state.ceiling_point
print('list_point_1', list_point_1)
for i in range(len(st.session_state.ceiling_point)):
list_label_1.append(0)
list_point_2 = st.session_state.floor_point
for i in range(len(st.session_state.floor_point)):
list_label_2.append(0)
else:
list_point_1 = []
list_point_2 = []
list_point = list_point_1 + list_point_2
list_label = list_label_1 + list_label_2
print('list_point', list_point)
print('list_label', list_label)
point = pointdet(image_path , list_1,
points=list_point,
#points = [],
labels=list_label,
#labels = [],
use_space=True)
if point is not None:
st.session_state.point = point
st.session_state.floor_point = []
st.session_state.ceiling_point = []
#if 'points' not in st.session_state:
st.session_state.points = []
if point is not None:
for i in st.session_state.point:
if i['label_id'] == 0:
#st.session_state.ceiling_point.append([int(i['point'][0]), int(i['point'][1])])
st.session_state.points.append([int(i['point'][0]), int(i['point'][1])])
else:
#st.session_state.floor_point.append([int(i['point'][0]), int(i['point'][1])])
st.session_state.points.append([int(i['point'][0]), int(i['point'][1])])
print('st.session_state.points', st.session_state.points)
c_f_point = points_sorter(st.session_state.points)
st.session_state.ceiling_point = c_f_point[0]
st.session_state.floor_point = c_f_point[1]
#print('a', a)
#st.session_state.ceiling_point = sort_list_ceiling(st.session_state.ceiling_point)
print(st.session_state.ceiling_point)
#st.session_state.floor_point = sort_list_floor(st.session_state.floor_point)
#st.session_state.ceiling_point = cv2.convexHull(np.array(st.session_state.ceiling_point))
#st.session_state.floor_point = cv2.convexHull(np.array(st.session_state.floor_point))
#print('st.session_state.ceiling_point', st.session_state.ceiling_point)
#print('st.session_state.floor_point', st.session_state.floor_point)
#st.rerun()
def sort_list_ceiling(no_change_list):
if len(no_change_list) >= 4:
no_change_list.sort()
if no_change_list[0][1] > no_change_list[1][1]:
no_change_list[0], no_change_list[1] = no_change_list[1], no_change_list[0]
if no_change_list[-1][1] > no_change_list[-2][1]:
no_change_list[-1], no_change_list[-2] = no_change_list[-2], no_change_list[-1]
if len(no_change_list) == 3:
no_change_list.sort()
if no_change_list[0][1] > no_change_list[1][1]:
no_change_list[0], no_change_list[1] = no_change_list[1], no_change_list[0]
return no_change_list
def sort_list_floor(no_change_list):
if len(no_change_list) >= 4:
no_change_list.sort()
if no_change_list[0][1] < no_change_list[1][1]:
no_change_list[0], no_change_list[1] = no_change_list[1], no_change_list[0]
if no_change_list[-1][1] < no_change_list[-2][1]:
no_change_list[-1], no_change_list[-2] = no_change_list[-2], no_change_list[-1]
if len(no_change_list) == 3:
no_change_list.sort()
if no_change_list[0][1] < no_change_list[1][1]:
no_change_list[0], no_change_list[1] = no_change_list[1], no_change_list[0]
return no_change_list
#@st.dialog('Определение углов комнаты', width='large')
def corner_change(image_path):
list_1 = ['Угол потолка', 'Угол пола']
list_label_1 = []
list_label_2 = []
list_point_1 = []
list_point_2 = []
if 'ceiling_point' in st.session_state and 'floor_point' in st.session_state and st.session_state.ceiling_point is not None and st.session_state.floor_point is not None:
list_point_1 = st.session_state.ceiling_point
for i in range(len(st.session_state.ceiling_point)):
list_label_1.append(0)
list_point_2 = st.session_state.floor_point
for i in range(len(st.session_state.floor_point)):
list_label_2.append(1)
else:
list_point_1 = []
list_point_2 = []
list_point = list_point_1 + list_point_2
list_label = list_label_1 + list_label_2
print('list_point', list_point)
print('list_label', list_label)
point = pointdet(image_path , list_1,
points=list_point,
#points = [],
labels=list_label,
#labels = [],
use_space=True)
if point is not None:
st.session_state.point = point
st.session_state.floor_point = []
st.session_state.ceiling_point = []
if point is not None:
for i in st.session_state.point:
if i['label_id'] == 0:
st.session_state.ceiling_point.append([int(i['point'][0]), int(i['point'][1])])
else:
st.session_state.floor_point.append([int(i['point'][0]), int(i['point'][1])])
st.session_state.ceiling_point = sort_list_ceiling(st.session_state.ceiling_point)
print(st.session_state.ceiling_point)
st.session_state.floor_point = sort_list_floor(st.session_state.floor_point)
#st.session_state.ceiling_point = cv2.convexHull(np.array(st.session_state.ceiling_point))
#st.session_state.floor_point = cv2.convexHull(np.array(st.session_state.floor_point))
print('st.session_state.ceiling_point', st.session_state.ceiling_point)
print('st.session_state.floor_point', st.session_state.floor_point)
#st.rerun()
return point
@st.dialog("modification_photo")
def modification_photo(image_1):
st.session_state.modification_photo = [image_1]
st.rerun()
def a(path_photo):
st.session_state.a = path_photo
def predict(path_photo, model):
path_file =save_file_st(path_photo)
_, seg_map, seg_all, image = moduls.model.predict_and_visualize(model, path_file)
print(seg_map.shape)
st.session_state.predict =[seg_all, image]
contur_image, simplified_contour = conturs_on_image(image, seg_map)
st.session_state.contur_image =contur_image
st.session_state.simplified_contour = simplified_contour
return image
def modificate_image(surface):
original_img = cv2.cvtColor(st.session_state.predict[1], cv2.COLOR_BGR2RGB)
if st.session_state.f_h !=0:
f_h = st.session_state.f_h
else:
f_h = None
if st.session_state.w_h !=0:
w_h = st.session_state.w_h
else:
w_h = None
if st.session_state.c_h !=0:
c_h = st.session_state.c_h
else:
c_h = None
image_1 = texture_transformation_1(original_img, st.session_state.predict[0],
st.session_state.room_l*100, st.session_state.room_w*100, st.session_state.room_h*100,
st.session_state.ceiling_point, st.session_state.floor_point,
st.session_state.floor_angel, st.session_state.wall_angel, st.session_state.ceiling_angel,
st.session_state.json_list, surface = st.session_state.surface,
h_f= f_h, h_w = w_h, h_c = c_h,
rescale = 1.)
st.session_state.image_1 = image_1
st.session_state.modification_photo = [image_1]
def save_angel():
st.session_state.floor_angel = floor_angel
st.session_state.ceiling_angel = ceiling_angel
st.session_state.wall_angel = wall_angel
path_icon, path_json, path_logo = path_for_streamlit()
if 'json_list' not in st.session_state:
st.session_state.json_list = [None, None, None]
img_list_1 = []
img_list = []
for path_file in os.listdir(path_icon):
img_list_1.append(path_icon + f'\{path_file}')
for path_json_file in os.listdir(path_json):
if path_json_file.endswith(('.json')):
img_list.append(path_json + f'\{path_json_file}')
img_list_1.sort()
img_list.sort()
title_col1, title_col2 = st.columns([1,3])
with title_col1:
st.image(path_logo)
with title_col2:
st.title(":orange[Замена текстур на фотографии вашей комнаты]",)
change_col_1, change_col_2, change_col_3 = st.columns([1, 4, 1])
# Загрузка фотографиии
with change_col_1:
path_photo = st.file_uploader("Загрузка фото", type=['png','jpeg','jpg'], accept_multiple_files=False, key=None,
help=None, on_change=None, args=None, kwargs=None,
disabled=False, label_visibility = 'collapsed')
if path_photo == None:
st.session_state.a = None
st.session_state.pp = None
if path_photo is not None:
if st.session_state.a != path_photo:
st.session_state.ceiling_point = None
st.session_state.floor_point = None
st.session_state.pp = None
st.session_state.a = path_photo
predict(st.session_state.a, model)
st.session_state.modification_photo = [cv2.cvtColor(st.session_state.predict[1], cv2.COLOR_BGR2RGB)]
# Выбор угловых точек на фотографии
with change_col_2:
if path_photo is not None:
cv2.imwrite('corners.png',st.session_state.contur_image)
#st.session_state.corners = corner_change('corners.png')
st.session_state.corners = corner_change_2('corners.png')
# Размеры комнаты и выбор способа набора текстуры
with change_col_3:
if path_photo is not None:
st.session_state.room_l = st.number_input('Глубина комнаты', min_value=0., max_value=6., value=4., step=0.1, format=None, key='room_l_key', help=None, on_change=None, args=None, kwargs=None, placeholder=None, disabled=False, label_visibility="visible")
st.session_state.room_w = st.number_input('Ширина комнаты', min_value=0., max_value=6., value=3., step=0.1, format=None, key='room_w_key', help=None, on_change=None, args=None, kwargs=None, placeholder=None, disabled=False, label_visibility="visible")
st.session_state.room_h = st.number_input('Высота потолка', min_value=0., max_value=4., value=3., step=0.1, format=None, key='room_h_key', help=None, on_change=None, args=None, kwargs=None, placeholder=None, disabled=False, label_visibility="visible")
# Выбор текстур
if 'corners' in st.session_state and st.session_state.corners != None:
st.session_state.pp = 1
col1, col2, col3 = st.columns(3)
# Текстура пола
with col1:
if path_photo is not None and st.session_state.pp is not None:
floor = st.checkbox('Текстура пола', value=False, key=None, help=None, on_change=None, args=None, kwargs=None, disabled=False, label_visibility="visible")
if floor:
floor_select = st.button("Выбор текстуры пола", key = '1')
if floor_select:
select_floor(img_list_1, cv2.cvtColor(st.session_state.modification_photo[0], cv2.COLOR_BGR2RGB), img_list)
try:
st.image(img_list_1[st.session_state.select_floor[0]], caption=None, width=200, use_column_width=None, clamp=False, channels='RGB', output_format="auto")
st.session_state.json_list[0] = img_list[st.session_state.select_floor[0]]
except:
b=1
else:
st.session_state.json_list[0] = None
# Текстура стен
with col2:
if path_photo is not None and st.session_state.pp is not None:
wall = st.checkbox('Текстура стен', value=False, key=None, help=None, on_change=None, args=None, kwargs=None, disabled=False, label_visibility="visible")
if wall:
wall_select = st.button("Выбор текстуры стен", key = '2')
if wall_select:
select_wall(img_list_1, cv2.cvtColor(st.session_state.modification_photo[0], cv2.COLOR_BGR2RGB), img_list)
try:
st.image(img_list_1[st.session_state.select_wall[0]], caption=None, width=200, use_column_width=None, clamp=False, channels='RGB', output_format="auto")
st.session_state.json_list[1] = img_list[st.session_state.select_wall[0]]
except:
b=1
else:
st.session_state.json_list[1] = None
# Текстура потолка
with col3:
if path_photo is not None and st.session_state.pp is not None:
ceiling = st.checkbox('Текстура потолка', value=False, key=None, help=None, on_change=None, args=None, kwargs=None, disabled=False, label_visibility="visible")
if ceiling:
ceiling_select = st.button("Выбор текстуры потолка", key = '3')
if ceiling_select:
select_ceiling(img_list_1, cv2.cvtColor(st.session_state.modification_photo[0], cv2.COLOR_BGR2RGB), img_list)
try:
st.image(img_list_1[st.session_state.select_ceiling[0]], caption=None, width=200, use_column_width=None, clamp=False, channels='RGB', output_format="auto")
st.session_state.json_list[2] = img_list[st.session_state.select_ceiling[0]]
except:
b=1
else:
st.session_state.json_list[2] = None
if path_photo is not None and st.session_state.pp is not None:
st.session_state.surface = [floor, wall, ceiling]
# Выбор углов поворота текстур
col1_1, col2_1 = st.columns([3,1])
try:
with col2_1:
if path_photo is not None and st.session_state.pp is not None:
floor_angel = st.slider(label = 'Угол поворота текстуры пола',min_value=0, max_value=360, value=0, step=1, format=None, key='floor_angle_key',
help=None, on_change=save_angel, args=None, kwargs=None, disabled=False, label_visibility= 'visible')
wall_angel = st.slider(label = 'Угол поворота текстуры стен',min_value=0, max_value=360, value=0, step=1, format=None, key='wall_angle_key',
help=None, on_change=save_angel, args=None, kwargs=None, disabled=False, label_visibility= 'visible')
ceiling_angel = st.slider(label = 'Угол поворота текстуры потолка',min_value=0, max_value=360, value=0, step=1, format=None, key='ceiling_angle_key',
help=None, on_change=save_angel, args=None, kwargs=None, disabled=False, label_visibility= 'visible')
st.write(":orange[Выбор способа набора текстур]")
st.write(":orange[Если больше 1 то набор ёлочкой]")
st.session_state.f_h = st.number_input('Пол', min_value=0, max_value=3, value=0, step=1, format=None, key='f_h_key', help=None, on_change=None, args=None, kwargs=None, placeholder=None, disabled=False, label_visibility="visible")
st.session_state.w_h = st.number_input('Стены', min_value=0, max_value=3, value=0, step=1, format=None, key='w_h_key', help=None, on_change=None, args=None, kwargs=None, placeholder=None, disabled=False, label_visibility="visible")
st.session_state.c_h = st.number_input('Потолок', min_value=0, max_value=3, value=0, step=1, format=None, key='c_h_key', help=None, on_change=None, args=None, kwargs=None, placeholder=None, disabled=False, label_visibility="visible")
if 'floor_angel' not in st.session_state:
st.session_state.floor_angel = 0
if 'wall_angel' not in st.session_state:
st.session_state.wall_angel = 0
if 'ceiling_angel' not in st.session_state:
st.session_state.ceiling_angel = 0
try:
if st.session_state.floor_angel != floor_angel:
modificate_image('floor')
except:
print('no_change_angel_floor')
try:
if st.session_state.wall_angel != wall_angel:
modificate_image('floor')
except:
print('no_change_angel_wall')
try:
if st.session_state.ceiling_angel != ceiling_angel:
modificate_image('ceiling')
except:
print('no_change_angel_ceiling')
# Отображение фотографии с наложением текстур
with col1_1:
# scroll = st.slider(label = '123',min_value=0., max_value=1., value=0.5, step=0.01, format=None, key=33,
# help=None, on_change=None, args=None, kwargs=None, disabled=False, label_visibility= 'hidden')
if path_photo is not None and st.session_state.pp is not None:
if st.session_state.modification_photo is not None:
image_1 = st.session_state.modification_photo[0]
else:
image_1 = cv2.cvtColor(st.session_state.predict[1], cv2.COLOR_BGR2RGB)
image = cv2.cvtColor(st.session_state.predict[1], cv2.COLOR_BGR2RGB)
#st.write(st.get_option())
image_comparison(
img1=image,
img2=image_1,
width = 1080,
starting_position = 1
)
#fix_line = np.zeros((image.shape[0], 5, 3), dtype=np.uint8)
#fix_line[:,:,1] = 254
#image_2 =cv2.hconcat([image[:, 0:int(image.shape[1]*scroll)], fix_line])
#image_3 =cv2.hconcat([image_2, image_1[: , int(image_1.shape[1]*scroll+5):]])
#img = st.image(image_3, caption=None, use_column_width='always', clamp=False, channels="RGB", output_format="auto")
cv2.imwrite('Change_photo.jpg', cv2.cvtColor(st.session_state.modification_photo[0], cv2.COLOR_BGR2RGB))
with open('Change_photo.jpg', "rb") as file:
print(type(file))
btn = st.download_button(
label="Скачать изображение с наложенной текстурой",
data=file,
file_name="Change_photo.png",
mime="image/png"
)
except:
b=1