文章目录

  • 前言
  • 一、数据集的制作
  • 二、网络构建与训练
    • 1. 图像预处理
    • 2. 训练数据生成
    • 3. 网络构建
    • 4. 指定参数并训练
  • 三、试用网络

前言

今天我们完成一个需求:给不同图片打上一个量化的标签,将图像作为输入,量化标签(浮点数)作为输出。我们的例子为:一个柔性视觉力度传感器:随着力的大小变化,弹性体发生形变,输出即为力的大小。

本文只提供部分技术的解决方案。


一、数据集的制作

使用通常的应变力传感器来完成标定,给图片打上标签。

二、网络构建与训练

1. 图像预处理

我们相机拍摄的图片为1280x760。我们这里需要裁剪并缩小为56x56,并将其变为灰阶和二值化。

function preprocessed = preprocess(img)tmp = img(0:720, 240:960);tmp = imresize(tmp, [56, 56]);tmp = im2gray(tmp);preprocessed = imbinarize(tmp);
end

2. 训练数据生成

按照80%和20%的分组将数据集分为训练集和测试集。

function [XTrain, YTrain, XValidation, YValidation] = generateTrainData(sourcePath)imds = imageDatastore(sourcePath, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');[dsTrain, dsVal] = splitEachLabel(imds, 0.8, 0.2, 'randomized');[XTrain, YTrain] = imds2array(dsTrain);[XValidation, YValidation] = imds2array(dsVal);
end

由于Matlab的回归任务需要将四维数组作为输入,我们还需要一个函数将图片集转换为4-D double数组。

function [X, T] = imds2array(imds)% imds2array   Convert an image datastore into a 4-D array%%   X       - Input data as an H-by-W-by-C-by-N array, where H is the%             height and W is the width of the images, C is the number of%             channels, and N is the number of images.%   T       - Categorical vector containing the labels for each%             observation.imagesCellArray = imds.readall();numImages = numel(imagesCellArray);[h, w, c] = size(imagesCellArray{1});X = zeros(h, w, c, numImages);for i = 1:numImagesX(:, :, :, i) = im2double(imagesCellArray{i});endT = double(string(imds.Labels));
end

3. 网络构建

根据图片的特征,构建深度网络:

layers = [imageInputLayer([56 56 1])convolution2dLayer(3,8,'Padding','same')batchNormalizationLayerreluLayeraveragePooling2dLayer(2,'Stride',2)convolution2dLayer(3,16,'Padding','same')batchNormalizationLayerreluLayeraveragePooling2dLayer(2,'Stride',2)convolution2dLayer(3,32,'Padding','same')batchNormalizationLayerreluLayerconvolution2dLayer(3,32,'Padding','same')batchNormalizationLayerreluLayerdropoutLayer(0.2)fullyConnectedLayer(1)regressionLayer];

4. 指定参数并训练

miniBatchSize = 128;
validationFrequency = floor(numel(YTrain) / miniBatchSize);
options = trainingOptions('sgdm', ...'MiniBatchSize', miniBatchSize, ...'MaxEpochs', 100, ...'InitialLearnRate', 1e-4, ...'LearnRateSchedule', 'piecewise', ...'LearnRateDropFactor', 0.1, ...'LearnRateDropPeriod', 20, ...'Shuffle', 'every-epoch', ...'ValidationData', {XValidation, YValidation}, ...'ValidationFrequency', 10, ...'Plots', 'training-progress', ...'Verbose', false);net = trainNetwork(XTrain, YTrain, layers, options);

三、试用网络

这里我们使用摄像头实时获取图片,需要Matlab的Image Acquisition Toolbox。
首先查询摄像机Adapter:imaqInfo = imaqhwinfo,输出:

InstalledAdaptors: {'winvideo'}
MATLABVersion: '9.11 (R2021b)'
ToolboxName: 'Image Acquisition Toolbox'
ToolboxVersion: '6.5 (R2021b)'

可以看到,存在的Adaptor只有winvideo,继续查看winvideo的信息:winvideoinfo = imaqhwinfo('winvideo'),找到DeviceInfo,并找到USB Camera的ID。我这里为1。

接下来调用相机:

vid = videoinput('winvideo', 1, 'MJPG_1280x720');
vid.TriggerRepeat = 100;
vid.FrameGrabInterval = 5;
% 加载训练好的网络
load("network.mat");
figure
hold on
i = 0;
start(vid)
while i < 2000if vid.FramesAvailable >= 1i = i + 1;img = getdata(vid, 1); img = preprocess2(img);inp = img2array(img);out = predict(net, inp);plot(i, double(out)/10, 'o');double(out) / 10end
end
stop(vid)

随着按下的力度变化,采集到的力度数据变化曲线如图所示:


虽然值不是很准确,但是趋势是正确的。后续还需要继续调整网络结构和参数。

【机器学习】使用Matlab和CNN完成回归任务相关推荐

  1. MATLAB 使用CNN拟合回归模型预测手写数字的旋转角度(卷积神经网络)

    学习来源自mathworks的官方范例,个人学习使用,在个人项目上可以按照需求变化数据集来实现CNN回归计算 数据集生成方法可以参考:https://blog.csdn.net/qingfengxd1 ...

  2. 手把手实现MATLAB的CNN回归

    基于MATLAB的深度学习工具箱(推荐2018b以上),实现CNN回归. 网上的例子比较少,这里简单的说一下传统的多输入单输出怎么做.手把手的教(PS:MATLAB自带一个回归教程,竟然还是有学生不知 ...

  3. matlab 逻辑斯蒂回归,梯度下降法解逻辑斯蒂回归

    本文是Andrew Ng在Coursera的机器学习课程的笔记. Logistic回归属于分类模型.回顾线性回归,输出的是连续的实数,而Logistic回归输出的是[0,1]区间的概率值,通过概率值来 ...

  4. 基于matlab数据线性拟合回归

    1 选题背景及意义 在统计学中,线性回归是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合.只有一个自变 ...

  5. 基于Octave/Matlab的二元逻辑回归(logistic regression)算法

    基于Octave/Matlab的二元逻辑回归(logistic regression)算法 本博文基于吴恩达老师的机器学习网课,是对作业代码进行简化和补充完整后的实现. 逻辑回归算法的基本思想 sig ...

  6. 机器学习之MATLAB代码--IWOA_BILSTM(基于改进鲸鱼算法优化的BiLSTM预测算法)(十六)

    机器学习之MATLAB代码--IWOA_BILSTM基于改进鲸鱼算法优化的BiLSTM预测算法(十六) 代码 数据 结果 代码 1. %% 基于改进鲸鱼算法优化的BiLSTM预测算法 clear;cl ...

  7. 机器学习之MATLAB代码--SSA-CNN-BiLSTM做电池容量预测(十)

    机器学习之MATLAB代码--SSA-CNN-BiLSTM做电池容量预测(十) 代码 数据 结果 代码 代码按照如下顺序: 1. clc close all clear alldata=xlsread ...

  8. 回归预测 | MATLAB实现SVR(支持向量机回归)K折交叉验证

    回归预测 | MATLAB实现SVR(支持向量机回归)K折交叉验证 目录 回归预测 | MATLAB实现SVR(支持向量机回归)K折交叉验证 基本介绍 划分原理 留一划分 交叉验证 K折交叉 程序设计 ...

  9. 分类预测 | MATLAB实现CNN卷积神经网络多特征分类预测

    分类预测 | MATLAB实现CNN卷积神经网络多特征分类预测 目录 分类预测 | MATLAB实现CNN卷积神经网络多特征分类预测 分类效果 基本介绍 程序设计 参考资料 致谢 分类效果 基本介绍 ...

最新文章

  1. php webapi验签,Asp.netCore3.0 WebApi从0到1手摸手教你写【5】增加接口参数签名验证...
  2. c++:MFC中sqlite3的使用(附实际案例)
  3. HDU - 3374 String Problem(最小表示法+最大表示法+KMP的next数组)
  4. 选择行_外出旅游你会选择自由行还是跟团游?
  5. 记录pageHelper分页orderby的坑
  6. html5访问电脑或手机摄像头
  7. gentoo Wireless Configuration
  8. 海康ehome协议分析(4):GPS上传
  9. 文字转语音软件真人发声(声音自然有感情)
  10. Dynamic Memory Tensor Networks笔记
  11. android注册页面开发
  12. rust中slice panicked at 'byte index 5 is not a char boundary' 问题解决办法
  13. 用静息态fMRI映射人脑多巴胺能影像
  14. 百度谷歌一起搜 - 百Google度 - Chrome插件2
  15. 【Linux】虚拟机VMware的Ubuntu使用vi指令的方向键和backspace空格键乱码
  16. 【Discuz!】添加表情
  17. EFR32上用DMA实现UART高速数据传输
  18. 2022年11月PMP难考吗?
  19. Linux网络延迟排查方法
  20. 192.168.49.1登录_192.168.49.1路由器登录页面打不开

热门文章

  1. renren-generator:运行报错java: 找不到符号 符号: 类 Longblob
  2. 分享一个普通程序员的“沪漂”六年的历程以及感想
  3. Vue.js入门 0x2 内置指令(1)
  4. python 调用Multipart类型接口上传文件和下载文件
  5. Spring面向切面编程-AOP详解
  6. 【C++】哈希——unordered系列容器|哈希冲突|闭散列|开散列
  7. 该怎么用pyqt5来实现数据的增、删、改、查功能...
  8. Python3学习笔记之-学习基础(第三篇)
  9. 移动端开发-响应式页面
  10. OSI七层网络模型详解!