Spaces:
Sleeping
Sleeping
File size: 4,092 Bytes
56ac15e 28a3dde 56ac15e 28a3dde 56ac15e 28a3dde 56ac15e 28a3dde 56ac15e 28a3dde 56ac15e 28a3dde 56ac15e 28a3dde 56ac15e 28a3dde 56ac15e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | import gradio as gr
import os
import shutil
import cv2
import numpy as np
from naming import im2c
from collections import Counter
COLOR_NAME = ['black', 'brown', 'blue', 'gray', 'green', 'orange', 'pink', 'purple', 'red', 'white', 'yellow']
def get_top_names(img):
# resize images to smaller size
anchor = 256
width = img.shape[1]
height = img.shape[0]
if width > 512 or height > 512:
if width >= height:
dim = (np.floor(width/height*anchor).astype(int), anchor)
else:
dim = (anchor, np.floor(height/width*anchor).astype(int))
img = cv2.resize(img, dim, interpolation=cv2.INTER_LINEAR)
# obtain color names of all the pixels
w2c = np.load('w2c11_j.npy').astype(np.float16)
_, _, name_idx_img, _ = im2c(img, w2c)
# compute the order of each name based on the numbers of each name
filtered_counts = Counter(name_idx_img[name_idx_img <= 10])
sorted_counts = sorted(filtered_counts.items(), key=lambda x: x[1], reverse=True)
top_3_values = [num for num, count in sorted_counts[:3]]
top_3_colors = [COLOR_NAME[i] for i in top_3_values]
# print("Top 3 colors:", top_3_colors)
return top_3_values, top_3_colors
def classify_and_log(images):
output_folder = "classified_results"
os.makedirs(output_folder, exist_ok=True)
category_folders = {i: os.path.join(output_folder, COLOR_NAME[i]) for i in range(11)}
for folder in category_folders.values():
os.makedirs(folder, exist_ok=True)
log_file = os.path.join(output_folder, "top3colors.txt")
results = {i: [] for i in range(11)}
with open(log_file, "w") as log:
for id_img, img in enumerate(images):
filename = os.path.basename(img.name)
img_array = cv2.imread(img).astype(np.float32)
img_array = cv2.cvtColor(img_array, cv2.COLOR_BGR2RGB)
cat_id, category = get_top_names(img_array)
# print(category_folders[cat_id[0]], filename)
target_path = os.path.join(category_folders[cat_id[0]], filename)
cv2.imwrite(target_path, cv2.cvtColor(img_array, cv2.COLOR_BGR2RGB))
print(f"Image:{filename} -> Top 3 colors:{category}\n")
log.write(f"{filename} -> 1 {category[0]}, 2 {category[1]}, 3 {category[2]}\n")
results[cat_id[0]].append(target_path)
# output_images = [results[i] for i in range(11)]
# print(output_images)
return log_file
def swap_to_gallery(images):
return gr.update(value=images, visible=True), gr.update(visible=True), gr.update(visible=False)
def upload_example_to_gallery(images, prompt, style, negative_prompt):
return gr.update(value=images, visible=True), gr.update(visible=True), gr.update(visible=False)
def remove_back_to_files():
return gr.update(visible=False), gr.update(visible=False), gr.update(visible=True)
with gr.Blocks() as demo:
gr.Markdown("## Image color categorization")
with gr.Row():
with gr.Column():
image_input = gr.File(
label="Drag/Select more than one images",
file_types=["image"],
file_count="multiple"
)
uploaded_files = gr.Gallery(label="Your images", visible=False, columns=5, rows=1, height=200)
with gr.Column(visible=False) as clear_button:
remove_and_reupload = gr.ClearButton(value="Remove and upload new ones", components=image_input, size="sm")
image_input.upload(fn=swap_to_gallery, inputs=image_input, outputs=[uploaded_files, clear_button, image_input])
remove_and_reupload.click(fn=remove_back_to_files, outputs=[uploaded_files, clear_button, image_input])
classify_btn = gr.Button("submit")
# with gr.Row():
# image_output = {str(i): gr.Gallery(label=f"{i}") for i in range(11)}
log_output = gr.File(label="download results")
classify_btn.click(
classify_and_log,
inputs=[image_input],
outputs=[log_output]
)
demo.launch()
|