从测试转开发后,我用计算机视觉搞了个“区块链+AI”缝合怪?别急,听我慢慢道来

代码里的风
2025-12-18 22:02
阅读 592

兄弟们,还记得那个天天在 Jira 里给你提 bug、在测试报告里写“无法复现”的 QA 吗?没错,那就是两年前的我。现在嘛——我已经是个正儿八经的 Rust 学徒(自称),MacBook Pro 上常年开着 VS Code + Docker + tmux 的三件套,Windows 虚拟机只在需要测兼容性时才启动一下(还得骂一句“这破系统又蓝屏了”)。

我在现在的团队快干满两年了,从最初只会点点点写测试脚本,到现在能独立负责一个模块的后端+部分算法集成,说实话,一路走来全靠“被需求推着跑”。上周五晚上十一点,我还在改一个 CV 模型的推理延迟问题,产品经理突然在群里@我:“这个功能双11前必须上线,对齐下排期。” 我默默咽下第 N 杯速溶咖啡,心想:行吧,反正头发也没剩几根了。

今天想跟大家唠唠最近做的一个计算机视觉实战项目——听起来高大上,其实一开始就是个临时救火需求。但有意思的是,过程中我们居然把算法区块链这两个看似八竿子打不着的东西给“缝”在了一起。别笑,真不是为了凑 buzzword,是业务逼的!


事情的起因:老板说要“溯源防伪”

去年 Q4,公司接了个新业务线——高端农产品溯源。简单说,就是给每箱有机草莓贴个二维码,消费者扫码能看到这箱草莓从种植、采摘到物流的全流程。听起来挺美好,对吧?

但问题来了:怎么证明你扫出来的“种植记录”是真的?万一农户随便拍张别人家的地,P 张图上传系统,平台背书了,结果货不对板,最后锅还是我们背。

产品经理拍脑袋:“加个 AI 图像识别!自动判断上传的照片是不是真实场景。”
技术总监补刀:“再上个区块链存证,保证数据不可篡改。”

我坐在工位上,手里的 M1 Max 都感觉烫手了——我一个半路出家的开发者,又要搞 CV,又要碰链?当时真想回老家种草莓。


别慌,先拆解问题

冷静下来一分析,其实核心就两块:

  1. 图像真实性验证:用户上传一张农田照片,系统要判断它是否符合“真实草莓种植场景”的特征。
  2. 可信存证:一旦判定为真,就把这张图的元数据(哈希、时间戳、GPS、模型置信度等)写入区块链,后续不可抵赖。

第二点还好说,我们用的是 Hyperledger Fabric(内部私有链),API 封装得挺成熟。难的是第一点——怎么让算法“看懂”一张图是不是真的草莓地


数据比模型更重要(血泪教训)

我一开始天真地以为,直接拿个 ResNet50 微调一下就行。结果?训练集只有 200 多张图,还是从内部员工手机里东拼西凑来的。模型在训练集上准确率 98%,一上测试集(也就是农户自己拍的糊图、逆光图、甚至拿手机对着电脑屏幕拍的图),直接崩到 60%。

“你这模型怕不是学会了识别‘办公室窗户反光’?” —— 我们的 CV 老哥(科班出身,人狠话不多)看完结果后如是说。

痛定思痛,我们决定重新搞数据。花了两周时间,联合运营团队,跑到合作农场实地采集了3000+ 张高质量图像,涵盖不同天气、光照、角度、生长阶段。更关键的是,我们还收集了负样本:比如普通草地、其他水果田、室内摆拍、网络盗图等。

最终数据集结构如下:

类别 数量 特点
真实草莓田(正样本) 2800 多角度、多时段、含 GPS 元数据
普通农田/草地(负样本) 600 易混淆场景
室内/摆拍(负样本) 400 手机拍摄,常见于造假
网络图片(负样本) 300 带水印、分辨率异常

有了靠谱数据,模型才有救。


算法选型:轻量级才是王道

我们的服务要部署在边缘设备(农场网关),算力有限,GPU?不存在的。所以模型必须小、快、准

对比了几种方案:

模型 参数量 推理速度(CPU) 准确率(验证集) 是否适合边缘
ResNet50 ~25M 800ms 92% ❌ 太重
MobileNetV2 ~3.4M 120ms 89%
EfficientNet-Lite0 ~4.3M 150ms 91%
自研蒸馏小模型 ~1.8M 70ms 88% ✅✅

最后我们选了 MobileNetV2 + Focal Loss 的组合。为什么不用更准的 EfficientNet?因为实测发现,在低光照场景下,它的误判率反而更高。而 MobileNet 对模糊和低对比度图像更鲁棒——这点在农田环境太重要了。

训练时还踩了个坑:没做数据增强。第一次训完,模型对旋转、裁剪极度敏感。后来加上了 albumentations 库的随机亮度、对比度、旋转、仿射变换,泛化能力立马提升。

# 训练时的数据增强 pipeline(PyTorch)
transform = A.Compose([
    A.RandomRotate90(),
    A.Flip(),
    A.Transpose(),
    A.OneOf([
        A.IAAAdditiveGaussianNoise(),
        A.GaussNoise(),
    ], p=0.2),
    A.OneOf([
        A.MotionBlur(p=0.2),
        A.MedianBlur(blur_limit=3, p=0.1),
        A.Blur(blur_limit=3, p=0.1),
    ], p=0.2),
    A.ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.2, rotate_limit=15, p=0.2),
    A.OneOf([
        A.OpticalDistortion(p=0.3),
        A.GridDistortion(p=0.1),
        A.IAAPiecewiseAffine(p=0.3),
    ], p=0.2),
    A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ToTensorV2()
])

训练完导出 ONNX,再用 TensorRT 优化(虽然边缘设备没 GPU,但 CPU 推理也受益于算子融合),最终推理时间压到了 90ms 以内,满足业务要求。


区块链?真不是为了装 X

很多人一听“区块链+AI”就觉得是炒作。但在这个场景里,区块链确实解决了信任问题

流程是这样的:

  1. 用户上传图片 → 系统调用 CV 模型判断是否为真实草莓田
  2. 如果置信度 > 0.85,则生成一条存证记录,包含:
    • 图片 SHA256 哈希
    • 模型输出的类别和置信度
    • 拍摄时间 & GPS 坐标(来自 EXIF)
    • 农户 ID
  3. 调用 Fabric Chaincode,将上述数据写入区块
  4. 返回交易 ID 给前端,消费者扫码即可查看完整溯源链

关键在于:一旦上链,谁都改不了。哪怕我们平台内部有人想作假,也得控制超过 2/3 的节点——而节点分布在合作农场、物流公司、监管方手里。

代码层面其实很简单,就是一次 gRPC 调用:

// Go 服务调用 Fabric SDK(简化版)
func RecordEvidence(evidence Evidence) (string, error) {
    client := fabric.NewClient("peer0.farm.example.com")
    resp, err := client.InvokeChaincode("traceability", "recordImage", []byte(evidence.JSON()))
    if err != nil {
        return "", fmt.Errorf("blockchain write failed: %v", err)
    }
    return string(resp.Payload), nil
}

但调试过程差点让我秃了——Fabric 的 TLS 证书、MSP 配置、链码版本对齐……每次改一点都要等 10 分钟部署。运维大哥看我眼神都带怜悯:“又卡链上了?要不要给你泡杯枸杞?”


效果如何?上线后的真实反馈

双11前一周,系统终于灰度上线。首周处理了 12,000+ 张图片,其中 8,300+ 被判定为真实场景并上链,其余被拦截(多数是室内摆拍或网络盗图)。

最惊喜的是,误判率低于 3%。有次系统拒了一张图,农户打电话投诉,结果我们调出 EXIF 发现——他是在自家客厅用投影仪放草莓田视频,然后对着屏幕拍的!AI 居然识别出了投影的摩尔纹和色偏,牛!

当然也有翻车时刻。有一次暴雨天,照片全是水珠和模糊,模型直接判假。后来我们紧急加了个“人工复核”通道,并在模型输入前加了去雾预处理模块(用的是轻量级 DehazeNet 变种),问题缓解了不少。


从测试转开发的感悟:别怕跨界

写这篇文章的时候,我刚用 Rust 重写了图像预处理模块(性能比 Python 快 3 倍,内存占用少一半)。虽然还在啃《The Rust Programming Language》,但那种“零成本抽象”和“内存安全”的爽感,真的会上瘾。

回头看这个项目,其实没啥黑科技。核心就三点:

  • 数据质量 > 模型复杂度
  • 业务场景决定技术选型(别一上来就上 Transformer)
  • 区块链不是万能药,但在需要多方信任的场景,它真香

如果你也是非科班出身,或者正从测试/运维转开发,别怕碰算法、碰新领域。我当年连卷积是啥都不知道,现在不也能搞 CV+链?

最后送大家一句我们团队墙上贴的话(老板写的,但意外地不鸡汤):

“技术没有高低贵贱,能解决问题的就是好技术。”

好了,我去 fix 一个线上 bug 了——听说又有农户试图用 Photoshop 把西瓜 P 成草莓……这届用户,真是越来越卷了啊。

(完)

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝