在消防安全管理中,灭火器是否放置在指定位置、数量是否足够,是日常巡检的核心内容。如果仅依靠人工记录,很容易出现漏检或填表式应付。借助Android设备的摄像头,配合轻量级目标检测模型,可以实时识别画面中的灭火器,并给出大致位置和置信度。这种方式不依赖额外硬件,适合巡检人员、仓库管理员或商场安保人员在手机上快速完成检查。

一、灭火器检测的两条主要技术路线
实现灭火器检测通常有两种思路。第一种是传统图像处理方法,利用灭火器瓶体通常为红色的先验知识,先用OpenCV把摄像头帧从RGB色彩空间转换到HSV色彩空间,然后根据红色色调范围提取掩码,再进行形态学膨胀和腐蚀操作去除小面积噪声,最后通过轮廓检测筛选出面积、长宽比满足条件的区域。这种方案不需要训练模型,开发成本低,在光线稳定、背景简单的场景下有一定效果。但它的缺点也非常明显:当现场存在红色安全帽、红色消防栓、红色海报或强反光物体时,误检率会明显上升;在逆光、阴影或灭火器被部分遮挡的情况下,召回率会快速下降。
第二种是深度学习目标检测方案。典型做法是选择YOLOv5、YOLOv8、SSD或EfficientDet等检测模型,使用包含灭火器的图像训练出轻量级模型,再转换为TensorFlow Lite格式部署到Android端。深度学习模型能够自动学习灭火器的形状、纹理和上下文信息,对光照变化和复杂背景的适应能力更强。虽然前期需要准备数据集并训练,但在实际环境中通常可以获得更稳定的检测效果。对于灭火器这类形状相对固定但环境变化大的目标,建议优先选择深度学习路线。
两条路线的核心区别可以概括为:传统方法依赖人工设计的颜色和轮廓特征,规则简单但脆弱;深度学习方法依赖数据驱动,训练成本高但泛化能力更好。如果只是做原型验证,可以先从HSV颜色分割入手;如果要面向真实巡检场景,最好直接使用YOLO系列模型。
二、训练自定义灭火器检测模型
训练模型的第一步是采集数据。建议拍摄500到2000张包含灭火器的图片,覆盖不同角度、距离、光照条件以及部分遮挡情况。图片中既可以只有单个灭火器,也可以包含多个灭火器。采集时应尽量模拟巡检现场,例如走廊、仓库、地下车库、商场通道等。画面中的灭火器可以是壁挂式、落地式或放置在灭火器箱内。数据多样性越丰富,模型在实际使用中的鲁棒性越好。
采集完成后需要使用标注工具标注目标框。LabelImg、Roboflow、Make Sense都是常用的标注工具,标注时只需要标注一个类别,例如fire_extinguisher。标注结果可以导出为YOLO格式的txt文件,也可以导出为Pascal VOC格式的XML文件。以YOLOv8训练为例,数据集目录结构可以按照images和labels分别存放训练集、验证集,然后创建一个数据集配置文件。下面是一个简单的data.yaml示例:
train: dataset/images/train val: dataset/images/val nc: 1 names: ['fire_extinguisher']
训练过程可以使用Ultralytics提供的训练接口。安装ultralytics库后,只需几行命令即可启动训练。训练时需要根据显存大小调整batch size,并设置合适的输入分辨率,例如640x640。如果检测目标在画面中占比较小,可以适当提高输入分辨率,但会增加推理耗时。训练完成后,模型会生成best.pt或last.pt权重文件。
为了部署到Android,需要把PyTorch模型转换为TensorFlow Lite格式。以YOLOv8为例,可以先使用ultralytics导出ONNX格式,再通过onnx2tf或官方转换脚本转为TFLite。如果不追求极致的检测精度,可以使用FP16量化甚至INT8量化。INT8量化会带来一定精度损失,但模型体积可以从几十MB压缩到几MB,推理速度也会有明显提升。转换完成后,将.tflite文件放入Android工程的assets目录即可。
三、在Android端集成CameraX与TensorFlow Lite
Android端主要使用CameraX获取相机帧,再把帧送入TensorFlow Lite解释器进行推理。首先在模块的build.gradle中添加相机和TensorFlow Lite相关依赖。示例配置如下:
dependencies {
def camerax_version = "1.3.1"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-view:${camerax_version}"
implementation 'org.tensorflow:tensorflow-lite:2.14.0'
implementation 'org.tensorflow:tensorflow-lite-gpu:2.14.0'
implementation 'org.tensorflow:tensorflow-lite-support:0.4.4'
}
同时需要在AndroidManifest.xml中声明相机权限。注意权限标签需要用<uses-permission>,并且如果应用只用于巡检,通常不需要存储权限,因为检测结果可以直接显示在界面上。申请相机权限后,可以通过CameraX的ImageAnalysis用例持续获取图像帧。为了兼顾实时性和功耗,建议将分析分辨率设置为640x480或640x640,并在检测过程中通过跳帧控制推理频率。
加载模型时,先读取assets中的.tflite文件,创建Interpreter实例。如果设备支持GPU,可以优先使用GPU委托来加速推理。GPU委托能够显著减少单帧耗时,特别适合YOLO这类计算量较大的检测模型。下面是一段Kotlin预处理代码,负责把Bitmap缩放到模型输入尺寸,并转换为浮点Buffer:
private fun preprocess(bitmap: Bitmap): ByteBuffer {
val resized = Bitmap.createScaledBitmap(bitmap, 320, 320, true)
val byteBuffer = ByteBuffer.allocateDirect(4 * 320 * 320 * 3)
byteBuffer.order(ByteOrder.nativeOrder())
val pixels = IntArray(320 * 320)
resized.getPixels(pixels, 0, 320, 0, 0, 320, 320)
for (pixel in pixels) {
val r = (pixel shr 16) and 0xFF
val g = (pixel shr 8) and 0xFF
val b = pixel and 0xFF
byteBuffer.putFloat(r / 255.0f)
byteBuffer.putFloat(g / 255.0f)
byteBuffer.putFloat(b / 255.0f)
}
return byteBuffer
}
推理完成后,输出张量中会包含多个候选框、类别置信度和坐标信息。对于YOLOv8的TFLite模型,输出形状通常为[1, 84, 8400]或[1, 25200, 85]这类形式,需要根据模型的具体导出方式解析。一般来说,前4个值对应中心点坐标和宽高,后面的值对应类别置信度。解析出候选框后,还要执行非极大值抑制,去掉重叠度过高的重复检测框,然后根据置信度阈值过滤弱检测结果。
得到最终检测框后,需要把模型输出坐标映射回预览画面的实际坐标。因为模型输入是缩放后的正方形图像,而预览画面可能是16:9或其他比例,所以在绘制矩形框时要做坐标转换,避免框的位置偏移。可以把检测框绘制在自定义Overlay上,通过Canvas实时画出灭火器位置和标签。如果在连续多帧中检测到灭火器,可以增加一个简单的时序校验,例如连续3帧置信度都高于0.6才触发提醒,这样能减少抖动和偶发误报。
四、降低误报与现场落地建议
实际部署时,灭火器检测很容易受到红色消防栓、红色椅子、红色广告牌等干扰。除了使用深度学习模型外,还可以在推理后增加后处理规则。例如提取检测框区域,计算红色像素占比,如果占比过低则剔除该候选框。对于灭火器而言,瓶体通常为高饱和红色,并且检测框的宽高比在一定范围内。这些规则可以作为二次过滤,在不增加模型计算量的前提下降低误报。
性能方面,Android设备的计算能力差异较大。低端设备上运行YOLO模型可能只有几帧每秒,勉强可用;中高端设备配合GPU委托可以达到15到30帧。如果只是巡检打卡场景,不需要追求高帧率,可以采取间隔检测策略,例如每300毫秒分析一帧。这样既能保证检测灵敏度,又能控制发热和电量消耗。此外,模型输入分辨率不宜过高,320x320或416x416通常足够识别画面中的灭火器。
从工程角度看,灭火器检测应用应与巡检流程结合。检测到灭火器后,可以在界面显示绿色框和置信度,并记录当前时间和位置。如果没有检测到,则提示巡检人员注意该区域是否存在缺失或遮挡。所有推理都在本地完成,不需要上传视频流,这对商超、仓库等对隐私敏感的场景非常友好。后续如果要扩展识别其他消防设备,比如消防栓、应急灯、安全出口标志,可以在数据集中增加相应类别,并重新训练模型。
综合来看,在Android端实现灭火器检测并不是一件特别复杂的事情。核心工作集中在数据集准备、模型训练与转换、CameraX接入和推理后处理这几个环节。只要选择合适的目标检测模型,并结合现场环境做误报控制,就可以在较短时间内开发出一个可用的消防巡检原型。