Spaces:
Sleeping
Sleeping
import streamlit as st | |
from transformers import pipeline | |
from datasets import load_dataset | |
from PIL import Image | |
import numpy as np | |
from collections import Counter | |
# 设置页面 | |
st.set_page_config(page_title="🏠 装修风格分析器", layout="wide") | |
st.title("AI 装修风格匹配工具") | |
# 缓存模型(移除了物体检测) | |
def load_models(): | |
return { | |
"style_classifier": pipeline( | |
"image-classification", | |
model="playrobin/furniture-styles" | |
), | |
"advisor": pipeline("text2text-generation", model="google/flan-t5-small") | |
} | |
# 颜色分析函数(替代物体检测) | |
def analyze_image(img): | |
# 简化的视觉分析:仅提取颜色 | |
img = img.resize((50,50)) | |
arr = np.array(img) | |
pixels = arr.reshape(-1,3) | |
# 使用简化版颜色分析(避免sklearn依赖) | |
unique_colors = np.unique(pixels, axis=0) | |
main_colors = unique_colors[:3] # 取前3种主要颜色 | |
return [f"#{r:02x}{g:02x}{b:02x}" for r,g,b in main_colors] | |
def main(): | |
uploaded_img = st.file_uploader("上传房间照片", type=["jpg", "png"]) | |
if uploaded_img: | |
models = load_models() | |
img = Image.open(uploaded_img) | |
with st.spinner("正在分析..."): | |
# 1. 风格分类 | |
style_result = models["style_classifier"](img) | |
main_style = style_result[0]['label'] | |
# 2. 视觉分析(颜色替代物体检测) | |
colors = analyze_image(img) | |
# 3. 从数据集找案例 | |
try: | |
dataset = load_dataset("AntZet/home_decoration_objects_images", streaming=True) | |
examples = [ex['image'] for ex in dataset['train'] | |
if ex['style'] == main_style][:3] | |
except: | |
examples = [] | |
# 4. 生成建议 | |
prompt = f"""基于{main_style}风格,给出3条装修建议: | |
- 主色调: {colors} | |
- 避免: 与风格冲突的元素 | |
- 预算: 中等成本方案""" | |
advice = models["advisor"](prompt, max_length=200)[0]['generated_text'] | |
# 显示结果 | |
col1, col2 = st.columns(2) | |
with col1: | |
st.image(img, width=300) | |
st.success(f"识别风格: {main_style}") | |
st.subheader("主要色调") | |
for color in colors: | |
st.markdown(f"<div style='background:{color}; height:30px'></div>", | |
unsafe_allow_html=True) | |
with col2: | |
st.subheader("风格建议") | |
st.write(advice) | |
if examples: | |
st.subheader("参考案例") | |
st.image(examples, width=150) | |
if __name__ == "__main__": | |
main() |