赞
踩
后期有什么问题可以加我微信交流微信号:zz2003093737
我将从新建Android工程移植Yolov5模型来讲解
首先:创建一个新的工程,大家应该都会我就不过多介绍
然后,打开我的安卓例程工程:
这是我的例程工程链接:
将工程中这两个文件粘贴复制到你自己的工程之中
不用下我的,下官方的tflite模型的安卓工程也有这2个,移植进来进行
然后在build.gradle中添加依赖
- implementation 'org.tensorflow:tensorflow-lite:2.4.0'
- implementation 'org.tensorflow:tensorflow-lite-gpu:2.4.0'
环境就是这样子了,
要是有问题可以看我例程修改即可
然后,请把你训练好的Yolov5模型转成tflite的模型格式
然后把你的Yolov模型的标签文件一起放到这里来,
分别一个tflite文件和一个txt标签文件
如果你的命名名字跟我不一样,记得改一下这里
tflie下的DetectorFactory的
然后新建一个Java类,yolov5.java
- package com.example.yolov5.yolov5;
-
- import android.content.res.AssetManager;
- import android.graphics.Bitmap;
- import android.util.Log;
-
-
- import com.example.yolov5.yolov5.tflite.Classifier;
- import com.example.yolov5.yolov5.tflite.DetectorFactory;
- import com.example.yolov5.yolov5.tflite.YoloV5Classifier;
-
- import java.io.IOException;
- import java.util.List;
-
- public class yolov5demo {
-
- private final AssetManager a;
-
- private YoloV5Classifier detector;
-
- public yolov5demo(AssetManager a){
- this.a = a;
- }
-
- public String start(Bitmap bitmap){
- // 模型初始化
- try {
- detector = DetectorFactory.getDetector(this.a,"test.tflite");
- detector.useCPU();
- detector.setNumThreads(4);
- }catch (IOException e){
- e.printStackTrace();
- }
-
- //开始识别
- List<Classifier.Recognition> results = detector.recognizeImage(bitmap);
- if (results == null) {
- Log.d("yolov5识别:", "result = null");
- }
- // 遍历回传
- String text = "";
- for (Classifier.Recognition result : results){
- text += result.toString() + "\n";
- }
-
- return text;
- }
-
-
- }
然后 设置主页面UI: activity_main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".MainActivity"
- android:orientation="vertical">
-
- <ImageView
- android:id="@+id/iv_show"
- android:layout_gravity="center_horizontal"
- android:layout_margin="20dp"
- android:layout_width="640px"
- android:layout_height="360px"/>
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/bt_start"
- android:text="开始预测"
- android:textSize="20sp"
- android:layout_gravity="center_horizontal"/>
- <TextView
- android:id="@+id/tv_show"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:text="显示预测结果:"
- android:textSize="20sp"
- android:layout_margin="20dp"
- />
-
MainActivity.java
- package com.example.yolov5;
-
- import androidx.appcompat.app.AppCompatActivity;
-
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.graphics.Matrix;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.TextView;
- import android.widget.Toast;
-
- import org.opencv.android.OpenCVLoader;
- import org.opencv.core.Mat;
- import org.opencv.core.Rect;
-
- import com.example.yolov5.yolov5.env.Utils;
- import com.example.yolov5.yolov5.yolov5demo;
-
- public class MainActivity extends AppCompatActivity {
-
- public static final float MINIMUM_CONFIDENCE_TF_OD_API = 0.5f;
-
- private ImageView ivShow;
- private Button btStart;
- private TextView tvShow;
- private Bitmap bitmap, bitmap1;
-
- public static final int TF_OD_API_INPUT_SIZE = 320;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- // 判断Opencv是否加载成功
- if (OpenCVLoader.initDebug()) {
- Toast.makeText(this, "OpenCv加载成功", Toast.LENGTH_SHORT).show();
- }
-
- // 初始化控件
- intView();
- }
-
- private void intView() {
- ivShow = findViewById(R.id.iv_show); // 图像显示控件
- tvShow = findViewById(R.id.tv_show); // 文本框控件
- btStart = findViewById(R.id.bt_start); // 按钮控件
-
- // 把指定图片传给bitmap
- bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.yellow);
-
- Log.d("KaiXuan", "w: " + bitmap.getWidth() + "h: " + bitmap.getHeight());
-
- // 将传完后的bitmap显示出来
- ivShow.setImageBitmap(bitmap);
-
- // 按钮点击
- btStart.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Toast.makeText(MainActivity.this, "测试", Toast.LENGTH_SHORT).show();
- /* 将bitmap传给Utils的processBitmap的方法函数进行分辨率处理,
- 将需要的分辨率传进去,这里我设置了一个固定变量TF_OD_API_INPUT_SIZE,
- 在上面可以通过修改TF_OD_API_INPUT_SIZE的值来改变你想修改的分辨率
- 将修改分辨率后的bitmap传给bitmap1
- */
- bitmap1 = Utils.processBitmap(bitmap, TF_OD_API_INPUT_SIZE);
- /*
- 打印修改后的分辨率,判断是否有进行分辨率修改,
- 判断bitmap1是否为空,
- 要防止bitmap1出现空指针
- */
- Log.d("KaiXuan","w: " + bitmap1.getWidth() + "h: "+bitmap1.getHeight());
- if (bitmap1 == null){
- Log.d("RGBlight:","bitmap = null");
- }
-
- // 开始识别
- /*
- 调用写好的yolov5demo类的star函数
- 将上面处理好的bitmap1传进去
- 进行识别处理
- yolov5demo这个类是处理模型的类,对模型初始化等等
- */
- yolov5demo yolov5demo = new yolov5demo(getAssets());
- String text33 = yolov5demo.start(bitmap1);
- ivShow.setImageBitmap(bitmap1);
-
- // 显示识别
- tvShow.setText(text33);
- Log.d("RGBlight","test: " + text33);
- if (text33 == null){
- Log.d("RGBlight","test = null");
- }
- }
- });
- }
重点要注意一下,对于更改图像分辨率后可能会有索引越界的错误,这个只能你们自己解决了,
移植到这里也就结束了,有什么问题可以加我微信交流
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。