【基于TensorFlow2.3.0的果蔬识别系统的设计】

基于TensorFlow2.3.0的果蔬识别系统的设计

一、开发环境

  • Windows 10
  • Python 3.7.3
  • TensorFlow 2.3.0
  • Anaconda 4.12.0
  • CUDA 10.1
  • cuDNN 7.6.5

二、步骤

2.1 创建一个python 3.7.3的虚拟环境

conda create -n vegetable python==3.7.3

2.2 激活名称为vegetable的虚拟环境

conda activate vegetable

2.3 安装tensorflow-cpu,

pip install tensorflow-cpu==2.3.0

2.4 推荐安装tensorflow-gpu版本,电脑需提前安装好CUDA 10.1和cuDNN 7.6.5

pip install tensorflow-gpu==2.3.0

2.5 准备好果蔬分类数据集
2.6 编写训练模型代码,使用MobileNetV2来训练模型。

# 模型加载
def model_load(IMG_SHAPE=(224, 224, 3), class_num=214):
    base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE, include_top=False, weights='imagenet')
    base_model.trainable = False

    model = tf.keras.models.Sequential([
        tf.keras.layers.experimental.preprocessing.Rescaling(1. / 127.5, offset=-1, input_shape=IMG_SHAPE),
        base_model,
        tf.keras.layers.GlobalAveragePooling2D(),
        tf.keras.layers.Dense(class_num, activation='softmax')
    ])
    
    # 输出模型信息
    model.summary() 
    model.compile(optimizer='adam', loss='categorical_crossentropy',
                  metrics=['accuracy'])
    return model



# 训练模型
def train(epochs):
    # 1. 加载数据集
    train_dataset, validate_dataset, class_names = data_load("../data", 224, 224, 16) 
    print(class_names)
    # print('类别的个数-->')
    # print(len(class_names))

    # 2. 加载模型
    model = model_load(class_num=len(class_names))
    # 3. 训练
    history = model.fit(train_dataset, validation_data=validate_dataset, epochs=epochs)

    # 4. 保存模型
    model.save("models/vegetable_model.h5")  

    # 5. 转换为tflite模型
    h5_model = tf.keras.models.load_model("models/vegetable_model.h5")
    converter = tf.lite.TFLiteConverter.from_keras_model(h5_model)
    tflite_model = converter.convert()
    open("models/model.tflite", "wb").write(tflite_model)


if __name__ == '__main__':
    train(epochs=30)

2.7 训练完成后在models文件夹中得到名称为model.tflite的模型文件,接下来将这个模型文件导入Android Studio工程中。

三、编写Android APP

3.1 打开Android Studio,将model.tflite模型文件拷贝到Android工程的assets文件中

在这里插入图片描述

3.2 同时要在app下build.gradle文件添加如下内容

    aaptOptions {
        noCompress "tflite"
    }

3.3 编写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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="0dp"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="基于TensorFlow的果蔬识别系统"
        android:textColor="@color/black"
        android:textSize="25sp" />

    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        app:cardCornerRadius="20dp">

        <ImageView
            android:id="@+id/iv_vegetable"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:scaleType="centerCrop"
            android:src="@drawable/orange" />

    </androidx.cardview.widget.CardView>

    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        app:cardCornerRadius="20dp">

        <ScrollView
            android:layout_width="wrap_content"
            android:layout_height="320dp"
            android:layout_margin="10dp"
            android:layout_marginTop="10dp">

            <TextView
                android:id="@+id/tv_vegetable_detail"
                android:layout_width="360dp"
                android:layout_height="wrap_content"
                android:text="@string/orange"
                android:textColor="@color/black"
                android:textSize="18sp" />

        </ScrollView>
    </androidx.cardview.widget.CardView>


    <Button
        android:id="@+id/choose_image"
        android:layout_width="230dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginTop="50dp"
        android:background="@drawable/angle_button"
        android:onClick="choose_image"
        android:text="选择图片"
        android:textColor="@android:color/white"
        android:textSize="20sp" />


</LinearLayout>

在这里插入图片描述

3.4 编写MainActivity.java代码

  private Interpreter interpreter;
    private Bitmap bitmap;
    private ImageView iv_vegetable;
    private TextView tv_vegetable_detail; // 果蔬的介绍

    private String[] neededPermissions = new String[]{
            Manifest.permission.READ_PHONE_STATE
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = this.getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.GRAY);

        }
        setContentView(R.layout.activity_main);

        /*
         * 在选择图片的时候,在android 7.0及以上通过FileProvider获取Uri,不需要文件权限
         */
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            List<String> permissionList = new ArrayList<>(Arrays.asList(neededPermissions));
            permissionList.add(Manifest.permission.READ_EXTERNAL_STORAGE);
            neededPermissions = permissionList.toArray(new String[0]);
        }

        initView();

        TFLiteLoader loader = TFLiteLoader.newInstance(this);
        interpreter = loader.get();

        showToast("模型加载成功!");

        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.orange);
    }


    private void initView() {
        tv_vegetable_detail = findViewById(R.id.tv_vegetable_detail);
        iv_vegetable = findViewById(R.id.iv_vegetable);
    }

    private void showToast(String text) {
        Toast.makeText(this, text, Toast.LENGTH_LONG).show();
    }

    // 更换图片
    public void choose_image(View view) {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
        startActivityForResult(intent, 0);
    }

    private int maxIndex = 0;

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data == null || data.getData() == null) {
            showToast("获取图片失败");
            return;
        }

        try {
            Bitmap src = MediaStore.Images.Media.getBitmap(getContentResolver(), data.getData());
            bitmap = Bitmap.createScaledBitmap(src, 224, 224, false);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 识别图片
        detect_image();

        // 更新显示的图片
        iv_vegetable.setImageBitmap(bitmap);
        // 更新果蔬的介绍
        tv_vegetable_detail.setText(vegetable_detail[maxIndex]);
    }

    // 识别图片
    public void detect_image() {
        // bitmap convert to array
        float[][][][] pixels = getScaledMatrix(bitmap, input);
        interpreter.run(pixels, output);

        for (int j = 0; j < output[0].length; j++) {
            BigDecimal b = new BigDecimal(output[0][j]);
            float f1 = b.setScale(3, BigDecimal.ROUND_HALF_UP).floatValue();
            Log.i("Test", f1 + "--> "+ j);
        }

        float max = output[0][0];

        for(int i = 1; i < output[0].length;i++){
            if(max < output[0][i]){
                max = output[0][i];
                maxIndex = i;
            }
        }

        String text = class_names[maxIndex];
        // 显示Toast
        showToast(text);
    }

3.5 安装到手机后的识别效果

在这里插入图片描述

基于TensorFlow2.3.0的果蔬识别系统的设计

四、资料下载

APK下载:https://wwi.lanzoup.com/inXuX0adi9de
完整源码下载:https://item.taobao.com/item.htm?ft=t&id=682478970844

基于 tensorflow 2.3 开发的水果蔬识别系统的 ISO 软件工程模板(10)模块开发说明如下: 1. 引言: 本文档旨在说明基于 TensorFlow 2.3 开发的水果蔬识别系统的 ISO 软件工程模板的模块开发过程。该系统旨在识别水果和蔬菜的类型和品质,并提供相应的分析报告。 2. 目标: 本模块的目标是实现基于 TensorFlow 2.3 的水果蔬识别系统的特征提取和分类功能。 3. 功能描述: 该模块包括以下功能: - 特征提取:通过卷积神经网络模型,从输入的水果蔬菜图像中提取有效的特征。 - 分类:使用训练好的分类器对提取的特征进行分类,确定图像中水果或蔬菜的类型。 4. 接口定义: 本模块需要与其他模块进行数据交互,包括: - 输入接口:接收水果蔬菜图像作为输入。 - 输出接口:输出分类结果,指示图像中水果或蔬菜的类型。 5. 数据流程: 1)接收输入的水果蔬菜图像。 2)使用预训练的卷积神经网络模型进行特征提取。 3)将提取的特征输入到分类器中,进行分类。 4)输出分类结果。 6. 算法设计: 该模块的算法设计主要包括以下步骤: 1)加载预训练的卷积神经网络模型。 2)将输入的水果蔬菜图像传递给卷积神经网络模型,提取特征。 3)将提取的特征输入到分类器中,得出分类结果。 7. 开发注意事项: 在开发该模块时,需要注意以下事项: - 根据实际需求选择合适的卷积神经网络结构和参数配置。 - 使用合适的数据集进行训练和验证模型的性能。 - 关注模块的可扩展性和可维护性,便于后续的功能扩展和代码维护。 8. 测试计划: 为确保模块的正确性和稳定性,需要制定相应的测试计划,并进行模块功能测试、性能测试和兼容性测试。 9. 风险管理: 可能的风险包括: - 模型性能不够准确,导致识别结果错误。 - 模块的运行时间过长,无法满足实时性要求。 - 系统的资源占用过高,对设备性能有较高要求。 10. 结论: 本文档详细描述了基于 TensorFlow 2.3 开发的水果蔬识别系统 ISO 软件工程模板(10)模块的开发说明,包括目标、功能描述、接口定义、数据流程、算法设计、开发注意事项、测试计划和风险管理。该模块将实现水果蔬菜图像的特征提取和分类功能,为系统提供准确的识别结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lilihewo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值