宠物App的AI优化思路:伍德氏灯下的光谱分析

2026-01-12 14:04:09
文章摘要
猫主人愁猫皮肤病,去医院贵,自己用伍德氏灯看不懂荧光。喵咪App接入AI ,3 步出诊断报告,还能排除药物干扰。既帮省医药费,又能推荐用药,助力宠物 App 低成本获客、提升转化。

目录


猫咪皮肤病发病率高达 60%,其中猫癣占比超过 40%,且极易传染给免疫力低下的老人和儿童。当铲屎官发现猫咪耳后秃了一块、有皮屑时,第一反应往往是焦虑:“这是猫癣吗?会传染给我家孩子吗?要去医院吗?”

去一次宠物医院,挂号、检查加药费,¥350 起步是常态,还得冒着交叉感染的风险。于是,大量用户选择自行购买伍德氏灯(紫外线灯)在家照照看。这种灯在电商平台售价仅 ¥15-50,年销量超 300 万台。


但问题是,家里硬件有了,铲屎官的知识却没跟上。

当用户打开伍德氏灯,看到猫咪皮肤泛出绿色、蓝白色、暗红色的荧光时,彻底懵了:“到底哪种颜色是猫癣?这团蓝白光是真菌还是皮屑?涂了药之后的荧光残留又是什么?”

这正是痛点所在:有设备,无解读能力

对于宠物 App 来说,这是一个绝佳的切入点。利用 AI 技术,填补用户的知识空白,将几十块的紫外线灯升级为家庭智能皮肤科医生。


1. 技术拆解

AI 识别过程动态演示

实现居家诊断,我们需要解决三大难题:环境光线太暗、手机拍摄偏色严重、以及肉眼难以区分的色彩差异。

1. 像修图一样增强画质


用户在关灯环境下拍摄,照片往往模糊、噪点多且充满紫色光污染。 我们的 AI 第一步就是“智能修图”:

  • 去噪点:让画面更干净。
  • 去模糊:修正手抖带来的影响,让边缘更清晰。
  • 去紫光:自动滤除伍德氏灯带来的紫色干扰,还原皮肤和荧光的真实色彩,让病灶清晰可见。
import cv2
import numpy as np

class WoodLampImageEnhancer:
def init(self):
self.denoiser = cv2.fastNlMeansDenoisingColored

def preprocess(self, raw_image):
    """
    第一阶段:噪声抑制与去模糊
    """
    # 1. 降噪(保留边缘细节)
    denoised = self.denoiser(
        raw_image,
        h=10,           # 滤波强度
        hColor=10,      # 色彩降噪
        templateWindowSize=7,
        searchWindowSize=21
    )
    
    # 2. 去模糊(锐化边缘)
    kernel = np.array([[-1,-1,-1],
                      [-1, 9,-1],
                      [-1,-1,-1]])
    sharpened = cv2.filter2D(denoised, -1, kernel)
    
    # 3. 自适应直方图均衡化(提升对比度)
    lab = cv2.cvtColor(sharpened, cv2.COLOR_BGR2LAB)
    l, a, b = cv2.split(lab)
    clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
    l_enhanced = clahe.apply(l)
    enhanced = cv2.merge([l_enhanced, a, b])
    result = cv2.cvtColor(enhanced, cv2.COLOR_LAB2BGR)
    
    return result

def remove_purple_cast(self, image):
    """
    第二阶段:去除紫光污染
    """
    # 将图像转到LAB色彩空间
    lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
    l, a, b = cv2.split(lab)
    
    # 分析紫光偏移(B通道异常高)
    b_mean = np.mean(b)
    b_std = np.std(b)
    
    # 自适应校正
    if b_mean > 140:  # 紫光污染阈值
        b_corrected = np.clip(b - (b_mean - 128), 0, 255).astype(np.uint8)
        corrected_lab = cv2.merge([l, a, b_corrected])
        return cv2.cvtColor(corrected_lab, cv2.COLOR_LAB2BGR)
    
    return image

def enhance_fluorescence(self, image):
    """
    第三阶段:荧光信号增强
    """
    # 转换到HSV空间
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(hsv)
    
    # 选择性增强特定色相(绿色、黄绿色范围)
    green_mask = cv2.inRange(h, 35, 85)  # 绿色荧光范围
    s_enhanced = np.where(green_mask > 0, np.clip(s * 1.5, 0, 255), s)
    v_enhanced = np.where(green_mask > 0, np.clip(v * 1.3, 0, 255), v)
    
    enhanced_hsv = cv2.merge([h, s_enhanced.astype(np.uint8), v_enhanced.astype(np.uint8)])
    return cv2.cvtColor(enhanced_hsv, cv2.COLOR_HSV2BGR)

2. 色彩分析


为什么人眼看不准?因为在 RGB 模式下,苹果绿(猫癣)和黄绿色(药物残留)非常相似。 我们采用更专业的 HSV 色彩分析法,它能像棱镜一样拆解光线,捕捉不同病菌的“光谱指纹”:

  • 猫癣(犬小孢子菌):呈现明亮的苹果绿,且通常呈环状扩散。
  • 细菌感染:呈现暗红色或橙红色的散点。
  • 皮屑/油脂:通常是蓝白色或淡绿色,且光泽度低。
class FluorescenceAnalyzer:
    def __init__(self):
        # 基于兽医临床数据的光谱指纹库
        self.spectrum_database = {
            "猫癣_犬小孢子菌": {
                "hue_range": (70, 85),      # 色相:苹果绿
                "saturation_min": 0.6,       # 高饱和度
                "value_range": (0.5, 0.9),
                "pattern": "ring_expansion",  # 环状扩散
                "confidence": 0.85
            },
            "细菌感染_葡萄球菌": {
                "hue_range": (0, 15),        # 暗红/橙红
                "saturation_min": 0.4,
                "value_range": (0.3, 0.6),
                "pattern": "scattered_dots",  # 散点状
                "confidence": 0.75
            },
            "马拉色菌": {
                "hue_range": (15, 35),       # 黄色/橙黄
                "saturation_min": 0.5,
                "value_range": (0.4, 0.7),
                "pattern": "greasy_patch",    # 油腻斑块
                "confidence": 0.70
            },
            "药物残留_抗真菌": {
                "hue_range": (85, 110),      # 黄绿/青绿
                "saturation_min": 0.3,       # 低饱和度(不纯)
                "value_range": (0.6, 1.0),
                "pattern": "uniform_glow",    # 均匀发光
                "confidence": 0.90
            },
            "皮屑_正常代谢": {
                "hue_range": (160, 240),     # 蓝白色
                "saturation_min": 0.1,       # 极低饱和度
                "value_range": (0.7, 1.0),
                "pattern": "scattered_flakes", # 碎屑状
                "confidence": 0.95
            }
        }
def analyze_fluorescence(self, enhanced_image, roi):
    """
    分析荧光区域(ROI)的光谱特征
    """
    # 提取感兴趣区域
    roi_hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(roi_hsv)
    
    # 归一化到0-1
    h_norm = h / 180.0
    s_norm = s / 255.0
    v_norm = v / 255.0
    
    # 计算平均光谱特征
    avg_hue = np.mean(h_norm) * 360  # 转回0-360度
    avg_sat = np.mean(s_norm)
    avg_val = np.mean(v_norm)
    
    # 形态学分析
    pattern = self.analyze_pattern(roi)
    
    # 匹配光谱指纹
    matches = []
    for disease, spectrum in self.spectrum_database.items():
        # 色相匹配度
        hue_match = self.is_in_range(avg_hue, spectrum['hue_range'])
        # 饱和度匹配
        sat_match = avg_sat >= spectrum['saturation_min']
        # 明度匹配
        val_match = self.is_in_range(avg_val, spectrum['value_range'])
        # 形态匹配
        pattern_match = pattern == spectrum['pattern']
        
        if hue_match and sat_match and val_match:
            confidence = spectrum['confidence']
            if pattern_match:
                confidence += 0.1  # 形态吻合,置信度+10%
            
            matches.append({
                "disease": disease,
                "confidence": min(confidence, 1.0),
                "spectrum": {
                    "hue": avg_hue,
                    "saturation": avg_sat,
                    "value": avg_val
                }
            })
    
    # 按置信度排序
    matches.sort(key=lambda x: x['confidence'], reverse=True)
    
    return matches

def analyze_pattern(self, roi):
    """
    形态学分析:病灶是环状?点状?还是片状?
    """
    # 二值化
    gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
    _, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
    
    # 轮廓检测
    contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    if len(contours) == 0:
        return "no_fluorescence"
    
    # 分析主要轮廓
    main_contour = max(contours, key=cv2.contourArea)
    area = cv2.contourArea(main_contour)
    perimeter = cv2.arcLength(main_contour, True)
    
    # 圆形度(4πA/P²,圆形为1)
    circularity = 4 * np.pi * area / (perimeter ** 2) if perimeter > 0 else 0
    
    # 判断形态
    if circularity > 0.7:
        # 检查是否环状(中心有空洞)
        hull = cv2.convexHull(main_contour)
        hull_area = cv2.contourArea(hull)
        solidity = area / hull_area if hull_area > 0 else 0
        
        if solidity < 0.8:
            return "ring_expansion"  # 环状扩散(典型猫癣)
        else:
            return "circular_patch"   # 圆形斑块
    
    elif len(contours) > 5:
        return "scattered_dots"  # 多点分布(细菌感染)
    
    else:
        return "irregular_patch"  # 不规则斑块

通过这种分析,AI 能比人眼更精准地判断荧光背后的真相。

3. 深度学习模型:越用越聪明


单纯的颜色分析可能无法处理混合感染。因此,我们引入基于 EfficientNet 的深度学习模型。 该模型经过海量真实样本训练,包括:

  • 5万+ 医院确诊样本
  • 8万+ 用户上传标注数据
  • 2万+ 增强合成数据
# 数据集结构
dataset = {
    "total_samples": 150_000,
    "sources": [
        "宠物医院显微镜确诊样本: 50,000",
        "用户上传+人工标注: 80,000",
        "合成数据(增强): 20,000"
    ],
    "labels": {
        "猫癣_犬小孢子菌": 45000,
        "猫癣_须毛癣菌": 8000,
        "细菌感染_葡萄球菌": 15000,
        "马拉色菌": 12000,
        "螨虫_耳螨": 10000,
        "过敏性皮炎": 18000,
        "药物残留": 25000,
        "正常皮肤": 17000
    }
}

模型架构

import torch
import torch.nn as nn
from torchvision import models

class SkinDiseaseClassifier(nn.Module):
def init(self, num_classes=8):
super().init()

    # 使用预训练的EfficientNet-B3(轻量级,适合移动端部署)
    self.backbone = models.efficientnet_b3(pretrained=True)
    
    # 冻结前80%层(迁移学习)
    for param in list(self.backbone.parameters())[:-50]:
        param.requires_grad = False
    
    # 替换分类头
    in_features = self.backbone.classifier[1].in_features
    self.backbone.classifier = nn.Sequential(
        nn.Dropout(0.3),
        nn.Linear(in_features, 512),
        nn.ReLU(),
        nn.Dropout(0.2),
        nn.Linear(512, num_classes)
    )
    
    # 辅助分支:光谱特征融合
    self.spectrum_branch = nn.Sequential(
        nn.Linear(3, 64),  # 输入HSV均值
        nn.ReLU(),
        nn.Linear(64, 128)
    )
    
    # 融合层
    self.fusion = nn.Linear(512 + 128, num_classes)

def forward(self, image, spectrum_features):
    """
    双路输入:图像 + 光谱特征
    """
    # 图像特征提取
    img_features = self.backbone(image)
    
    # 光谱特征处理
    spec_features = self.spectrum_branch(spectrum_features)
    
    # 特征融合
    combined = torch.cat([img_features, spec_features], dim=1)
    output = self.fusion(combined)
    
    return output

训练策略:

# 类别不平衡处理:加权损失函数
class_weights = torch.tensor([
    3.0,  # 猫癣(重要)
    2.5,  # 细菌感染
    2.0,  # 马拉色菌
    1.5,  # 螨虫
    1.0,  # 过敏
    0.5,  # 药物残留(负样本)
    0.3,  # 正常皮肤
    2.8   # 罕见菌种
])

criterion = nn.CrossEntropyLoss(weight=class_weights)

数据增强(模拟真实场景)

augmentation = A.Compose([
A.RandomBrightnessContrast(p=0.5), # 模拟不同灯光强度
A.GaussNoise(p=0.3), # 模拟相机噪声
A.MotionBlur(p=0.2), # 模拟手抖
A.HueSaturationValue( # 模拟不同相机白平衡
hue_shift_limit=10,
sat_shift_limit=20,
val_shift_limit=10,
p=0.5
),
A.Rotate(limit=15, p=0.5) # 模拟拍摄角度
])

它不仅看颜色,还看形态(环状、点状、片状),综合判断置信度。针对类别不平衡问题(如猫癣样本多,罕见菌少),我们采用了加权策略,确保模型不会忽略少数派病例。


2. 极简交互:3 步完成在家诊断


我们把复杂的医疗流程简化为傻瓜式的三步操作:

Step 1:拍摄引导 App 会通过语音或文字提示:“请关闭房间灯光,打开伍德氏灯,距离皮肤 10-15 厘米拍摄。”

Step 2:AI 实时分析 取景框内,AI 会实时捕捉荧光区域。如果检测到可疑绿色荧光,会立即标记并提示用户:“发现疑似病灶,请保持稳定。”

Step 3:生成诊断报告 几秒钟后,一份通俗易懂的报告呈现眼前:

  • 结果:疑似猫癣(置信度 92%)
  • 病因:犬小孢子菌(真菌)
  • 风险:高度传染,请隔离
  • 建议:立即隔离患猫,推荐使用抗真菌喷雾,并对环境进行消毒。

更有心的是,我们加入了“药物干扰排除”功能。如果用户近期用过药,AI 会自动识别药物残留产生的荧光,避免误判。


3. 商业闭环

这个功能不仅解决了用户焦虑,更是一个极具商业价值的流量入口。

1. 高频刚需的获客利器

猫癣的高发性和反复性,决定了这是一个高频使用的功能。几乎每个养猫家庭都需要它,这为 App 带来了极低的获客成本和极高的用户粘性。

2. 精准的供应链转化

诊断只是开始,治疗才是目的。基于 AI 的诊断结果,系统可以直接推荐治疗方案:

  • 确诊猫癣:推荐“特比萘芬喷雾 + 维生素B族(增强抵抗力) + 消毒液”的组合套餐。
  • 确诊耳螨:推荐洗耳液和耳螨药。

数据验证:在试点项目中,查看用药方案的用户占比高达 85%,点击购买率达到 62%,客单价稳定在 ¥180 左右。


4. 结语

宠物医疗领域,信息不对称是最大的机会。

通过 AI 技术,我们把专业的诊断能力装进了用户的手机里,让每一次 照一照都变得有据可依。这不仅帮用户省下了去医院的冤枉钱,更通过精准的商品推荐,打通了“诊断-治疗-购药”的商业闭环。

这就是 AI 赋能宠物经济的最佳实践路径。

声明:该内容由作者自行发布,观点内容仅供参考,不代表平台立场;如有侵权,请联系平台删除。
标签:
图像识别
AI+IoT 融合
模型部署