
如果你搞过水产养殖或者哪怕只是在水库边看人喂鱼都会发现一个很有意思的现象鱼到底吃饱了没有、状态好不好、有没有生病几乎全凭老师傅的经验来判断。水面一有动静就撒料结果一半饲料沉底浪费鱼浮头了才想起来增氧损失已经跑不掉了。我做这个叫Fish Sense的项目就是想给鱼塘装上一套“读心术”用传感器和行为识别去理解鱼在干什么把“经验”变成“数据”。这个项目前前后后折腾了快一年从最早的一颗水下摄像头到最后的多传感器融合系统中间踩了不少坑也沉淀了一套可以复用的思路。这篇文章就围绕 Fish Sense 的完整实现过程展开从为什么选这条技术路线、传感器怎么选、数据怎么解到实际部署中遇到的典型问题、排查方法尽量把我试过并且验证可行的方案写清楚。适合智慧渔业相关方向的开发者、规模化养殖场的技术负责人以及想用低成本方式改造传统鱼塘的DIY爱好者。1. 项目整体设计与思路拆解1.1 为什么叫“Fish Sense”项目名字其实有两层含义。第一层是“鱼的感官”也就是鱼类本身拥有的视觉、听觉、嗅觉、触觉和侧线感知系统这些感官决定了鱼如何与环境互动。第二层是“对鱼的感知”也就是我们如何借助传感器去捕捉鱼的行为信号。这两个方向并不矛盾恰恰是整个系统的设计起点想理解鱼的行为就得先理解鱼靠什么感知世界。传统养殖的问题在于信息链路太短。养殖户能看到的就是水面波纹和偶尔浮上来的鱼水面之下的状态几乎全盲。鱼不吃食、群游异常、贴底不动这些信号肉眼很难及时捕捉等发现的时候往往已经错过了最佳干预窗口。Fish Sense 的思路不是去替代人的经验而是把人的经验转化成一堆可以量化的指标让机器帮我们盯着水面之下的世界。1.2 系统架构从感知层到应用层整个系统我按四层架构来设计感知层、传输层、处理层和应用层。感知层负责采集原始信号包括水下摄像头、水听器、水质传感器、溶氧探头等传输层负责把信号送回边缘计算设备或服务器处理层跑行为识别算法和预警逻辑应用层则是给养殖户看的手机端和Web端界面。这套架构和常规的物联网系统没有本质区别但真正的难点在感知层和处理层。为什么这两个层最难因为水下环境和地面环境差异太大光线衰减、水流扰动、气泡干扰都会让传感器数据变脏而鱼的行为又高度随机算法很容易误判。所以我在设计之初就确定了一个原则不追求单一传感器的高精度而是用多传感器交叉验证来降低误报率。这也直接影响了后面的硬件选型和算法设计。1.3 方案选型为什么坚持多传感器融合我见过不少同行做单摄像头方案成本低、部署简单但实际效果不太理想。水下能见度受天气和水质影响很大一场雨过后摄像头能看到的范围可能从两米缩到半米夜间更是几乎全盲。单靠视觉判断鱼的状态等于让系统只睁着一只眼睛工作。Fish Sense 选择了四条数据通道并行视觉通道看鱼的集群密度和游动姿态声学通道听摄食声和异常拍击声水质通道监测溶氧、温度、pH值压力阵列参考侧线原理感知水流扰动。四条通道各有盲区但叠加起来覆盖率大幅提高。比如鱼缺氧时往往先表现为呼吸急促、贴壁缓慢游动然后才会浮头。视觉通道可以在游动异常阶段就发出警报而水质通道在溶氧掉到阈值以下时直接联动增氧机双通道验证后误报率明显下降。2. 鱼类“感官语言”是如何被机器感知的2.1 侧线系统与水流压力阵列鱼身上有一套我们人类没有的感知系统叫侧线。它分布在鱼体两侧由一系列神经丘组成能感知水流速度变化、低频振动和周围物体的位移。鱼群在夜间甚至看不见的情况下也能保持队形靠的很大程度上就是侧线。我在设计 Fish Sense 的传感方案时借鉴了侧线的工作原理在水域里布置几个微型压力传感器采集水压的微小波动。当鱼群快速转向、捕食、受惊逃窜时会产生特征明显的水流压力变化。经过滤波处理之后这些压力信号可以成为判断鱼群运动状态的辅助依据。压力阵列选型时要注意两个参数灵敏度和响应频率。普通的气压传感器不行必须用水介质压力传感器量程不需要太大0到10米水柱足够但响应频率至少要达到10Hz以上。实测下来一个小鱼群在五米外游过时压力变化幅度大概在10到50Pa之间需要传感器有足够的分辨率才能捕捉到。有朋友可能会问直接用声呐不是更好吗声呐确实能探测鱼群位置但价格高而且对近岸浅水区域分辨效果差。压力传感阵列的优势是便宜、功耗低、不受光照影响虽然数据解释难度大一些但作为辅助通道完全够用。2.2 声学通道摄食声与异常声响水下是声音的世界。鱼在摄食时会发出高频的拍击声和咀嚼声这些声音和日常游动产生的水流声频谱特征差异很大。利用水听器收集水下声音信号再通过频谱分析提取特定频段的能量变化就能判断鱼是不是进入了活跃摄食状态。水听器的选择上我推荐频响范围在20Hz到20kHz之间的产品基本覆盖淡水鱼类行为声信号的主要频段。安装时要避免贴近增氧机否则增氧产生的气动噪声会完全淹没鱼的声音信号。实际部署中我习惯把水听器安装在投饵机对侧偏下的位置这个位置既能采集到摄食声又能避开投饵机落料时直接砸中传感器产生的机械噪声。调参过程中最有意思的是“抢食声”和“正常游动声”的区分。抢食时声音的能量集中在较窄的频带上且短时脉冲重复率高正常游动声音则比较平缓。我用一个滑动窗口计算声谱的峰度峰度突然升高基本就是摄食事件。这个方法简单、不依赖大量训练数据在实验室池塘里实测准确率能到85%以上。2.3 视觉通道集群密度与游动姿态视觉通道在水下环境里挑战最大。首先是光线问题水下五米深的光照强度可能只有水面的十分之一其次是悬浮颗粒散射导致画面对比度严重下降。所以水下摄像机一定要选带补光功能的同时尽量选择广角镜头因为窄视角在浑浊水里能捕获的有效画面太少。图像处理方面我用了轻量化的目标检测模型检测画面中的鱼再用聚类算法估算集群密度。鱼群密集时个体间遮挡严重直接计数很难但估算密度并不需要精确到个位数。我只需要把画面中鱼的像素占比计算出来再结合鱼的平均大小映射成密度等级。这个思路在算法复杂度上比逐条识别低一个量级边缘设备跑起来毫无压力。视觉通道最能提供价值的是识别异常姿态。鱼生病或者中毒时会出现倾斜游动、螺旋游动、无力漂浮等异常姿态。这类姿态在正常鱼群中占比极低所以算法只需要统计异常姿态目标的比例一旦超过阈值就触发预警。虽然水中视线受限但这个指标在光照条件好的白天池塘里非常有效。2.4 水质传感器行为数据的“背景板”给 Fish Sense 配上水质传感器最初的想法很简单行为数据需要结合水质来解释。鱼游动缓慢可能是刚吃饱在休息也可能是缺氧前兆单靠行为数据分不清。有了溶氧、温度、pH数据判断的把握就大得多。溶氧传感器是这套系统里成本占比最高的部件之一。便宜的荧光法溶氧探头要一两千元但它的长期稳定性远好于电化学法探头维护周期也长。我的建议是溶氧探头不要省这是最容易出真问题的地方。温度传感器和pH探头相对便宜但要注意定期校准pH探头在养殖水体里漂移速度很快一个月不校准数据基本就不能用了。水质数据在系统里还有一个作用作为行为识别模型的上下文特征。同样的游动速度在低温和高温下含义完全不同同样的摄食强度在溶氧充足和低溶氧时反映的饥饿程度也不同。把水质数据放进模型相当于给行为数据加了一个“环境标签”能显著提升预测准确率。3. 核心硬件选型与配置指南3.1 传感器选型清单与理由Fish Sense 的硬件清单我在不同阶段调整过好几版最终稳定下来的版本如下模块推荐型号类型关键参数参考成本水下摄像头200万像素、广角、带红外补光分辨率1080P、帧率25fps、补光距离3m、IP68600-1500元水听器压电式水听器频响20Hz-20kHz、灵敏度-190dB re 1V/uPa800-2000元压力传感器水介质微型压力传感器量程0-100kPa、分辨率1Pa、响应频率10Hz200-500元/个溶氧传感器荧光法溶解氧探头量程0-20mg/L、精度0.1mg/L1200-3000元温度/pH传感器工业级pH电极温度探头pH精度0.01、温度量程0-60℃300-800元边缘计算设备低功耗AI边缘盒子算力3-8TOPS、支持RTSP、GPIO1000-2500元摄像头是整套系统里视觉通道的基础。我试过普通监控摄像头加防水壳的组合效果很差因为水下光路和空气里完全不同普通镜头在这种场景下画质衰减严重。专业水下摄像机通常做了色差校正并且在防水壳内部填充了光学级密封胶画面通透度好很多。如果预算有限至少也要选带自动白平衡和宽动态功能的机型。边缘计算设备是整个系统的算力核心。算力不需要太高但必须支持硬解码和常见的深度学习框架。我目前在用的是瑞芯微RK3588方案的边缘盒子跑YOLOv5系列轻量模型1080P视频流的推理帧率能到15fps以上足够实时处理。3.2 防水、供电与线缆布设水下设备的防水和供电是项目里最容易翻车的环节。IP68是防水等级的基本要求但这不等于你可以放心把设备丢在水里就不管了。实际使用中防水壳的密封圈两三个月就会老化衔接处是最容易进水的部位。我的做法是每季度打开设备检查一次更换密封圈同时在接线端子处涂一层硅脂做二次防护。供电方案方面水下摄像头和水听器一般优先考虑POE供电一根网线同时解决电力传输和视频传输不用单独拉电源线。但POE供电距离有限超过100米就需要考虑光缆或无线方案。我的一个试点鱼塘有接近200米的岸线距离最终在岸边中间位置增设了一个防水配电箱用48V电压送到边缘盒附近再降压给各传感器供电有效压降控制的在3%以内。线缆布设还有一个容易被忽略的细节水下部分要预留一定长度的松弛量。因为水流会带动设备移动线拉太紧容易在接口处撕裂。我用浮力绳加铅坠的方式固定水下设备让线缆呈自然弯曲状态既减小了拉力也方便后期收线维护。3.3 数据汇聚与通信方案数据汇聚层我采用的是RS485总线和以太网混合方案。水质传感器走RS485总线一条两芯双绞线最多可以挂载32个设备简单可靠摄像头和水听器走以太网接入边缘盒子。边缘盒子做本地处理和缓存然后通过4G路由器把关键数据回传到云端。为什么没有直接用Wi-Fi水边的环境信号干扰很严重而且鱼塘往往在郊区Wi-Fi覆盖范围有限。4G方案虽然要每月流量费但胜在稳定。边缘盒子本地只上传处理结果和预警信息视频流按需调取一个月流量控制在5GB以内。通信方面我踩过的最大坑是雷击。鱼塘周围空旷设备又靠近水面雷雨天特别容易感应雷击损坏设备。后来我在所有岸上设备的电源入口加了防雷模块传感器线缆入口加了隔离变压器问题才基本解决。强烈建议所有做户外物联网项目的朋友防雷不要省一次设备损坏的损失远高于防雷模块的成本。4. 软件核心算法与数据模型4.1 行为特征如何量化软件算法是整个系统的灵魂。行为识别不能只靠“看着像”来下结论得把行为变成数字。我定义了三类核心特征向量运动活跃度通过对视觉通道中鱼的位移速度进行中值滤波得到一段时间内的平均游动速度。鱼刚刚投喂时活跃度会快速上升吃饱后逐渐下降。饥饿状态下鱼在水体中层缓慢游动活跃度处于一个较低但持续的状态。集群紧密程度用目标检测结果计算鱼群包围盒面积与个体数量之比。聚集越紧密数值越小分散游动时数值大。摄食时集群度显著升高而应激反应比如受到惊吓时鱼群会瞬间散开再聚拢产生一个特征明显的V形曲线。声音脉冲密度对水听器信号做短时傅里叶变换统计指定频段内超过能量阈值的脉冲次数。这个指标对摄食行为特别敏感摄食声音脉冲密度通常能达到正常状态的三到五倍。三个特征向量乘上水质上下文在边缘盒子上组装成行为特征张量然后输入到一个轻量级分类器里。模型的输出不是简单的标签而是一个概率分布比如某个时刻鱼处于“摄食状态”的概率0.8、“正常游动”的概率0.15、“异常状态”的概率0.05。在实际系统中我会设置一个决策阈值只有概率超过阈值才触发对应动作这样能有效减小误报。4.2 异常预警与投喂联动逻辑预警逻辑的设计原则是人机协同机器提供信息人来做最终决策。系统里几类典型的预警每一个都有独立的触发条件预警类型触发条件联动动作缺氧预警溶氧低于3.0mg/L且持续10分钟自动开启增氧机App推送摄食响应不足投喂后10分钟声音脉冲密度低于阈值降低下次投喂量提示检查鱼体异常游动预警异常姿态目标比例高于5%持续5分钟连续抓拍图片推送人工复核漏水/设备故障湿度传感器显示机壳进水断电保护短信通知投喂量优化是这套系统的核心价值所在。过去养殖户投喂主要靠经验喂少了鱼长得慢喂多了饲料浪费且污染水质。Fish Sense 采用一个简单的反馈控制逻辑上一餐的摄食强度和剩饵情况作为反馈信号计算下一餐的投喂量。具体算法我用了一个比例控制模型。基本投喂量为鱼体总重量的2%到3%如果上一餐摄食强度高、剩饵少则增加3%到5%的投喂量反之如果摄食状态差则减少并警示。这套逻辑虽然朴素但落地效果很好。在我试点的两个鱼塘里使用Fish Sense之后饵料系数养殖中衡量饵料利用率的指标平均降低了0.15到0.2换算下来相当于每生产一公斤鱼节约了150到200克饲料。4.3 从零训练行为分类模型的完整思路行为分类需要的标注数据不多关键是得规划好采集流程。我建议准备一块独立的观察池布置好摄像头和水听器后定期录制鱼群在不同状态下的视频和音频。标注工作可以在录制的时候顺手做比如在投喂前、投喂后、增氧前、凌晨等关键时间节点打上标签。数据增强对水下场景特别重要。水下视频的光照和浑浊度变化很大我用了亮度抖动、对比度调整、仿射变换等方式扩充数据集另外把白天和夜间的数据分开训练两个版本模型。夜间模型对红外补光图像做了专门的适配实际使用下来夜间识别的准确率比通用模型高出很多。在边缘盒子上部署模型时我用了模型剪枝和量化把YOLOv5s的权重从14MB压缩到5MB左右推理速度提升了近一倍。这个过程不用太担心精度损失我用的是INT8量化实测mAP只下降了不到两个百分点对行为识别的场景完全够用。5. 实战部署从鱼塘到系统跑通5.1 部署前的现场勘测与点位规划部署前不要急着安装设备先去塘边把环境和点位搞清楚。我一般会做这几件事记录鱼塘的长宽、水深分布图、投饵机位置、增氧机位置、岸边有无高大遮挡物再用溶氧仪在不同位置、不同时间段测几组数据做基线。点位规划的原则是传感器布设要有代表性不求全覆盖。摄像头和水听器尽量靠近投饵机因为摄食行为是最有价值的观察窗口水质探头要避开增氧机附近否则增氧时溶氧值会虚高压力传感阵列布设在鱼群常经过的通道上如果鱼塘形状不规则可以先观察几天鱼群的巡游路径再确定。我在一个矩形鱼塘的部署方案是这样的投饵机在东南角摄像头在水深1.5米处对着投饵区域水听器在对侧偏南溶氧探头在鱼塘中央偏北位置压力传感器阵列布设在东西向通道上距离岸边大约4米。这样布设的优势是各个传感器的覆盖区域有一定重叠但又不完全重合交叉验证效果好。5.2 安装步骤与接线顺序安装过程我整理了七个步骤顺序不能乱先装配岸上设备配电箱、边缘计算盒子、4G路由器、防雷模块全部固定好并通电测试。再布设水下传感器按从远处到近处的顺序先把溶氧探头放到目标深度再放水听器和压力传感器最后安装水下摄像头。线缆全部走波纹管保护从岸边入水处要有弯头防水处理。摄像头画面调通后再装回防水壳避免反复开关密封圈。所有传感器上电后用校准液校准溶氧探头和pH探头。在边缘计算盒子上逐个接入数据流确认每个通道都在正常推送数据。最后跑一次完整的投喂-摄食-反馈流程验证预警联动逻辑。这里特别提醒一句水下设备的安装顺序是有讲究的。先安装远端设备再安装近端设备因为一旦线路走好远端设备出问题需要重新布线成本很高。宁可在前期花一个小时把位置确认好也不要装完再返工。5.3 系统阶段校准与阈值调整技巧系统上线后不要急着设高灵敏度的预警阈值先让它跑一两个星期收集正常数据。我强烈建议做一个“正常状态画像”记录每个时间段的溶氧值范围、水温变化、鱼群活跃度基线。没有这个基线后面设阈值就是瞎猜。阈值设置方面我总结了一个简单方法。先看历史数据里正常状态下的指标分布取平均值加减两个标准差作为“绿色区间”超过这个范围就触发关注当指标达到平均值的三倍标准差时才触发强预警。这个统计方法虽然粗糙但好处是能自动适应不同鱼塘的差异化环境。甲鱼塘和草鱼塘的指标分布完全不同用一个固定阈值必然出问题。校准频率上水质传感器建议每周人工比对一次溶氧探头用饱和空气法校准pH探头用标准液校准。水下摄像头每两周提升到水面清理一次镜头表面的附着物如果水质比较肥清理频率需要加密。压力传感器和传感器之间的校准主要是零漂检查每个月做一次即可。6. 常见问题与排查技巧实录6.1 典型故障现象与排查路径项目运行大半年遇到的问题不少我整理成一个速查表现象可能原因排查与解决水下画面模糊镜头结垢或起雾提上水面清洁检查防水壳密封溶氧值持续不变探头膜片脏污或老化清洗膜片用饱和空气法重新校准摄食声识别不灵敏水听器被泥沙覆盖清理水听器表面调整安装高度夜间误报频繁补光灯角度不合适调整补光灯角度或切换夜间模型4G信号不稳定天线位置靠近水面把天线支架升高避开水面反射多设备时间不同步边缘盒子未同步时钟配置NTP时间同步服务水下摄像头起雾是我遇到的最高频问题。起雾的原因是防水壳内外温差大空气湿度高时水汽在镜头内壁凝结。解决办法有两种一是在防水壳里放干燥剂包二是提前让设备在水面上空运行一会儿等壳内温度接近目标深度水温后再放入水中。第二种方法更有效因为是从根源上消除了温差。6.2 数据漂移与长期稳定性维护任何传感器用久了都会有漂移水下环境会加速这个过程。溶氧探头荧光膜的衰减、pH电极的电解液消耗、水听器灵敏度降低这些都会导致数据失真。我在系统里做了一个简单的漂移检测逻辑每天晚上固定时间比较各传感器的读数与前一天同时段的读数如果变化超过某个容忍带且没有对应的实际事件比如投喂、增氧就标记为“疑似漂移”并提醒人工校验。长期维护方面我还摸索出一个“值班巡检”制度。哪怕是全自动化系统每周也要有人去看一次检查设备表面附着物、线缆磨损、供电情况。很多隐患都是在巡检时发现的比如有一次发现岸边线缆被老鼠咬破了一个小口如果不及时发现雨季来临后大概率会短路。6.3 一些在设计和运维上的个人建议做这类系统的首要原则是降低维护成本而不是堆功能。传感器的故障率会随数量和复杂度的增加而上升如果一个小鱼塘装了一堆传感器看起来很高端但维护工作量会让人崩溃。我现在的原则是小鱼塘用核心三件套摄像头、溶氧探头、水听器大鱼塘再用全套方案。另一个建议是想清楚系统的输出边界。Fish Sense 的价值是辅助决策不是替代人。它可以告诉你鱼可能出了问题但最后怎么处理还是要人来判断。我在系统设计里特意加入了一个“人工复核”的环节所有强预警都要有现场照片作为证据避免系统乱报导致养殖户逐渐不信任系统。信任一旦没了再好的系统也白搭。最后再分享一个小技巧把系统里异常事件的时间点和人工处理结果都记录下来即使暂时不分析数据多了以后也能帮你做更精准的决策。比如积累一个完整的养殖周期后你就能发现“投喂量”“溶氧值”“摄食强度”三者之间的关联规律这比任何理论模型都更贴合你所在鱼塘的实际情况。