|
from metrics import dice_loss, dice_coef, iou |
|
from libs import * |
|
|
|
|
|
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2" |
|
|
|
""" Global parameters """ |
|
H = 512 |
|
W = 512 |
|
|
|
|
|
def load_image(image_file): |
|
img = Image.open(image_file) |
|
return img |
|
|
|
|
|
def choose_background(col1, col2, col3): |
|
background_file = None |
|
bg_image = None |
|
with col3: |
|
with st.spinner("[UPLOAD] Background uploading"): |
|
try: |
|
if background_file is None: |
|
try: |
|
background_file = st.file_uploader('[UPLOAD] Please upload your background:', type=["png", "jpg", "jpeg"]) |
|
time.sleep(1) |
|
except: |
|
pass |
|
except: |
|
print("[ERROR] Sorry, something went wrong!") |
|
pass |
|
|
|
if background_file is not None: |
|
with col2: |
|
st.success("Load background successfully!...") |
|
|
|
bg_image = load_image(background_file) |
|
print(type(bg_image)) |
|
save_path = "backgrounds/" + background_file.name |
|
bg_image.save(save_path) |
|
|
|
return bg_image, save_path |
|
|
|
|
|
def create_dir(path): |
|
if not os.path.exists(path): |
|
os.makedirs(path) |
|
|
|
|
|
def check_clothe(model_path, img_path): |
|
|
|
model = torch.hub.load('ultralytics/yolov5', 'custom', model_path) |
|
|
|
|
|
results = model(img_path) |
|
|
|
|
|
new_results = results.pandas().xyxy[0].sort_values("confidence").to_json(orient="records") |
|
new_results = json.loads(new_results) |
|
|
|
classes_in_img = [] |
|
classes_count_dict = {} |
|
item = '' |
|
if len(new_results) != 0: |
|
for i in range(len(new_results)): |
|
classes_in_img.append(new_results[i]['name']) |
|
set_of_classes = set(classes_in_img) |
|
list_of_classes = list(set_of_classes) |
|
|
|
older_value_count = 0 |
|
for idx in range(len(list_of_classes)): |
|
value_count = classes_in_img.count(list_of_classes[idx]) |
|
if value_count > older_value_count: |
|
item = list_of_classes[idx] |
|
|
|
else: |
|
item = None |
|
|
|
return item |
|
|
|
|
|
|
|
def main_processing(col1, col2, col3, sport_bg_path, swim_bg_path, office_bg_path, img_path, name, detection_model_path, background_model_path): |
|
""" Seeding """ |
|
bg_path = None |
|
np.random.seed(42) |
|
tf.random.set_seed(42) |
|
|
|
model_path = detection_model_path |
|
|
|
stadium_sport_bg_path = sport_bg_path |
|
beach_swim_bg_path = swim_bg_path |
|
office_bg_path = office_bg_path |
|
|
|
""" Directory for storing files """ |
|
create_dir("remove_bg") |
|
|
|
st.write('Auto detect or choosing background? ') |
|
|
|
if bg_path is None: |
|
if st.checkbox('Choose background'): |
|
try: |
|
bg_img, save_path = choose_background(col1, col2, col3) |
|
bg_path = save_path |
|
except: |
|
pass |
|
|
|
""" Directory for storing files """ |
|
elif st.checkbox('Automatic background'): |
|
item = check_clothe(model_path, img_path) |
|
if item == 'sport': |
|
bg_path = stadium_sport_bg_path |
|
st.write("Hãy tiếp tục luyện tập TDTT chăm chỉ nhé!...") |
|
if item == 'swim': |
|
bg_path = beach_swim_bg_path |
|
st.write("Thời tiết thế này không đi biển hơi phí nhé!...") |
|
if item == 'office': |
|
bg_path = office_bg_path |
|
st.write("Chơi nhiều roài, đi làm chăm chỉ thuii...") |
|
if item == None: |
|
st.warning("Sorry, mô hình chúng tôi không biết bạn đang mặc cái quái gì hết...") |
|
st.warning("Chọn background bạn muốn nhé!") |
|
try: |
|
background_img, save_path = choose_background(col1, col2, col3) |
|
bg_path = save_path |
|
except: |
|
pass |
|
|
|
else: |
|
pass |
|
|
|
else: |
|
pass |
|
|
|
if bg_path is not None: |
|
""" Loading model: DeepLabV3+ """ |
|
with CustomObjectScope({'iou': iou, 'dice_coef': dice_coef, 'dice_loss': dice_loss}): |
|
model = tf.keras.models.load_model(background_model_path) |
|
|
|
""" Read the image """ |
|
image = cv2.imread(img_path, cv2.IMREAD_COLOR) |
|
h, w, _ = image.shape |
|
x = cv2.resize(image, (W, H)) |
|
x = x / 255.0 |
|
x = x.astype(np.float32) |
|
x = np.expand_dims(x, axis=0) |
|
|
|
""" Prediction """ |
|
y = model.predict(x)[0] |
|
y = cv2.resize(y, (w, h)) |
|
y = np.expand_dims(y, axis=-1) |
|
y = y > 0.5 |
|
|
|
photo_mask = y |
|
background_mask = np.abs(1 - y) |
|
cv2.imwrite( |
|
f"remove_bg\\{name}_1.png", |
|
photo_mask * 255) |
|
cv2.imwrite( |
|
f"remove_bg\\{name}_2.png", |
|
background_mask * 255) |
|
|
|
cv2.imwrite( |
|
f"remove_bg\\{name}_3.png", |
|
image * photo_mask) |
|
cv2.imwrite( |
|
f"remove_bg\\{name}_4.png", |
|
image * background_mask) |
|
|
|
bg_img = cv2.imread(bg_path, cv2.IMREAD_COLOR) |
|
print(bg_img.shape) |
|
new_bg_img = cv2.resize(bg_img, (w, h)) |
|
|
|
new_new_bg_img = new_bg_img * background_mask |
|
|
|
cv2.imwrite( |
|
f"remove_bg\\{name}_5.png", |
|
new_new_bg_img) |
|
|
|
final_final_img = new_new_bg_img + image * photo_mask |
|
|
|
final_img_path = f"remove_bg\\{name}_6.png" |
|
cv2.imwrite( |
|
final_img_path, |
|
final_final_img) |
|
|
|
return final_img_path |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|