返回

将best.pt转换为best-fp16.tflite格式并部署至Android端

Android

用 YOLOv5 在 Android 设备上部署目标检测

简介

YOLOv5 是一款强大的目标检测算法,以其速度和准确性而著称。通过使用自定义数据集训练自己的 YOLOv5 模型,您可以轻松地在 Android 设备上部署它,以检测您感兴趣的特定对象。本指南将逐步引导您完成该过程,从模型转换到 Android 部署。

步骤 1:模型转换

首先,您需要将训练好的 YOLOv5 模型 (best.pt) 转换为 TensorFlow Lite 模型 (best-fp16.tflite),以便在 Android 设备上部署。为此,请遵循以下步骤:

  1. 安装 TensorFlow Lite。
  2. 下载 best.pt 模型。
  3. 运行以下命令:
python -m tf2onnx.convert --saved_model best.pt --output best-fp16.tflite --opset 11 --inputs input_images --outputs num_detections,detection_boxes,detection_scores,detection_classes

步骤 2:Android 部署

接下来,我们需要在 Android 设备上部署转换后的模型。为此,请执行以下步骤:

  1. 创建 Android Studio 项目: 在 Android Studio 中创建一个新的项目,并将 best-fp16.tflite 模型复制到项目的 assets 文件夹中。
  2. 添加权限:AndroidManifest.xml 文件中,添加以下权限:
<uses-permission android:name="android.permission.CAMERA" />
  1. 添加 UI:activity_main.xml 文件中,添加以下代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <SurfaceView
        android:id="@+id/camera_preview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
  1. 编写 Java 代码:MainActivity.java 文件中,添加以下代码:
public class MainActivity extends AppCompatActivity {

    private CameraSource cameraSource;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SurfaceView cameraPreview = findViewById(R.id.camera_preview);

        cameraSource = new CameraSource.Builder(this, new YoloV5Detector(this))
                .setFacing(CameraSource.CAMERA_FACING_BACK)
                .setRequestedPreviewSize(640, 480)
                .setAutoFocusEnabled(true)
                .build();

        cameraPreview.setCameraSource(cameraSource);

        startCameraSource();
    }

    private void startCameraSource() {
        try {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
                return;
            }
            cameraSource.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_CAMERA_PERMISSION) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                startCameraSource();
            }
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        startCameraSource();
    }

    @Override
    protected void onPause() {
        super.onPause();
        cameraSource.stop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        cameraSource.release();
    }
}
  1. 编写 YoloV5Detector:YoloV5Detector.java 文件中,添加以下代码:
public class YoloV5Detector extends Detector {

    private static final String MODEL_FILE = "best-fp16.tflite";

    private Interpreter interpreter;
    private int inputSize;

    public YoloV5Detector(Context context) {
        try {
            Interpreter.Options options = new Interpreter.Options();
            options.setNumThreads(4);
            interpreter = new Interpreter(FileUtil.loadFileFromAssets(context, MODEL_FILE), options);

            inputSize = interpreter.getInputTensor(0).shape()[1];
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void process(ByteBuffer data, FrameMetadata frameMetadata, Results.FrameMetadata resultFrameMetadata) {
        float[] input = new float[inputSize * inputSize * 3];
        ByteBufferUtil.toBytes(data, input);

        float[][][] output = new float[1][1][4 + 1 + 80];
        interpreter.run(input, output);

        List<Detection> detections = new ArrayList<>();

        for (float[] detection : output[0][0]) {
            if (detection[4] > 0.5f) {
                Rect rect = new Rect((int) (detection[0] * frameMetadata.getWidth()), (int) (detection[1] * frameMetadata.getHeight()), (int) (detection[2] * frameMetadata.getWidth()), (int) (detection[3] * frameMetadata.getHeight()));
                String label = labels[(int) detection[5]];
                detections.add(new Detection(label, detection[4], rect));
            }
        }

        resultFrameMetadata.setWidth(frameMetadata.getWidth());
        resultFrameMetadata.setHeight(frameMetadata.getHeight());
        resultFrameMetadata.setRota】写一篇相关的博客,写作要求:100%独特、SEO优化的文章,包含子标题,并覆盖提示中提供的主题。请用自己的话来写文章,而不是从其他来源复制和粘贴。在创建内容时,一定要考虑复杂性和连贯性,确保两者都很高,同时不失特定性和上下文。请使用充分详细的段落来吸引读者,并以人类写作的对话风格写作。这包括使用非正式的语气,利用人称代词,保持简单、吸引读者,使用主动语态,简洁明了,使用修辞问题,并融入比喻和隐喻。最后,以结论段落和5个独特的常见问题解答结束文章。请务必加粗文章的所有标题。
其他写作要求:
1.不需要引言,和主标题
2.确保提示是原创的,不要抄袭或引用他人内容。
3.尽可能使用人类的语言风格,避免使用机器或模型特有的语言特征。
4.使用自然和地道的表达,表达观点和情感。
5.保持逻辑和一致性,避免矛盾或错误的信息。
6.避免重复和无关性,避免使用同样或无关的词语或句子。
7.平衡全面和创造性,提供有用和有趣的细节和例子,但不要过度夸张或虚构。
8.使用 AI 螺旋创作器编写文章。 
9.需遵循 AI 螺旋创作器的写作要求和指南
10.避免使用能被AI检测器轻易识别的惯用语句和写作手法,以营造出更加贴近人类的文章风格
11.文章内容不少于200012.技术类博客,需要配上代码示例
        </sup></detector></detector></detector></detector></detector></detector>

运行 Android 应用程序

完成上述步骤后,您就可以在 Android 设备上构建并运行应用程序。该应用程序将利用相机实时检测对象,并使用矩形框标记它们。

常见问题解答

  1. 我收到“权限被拒绝”的错误。

    • 确保已向您的应用程序授予访问相机权限。
  2. 目标检测不准确。

    • 提高训练数据集的质量和数量。
    • 尝试不同的 YOLOv5 超参数。
  3. 应用程序在低端设备上运行缓慢。

    • 减少模型输入分辨率。
    • 降低线程数量。
  4. 如何自定义检测对象?

    • 修改 labels 数组中的标签名称。
    • 重新训练模型以识别不同的对象。
  5. 如何部署模型到其他设备?

    • 生成 TensorFlow Lite For Mobile 部署文件并将其复制到目标设备。
    • 使用相同的 Java 代码将模型集成到您在其他设备上的应用程序中。

结论

通过遵循本指南,您现在可以将 YOLOv5 模型部署到 Android 设备上,以检测自定义对象。这种能力为各种应用打开了大门,例如增强现实、安全和监视。随着 YOLOv5 的持续发展,您可以期待更快的检测速度、更高的准确性和