宠物App的AI优化思路:伍德氏灯下的光谱分析
目录
猫咪皮肤病发病率高达 60%,其中猫癣占比超过 40%,且极易传染给免疫力低下的老人和儿童。当铲屎官发现猫咪耳后秃了一块、有皮屑时,第一反应往往是焦虑:“这是猫癣吗?会传染给我家孩子吗?要去医院吗?”
去一次宠物医院,挂号、检查加药费,¥350 起步是常态,还得冒着交叉感染的风险。于是,大量用户选择自行购买伍德氏灯(紫外线灯)在家照照看。这种灯在电商平台售价仅 ¥15-50,年销量超 300 万台。
但问题是,家里硬件有了,铲屎官的知识却没跟上。
当用户打开伍德氏灯,看到猫咪皮肤泛出绿色、蓝白色、暗红色的荧光时,彻底懵了:“到底哪种颜色是猫癣?这团蓝白光是真菌还是皮屑?涂了药之后的荧光残留又是什么?”
这正是痛点所在:有设备,无解读能力。
对于宠物 App 来说,这是一个绝佳的切入点。利用 AI 技术,填补用户的知识空白,将几十块的紫外线灯升级为家庭智能皮肤科医生。
1. 技术拆解
实现居家诊断,我们需要解决三大难题:环境光线太暗、手机拍摄偏色严重、以及肉眼难以区分的色彩差异。
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 赋能宠物经济的最佳实践路径。



