×

《从Ozon到1688:中国卖家如何玩转“图片情报学”进行选品?》

万邦科技Lex 万邦科技Lex 发表于2026-04-28 11:50:18 浏览14 评论0

抢沙发发表评论

🔍 图片情报学:从Ozon到1688的逆向工程选品法

在跨境电商的战场上,每一张产品图都是一个数据金矿——这不是玄学,而是可量化、可复制、可系统化的图片情报学

🎯 一、图片情报学的核心:从视觉到供应链的逆向工程

三层解码系统

graph TD
    A[Ozon产品图] --> B[第一层: 市场情报]
    A --> C[第二层: 产品情报]  
    A --> D[第三层: 供应链情报]
    
    B --> B1[定价策略]
    B --> B2[营销卖点]
    B --> B3[用户偏好]
    
    C --> C1[材料分析]
    C --> C2[工艺推断]
    C --> C3[结构拆解]
    
    D --> D1[供应商定位]
    D --> D2[成本核算]
    D --> D3[改进方向]
    
    B1 & C1 & D1 --> E[1688精准匹配]
    B2 & C2 & D2 --> F[差异化策略]
    B3 & C3 & D3 --> G[逆向供应链开发]

实战案例:智能猫砂盆的图片解码

# 原图分析报告
产品: 俄罗斯Ozon智能猫砂盆
售价: 12,990₽ (约1040元)
月销: 150+台
评分: 4.3/5

## 第一层解码: 市场情报
图片特征:
  - 主图: 白色简约设计, 现代家居风格
  - 场景: 客厅角落, 暗示"美观不显眼"
  - 模特: 无宠物, 强调"无味"卖点
  - 卖点: "自动清洁"、"静音"、"大容量"

文字信息:
  - 标题: 包含"Автоматический" (自动), "Без запаха" (无味)
  - 描述: 强调"无需每天清理", 俄罗斯冬季痛点
  - 标签: "умный" (智能), "для квартиры" (公寓用)

市场结论:
  - 目标用户: 城市公寓养猫人
  - 核心痛点: 异味、清理频率
  - 价格定位: 中高端(1000+元)
  - 差异化: 静音、美观

## 第二层解码: 产品情报
材料分析:
  - 外壳: 白色ABS塑料, 哑光质感
  - 内部: 透明观察窗 → 亚克力或PC
  - 配件: 金属滚轴, 橡胶密封条
  - 尺寸: 长60cm×宽50cm×高50cm (对比猫)

结构分析:
  - 可拆卸: 上盖、底盘、集便盒
  - 电机位置: 底部右侧 → 单电机设计
  - 控制面板: 顶部按钮+指示灯 → 基础控制
  - 通风口: 顶部格栅 → 自然通风

工艺推断:
  - 注塑工艺: 壳体无拼缝 → 一体注塑
  - 表面处理: 哑光 → 喷砂或咬花
  - 组装方式: 卡扣+螺丝 → 易组装
  - 电子部分: PCB板+普通电机 → 非定制

## 第三层解码: 供应链情报
部件清单:
  1. 主壳体: ABS注塑件
  2. 上盖: ABS注塑件
  3. 集便盒: PS注塑件
  4. 滚轴组件: 电机+齿轮+滚轴
  5. 控制板: 单片机+传感器
  6. 密封条: 硅胶条
  7. 包装: 彩盒+泡沫

供应商画像:
  - 壳体供应商: 中等规模注塑厂
  - 电机供应商: 通用减速电机厂
  - 控制板: 公版方案商
  - 组装: 家电组装厂

成本估算:
  - 注塑件: 150元
  - 电机组件: 60元
  - 控制板: 40元
  - 其他: 50元
  - 总成本: 300元左右
  - 利润率: (1040-300)/1040 = 71%

🔧 二、图片情报学的实战工具集

工具1:图片元数据分析器

# 图片元数据分析工具
import exifread
from PIL import Image
import cv2
import numpy as np
from typing import Dict, List, Optional
import requests
from io import BytesIO
from datetime import datetime
import json

class ProductImageAnalyzer:
    """产品图片分析器"""
    
    def __init__(self):
        self.known_suppliers = self._load_supplier_db()
        self.material_patterns = self._load_material_patterns()
        self.price_patterns = self._load_price_patterns()
    
    def analyze_ozon_image(self, image_url: str, product_data: Dict) -> Dict:
        """分析Ozon产品图"""
        analysis = {
            'basic_info': {},
            'material_analysis': {},
            'structure_analysis': {},
            'supplier_analysis': {},
            'cost_estimation': {},
            'improvement_opportunities': []
        }
        
        # 下载并分析图片
        try:
            response = requests.get(image_url, timeout=10)
            image_data = BytesIO(response.content)
            img = Image.open(image_data)
            
            # 基础信息提取
            analysis['basic_info'] = self._extract_basic_info(img, product_data)
            
            # 材料分析
            analysis['material_analysis'] = self._analyze_materials(img)
            
            # 结构分析
            analysis['structure_analysis'] = self._analyze_structure(img, product_data)
            
            # 供应商分析
            analysis['supplier_analysis'] = self._analyze_suppliers(analysis)
            
            # 成本估算
            analysis['cost_estimation'] = self._estimate_cost(analysis)
            
            # 改进机会
            analysis['improvement_opportunities'] = self._find_improvements(analysis, product_data)
            
        except Exception as e:
            print(f"图片分析失败: {e}")
        
        return analysis
    
    def _extract_basic_info(self, img: Image.Image, product_data: Dict) -> Dict:
        """提取基础信息"""
        info = {
            'image_size': img.size,
            'image_mode': img.mode,
            'resolution': img.info.get('dpi', (72, 72)),
            'file_size_kb': len(img.tobytes()) / 1024 if hasattr(img, 'tobytes') else 0
        }
        
        # 从图片推断产品信息
        width, height = img.size
        
        # 如果图片中有参照物(如手、硬币),可估算产品尺寸
        if 'hand' in self._detect_objects(img):
            info['estimated_size'] = 'medium'  # 中等尺寸
        elif 'ruler' in self._detect_objects(img):
            # 如果有尺子,可以更精确估算
            pass
            
        return info
    
    def _analyze_materials(self, img: Image.Image) -> Dict:
        """分析材料"""
        materials = {}
        
        # 颜色分析
        dominant_colors = self._get_dominant_colors(img, n_colors=3)
        materials['dominant_colors'] = dominant_colors
        
        # 材质推断
        img_array = np.array(img)
        
        # 通过颜色、纹理、光泽推断材质
        if self._is_plastic_like(img_array):
            materials['primary_material'] = '塑料'
            materials['plastic_type'] = self._identify_plastic_type(img_array)
        elif self._is_metal_like(img_array):
            materials['primary_material'] = '金属'
            materials['metal_type'] = self._identify_metal_type(img_array)
        elif self._is_wood_like(img_array):
            materials['primary_material'] = '木材'
        
        # 表面处理
        materials['surface_finish'] = self._identify_surface_finish(img_array)
        
        return materials
    
    def _analyze_structure(self, img: Image.Image, product_data: Dict) -> Dict:
        """分析结构"""
        structure = {}
        
        # 边缘检测
        edges = self._detect_edges(img)
        structure['edge_count'] = len(edges)
        
        # 对称性分析
        symmetry_score = self._analyze_symmetry(img)
        structure['symmetry'] = symmetry_score
        
        # 复杂度评估
        complexity = self._assess_complexity(img, product_data)
        structure['complexity'] = complexity
        
        # 可制造性评估
        manufacturability = self._assess_manufacturability(structure)
        structure['manufacturability'] = manufacturability
        
        return structure
    
    def _analyze_suppliers(self, analysis: Dict) -> Dict:
        """分析可能的供应商"""
        suppliers = {
            'possible_suppliers': [],
            'supplier_locations': [],
            'supplier_types': [],
            'search_keywords': []
        }
        
        # 根据材料推断供应商
        if 'primary_material' in analysis['material_analysis']:
            material = analysis['material_analysis']['primary_material']
            
            if material == '塑料':
                suppliers['supplier_types'].append('注塑厂')
                suppliers['search_keywords'].extend(['注塑', '塑料制品', '塑胶'])
                suppliers['supplier_locations'].extend(['东莞', '深圳', '宁波'])
                
            elif material == '金属':
                suppliers['supplier_types'].append('五金厂')
                suppliers['search_keywords'].extend(['五金加工', '钣金', '金属制品'])
                suppliers['supplier_locations'].extend(['佛山', '温州', '永康'])
        
        # 根据结构复杂度推断
        complexity = analysis['structure_analysis'].get('complexity', 'medium')
        if complexity == 'low':
            suppliers['search_keywords'].append('简易')
        elif complexity == 'high':
            suppliers['search_keywords'].append('精密')
        
        return suppliers
    
    def _estimate_cost(self, analysis: Dict) -> Dict:
        """估算成本"""
        cost = {
            'material_cost': 0,
            'manufacturing_cost': 0,
            'assembly_cost': 0,
            'total_cost': 0,
            'confidence': 'medium'
        }
        
        # 材料成本估算
        material = analysis['material_analysis'].get('primary_material')
        if material == '塑料':
            cost['material_cost'] = 50  # 基础估算
        elif material == '金属':
            cost['material_cost'] = 80
        elif material == 'wood':
            cost['material_cost'] = 100
        
        # 制造成本估算
        complexity = analysis['structure_analysis'].get('complexity')
        if complexity == 'low':
            cost['manufacturing_cost'] = 30
        elif complexity == 'medium':
            cost['manufacturing_cost'] = 50
        elif complexity == 'high':
            cost['manufacturing_cost'] = 100
        
        # 组装成本
        cost['assembly_cost'] = 20
        
        # 总成本
        cost['total_cost'] = (cost['material_cost'] + 
                            cost['manufacturing_cost'] + 
                            cost['assembly_cost'])
        
        return cost
    
    def _find_improvements(self, analysis: Dict, product_data: Dict) -> List[str]:
        """找出改进机会"""
        improvements = []
        
        # 基于材料改进
        materials = analysis['material_analysis']
        if 'primary_material' in materials:
            if materials['primary_material'] == '塑料':
                improvements.append('可升级为ABS+PC增强材料')
        
        # 基于结构改进
        structure = analysis['structure_analysis']
        if structure.get('symmetry', 0) < 0.8:
            improvements.append('优化对称性,提升美观度')
        
        # 基于成本改进
        if analysis['cost_estimation']['total_cost'] < 100:
            improvements.append('有足够成本空间做升级')
        
        return improvements[:3]  # 返回前3个改进点
    
    # 以下为辅助方法(简化版)
    def _load_supplier_db(self):
        """加载供应商数据库"""
        return {
            '塑料': ['东莞', '深圳', '宁波'],
            '金属': ['佛山', '温州', '永康'],
            '木材': ['湖州', '临沂']
        }
    
    def _load_material_patterns(self):
        """加载材料模式"""
        return {
            'plastic': ['smooth', 'glossy', 'matte'],
            'metal': ['reflective', 'textured'],
            'wood': ['grainy', 'organic']
        }
    
    def _load_price_patterns(self):
        """加载价格模式"""
        return {
            'simple_plastic': 30,
            'complex_plastic': 80,
            'simple_metal': 50,
            'complex_metal': 120
        }
    
    def _detect_objects(self, img):
        """检测图片中的物体(简化)"""
        # 这里可以集成物体检测模型
        return []
    
    def _get_dominant_colors(self, img, n_colors=3):
        """获取主色调"""
        # 简化实现
        return ['#FFFFFF', '#F5F5F5', '#EEEEEE']
    
    def _is_plastic_like(self, img_array):
        """判断是否为塑料"""
        # 通过颜色、亮度、对比度等特征判断
        return True
    
    def _is_metal_like(self, img_array):
        """判断是否为金属"""
        return False
    
    def _is_wood_like(self, img_array):
        """判断是否为木材"""
        return False
    
    def _identify_plastic_type(self, img_array):
        """识别塑料类型"""
        return 'ABS'
    
    def _identify_metal_type(self, img_array):
        """识别金属类型"""
        return '铝合金'
    
    def _identify_surface_finish(self, img_array):
        """识别表面处理"""
        return '哑光'
    
    def _detect_edges(self, img):
        """边缘检测"""
        return []
    
    def _analyze_symmetry(self, img):
        """分析对称性"""
        return 0.8  # 0-1的对称性分数
    
    def _assess_complexity(self, img, product_data):
        """评估复杂度"""
        return 'medium'
    
    def _assess_manufacturability(self, structure):
        """评估可制造性"""
        return 'easy'

# 使用示例
analyzer = ProductImageAnalyzer()

# 分析Ozon产品图
product_data = {
    'title': 'Умный туалет для кошек',
    'price': 12990,
    'category': 'Товары для животных',
    'description': 'Автоматический самоочищающийся'
}

image_url = "https://example.com/product-image.jpg"
result = analyzer.analyze_ozon_image(image_url, product_data)

print("图片分析结果:")
print(json.dumps(result, indent=2, ensure_ascii=False))

工具2:1688反向图片搜索引擎

# 1688反向图片搜索工具
import base64
import hashlib
import requests
from bs4 import BeautifulSoup
import re
from urllib.parse import urlencode, quote
import time
from dataclasses import dataclass
from typing import List, Dict, Optional
import json

@dataclass
class AlibabaProduct:
    """1688产品信息"""
    title: str
    url: str
    price: str
    moq: str
    supplier: str
    supplier_location: str
    image_url: str
    similarity: float  # 与目标图片的相似度
    
class ReverseImageSearcher:
    """反向图片搜索引擎"""
    
    def __init__(self):
        self.session = requests.Session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
        })
    
    def search_by_image(self, image_url: str, category: str = None) -> List[AlibabaProduct]:
        """通过图片搜索1688"""
        
        # 第一步: 上传图片到搜索引擎
        search_results = []
        
        # 使用多个搜索引擎提高覆盖率
        # 1. 1688以图搜货
        alibaba_results = self._search_1688(image_url, category)
        search_results.extend(alibaba_results)
        
        # 2. 百度识图
        baidu_results = self._search_baidu(image_url, category)
        search_results.extend(baidu_results)
        
        # 3. 谷歌图片搜索
        google_results = self._search_google(image_url, category)
        search_results.extend(google_results)
        
        # 去重和排序
        unique_results = self._deduplicate_results(search_results)
        sorted_results = sorted(unique_results, key=lambda x: x.similarity, reverse=True)
        
        return sorted_results[:20]  # 返回前20个结果
    
    def _search_1688(self, image_url: str, category: str = None) -> List[AlibabaProduct]:
        """搜索1688"""
        products = []
        
        try:
            # 构建搜索URL
            base_url = "https://s.1688.com/selloffer/offer_search.htm"
            params = {
                'keywords': self._extract_keywords_from_image(image_url),
                'imageUrl': image_url,
                'sortType': 'pop',  # 按人气排序
                'pageSize': 20,
            }
            
            if category:
                params['catId'] = self._get_category_id(category)
            
            search_url = f"{base_url}?{urlencode(params)}"
            
            # 发送请求
            response = self.session.get(search_url, timeout=10)
            soup = BeautifulSoup(response.text, 'html.parser')
            
            # 解析结果
            items = soup.select('.offer-list-row .offer-list .offer-item')
            
            for item in items[:10]:  # 前10个
                try:
                    title_elem = item.select_one('.title a')
                    price_elem = item.select_one('.price')
                    supplier_elem = item.select_one('.supplier a')
                    image_elem = item.select_one('.pic img')
                    moq_elem = item.select_one('.moq')
                    location_elem = item.select_one('.location')
                    
                    if not all([title_elem, price_elem]):
                        continue
                    
                    product = AlibabaProduct(
                        title=title_elem.get('title', '').strip(),
                        url=title_elem.get('href', ''),
                        price=price_elem.get_text(strip=True) if price_elem else '面议',
                        moq=moq_elem.get_text(strip=True) if moq_elem else '未知',
                        supplier=supplier_elem.get_text(strip=True) if supplier_elem else '未知',
                        supplier_location=location_elem.get_text(strip=True) if location_elem else '未知',
                        image_url=image_elem.get('src', '') if image_elem else '',
                        similarity=self._calculate_similarity(item, category)
                    )
                    
                    products.append(product)
                    
                except Exception as e:
                    print(f"解析商品失败: {e}")
                    continue
                    
        except Exception as e:
            print(f"搜索1688失败: {e}")
        
        return products
    
    def _search_baidu(self, image_url: str, category: str = None) -> List[AlibabaProduct]:
        """通过百度识图搜索"""
        # 百度识图API调用逻辑
        products = []
        # ... 实现细节
        return products
    
    def _search_google(self, image_url: str, category: str = None) -> List[AlibabaProduct]:
        """通过谷歌图片搜索"""
        # 谷歌图片搜索逻辑
        products = []
        # ... 实现细节
        return products
    
    def _extract_keywords_from_image(self, image_url: str) -> str:
        """从图片提取关键词"""
        # 这里可以集成图像识别API
        # 返回关键词
        return "塑料 家居 用品"
    
    def _get_category_id(self, category: str) -> str:
        """获取1688分类ID"""
        categories = {
            '家居用品': '96',
            '宠物用品': '509',
            '电子产品': '101',
            '工具': '103',
            '户外用品': '104',
        }
        return categories.get(category, '96')
    
    def _calculate_similarity(self, item, target_category: str = None) -> float:
        """计算相似度"""
        similarity = 0.5  # 基础相似度
        
        # 根据各种因素调整相似度
        title = item.select_one('.title a').get('title', '').lower()
        
        # 关键词匹配
        keywords = ['定制', '批发', '厂家', '直销']
        for keyword in keywords:
            if keyword in title:
                similarity += 0.1
        
        # 价格信息
        price_elem = item.select_one('.price')
        if price_elem and '面议' not in price_elem.get_text():
            similarity += 0.1
        
        # MOQ信息
        moq_elem = item.select_one('.moq')
        if moq_elem and '可混批' in moq_elem.get_text():
            similarity += 0.1
        
        return min(similarity, 1.0)  # 不超过1
    
    def _deduplicate_results(self, products: List[AlibabaProduct]) -> List[AlibabaProduct]:
        """去重"""
        seen_urls = set()
        unique_products = []
        
        for product in products:
            if product.url and product.url not in seen_urls:
                seen_urls.add(product.url)
                unique_products.append(product)
        
        return unique_products
    
    def analyze_suppliers(self, products: List[AlibabaProduct]) -> Dict:
        """分析供应商"""
        analysis = {
            'supplier_count': len(products),
            'supplier_locations': {},
            'price_range': {'min': float('inf'), 'max': 0},
            'moq_distribution': {},
            'recommended_suppliers': []
        }
        
        # 统计供应商地区
        for product in products:
            # 地区统计
            loc = product.supplier_location
            if loc:
                analysis['supplier_locations'][loc] = analysis['supplier_locations'].get(loc, 0) + 1
            
            # 价格范围
            try:
                price = float(re.search(r'[\d.]+', product.price).group())
                analysis['price_range']['min'] = min(analysis['price_range']['min'], price)
                analysis['price_range']['max'] = max(analysis['price_range']['max'], price)
            except:
                pass
            
            # MOQ分布
            moq_match = re.search(r'(\d+)', product.moq)
            if moq_match:
                moq = int(moq_match.group(1))
                if moq <= 10:
                    analysis['moq_distribution']['<=10'] = analysis['moq_distribution'].get('<=10', 0) + 1
                elif moq <= 50:
                    analysis['moq_distribution']['11-50'] = analysis['moq_distribution'].get('11-50', 0) + 1
                elif moq <= 100:
                    analysis['moq_distribution']['51-100'] = analysis['moq_distribution'].get('51-100', 0) + 1
                else:
                    analysis['moq_distribution']['>100'] = analysis['moq_distribution'].get('>100', 0) + 1
        
        # 推荐供应商
        for product in products:
            score = 0
            
            # 评分标准
            if '厂家' in product.title or '工厂' in product.title:
                score += 2
            
            if '可混批' in product.moq or int(re.search(r'\d+', product.moq or '1000').group()) <= 50:
                score += 2
            
            if '广东' in product.supplier_location or '浙江' in product.supplier_location:
                score += 1
            
            if product.similarity > 0.7:
                score += 1
            
            if score >= 3:  # 得分3分以上推荐
                analysis['recommended_suppliers'].append({
                    'title': product.title,
                    'url': product.url,
                    'price': product.price,
                    'moq': product.moq,
                    'supplier': product.supplier,
                    'location': product.supplier_location,
                    'score': score
                })
        
        return analysis

# 使用示例
searcher = ReverseImageSearcher()

# 搜索相似产品
image_url = "https://ozon-storage.ru/image.jpg"
results = searcher.search_by_image(image_url, category="家居用品")

print(f"找到 {len(results)} 个相关产品")
for i, product in enumerate(results[:5], 1):
    print(f"{i}. {product.title}")
    print(f"   价格: {product.price}, MOQ: {product.moq}")
    print(f"   供应商: {product.supplier} ({product.supplier_location})")
    print(f"   相似度: {product.similarity:.2f}")
    print()

# 分析供应商
analysis = searcher.analyze_suppliers(results)
print("供应商分析:")
print(f"供应商数量: {analysis['supplier_count']}")
print(f"主要地区: {list(analysis['supplier_locations'].keys())[:3]}")
print(f"价格范围: {analysis['price_range']['min']} - {analysis['price_range']['max']}")
print(f"推荐供应商: {len(analysis['recommended_suppliers'])} 个")

🔄 三、图片情报学的标准化工作流

七步逆向工程法

# 图片逆向工程标准化流程

## 第一步:Ozon图片情报收集
### 目标:获取高质量情报
- 截图主图、详情图、场景图
- 保存产品视频(如果有)
- 记录标题、价格、销量、评分
- 爬取所有评价,特别是差评
- 注意用户上传的实拍图

## 第二步:视觉特征分析
### 目标:解码产品DNA
- 材质识别:塑料/金属/木材/复合材料
- 工艺分析:注塑/钣金/压铸/组装
- 结构拆解:可拆卸部件、连接方式
- 尺寸估算:通过参照物(手、硬币等)
- 颜色分析:主色、配色、表面处理

## 第三步:成本反向计算
### 目标:建立成本模型
- 材料成本 = 体积 × 密度 × 单价
- 加工成本 = 工艺复杂度 × 工时费率
- 电子成本 = BOM清单 × 采购价
- 组装成本 = 人工 + 治具
- 包装成本 = 材料 + 印刷
- 总成本 = ∑(各项成本) × (1+损耗率)

## 第四步:供应链地图绘制
### 目标:定位生产网络
- 主材供应商:注塑厂/五金厂/电子厂
- 配件供应商:螺丝/电线/包装
- 组装工厂:OEM/ODM厂家
- 地区分布:珠三角/长三角/其他
- 供应关系:一级/二级/三级供应商

## 第五步:差异化机会识别
### 目标:找到改进点
- 性能改进:功能增强/参数提升
- 体验改进:易用性/美观度/便利性
- 成本优化:材料替代/工艺简化
- 本地化:俄罗斯认证/俄文包装
- 组合创新:功能组合/场景扩展

## 第六步:1688精准匹配
### 目标:找到对应供应商
- 以图搜货:找相同/相似产品
- 零件搜索:拆解BOM单独找
- 工艺搜索:按制造工艺找厂家
- 地区搜索:按产业集群找
- 认证搜索:找有认证的厂家

## 第七步:验证与测试
### 目标:验证可行性
- 样品采购:1-2个样品测试
- 成本验证:实际报价 vs 估算
- 工艺验证:能否实现改进
- 市场测试:小规模预售
- 迭代优化:基于反馈改进

情报收集模板

<!DOCTYPE html>
<html>
<head>
    <title>产品情报收集表</title>
    <style>
        * { box-sizing: border-box; }
        body { font-family: Arial; margin: 20px; background: #f8f9fa; }
        .form-container { max-width: 1000px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        .section { margin-bottom: 30px; padding-bottom: 20px; border-bottom: 2px solid #e9ecef; }
        .section h3 { color: #2c3e50; margin-top: 0; padding-bottom: 10px; border-bottom: 1px solid #eee; }
        .form-group { margin-bottom: 15px; }
        .form-group label { display: block; margin-bottom: 5px; font-weight: bold; color: #495057; }
        .form-group input, .form-group textarea, .form-group select { width: 100%; padding: 8px; border: 1px solid #ced4da; border-radius: 4px; }
        .form-group textarea { height: 80px; resize: vertical; }
        .image-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 15px; margin: 15px 0; }
        .image-item { border: 1px dashed #adb5bd; padding: 10px; border-radius: 5px; text-align: center; }
        .image-item img { max-width: 100%; height: 120px; object-fit: cover; border-radius: 3px; }
        .btn { background: #007bff; color: white; border: none; padding: 10px 20px; border-radius: 5px; cursor: pointer; }
        .btn:hover { background: #0056b3; }
        .cost-breakdown { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; }
        .cost-item { background: #f8f9fa; padding: 15px; border-radius: 5px; }
        .opportunity-list { list-style: none; padding: 0; }
        .opportunity-list li { padding: 8px 0; border-bottom: 1px solid #eee; }
        .opportunity-list li:before { content: "💡 "; }
    </style>
</head>
<body>
    <div class="form-container">
        <h2>📸 产品情报收集表</h2>
        
        <!-- 基本信息 -->
        <div class="section">
            <h3>1. 产品基本信息</h3>
            <div class="form-group">
                <label>Ozon链接</label>
                <input type="url" placeholder="https://www.ozon.ru/product/...">
            </div>
            <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;">
                <div class="form-group">
                    <label>产品名称(俄文)</label>
                    <input type="text" placeholder="例如: Умный туалет для кошек">
                </div>
                <div class="form-group">
                    <label>产品名称(中文)</label>
                    <input type="text" placeholder="例如: 智能猫砂盆">
                </div>
            </div>
            <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 15px;">
                <div class="form-group">
                    <label>价格(₽)</label>
                    <input type="number" placeholder="12990">
                </div>
                <div class="form-group">
                    <label>月销量</label>
                    <input type="number" placeholder="150">
                </div>
                <div class="form-group">
                    <label>评分(5分制)</label>
                    <input type="number" step="0.1" placeholder="4.3">
                </div>
                <div class="form-group">
                    <label>评价数</label>
                    <input type="number" placeholder="342">
                </div>
            </div>
        </div>
        
        <!-- 图片收集 -->
        <div class="section">
            <h3>2. 产品图片收集</h3>
            <p>请上传或粘贴产品图片URL</p>
            <div class="image-grid">
                <div class="image-item">
                    <div style="background: #e9ecef; height: 120px; display: flex; align-items: center; justify-content: center; color: #6c757d; border-radius: 3px;">
                        主图
                    </div>
                    <input type="url" placeholder="图片URL" style="margin-top: 5px; width: 100%;">
                </div>
                <div class="image-item">
                    <div style="background: #e9ecef; height: 120px; display: flex; align-items: center; justify-content: center; color: #6c757d; border-radius: 3px;">
                        详情图1
                    </div>
                    <input type="url" placeholder="图片URL" style="margin-top: 5px; width: 100%;">
                </div>
                <div class="image-item">
                    <div style="background: #e9ecef; height: 120px; display: flex; align-items: center; justify-content: center; color: #6c757d; border-radius: 3px;">
                        详情图2
                    </div>
                    <input type="url" placeholder="图片URL" style="margin-top: 5px; width: 100%;">
                </div>
                <div class="image-item">
                    <div style="background: #e9ecef; height: 120px; display: flex; align-items: center; justify-content: center; color: #6c757d; border-radius: 3px;">
                        场景图
                    </div>
                    <input type="url" placeholder="图片URL" style="margin-top: 5px; width: 100%;">
                </div>
            </div>
        </div>
        
        <!-- 视觉分析 -->
        <div class="section">
            <h3>3. 视觉特征分析</h3>
            <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px;">
                <div>
                    <div class="form-group">
                        <label>主要材质</label>
                        <select>
                            <option value="">请选择</option>
                            <option value="plastic_abs">ABS塑料</option>
                            <option value="plastic_pp">PP塑料</option>
                            <option value="metal_aluminum">铝合金</option>
                            <option value="metal_stainless">不锈钢</option>
                            <option value="wood">木材</option>
                            <option value="composite">复合材料</option>
                        </select>
                    </div>
                    <div class="form-group">
                        <label>表面处理</label>
                        <select>
                            <option value="">请选择</option>
                            <option value="matte">哑光</option>
                            <option value="glossy">亮光</option>
                            <option value="textured">纹理</option>
                            <option value="painted">喷漆</option>
                        </select>
                    </div>
                    <div class="form-group">
                        <label>主要颜色</label>
                        <input type="text" placeholder="例如: 白色、黑色、灰色">
                    </div>
                </div>
                <div>
                    <div class="form-group">
                        <label>结构复杂度</label>
                        <select>
                            <option value="simple">简单(5个部件以内)</option>
                            <option value="medium">中等(5-10个部件)</option>
                            <option value="complex">复杂(10个部件以上)</option>
                        </select>
                    </div>
                    <div class="form-group">
                        <label>制造工艺</label>
                        <select multiple style="height: 100px;">
                            <option value="injection">注塑成型</option>
                            <option value="stamping">冲压</option>
                            <option value="casting">压铸</option>
                            <option value="cnc">CNC加工</option>
                            <option value="assembly">组装</option>
                            <option value="welding">焊接</option>
                        </select>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label>尺寸估算(长×宽×高 cm)</label>
                <input type="text" placeholder="例如: 60×50×50">
            </div>
        </div>
        
        <!-- 成本分析 -->
        <div class="section">
            <h3>4. 成本反向计算</h3>
            <div class="cost-breakdown">
                <div class="cost-item">
                    <h4>材料成本</h4>
                    <input type="number" placeholder="估算金额" style="width: 100%; margin: 5px 0;">
                    <textarea placeholder="材料明细..." style="width: 100%; height: 60px;"></textarea>
                </div>
                <div class="cost-item">
                    <h4>加工成本</h4>
                    <input type="number" placeholder="估算金额" style="width: 100%; margin: 5px 0;">
                    <textarea placeholder="工艺明细..." style="width: 100%; height: 60px;"></textarea>
                </div>
                <div class="cost-item">
                    <h4>电子成本</h4>
                    <input type="number" placeholder="估算金额" style="width: 100%; margin: 5px 0;">
                    <textarea placeholder="电子件明细..." style="width: 100%; height: 60px;"></textarea>
                </div>
                <div class="cost-item">
                    <h4>其他成本</h4>
                    <input type="number" placeholder="估算金额" style="width: 100%; margin: 5px 0;">
                    <textarea placeholder="包装、物流等..." style="width: 100%; height: 60px;"></textarea>
                </div>
            </div>
            <div style="margin-top: 15px; text-align: center;">
                <div style="display: inline-block; background: #007bff; color: white; padding: 10px 20px; border-radius: 5px;">
                    总成本估算: <span id="totalCost">0</span> 元
                </div>
                <div style="margin-top: 10px; font-size: 14px; color: #666;">
                    Ozon售价: <input type="number" placeholder="12990" style="width: 100px; text-align: center;"> ₽
                    利润率: <span id="profitMargin">0</span>%
                </div>
            </div>
        </div>
        
        <!-- 供应链分析 -->
        <div class="section">
            <h3>5. 供应链分析</h3>
            <div class="form-group">
                <label>主要供应商类型</label>
                <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;">
                    <label><input type="checkbox"> 注塑厂</label>
                    <label><input type="checkbox"> 五金厂</label>
                    <label><input type="checkbox"> 电子厂</label>
                    <label><input type="checkbox"> 组装厂</label>
                    <label><input type="checkbox"> 包装厂</label>
                    <label><input type="checkbox"> 其他</label>
                </div>
            </div>
            <div class="form-group">
                <label>主要产业带</label>
                <select multiple style="height: 80px;">
                    <option value="dongguan">东莞(注塑、电子)</option>
                    <option value="shenzhen">深圳(电子、方案)</option>
                    <option value="ningbo">宁波(五金、小家电)</option>
                    <option value="yongkang">永康(五金、工具)</option>
                    <option value="foshan">佛山(小家电、家具)</option>
                    <option value="yiwu">义乌(小商品、配件)</option>
                </select>
            </div>
            <div class="form-group">
                <label>1688搜索关键词</label>
                <input type="text" placeholder="例如: 自动猫砂盆 宠物用品 智能">
            </div>
        </div>
        
        <!-- 改进机会 -->
        <div class="section">
            <h3>6. 差异化机会识别</h3>
            <ul class="opportunity-list">
                <li>
                    <input type="checkbox"> 性能改进
                    <input type="text" placeholder="具体改进点" style="width: 300px; margin-left: 10px;">
                </li>
                <li>
                    <input type="checkbox"> 体验改进
                    <input type="text" placeholder="具体改进点" style="width: 300px; margin-left: 10px;">
                </li>
                <li>
                    <input type="checkbox"> 成本优化
                    <input type="text" placeholder="具体改进点" style="width: 300px; margin-left: 10px;">
                </li>
                <li>
                    <input type="checkbox"> 外观优化
                    <input type="text" placeholder="具体改进点" style="width: 300px; margin-left: 10px;">
                </li>
                <li>
                    <input type="checkbox"> 本地化
                    <input type="text" placeholder="具体改进点" style="width: 300px; margin-left: 10px;">
                </li>
            </ul>
        </div>
        
        <!-- 保存按钮 -->
        <div style="text-align: center; margin-top: 30px;">
            <button class="btn" onclick="saveAnalysis()">💾 保存分析结果</button>
            <button class="btn" onclick="generateReport()" style="margin-left: 10px; background: #28a745;">📄 生成分析报告</button>
        </div>
    </div>
    
    <script>
        function saveAnalysis() {
            alert('分析结果已保存!');
        }
        
        function generateReport() {
            alert('分析报告生成中...');
        }
    </script>
</body>
</html>

🎯 四、实战案例:智能花盆的逆向工程

案例:Ozon热销智能花盆分析

# 产品信息
产品名称: Умный горшок для цветов с автополивом
Ozon链接: https://www.ozon.ru/product/123456
价格: 3,490₽
月销: 300+
评分: 4.2/5
评价数: 428

## 图片情报分析

### 视觉特征解码
1. 材质分析:
   - 外壳: 白色磨砂ABS塑料
   - 水箱: 透明PC材料
   - 底座: 加重PP塑料
   - 传感器: 不锈钢探针

2. 结构分析:
   - 可拆卸水箱: 卡扣连接
   - 电子模块: 顶部集成
   - 水位计: 透明窗口
   - 尺寸: 直径20cm×高25cm

3. 工艺推断:
   - 外壳: 一体注塑
   - 表面: 磨砂咬花
   - 装配: 超声波焊接
   - 电子: 灌胶防水

### 成本反向计算
材料成本:
  - ABS外壳: 35元
  - PC水箱: 15元
  - 控制板: 25元
  - 水泵: 12元
  - 传感器: 8元
  - 其他: 5元
  - 小计: 100元

制造成本:
  - 注塑: 20元
  - 组装: 10元
  - 测试: 5元
  - 小计: 35元

其他成本:
  - 包装: 15元
  - 认证: 5元
  - 利润: 20元
  - 小计: 40元

总成本估算: 175元
Ozon售价: 3,490₽ ≈ 279元
毛利率: (279-175)/279 = 37.3%

### 差评分析
1. "水箱太小,只能坚持3天" (45条)
2. "水泵噪音大" (28条)
3. "APP经常断开连接" (19条)
4. "贵" (15条)
5. "水位显示不准" (12条)

### 改进机会
1. 增大水箱容量 (+5元成本)
2. 更换静音水泵 (+8元成本)
3. 改进蓝牙稳定性 (+3元成本)
4. 优化成本结构 (-10元)
5. 改进传感器精度 (+4元成本)

### 1688供应链匹配
搜索结果: 25个相关产品
价格范围: 85-150元
主要产地: 东莞、深圳
推荐供应商:
  1. XX智能科技 - 专业智能花盆厂家
    - 价格: 95元/个
    - MOQ: 50个
    - 支持定制: 是
    - 地区: 深圳
  
  2. XX电子有限公司 - 控制板供应商
    - 价格: 28元/套
    - MOQ: 100套
    - 支持定制: 是
    - 地区: 东莞

  3. XX塑料制品厂 - 外壳供应商
    - 价格: 35元/套
    - MOQ: 200套
    - 支持定制: 是
    - 地区: 东莞

### 差异化方案
改进版成本: 175 + 10(改进) = 185元
定价策略: 3,990₽ (比原品高500₽)
卖点:
  1. 超大容量: 7天续航
  2. 超静音: <25分贝
  3. 稳定连接: 蓝牙5.0
  4. 精准监测: ±2%精度
  5. 俄文APP: 本地化界面

预期利润率: (319-185)/319 = 42%
月利润(200个): (319-185)×200 = 26,800元

🔄 五、图片情报学的自动化工作流

自动化分析系统

# 自动化图片情报分析系统
import os
import json
import sqlite3
from datetime import datetime
from typing import Dict, List, Optional
import asyncio
import aiohttp
from concurrent.futures import ThreadPoolExecutor
import logging
from dataclasses import dataclass, asdict
from enum import Enum
import hashlib
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@dataclass
class ProductInfo:
    """产品信息"""
    url: str
    title: str
    price: float
    sales: int
    rating: float
    reviews: int
    category: str
    images: List[str]
    
@dataclass 
class ImageAnalysis:
    """图片分析结果"""
    product_id: str
    material_analysis: Dict
    structure_analysis: Dict
    cost_estimation: Dict
    supplier_suggestions: List[Dict]
    improvement_opportunities: List[str]
    confidence_score: float
    
@dataclass
class MarketAnalysis:
    """市场分析结果"""
    product_id: str
    competitor_analysis: Dict
    price_analysis: Dict
    review_analysis: Dict
    market_opportunity: float
    
@dataclass
class FinalReport:
    """最终报告"""
    product_info: ProductInfo
    image_analysis: ImageAnalysis
    market_analysis: MarketAnalysis
    recommendations: List[Dict]
    risk_assessment: Dict
    action_plan: List[str]

class AnalysisPipeline:
    """自动化分析流水线"""
    
    def __init__(self, db_path: str = "product_intelligence.db"):
        self.db_path = db_path
        self._init_database()
        self.executor = ThreadPoolExecutor(max_workers=5)
        
    def _init_database(self):
        """初始化数据库"""
        with sqlite3.connect(self.db_path) as conn:
            # 产品表
            conn.execute("""
                CREATE TABLE IF NOT EXISTS products (
                    id TEXT PRIMARY KEY,
                    url TEXT,
                    title TEXT,
                    price REAL,
                    sales INTEGER,
                    rating REAL,
                    reviews INTEGER,
                    category TEXT,
                    created_at TIMESTAMP
                )
            """)
            
            # 图片表
            conn.execute("""
                CREATE TABLE IF NOT EXISTS product_images (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    product_id TEXT,
                    image_url TEXT,
                    local_path TEXT,
                    analysis_result TEXT,
                    created_at TIMESTAMP,
                    FOREIGN KEY (product_id) REFERENCES products (id)
                )
            """)
            
            # 分析结果表
            conn.execute("""
                CREATE TABLE IF NOT EXISTS analysis_results (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    product_id TEXT,
                    material_analysis TEXT,
                    structure_analysis TEXT,
                    cost_estimation TEXT,
                    supplier_suggestions TEXT,
                    improvement_opportunities TEXT,
                    market_analysis TEXT,
                    recommendations TEXT,
                    created_at TIMESTAMP,
                    FOREIGN KEY (product_id) REFERENCES products (id)
                )
            """)
            
    async def analyze_product(self, ozon_url: str) -> FinalReport:
        """分析产品完整流程"""
        logger.info(f"开始分析产品: {ozon_url}")
        
        # 1. 收集产品信息
        product_info = await self._collect_product_info(ozon_url)
        
        # 2. 下载并分析图片
        image_analysis = await self._analyze_images(product_info)
        
        # 3. 市场分析
        market_analysis = await self._analyze_market(product_info)
        
        # 4. 生成建议
        recommendations = self._generate_recommendations(product_info, image_analysis, market_analysis)
        
        # 5. 风险评估
        risk_assessment = self._assess_risks(product_info, image_analysis)
        
        # 6. 行动计划
        action_plan = self._create_action_plan(product_info, recommendations)
        
        # 7. 保存结果
        await self._save_results(product_info, image_analysis, market_analysis, recommendations)
        
        logger.info(f"产品分析完成: {product_info.title}")
        
        return FinalReport(
            product_info=product_info,
            image_analysis=image_analysis,
            market_analysis=market_analysis,
            recommendations=recommendations,
            risk_assessment=risk_assessment,
            action_plan=action_plan
        )
    
    async def _collect_product_info(self, url: str) -> ProductInfo:
        """收集产品信息"""
        # 这里实现Ozon页面爬取逻辑
        # 简化示例
        return ProductInfo(
            url=url,
            title="Умный горшок для цветов с автополивом",
            price=3490,
            sales=300,
            rating=4.2,
            reviews=428,
            category="Товары для дома",
            images=[
                "https://example.com/image1.jpg",
                "https://example.com/image2.jpg"
            ]
        )
    
    async def _analyze_images(self, product_info: ProductInfo) -> ImageAnalysis:
        """分析产品图片"""
        # 并行分析多张图片
        tasks = []
        for img_url in product_info.images[:3]:  # 分析前3张图片
            task = asyncio.create_task(self._analyze_single_image(img_url))
            tasks.append(task)
        
        image_results = await asyncio.gather(*tasks)
        
        # 合并分析结果
        combined_analysis = self._combine_image_analysis(image_results)
        
        return ImageAnalysis(
            product_id=self._generate_product_id(product_info),
            material_analysis=combined_analysis['material'],
            structure_analysis=combined_analysis['structure'],
            cost_estimation=combined_analysis['cost'],
            supplier_suggestions=combined_analysis['suppliers'],
            improvement_opportunities=combined_analysis['improvements'],
            confidence_score=combined_analysis['confidence']
        )
    
    async def _analyze_single_image(self, image_url: str) -> Dict:
        """分析单张图片"""
        # 这里集成图片分析AI
        # 简化示例
        return {
            'material': {'primary': '塑料', 'type': 'ABS', 'confidence': 0.8},
            'structure': {'complexity': 'medium', 'parts': 8, 'confidence': 0.7},
            'cost': {'estimate': 150, 'range': '120-180', 'confidence': 0.6},
            'suppliers': [
                {'type': '注塑厂', 'location': '东莞', 'keywords': ['ABS 注塑']},
                {'type': '电子厂', 'location': '深圳', 'keywords': ['控制板', '单片机']}
            ],
            'improvements': ['优化结构', '改进材质'],
            'confidence': 0.7
        }
    
    async def _analyze_market(self, product_info: ProductInfo) -> MarketAnalysis:
        """市场分析"""
        # 分析竞争对手、价格、评价等
        return MarketAnalysis(
            product_id=self._generate_product_id(product_info),
            competitor_analysis={
                'count': 5,
                'avg_price': 3200,
                'avg_rating': 4.1,
                'strengths': ['品牌认知', '渠道优势'],
                'weaknesses': ['价格高', '功能少']
            },
            price_analysis={
                'position': '中高端',
                'room_for_increase': 500,
                'optimal_price': 3990
            },
            review_analysis={
                'total': 428,
                'positive_rate': 0.85,
                'common_complaints': ['水箱小', '噪音大', 'APP不稳定'],
                'common_praises': ['方便', '美观', '实用']
            },
            market_opportunity=0.75
        )
    
    def _generate_recommendations(self, product_info: ProductInfo, 
                                 image_analysis: ImageAnalysis,
                                 market_analysis: MarketAnalysis) -> List[Dict]:
        """生成建议"""
        recommendations = []
        
        # 基于成本建议
        cost = image_analysis.cost_estimation.get('estimate', 0)
        if cost > 0 and product_info.price / 8 > cost * 1.5:  # 汇率近似8
            recommendations.append({
                'type': '成本优化',
                'priority': '高',
                'action': '有足够利润空间,可投入改进',
                'impact': '高'
            })
        
        # 基于差评建议
        complaints = market_analysis.review_analysis.get('common_complaints', [])
        if '水箱小' in complaints:
            recommendations.append({
                'type': '产品改进',
                'priority': '高',
                'action': '增大水箱容量20%',
                'impact': '中'
            })
        
        if '噪音大' in complaints:
            recommendations.append({
                'type': '产品改进',
                'priority': '中',
                'action': '更换静音水泵',
                'impact': '中'
            })
        
        # 基于竞争建议
        competitor_count = market_analysis.competitor_analysis.get('count', 0)
        if competitor_count < 3:
            recommendations.append({
                'type': '市场机会',
                'priority': '高',
                'action': '竞争少,可快速进入',
                'impact': '高'
            })
        
        return recommendations
    
    def _assess_risks(self, product_info: ProductInfo, 
                     image_analysis: ImageAnalysis) -> Dict:
        """风险评估"""
        risks = {}
        
        # 技术风险
        complexity = image_analysis.structure_analysis.get('complexity', 'medium')
        if complexity == 'high':
            risks['technical'] = {'level': '高', 'reason': '结构复杂,制造难度大'}
        elif complexity == 'medium':
            risks['technical'] = {'level': '中', 'reason': '中等复杂度,有现成方案'}
        else:
            risks['technical'] = {'level': '低', 'reason': '结构简单,容易制造'}
        
        # 市场风险
        if product_info.sales < 50:
            risks['market'] = {'level': '高', 'reason': '销量较低,需求不确定'}
        elif product_info.sales < 200:
            risks['market'] = {'level': '中', 'reason': '中等销量,有一定需求'}
        else:
            risks['market'] = {'level': '低', 'reason': '销量不错,需求稳定'}
        
        # 供应链风险
        supplier_count = len(image_analysis.supplier_suggestions)
        if supplier_count < 2:
            risks['supply_chain'] = {'level': '高', 'reason': '供应商选择少'}
        elif supplier_count < 5:
            risks['supply_chain'] = {'level': '中', 'reason': '有多个供应商可选'}
        else:
            risks['supply_chain'] = {'level': '低', 'reason': '供应链成熟'}
        
        return risks
    
    def _create_action_plan(self, product_info: ProductInfo, 
                          recommendations: List[Dict]) -> List[str]:
        """创建行动计划"""
        plan = []
        
        # 高优先级建议
        high_priority = [r for r in recommendations if r['priority'] == '高']
        for rec in high_priority:
            if rec['type'] == '产品改进':
                plan.append(f"实施改进: {rec['action']}")
            elif rec['type'] == '成本优化':
                plan.append(f"优化成本结构")
            elif rec['type'] == '市场机会':
                plan.append(f"快速进入市场")
        
        # 标准步骤
        plan.extend([
            "1. 样品采购(1-2个)",
            "2. 供应商谈判(3-5家)",
            "3. 成本核算(精确报价)",
            "4. 小批量试产(50-100个)",
            "5. 市场测试(Ozon预售)",
            "6. 批量生产(根据订单)"
        ])
        
        return plan
    
    def _generate_product_id(self, product_info: ProductInfo) -> str:
        """生成产品ID"""
        url_hash = hashlib.md5(product_info.url.encode()).hexdigest()[:8]
        return f"{product_info.category[:2]}_{url_hash}"
    
    def _combine_image_analysis(self, results: List[Dict]) -> Dict:
        """合并多张图片分析结果"""
        # 简化实现
        if not results:
            return {}
        
        return results[0]  # 简化:返回第一张图片的结果
    
    async def _save_results(self, product_info: ProductInfo,
                           image_analysis: ImageAnalysis,
                           market_analysis: MarketAnalysis,
                           recommendations: List[Dict]):
        """保存结果到数据库"""
        with sqlite3.connect(self.db_path) as conn:
            # 保存产品信息
            conn.execute("""
                INSERT OR REPLACE INTO products 
                (id, url, title, price, sales, rating, reviews, category, created_at)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
            """, (
                self._generate_product_id(product_info),
                product_info.url,
                product_info.title,
                product_info.price,
                product_info.sales,
                product_info.rating,
                product_info.reviews,
                product_info.category,
                datetime.now()
            ))
            
            # 保存分析结果
            conn.execute("""
                INSERT INTO analysis_results 
                (product_id, material_analysis, structure_analysis, cost_estimation, 
                 supplier_suggestions, improvement_opportunities, market_analysis, 
                 recommendations, created_at)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
            """, (
                image_analysis.product_id,
                json.dumps(image_analysis.material_analysis, ensure_ascii=False),
                json.dumps(image_analysis.structure_analysis, ensure_ascii=False),
                json.dumps(image_analysis.cost_estimation, ensure_ascii=False),
                json.dumps(image_analysis.supplier_suggestions, ensure_ascii=False),
                json.dumps(image_analysis.improvement_opportunities, ensure_ascii=False),
                json.dumps(asdict(market_analysis), ensure_ascii=False),
                json.dumps(recommendations, ensure_ascii=False),
                datetime.now()
            ))
    
    def generate_report(self, report: FinalReport) -> str:
        """生成报告"""
        md_report = []
        
        # 标题
        md_report.append(f"# 产品情报分析报告")
        md_report.append(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        md_report.append("")
        
        # 产品信息
        md_report.append("## 1. 产品基本信息")
        md_report.append(f"- **产品**: {report.product_info.title}")
        md_report.append(f"- **价格**: {report.product_info.price}₽")
        md_report.append(f"- **月销量**: {report.product_info.sales}+")
        md_report.append(f"- **评分**: {report.product_info.rating}/5 ({report.product_info.reviews}评价)")
        md_report.append(f"- **类目**: {report.product_info.category}")
        md_report.append(f"- **链接**: {report.product_info.url}")
        md_report.append("")
        
        # 图片分析
        md_report.append("## 2. 图片情报分析")
        md_report.append("### 材料分析")
        for key, value in report.image_analysis.material_analysis.items():
            md_report.append(f"- {key}: {value}")
        
        md_report.append("### 结构分析")
        for key, value in report.image_analysis.structure_analysis.items():
            md_report.append(f"- {key}: {value}")
        
        md_report.append("### 成本估算")
        for key, value in report.image_analysis.cost_estimation.items():
            md_report.append(f"- {key}: {value}")
        
        md_report.append("### 供应商建议")
        for i, supplier in enumerate(report.image_analysis.supplier_suggestions[:3], 1):
            md_report.append(f"{i}. {supplier.get('type', '')} - {supplier.get('location', '')}")
            md_report.append(f"   关键词: {', '.join(supplier.get('keywords', []))}")
        md_report.append("")
        
        # 市场分析
        md_report.append("## 3. 市场分析")
        md_report.append(f"- **竞争对手**: {report.market_analysis.competitor_analysis.get('count', 0)}个")
        md_report.append(f"- **平均价格**: {report.market_analysis.competitor_analysis.get('avg_price', 0)}₽")
        md_report.append(f"- **市场机会评分**: {report.market_analysis.market_opportunity:.1%}")
        md_report.append("")
        
        # 差评分析
        md_report.append("### 主要差评")
        complaints = report.market_analysis.review_analysis.get('common_complaints', [])
        for i, complaint in enumerate(complaints[:5], 1):
            md_report.append(f"{i}. {complaint}")
        md_report.append("")
        
        # 改进建议
        md_report.append("### 改进机会")
        for i, improvement in enumerate(report.image_analysis.improvement_opportunities, 1):
            md_report.append(f"{i}. {improvement}")
        md_report.append("")
        
        # 推荐建议
        md_report.append("## 4. 推荐建议")
        for i, rec in enumerate(report.recommendations, 1):
            md_report.append(f"**{rec['type']}** ({rec['priority']}优先级)")
            md_report.append(f"- 行动: {rec['action']}")
            md_report.append(f"- 影响: {rec['impact']}")
            md_report.append("")
        
        # 风险评估
        md_report.append("## 5. 风险评估")
        for risk_type, risk_info in report.risk_assessment.items():
            md_report.append(f"- **{risk_type}风险**: {risk_info.get('level', '')} - {risk_info.get('reason', '')}")
        md_report.append("")
        
        # 行动计划
        md_report.append("## 6. 行动计划")
        for i, action in enumerate(report.action_plan, 1):
            md_report.append(f"{i}. {action}")
        
        return "\n".join(md_report)

# 使用示例
async def main():
    pipeline = AnalysisPipeline()
    
    # 分析产品
    ozon_url = "https://www.ozon.ru/product/123456"
    report = await pipeline.analyze_product(ozon_url)
    
    # 生成报告
    report_text = pipeline.generate_report(report)
    
    # 保存报告
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    report_file = f"product_analysis_{timestamp}.md"
    
    with open(report_file, "w", encoding="utf-8") as f:
        f.write(report_text)
    
    print(f"分析报告已保存到: {report_file}")
    print("\n=== 分析摘要 ===")
    print(f"产品: {report.product_info.title}")
    print(f"价格: {report.product_info.price}₽")
    print(f"成本估算: {report.image_analysis.cost_estimation.get('estimate', 0)}元")
    print(f"毛利率: {(report.product_info.price/8 - report.image_analysis.cost_estimation.get('estimate', 0)) / (report.product_info.price/8) * 100:.1f}%")
    print(f"改进建议: {len(report.recommendations)} 条")
    print(f"风险等级: {report.risk_assessment.get('market', {}).get('level', '未知')}")

# 运行
if __name__ == "__main__":
    asyncio.run(main())

🎯 六、图片情报学的进阶技巧

视觉特征数据库

# 视觉特征数据库
import json
from typing import Dict, List, Set
from dataclasses import dataclass
from collections import defaultdict
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
@dataclass
class VisualFeature:
    """视觉特征"""
    feature_type: str  # 材质/工艺/结构/颜色
    name: str
    description: str
    keywords: List[str]  # 搜索关键词
    suppliers: List[str]  # 供应商地区
    avg_cost: float  # 平均成本
    complexity: str  # 复杂度
    
class VisualFeatureDatabase:
    """视觉特征数据库"""
    
    def __init__(self):
        self.features = self._load_features()
        self.material_map = self._build_material_map()
        self.process_map = self._build_process_map()
        
    def _load_features(self) -> Dict[str, List[VisualFeature]]:
        """加载特征数据"""
        return {
            'materials': [
                VisualFeature(
                    feature_type='material',
                    name='ABS塑料',
                    description='常见的工程塑料,强度好,易加工',
                    keywords=['ABS塑料', 'ABS料', '工程塑料'],
                    suppliers=['东莞', '深圳', '宁波'],
                    avg_cost=15,  # 元/kg
                    complexity='低'
                ),
                VisualFeature(
                    feature_type='material',
                    name='PP塑料',
                    description='聚丙烯,食品级,耐化学',
                    keywords=['PP塑料', '聚丙烯', '食品级塑料'],
                    suppliers=['东莞', '深圳', '浙江'],
                    avg_cost=12,
                    complexity='低'
                ),
                VisualFeature(
                    feature_type='material',
                    name='铝合金',
                    description='轻质金属,强度好,易加工',
                    keywords=['铝合金', '铝型材', '铝制品'],
                    suppliers=['佛山', '永康', '江苏'],
                    avg_cost=25,
                    complexity='中'
                ),
            ],
            'processes': [
                VisualFeature(
                    feature_type='process',
                    name='注塑成型',
                    description='塑料制品主要工艺,适合大批量',
                    keywords=['注塑', '注塑加工', '塑料注塑'],
                    suppliers=['东莞', '深圳', '宁波'],
                    avg_cost=0.5,  # 元/克
                    complexity='中'
                ),
                VisualFeature(
                    feature_type='process',
                    name='钣金加工',
                    description='金属薄板加工,适合外壳',
                    keywords=['钣金', '钣金加工', '金属冲压'],
                    suppliers=['佛山', '永康', '江苏'],
                    avg_cost=0.8,
                    complexity='中'
                ),
                VisualFeature(
                    feature_type='process',
                    name='CNC加工',
                    description='精密加工,适合小批量',
                    keywords=['CNC加工', '数控加工', '精密加工'],
                    suppliers=['深圳', '东莞', '苏州'],
                    avg_cost=2.5,
                    complexity='高'
                ),
            ],
            'structures': [
                VisualFeature(
                    feature_type='structure',
                    name='卡扣连接',
                    description='无螺丝连接,美观,易组装',
                    keywords=['卡扣', '扣位', '无螺丝'],
                    suppliers=['通用'],
                    avg_cost=0.2,  # 每个连接点
                    complexity='低'
                ),
                VisualFeature(
                    feature_type='structure',
                    name='超声波焊接',
                    description='塑料焊接,密封性好',
                    keywords=['超声波焊接', '塑料焊接'],
                    suppliers=['有专门厂家'],
                    avg_cost=0.5,
                    complexity='中'
                ),
            ],
            'finishes': [
                VisualFeature(
                    feature_type='finish',
                    name='哑光喷漆',
                    description='磨砂质感,不反光',
                    keywords=['哑光', '磨砂', '喷漆'],
                    suppliers=['通用'],
                    avg_cost=5,  # 元/件
                    complexity='低'
                ),
                VisualFeature(
                    feature_type='finish',
                    name='电镀',
                    description='金属光泽,美观',
                    keywords=['电镀', '镀铬', '金属感'],
                    suppliers=['有污染限制'],
                    avg_cost=8,
                    complexity='高'
                ),
            ]
        }
    
    def _build_material_map(self) -> Dict[str, Dict]:
        """构建材料映射"""
        material_map = {}
        for feature in self.features['materials']:
            material_map[feature.name] = {
                'keywords': feature.keywords,
                'suppliers': feature.suppliers,
                'avg_cost': feature.avg_cost,
                'complexity': feature.complexity
            }
        return material_map
    
    def _build_process_map(self) -> Dict[str, Dict]:
        """构建工艺映射"""
        process_map = {}
        for feature in self.features['processes']:
            process_map[feature.name] = {
                'keywords': feature.keywords,
                'suppliers': feature.suppliers,
                'avg_cost': feature.avg_cost,
                'complexity': feature.complexity
            }
        return process_map
    
    def identify_features(self, image_description: str) -> Dict[str, List]:
        """从描述识别特征"""
        identified = {
            'materials': [],
            'processes': [],
            'structures': [],
            'finishes': []
        }
        
        description_lower = image_description.lower()
        
        # 识别材料
        for material, info in self.material_map.items():
            for keyword in info['keywords']:
                if keyword in description_lower:
                    identified['materials'].append({
                        'name': material,
                        'keywords_found': [k for k in info['keywords'] if k in description_lower],
                        'suppliers': info['supp


群贤毕至

访客