8月份做了个简单的安卓app,将resnet18和mobilenet部署到上面,简单的做了个登陆界面,以及游客模式限定部分功能,实现本地文件上传、拍照以及开启摄像头实时分类。界面稍微有点糙,没太有界面设计的审美。哈哈哈哈哈哈哈~~

开发工具:Android Studio

有三个界面:登录界面、主界面、开启摄像头实时分类界面。账号和密码都是123

源码如下:

activity_login.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".LoginActivity"><TextViewandroid:id="@+id/username"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="账号"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.226"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.349" /><TextViewandroid:id="@+id/password"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="密码"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.226"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.448" /><Buttonandroid:id="@+id/button_login"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登录"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.296"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.62" /><Buttonandroid:id="@+id/button_visitor"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="游客"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.772"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.62" /><EditTextandroid:id="@+id/edittext_username"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ems="10"android:inputType="textPersonName"android:text=""app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.855"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.339" /><EditTextandroid:id="@+id/edittext_password"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ems="10"android:inputType="textPassword"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.86"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.44" />
</androidx.constraintlayout.widget.ConstraintLayout>

LoginActivity.java:

package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;public class LoginActivity extends AppCompatActivity implements View.OnClickListener {Button button_login,button_visitor;EditText edittext_username,edittext_password;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);//向主界面发送信息的变量String login_mode = null;//按钮绑定button_login = (Button) findViewById(R.id.button_login);button_visitor = (Button) findViewById(R.id.button_visitor);edittext_username = (EditText) findViewById(R.id.edittext_username);edittext_password = (EditText) findViewById(R.id.edittext_password);//添加按钮监听button_login.setOnClickListener(this);button_visitor.setOnClickListener(this);}@Overridepublic void onClick(View v) {//在switch之前Intent,在其他地方都会导致闪退Intent main_activity = new Intent(LoginActivity.this,MainActivity.class);switch (v.getId()){case R.id.button_login://Intent main_activity = new Intent(LoginActivity.this,MainActivity.class);String username = edittext_username.getText().toString();String password = edittext_password.getText().toString();if (username.isEmpty()){Toast.makeText(this, "请输入账号!", Toast.LENGTH_SHORT).show();}else if (!(username.isEmpty())){if(password.isEmpty()){Toast.makeText(this, "请输入密码!", Toast.LENGTH_SHORT).show();}else if(!(password.isEmpty())){if(username.equals("123") && password.equals("123")){//Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();main_activity.putExtra("login_mode","VIP");startActivity(main_activity);break;}else{Toast.makeText(this, "您输入的账号或密码错误,请重新输入!", Toast.LENGTH_SHORT).show();}}}break;case R.id.button_visitor:main_activity.putExtra("login_mode","FREE");Toast.makeText(this, "您已进入游客模式!", Toast.LENGTH_SHORT).show();startActivity(main_activity);break;}}
}

功能主界面:

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"><ImageViewandroid:id="@+id/image_show"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitCenter"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.0" /><Buttonandroid:id="@+id/button_show_photo"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="打开文件"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.05"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.878" /><Buttonandroid:id="@+id/button_detect"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="检测"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.049"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.976" /><TextViewandroid:id="@+id/label"android:layout_width="395dp"android:layout_height="46dp"android:background="#03A9F4"android:rotationX="0"android:text="Detect_Result"android:textAlignment="center"android:textColor="#E91E63"android:textSize="15dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.497"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.781" /><RadioGroupandroid:layout_width="257dp"android:layout_height="168dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.832"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.0"><RadioButtonandroid:id="@+id/RseNet18"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="ResNet18" /><RadioButtonandroid:id="@+id/MobileNet_v3"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="MobileNet_v3" /><RadioButtonandroid:id="@+id/own_model"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="own_model(Coming soon)" /></RadioGroup><Buttonandroid:id="@+id/button_snapshot"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="拍照识别"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.253"app:layout_constraintStart_toEndOf="@+id/button_show_photo"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.878" /><Buttonandroid:id="@+id/button_realtime"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="实时识别"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.949"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.878" /></androidx.constraintlayout.widget.ConstraintLayout>

Mainactivity.java:

package com.example.myapplication;import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.speech.tts.TextToSpeechService;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;//import org.pytorch.torchvision.TensorImageUtils;import org.pytorch.IValue;
import org.pytorch.LiteModuleLoader;
import org.pytorch.MemoryFormat;
import org.pytorch.Module;
import org.pytorch.Tensor;
import org.pytorch.torchvision.TensorImageUtils;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;public class MainActivity extends AppCompatActivity implements View.OnClickListener{//检测相机权限所需CODEprivate int REQUEST_CODE_PREMISSION = 101;private final String[] REQUIRED_PERMISSION = new String[] {"android.permission.CAMERA"};Button button_show_photo,button_detect,button_snapshot,button_realtime;RadioButton ResNet18,MobileNet_v3,own_model;ImageView image_show;TextView label;Bitmap bitmap = null;Module module = null;String model_name = "mobilenet_v3.pt";int result = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//去掉导航栏getSupportActionBar().hide();//button绑定button_show_photo = (Button) findViewById(R.id.button_show_photo);button_detect = (Button) findViewById(R.id.button_detect);ResNet18 = (RadioButton) findViewById(R.id.RseNet18);MobileNet_v3 = (RadioButton) findViewById(R.id.MobileNet_v3);own_model = (RadioButton) findViewById(R.id.own_model);button_snapshot = (Button) findViewById(R.id.button_snapshot);button_realtime = (Button) findViewById(R.id.button_realtime);//ImageView 绑定image_show = (ImageView) findViewById(R.id.image_show);//TextView绑定->标签label(获取TextView控件)label = (TextView) findViewById(R.id.label);//button监听button_show_photo.setOnClickListener(this);button_detect.setOnClickListener(this);ResNet18.setOnClickListener(this);MobileNet_v3.setOnClickListener(this);own_model.setOnClickListener(this);button_snapshot.setOnClickListener(this);button_realtime.setOnClickListener(this);//接收来自LoginActivity传过来的login_model信息String login_mode = getIntent().getStringExtra("login_mode");if(login_mode.equals("FREE")){button_snapshot.setEnabled(false);button_realtime.setEnabled(false);//弹窗AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);dialog.setTitle("游客模式");dialog.setMessage("部分功能将被禁用,现在购买VIP,一折起!!!");dialog.setCancelable(false);//设置一个按钮dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(MainActivity.this, "开通会员请联系:XXX", Toast.LENGTH_SHORT).show();}});dialog.show();}else if (login_mode.equals("VIP")){Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show();}}public void onClick(View v){//单选框使用ischeck() 判断是否被选中if(ResNet18.isChecked()){Toast.makeText(this, "使用ResNet18进行识别分类", Toast.LENGTH_SHORT).show();model_name = "mobilenet_v3.pt";}else if (MobileNet_v3.isChecked()){Toast.makeText(this, "使用MobileNet_v3进行识别分类", Toast.LENGTH_SHORT).show();model_name = "resnet18.pt";}else if(own_model.isChecked()){Toast.makeText(this,"别急,很快就来!",Toast.LENGTH_SHORT).show();}switch (v.getId()){case R.id.button_realtime:Toast.makeText(this, "开启实时识别", Toast.LENGTH_SHORT).show();if(!checkpermission()){ActivityCompat.requestPermissions(this,REQUIRED_PERMISSION,REQUEST_CODE_PREMISSION);}Intent realtimeActivity = new Intent(MainActivity.this,realtimeActivity.class);realtimeActivity.putExtra("model_name",model_name);startActivity(realtimeActivity);break;case R.id.button_snapshot://相机权限问询,避免闪退if(!checkpermission()){ActivityCompat.requestPermissions(this,REQUIRED_PERMISSION,REQUEST_CODE_PREMISSION);}Intent opencamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(opencamera,002);break;case R.id.button_show_photo://获取文件路径//try {//获取文件路径//String filepath = assetFilePath(this,"LIU.jpg");//String filepath = assetFilePath(this,"ZHANG.jpg");//打开本地文件目录Intent chooseIntent = new Intent(Intent.ACTION_GET_CONTENT);chooseIntent.setType("image/*");chooseIntent.addCategory(Intent.CATEGORY_OPENABLE);//如果打开成功 发送requestCode:001startActivityForResult(chooseIntent,001);/*//获取文件File file = new File(filepath);//将文件转为UriUri imageuri = Uri.fromFile(file);//将文件转为可以显示的bitmapbitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),imageuri);//显示image_show.setImageBitmap(bitmap);} catch (IOException e) {e.printStackTrace();}*///result += 1;//Toast.makeText(this,String.valueOf(result), Toast.LENGTH_SHORT).show();break;case R.id.button_detect://步骤0:读取模型 获取模型位置并加载try {module = LiteModuleLoader.load(assetFilePath(this,model_name));} catch (IOException e) {e.printStackTrace();}//读取bitmap图片,转化为Tensor格式。将bitmap格式转化为tensorfinal Tensor inputTensor = TensorImageUtils.bitmapToFloat32Tensor(bitmap,TensorImageUtils.TORCHVISION_NORM_MEAN_RGB,TensorImageUtils.TORCHVISION_NORM_STD_RGB, MemoryFormat.CHANNELS_LAST);//前向传播 + toTensor();final Tensor outputTensor = module.forward(IValue.from(inputTensor)).toTensor();//tensor输出,并转化为JAVA的FLOAT32矩阵final float[] scores = outputTensor.getDataAsFloatArray();//分析结果//寻找最大值的标签  FLOAT.MAX_VALUE表示的时无穷大float maxscore = -Float.MAX_VALUE;int maxscoreIdx = -1;//寻找最大值,获取最大值索引for(int i = 0;i< scores.length;i++){if(scores[i]>maxscore){maxscore = scores[i];maxscoreIdx = i;}}//经过上面只能显示矩阵的索引下表,故需要对应其名称 定义一个类用来存放ImageNet_classes_nameString Imageclasses_name = ImageNetClasses.Imageclasses[maxscoreIdx];//在TextView中显示结果label.setText("Detect_Result:" + Imageclasses_name);//label.setText("Dog or Pig");//result -= 1;//Toast.makeText(this, String.valueOf(result), Toast.LENGTH_SHORT).show();break;}}protected void onActivityResult(int requestCode, int resultCode, Intent data){super.onActivityResult(requestCode,resultCode,data);//文件上传if(requestCode == 001){try {//定义bitmap接受文件窗口读进来的文件 使用data.getData()  并转化为bigmapbitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),data.getData());//显示出来,使用ImageView显示读进来的图片image_show.setImageBitmap(bitmap);} catch (IOException e) {e.printStackTrace();}}//打开相机拍照出照片else if(requestCode == 002){bitmap = (Bitmap) data.getExtras().get("data");image_show.setImageBitmap(bitmap);}}public static String assetFilePath(Context context,String assetName) throws IOException{File file = new File(context.getFilesDir(),assetName);if(file.exists() && file.length()>0){return file.getAbsolutePath();}try (InputStream is = context.getAssets().open(assetName)){try(OutputStream os = new FileOutputStream(file)){byte[] buffer = new byte[4*1024];int read;while ((read = is.read(buffer)) != -1){os.write(buffer,0,read);}os.flush();}return file.getAbsolutePath();}}private boolean checkpermission(){for(String permission:REQUIRED_PERMISSION){if(ContextCompat.checkSelfPermission(this,permission) != PackageManager.PERMISSION_GRANTED){return false;}}return true;}
}

实时分类界面:

Realtimeactivity.java:

package com.example.myapplication;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.core.Camera;
import androidx.camera.core.CameraControl;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.ImageAnalysis;
import androidx.camera.core.ImageProxy;
import androidx.camera.core.Preview;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.camera.view.PreviewView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.LifecycleOwner;import android.annotation.SuppressLint;
import android.content.pm.PackageManager;
import android.media.Image;
import android.os.Bundle;
import android.util.Log;
import android.util.Size;
import android.widget.TextView;
import android.widget.Toast;import com.google.common.util.concurrent.ListenableFuture;import org.pytorch.IValue;
import org.pytorch.LiteModuleLoader;
import org.pytorch.Module;
import org.pytorch.Tensor;
import org.pytorch.torchvision.TensorImageUtils;import java.io.IOException;
import java.security.PrivilegedAction;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;public class realtimeActivity extends AppCompatActivity {private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;PreviewView previewView;//int rotation = -100;Module module;//创建新的线程 利用此线程对画面中的图片进行分类Executor executor = Executors.newSingleThreadExecutor();//绑定textviewTextView textView;//检查相机的访问权限是否被获取到,如果没有获取,就获取private int REQUEST_CODE_PREMISSION = 101;private final String[] REQUIRED_PERMISSION = new String[] {"android.permission.CAMERA"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_realtime);//去掉导航栏getSupportActionBar().hide();textView = (TextView) findViewById(R.id.textview);previewView = (PreviewView) findViewById(R.id.cameraview);/*if(!checkpermission()){ActivityCompat.requestPermissions(this,REQUIRED_PERMISSION,REQUEST_CODE_PREMISSION);}*///从主界面传过来的model_name信息  不能在最上层定义,全局变量,会导致错乱闪退String model_name = getIntent().getStringExtra("model_name");LoadTorchModule(model_name);cameraProviderFuture = ProcessCameraProvider.getInstance(this);cameraProviderFuture.addListener(()->{try{ProcessCameraProvider cameraProvider = cameraProviderFuture.get();//打开摄像头startCamera(cameraProvider);//Toast.makeText(this, "摄像头打开成功!", Toast.LENGTH_SHORT).show();}catch (ExecutionException | InterruptedException e){}},ContextCompat.getMainExecutor(this));}/*private boolean checkpermission(){for(String permission:REQUIRED_PERMISSION){if(ContextCompat.checkSelfPermission(this,permission) != PackageManager.PERMISSION_GRANTED){return false;}}return true;}*/void startCamera(@NonNull ProcessCameraProvider cameraProvider){Preview preview = new Preview.Builder().build();//调用后置摄像头CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();//调用前置摄像头//CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_FRONT).build();preview.setSurfaceProvider(previewView.getSurfaceProvider());//使用ImageAnalysis类接受相机画面,将尺寸设置为224*224,并转化为手机cpu可识别格式ImageAnalysis imageAnalysis = new ImageAnalysis.Builder().setTargetResolution(new Size(224,224)).setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST).build();//Toast.makeText(this, "将相机捕获图片转为CPU可读形式成功!", Toast.LENGTH_SHORT).show();imageAnalysis.setAnalyzer(executor, new ImageAnalysis.Analyzer() {@Overridepublic void analyze(@NonNull ImageProxy image) {int rotation = image.getImageInfo().getRotationDegrees();analyzeimage(image,rotation);image.close();}});Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner) this,cameraSelector,preview,imageAnalysis);}void LoadTorchModule(String filename){try {module = LiteModuleLoader.load(MainActivity.assetFilePath(this,filename));Toast.makeText(this, "模型加载完成!", Toast.LENGTH_SHORT).show();} catch (IOException e) {Log.e("Error","Error reading file",e);finish();}}//识别函数  rotation代表相机拍摄状态,倾斜角度void analyzeimage(ImageProxy image,int rotation){//将图片转为Tensor@SuppressLint("UnsafeOptInUsageError") Tensor inputTensor = TensorImageUtils.imageYUV420CenterCropToFloat32Tensor(image.getImage(),rotation,224,224,TensorImageUtils.TORCHVISION_NORM_MEAN_RGB,TensorImageUtils.TORCHVISION_NORM_STD_RGB);//将图片相机拍摄图片转为tensor格式//前向传播 输出的数据类型为TENSOR,所以使用TENSOR格式的outputtensor进行接收//Toast.makeText(this, "Image->Tensor,successfully!", Toast.LENGTH_SHORT).show();Tensor outputTensor = module.forward(IValue.from(inputTensor)).toTensor();//获取最大值及其位置i,并通过i获得其标签  首先需要将tensor格式的输出转为JAVA的Array形式float[] scores = outputTensor.getDataAsFloatArray();//Toast.makeText(this, "Tensor->JAVA_Array,successfully!", Toast.LENGTH_SHORT).show();float maxscore = -Float.MAX_VALUE;int maxscoreIdx = -1;for (int i =0;i<scores.length;i++){if(maxscore<scores[i]){maxscore = scores[i];maxscoreIdx = i;}}String className = ImageNetClasses.Imageclasses[maxscoreIdx];Log.v("Torch","Detected-"+className);runOnUiThread(new Runnable() {@Overridepublic void run() {textView.setText(className);}});}
}

图像分类androidAPP相关推荐

  1. PyTorch 图像分类

    PyTorch 图像分类 如何定义神经网络,计算损失值和网络里权重的更新. 应该怎么处理数据? 通常来说,处理图像,文本,语音或者视频数据时,可以使用标准 python 包将数据加载成 numpy 数 ...

  2. MindSpore图像分类模型支持(Lite)

    MindSpore图像分类模型支持(Lite) 图像分类介绍 图像分类模型可以预测图片中出现哪些物体,识别出图片中出现物体列表及其概率. 比如下图经过模型推理的分类结果为下表: 使用MindSpore ...

  3. 基于Kaggle的图像分类(CIFAR-10)

    基于Kaggle的图像分类(CIFAR-10) Image Classification (CIFAR-10) on Kaggle 一直在使用Gluon's data package数据包直接获得张量 ...

  4. Pytorch和CNN图像分类

    Pytorch和CNN图像分类 PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序.它主要由Facebookd的人工智能小组开发,不仅能够实现强大的GPU加速, ...

  5. 图像分类:CVPR2020论文解读

    图像分类:CVPR2020论文解读 Towards Robust Image Classification Using Sequential Attention Models 论文链接:https:// ...

  6. 斯坦福大学李飞飞团队图像分类课程笔记

    斯坦福大学李飞飞团队图像分类课程笔记 Stanford image classification course notes 这是斯坦福CS231n课程图像分类基础知识. 目标:这一节先介绍图像分类基本 ...

  7. 【图像分类案例】(1) ResNeXt 交通标志四分类,附Tensorflow完整代码

    各位同学好,今天和大家分享一下如何使用 Tensorflow 构建 ResNeXt 神经网络模型,通过案例实战 ResNeXt 的训练以及预测过程.每个小节的末尾有网络.训练.预测的完整代码.想要数据 ...

  8. TorchVision中通过AlexNet网络进行图像分类

    TorchVision中给出了AlexNet的pretrained模型,模型存放位置为https://download.pytorch.org/models/alexnet-owt-4df8aa71. ...

  9. 医学图像分类_TauMed:医学诊断领域中的图像分类测试数据扩增

    南京大学智能软件工程实验室 iselab.cn 摘要: 深度学习在医学分类方面取得了长足的进步.但是,在许多现实的环境中,用于训练和测试的数据不足且不平衡,深度学习模型将很容易过度拟合且泛化能力很差. ...

最新文章

  1. 2021年大数据Hive(二):Hive的三种安装模式和MySQL搭配使用
  2. Python完全学习大师班
  3. VS2015+openGL配置
  4. mongodb添加创建修改时间_mongodb副本集生产环境下部署案例,推荐一个主两个从三台机器...
  5. 正则表达式入门之位置匹配
  6. 3、Finished with error: FormatException: Bad UTF-8 encoding 0xc3 (at offset 169)
  7. Laravel核心解读 -- 事件系统
  8. C++之命名空间探究
  9. poj2406 Power Strings 模式匹配算法KMP变形
  10. matlab的lambda,matlab lambda 级数
  11. 汇通达网络IPO取发行区间下限定价,多家投资方将出现账面亏损
  12. netty原理之蔚蓝天空
  13. 如何用邮件客户端收发电子邮件,如何配置邮件客户端?
  14. hellow aiowo
  15. 访问不到webapp
  16. SH7001单电池恒压线性充电IC
  17. linux项目管理软件排名,好用的项目管理软件大排名
  18. it行业计算机考试认证全集
  19. JWT最全知识点-动力节点
  20. Firefly ROC-RK3588S-PC板卡详细介绍

热门文章

  1. Mybatis中TypeHandler的简单应用
  2. skywalking内部测试服务器安装记录
  3. 踔厉奋发,笃行不怠!CASAIM 喜获2022年创新指标完成奖
  4. 子类不能继承或覆盖父类的private方法
  5. 0.45秒!以太坊平均网络传输时间又双叒叕缩短了;以太坊全球节点分布覆盖英国、法国及德国...
  6. stack overflow常见解决方法
  7. stackoverflow无法注册解决方案
  8. 开年纳新|天空卫士家族荣誉谱上再添多名新“成员”
  9. linux vdso(Virtual Dynamically-linked Shared Object)内核态的调用映射到用户态的地址空间开销更小
  10. 《Transformer-XL: Attentive Language ModelsBeyond a Fixed-Length Context》论文阅读笔记