当前位置:   article > 正文

关于Android如何移植Yolov5模型并且部署_安卓加载yolo模型

安卓加载yolo模型

 后期有什么问题可以加我微信交流微信号:zz2003093737

我将从新建Android工程移植Yolov5模型来讲解

首先:创建一个新的工程,大家应该都会我就不过多介绍

ba73717d4ccd40ba9152fe1e7c0830aa.jpeg

然后,打开我的安卓例程工程:

这是我的例程工程链接:

将工程中这两个文件粘贴复制到你自己的工程之中

不用下我的,下官方的tflite模型的安卓工程也有这2个,移植进来进行

b555ae1909864385b8ec804f139feb4c.png

然后在build.gradle中添加依赖

  1. implementation 'org.tensorflow:tensorflow-lite:2.4.0'
  2. implementation 'org.tensorflow:tensorflow-lite-gpu:2.4.0'

环境就是这样子了,

要是有问题可以看我例程修改即可

然后,请把你训练好的Yolov5模型转成tflite的模型格式

然后把你的Yolov模型的标签文件一起放到这里来,

837db188639340b3b7a8963ea7469672.jpeg

 分别一个tflite文件和一个txt标签文件

如果你的命名名字跟我不一样,记得改一下这里

tflie下的DetectorFactory的

8ca03dc84db14252aa06c9384fd85b24.jpeg

 然后新建一个Java类,yolov5.java

  1. package com.example.yolov5.yolov5;
  2. import android.content.res.AssetManager;
  3. import android.graphics.Bitmap;
  4. import android.util.Log;
  5. import com.example.yolov5.yolov5.tflite.Classifier;
  6. import com.example.yolov5.yolov5.tflite.DetectorFactory;
  7. import com.example.yolov5.yolov5.tflite.YoloV5Classifier;
  8. import java.io.IOException;
  9. import java.util.List;
  10. public class yolov5demo {
  11. private final AssetManager a;
  12. private YoloV5Classifier detector;
  13. public yolov5demo(AssetManager a){
  14. this.a = a;
  15. }
  16. public String start(Bitmap bitmap){
  17. // 模型初始化
  18. try {
  19. detector = DetectorFactory.getDetector(this.a,"test.tflite");
  20. detector.useCPU();
  21. detector.setNumThreads(4);
  22. }catch (IOException e){
  23. e.printStackTrace();
  24. }
  25. //开始识别
  26. List<Classifier.Recognition> results = detector.recognizeImage(bitmap);
  27. if (results == null) {
  28. Log.d("yolov5识别:", "result = null");
  29. }
  30. // 遍历回传
  31. String text = "";
  32. for (Classifier.Recognition result : results){
  33. text += result.toString() + "\n";
  34. }
  35. return text;
  36. }
  37. }

然后 设置主页面UI:   activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity"
  8. android:orientation="vertical">
  9. <ImageView
  10. android:id="@+id/iv_show"
  11. android:layout_gravity="center_horizontal"
  12. android:layout_margin="20dp"
  13. android:layout_width="640px"
  14. android:layout_height="360px"/>
  15. <Button
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:id="@+id/bt_start"
  19. android:text="开始预测"
  20. android:textSize="20sp"
  21. android:layout_gravity="center_horizontal"/>
  22. <TextView
  23. android:id="@+id/tv_show"
  24. android:layout_width="match_parent"
  25. android:layout_height="match_parent"
  26. android:text="显示预测结果:"
  27. android:textSize="20sp"
  28. android:layout_margin="20dp"
  29. />

 MainActivity.java

  1. package com.example.yolov5;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.graphics.Bitmap;
  4. import android.graphics.BitmapFactory;
  5. import android.graphics.Canvas;
  6. import android.graphics.Matrix;
  7. import android.os.Bundle;
  8. import android.util.Log;
  9. import android.view.View;
  10. import android.widget.Button;
  11. import android.widget.ImageView;
  12. import android.widget.TextView;
  13. import android.widget.Toast;
  14. import org.opencv.android.OpenCVLoader;
  15. import org.opencv.core.Mat;
  16. import org.opencv.core.Rect;
  17. import com.example.yolov5.yolov5.env.Utils;
  18. import com.example.yolov5.yolov5.yolov5demo;
  19. public class MainActivity extends AppCompatActivity {
  20. public static final float MINIMUM_CONFIDENCE_TF_OD_API = 0.5f;
  21. private ImageView ivShow;
  22. private Button btStart;
  23. private TextView tvShow;
  24. private Bitmap bitmap, bitmap1;
  25. public static final int TF_OD_API_INPUT_SIZE = 320;
  26. @Override
  27. protected void onCreate(Bundle savedInstanceState) {
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.activity_main);
  30. // 判断Opencv是否加载成功
  31. if (OpenCVLoader.initDebug()) {
  32. Toast.makeText(this, "OpenCv加载成功", Toast.LENGTH_SHORT).show();
  33. }
  34. // 初始化控件
  35. intView();
  36. }
  37. private void intView() {
  38. ivShow = findViewById(R.id.iv_show); // 图像显示控件
  39. tvShow = findViewById(R.id.tv_show); // 文本框控件
  40. btStart = findViewById(R.id.bt_start); // 按钮控件
  41. // 把指定图片传给bitmap
  42. bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.yellow);
  43. Log.d("KaiXuan", "w: " + bitmap.getWidth() + "h: " + bitmap.getHeight());
  44. // 将传完后的bitmap显示出来
  45. ivShow.setImageBitmap(bitmap);
  46. // 按钮点击
  47. btStart.setOnClickListener(new View.OnClickListener() {
  48. @Override
  49. public void onClick(View v) {
  50. Toast.makeText(MainActivity.this, "测试", Toast.LENGTH_SHORT).show();
  51. /* 将bitmap传给Utils的processBitmap的方法函数进行分辨率处理,
  52. 将需要的分辨率传进去,这里我设置了一个固定变量TF_OD_API_INPUT_SIZE,
  53. 在上面可以通过修改TF_OD_API_INPUT_SIZE的值来改变你想修改的分辨率
  54. 将修改分辨率后的bitmap传给bitmap1
  55. */
  56. bitmap1 = Utils.processBitmap(bitmap, TF_OD_API_INPUT_SIZE);
  57. /*
  58. 打印修改后的分辨率,判断是否有进行分辨率修改,
  59. 判断bitmap1是否为空,
  60. 要防止bitmap1出现空指针
  61. */
  62. Log.d("KaiXuan","w: " + bitmap1.getWidth() + "h: "+bitmap1.getHeight());
  63. if (bitmap1 == null){
  64. Log.d("RGBlight:","bitmap = null");
  65. }
  66. // 开始识别
  67. /*
  68. 调用写好的yolov5demo类的star函数
  69. 将上面处理好的bitmap1传进去
  70. 进行识别处理
  71. yolov5demo这个类是处理模型的类,对模型初始化等等
  72. */
  73. yolov5demo yolov5demo = new yolov5demo(getAssets());
  74. String text33 = yolov5demo.start(bitmap1);
  75. ivShow.setImageBitmap(bitmap1);
  76. // 显示识别
  77. tvShow.setText(text33);
  78. Log.d("RGBlight","test: " + text33);
  79. if (text33 == null){
  80. Log.d("RGBlight","test = null");
  81. }
  82. }
  83. });
  84. }

重点要注意一下,对于更改图像分辨率后可能会有索引越界的错误,这个只能你们自己解决了,

移植到这里也就结束了,有什么问题可以加我微信交流

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/465261
推荐阅读
相关标签
  

闽ICP备14008679号