YOLOv8安卓实战:5分钟搞定物体检测APP开发(附完整代码)
最近在做一个智能家居项目,需要让手机摄像头实时识别家里的宠物和常用物品。试了几个方案,最后还是觉得YOLOv8最顺手——检测准、速度快,关键是社区生态好,各种部署方案都很成熟。但说实话,第一次在安卓上部署YOLOv8时,踩的坑可不少:模型转换报错、Android Studio配置冲突、推理速度慢得没法用……
折腾了几天后,我总结出了一套极简部署方案。今天分享的这套代码,你直接复制粘贴就能跑起来,从零开始到APP运行,真的只需要5分钟。我特意避开了那些繁琐的理论讲解,聚焦在实际操作中最容易卡住的几个关键点,每个步骤都附上了可运行的代码片段。
这篇文章适合有一定Android开发基础,但没怎么接触过AI模型部署的朋友。我会带你走通整个流程:模型转换、Android项目集成、实时摄像头推理,最后还会分享几个提升性能的实用技巧。
1. 环境准备与模型转换
在开始写Android代码之前,我们需要先把YOLOv8的PyTorch模型转换成移动端友好的格式。这里有两个主流选择:TensorFlow Lite和NCNN。我两种都试过,TFLite更适合新手,因为Android官方支持好,集成简单;NCNN性能通常更好,但配置稍微复杂些。
考虑到我们的“5分钟”目标,今天先用TFLite方案。如果你后续对性能有更高要求,可以再迁移到NCNN。
1.1 安装必要的Python包
首先创建一个干净的Python环境。我习惯用conda,用virtualenv或者pipenv也行:
# 创建并激活conda环境
conda create -n yolov8_android python=3.9
conda activate yolov8_android
# 安装ultralytics(YOLOv8官方包)
pip install ultralytics
# 安装TensorFlow(注意版本兼容性)
pip install tensorflow==2.13.0
这里有个关键点:TensorFlow版本。最新版的TF经常和TFLite转换工具不兼容,我试下来2.13.0最稳定。如果你遇到奇怪的转换错误,大概率是版本问题。
1.2 转换PyTorch模型到TFLite
YOLOv8官方提供了预训练模型,我们直接用yolov8s(small版本),它在精度和速度之间取得了很好的平衡。如果你有自己的数据集训练好的模型,把yolov8s.pt换成你的模型路径就行。
创建一个Python脚本convert_to_tflite.py:
from ultralytics import YOLO
# 加载预训练模型
model = YOLO('yolov8s.pt')
# 导出为TFLite格式
# format: 指定导出格式为tflite
# imgsz: 输入图像尺寸,保持640x640
# int8: 是否量化成int8(可以大幅减小模型体积,但可能损失精度)
model.export(
format='tflite',
imgsz=640,
int8=False, # 第一次尝试先用float32,稳定后再试int8量化
simplify=True
)
print("转换完成!生成的TFLite文件在:yolov8s_saved_model/")
运行这个脚本:
python convert_to_tflite.py
转换过程大概需要1-2分钟。完成后,你会在当前目录下看到yolov8s_saved_model文件夹,里面最重要的文件是yolov8s_float32.tflite(或者如果你用了int8量化,会是yolov8s_int8.tflite)。
注意:如果转换过程中报错“ImportError: generic_type: cannot initialize type 'StatusCode'”,这绝对是TensorFlow版本问题。卸载当前版本,重新安装
pip install tensorflow==2.13.0。
1.3 准备标签文件
TFLite模型需要知道每个输出类别对应的名称。YOLOv8预训练模型用的是COCO数据集的80个类别,我们需要创建一个对应的labels.txt文件:
person
bicycle
car
motorcycle
airplane
bus
train
truck
boat
traffic light
fire hydrant
stop sign
parking meter
bench
bird
cat
dog
horse
sheep
cow
elephant
bear
zebra
giraffe
backpack
umbrella
handbag
tie
suitcase
frisbee
skis
snowboard
sports ball
kite
baseball bat
baseball glove
skateboard
surfboard
tennis racket
bottle
wine glass
cup
fork
knife
spoon
bowl
banana
apple
sandwich
orange
broccoli
carrot
hot dog
pizza
donut
cake
chair
couch
potted plant
bed
dining table
toilet
tv
laptop
mouse
remote
keyboard
cell phone
microwave
oven
toaster
sink
refrigerator
book
clock
vase
scissors
teddy bear
hair drier
toothbrush
把这个文件保存好,等下要放到Android项目的assets文件夹里。
2. Android Studio项目配置
现在转到Android开发部分。我假设你已经安装了Android Studio和基本的Android开发环境。如果没有,先去官网下载安装,这个过程大概需要10-15分钟。
2.1 创建新项目
打开Android Studio,选择“New Project”,然后选“Empty Activity”。项目配置如下:
- Name: YOLOv8Detector(随便起名)
- Package name: com.example.yolov8detector
- Language: Kotlin(推荐,代码更简洁)
- Minimum SDK: API 24(Android 7.0)
点击Finish,等Gradle同步完成。第一次创建项目可能会下载一些依赖,需要点时间。
2.2 添加TFLite依赖
打开app/build.gradle.kts(如果你用的是Groovy DSL,文件后缀是.gradle),在dependencies块中添加:
dependencies {
// ... 其他依赖
// TensorFlow Lite
implementation("org.tensorflow:tensorflow-lite:2.14.0")
implementation("org.tensorflow:tensorflow-lite-support:0.4.4")
// CameraX(用于摄像头访问)
val cameraxVersion = "1.3.0"
implementation("androidx.camera:camera-core:${cameraxVersion}")
implementation("androidx.camera:camera-camera2:${cameraxVersion}")
implementation("androidx.camera:camera-lifecycle:${cameraxVersion}")
implementation("androidx.camera:camera-view:${cameraxVersion}")
// 用于权限请求
implementation("com.guolindev.permissionx:permissionx:1.7.1")
}
同步Gradle(点击右上角的“Sync Now”)。如果遇到下载慢的问题,可以修改项目的gradle.properties文件,添加阿里云镜像:
# 加速下载
systemProp.http.proxyHost=mirrors.aliyun.com
systemProp.http.proxyPort=80
systemProp.https.proxyHost=mirrors.aliyun.com
systemProp.https.proxyPort=80
2.3 添加模型和标签文件
在Android Studio的项目视图中,右键点击app/src/main,选择New → Folder → Assets Folder。如果已经存在assets文件夹,就直接使用。
把之前准备好的两个文件复制进来:
yolov8s_float32.tflite→ 重命名为yolov8.tflite(简化名称)labels.txt
完成后,你的assets文件夹结构应该是这样的:
app/src/main/assets/
├── yolov8.tflite
└── labels.txt
3. 核心检测代码实现
这是最关键的部分。我会把完整的YOLOv8推理类贴出来,你直接复制到一个新的Kotlin文件里就行。
3.1 创建YOLOv8Detector类
新建一个Kotlin文件YOLOv8Detector.kt:
package com.example.yolov8detector
import android.content.Context
import android.graphics.*
import org.tensorflow.lite.DataType
import org.tensorflow.lite.Interpreter
import org.tensorflow.lite.support.common.FileUtil
import org.tensorflow.lite.support.common.ops.CastOp
import org.tensorflow.lite.support.common.ops.NormalizeOp
import org.tensorflow.lite.support.image.ImageProcessor
import org.tensorflow.lite.support.image.TensorImage
import org.tensorflow.lite.support.tensorbuffer.TensorBuffer
import java.io.BufferedReader
import java.io.InputStreamReader
import java.nio.ByteBuffer
import kotlin.math.max
import kotlin.math.min
/**
* YOLOv8物体检测器
* 支持实时摄像头检测
*/
class YOLOv8Detector(context: Context) {
// 模型配置
private val modelPath = "yolov8.tflite"
private val labelPath = "labels.txt"
// TFLite解释器
private var interpreter: Interpreter? = null
// 模型输入输出维度
private var inputWidth = 640
private var inputHeight = 640
private var numChannels = 3
// 类别标签
private val labels = mutableListOf<String>()
// 图像处理器:归一化 + 类型转换
private val imageProcessor = ImageProcessor.Builder()
.add(NormalizeOp(0f, 255f)) // 像素值从[0,255

&spm=1001.2101.3001.5002&articleId=154715647&d=1&t=3&u=2e2e4a19ee7542f999163d5175f8cef3)
1060

被折叠的 条评论
为什么被折叠?



