主要内容

이번역페이지는최신내용을담고있지않습니다。최신내용을영문으로보려면여기를클릭하십시오。

사전훈련된신경망을사용하여영상특징추출하기

이예제에서는사전훈련된컨벌루션신경망에서학습된영상특징을추출한다음추출한특징을사용하여영상분류기를훈련시키는방법을보여줍니다。특징추출은사전훈련된심층신경망의강력한표현기능을가장쉽고빠르게사용하는방법입니다。예를들어,추출된특징에대해fitcecoc(统计和机器学习的工具箱™)를사용하여서포트벡터머신(SVM)을훈련시킬수있습니다。특징추출은데이터를한번만통과하면되기때문에신경망훈련을가속할GPU가없을때시도할수있는좋은출발점이됩니다。

데이터불러오기

샘플영상의압축을풀고영상데이터저장소로서불러옵니다。imageDatastore는폴더이름을기준으로영상에자동으로레이블을지정하고데이터를ImageDatastore객체로저장합니다。영상데이터저장소를사용하면메모리에담을수없는데이터를포함하여다량의영상데이터를저장할수있습니다。데이터를훈련데이터70%와테스트데이로터30%분할합니다。

解压缩(“MerchData.zip”);imd = imageDatastore (“MerchData”“IncludeSubfolders”,真的,“LabelSource”“foldernames”);[imdsTrain, imdsTest] = splitEachLabel (imd, 0.7,“随机”);

이매우작은데이터세트에는이제55개의훈련영상과20개의검증영상이있습니다。샘플영상몇개를표시합니다。

numTrainImages =元素个数(imdsTrain.Labels);idx = randperm (numTrainImages 16);数字i = 1:16 subplot(4,4,i) i = readimage(imdsTrain,idx(i));imshow(我)结束

图中包含16个轴。Axes 1包含一个image类型的对象。Axes 2包含一个image类型的对象。Axes 3包含一个image类型的对象。Axes 4包含一个image类型的对象。Axes 5包含一个image类型的对象。Axes 6包含一个image类型的对象。Axes 7包含一个image类型的对象。Axes 8包含一个image类型的对象。Axes 9包含一个image类型的对象。 Axes 10 contains an object of type image. Axes 11 contains an object of type image. Axes 12 contains an object of type image. Axes 13 contains an object of type image. Axes 14 contains an object of type image. Axes 15 contains an object of type image. Axes 16 contains an object of type image.

사전훈련된신경망불러오기

사전훈련된ResNet-18신경망을불러옵니다。深度学习工具箱模型ResNet-18网络지원패키지가설치되어있지않으면이를다운로드할수있는링크가제공됩니다。1백만개가넘는영상에대해훈련된ResNet-18은영상을키보드,마우스,연필,각종동물등1000가지사물범주로분류할수있습니다。그결과이모델은다양한영상을대표하는다양한특징을학습했습니다。

网= resnet18
net = DAGNetwork with properties: Layers: [71x1 net.cnn.layer. layer] Connections: [78x2 table] InputNames: {'data'} OutputNames: {'ClassificationLayer_predictions'}

신경망아키텍처를분석합니다。첫번째계층인영상입력계층에입력되는영상은크기가224×224×3이어야합니다。3은여기서색채널의개수입니다。

inputSize = net.Layers (1) .InputSize;analyzeNetwork(净)

영상특징추출하기

이신경망의입력영상은크기가224×224×3이어야하는데영상데이터저장소의영상은이와크기가다릅니다。신경망에입력하기전에훈련영상과테스트영상의크기를자동으로조정하려면증대영상데이터저장소를만들고원하는영상크기를지정한다음이러한데이터저장소를激活에대한입력인수로사용하십시오。

augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain);augimdsTest = augmentedImageDatastore (inputSize (1:2), imdsTest);

신경망은입력영상에대한계층표현을생성합니다。보다심층의계층에는앞쪽계층의하위수준특징을사용하여생성한상위수준의특징이포함됩니다。훈련영상과테스트영상의특징표현을가져오려면신경망의끝부분에있는전역풀링계층“pool5”,에대해激活를사용하십시오。전역풀링계층은모든공간위치에대해입력특징을풀링하여총512개의특징을제공합니다。

层=“pool5”;featuresTrain =激活(净、augimdsTrain层,“OutputAs”“行”);featuresTest =激活(净、augimdsTest层,“OutputAs”“行”);谁featuresTrain
名称大小字节类属性特性55x512 112640单

훈련데이터와테스트데이터로부터클래스레이블을추출합니다。

YTrain = imdsTrain.Labels;欧美= imdsTest.Labels;

영상분류기피팅하기

훈련영상으로부터추출한특징을예측변수로사용하고fitcecoc(统计和机器学习的工具箱)를사용하여다중클래스서포트벡터머신(SVM)을피팅합니다。

分类器= fitcecoc (featuresTrain YTrain);

테스트영상분류하기

훈련된SVM모델과테스트영상으로부터추출한특징을사용하여테스트영상을분류합니다。

YPred =预测(分类器,featuresTest);

4개의샘플테스트영상을예측된레이블과함께표시합니다。

Idx = [1 5 10 15];数字i = 1:numel(idx) subplot(2,2,i) i = readimage(imdsTest,idx(i));标签= YPred (idx (i));imshow (I)标题(char(标签)结束

图中包含4个轴。标题为MathWorks Cap的轴1包含一个类型为image的对象。标题为MathWorks Cube的轴2包含一个类型为image的对象。标题为MathWorks Playing Cards的Axes 3包含一个类型为image的对象。标题为MathWorks螺丝刀的轴4包含一个类型为image的对象。

테스트세트에대한분류정확도를계산합니다。정확도는신경망이올바르게예측하는레이블의비율입니다。

精度=平均值(YPred == YTest)
精度= 1

더얕은특징을대상으로분류기훈련시키기

신경망의앞쪽에있는계층에서특징을추출하여이특징을대상으로분류기를훈련시킬수도있습니다。앞쪽계층은통상적으로더적고더얕은특징을추출하고,공간분해능이더높으며,총활성화개수가더많습니다。“res3b_relu”계층에서특징을추출합니다。이것은128개의특징을출력하는마지막계층으로,활성화값의공간크기는28×28입니다。

层=“res3b_relu”;featuresTrain =激活(净、augimdsTrain层);featuresTest =激活(净、augimdsTest层);谁featuresTrain
Name Size Bytes Class Attributes feature

이예제의첫번째부분에서사용되었던추출된특징은전역풀링계층에의해모든공간위치에대해풀링되었습니다。앞쪽계층에서특징을추출할때도동일한결과를달성하려면모든공간위치에대해활성화값의평균을직접구하십시오。N이관측값의개수이고C가특징의개수일때N——- - - - - -C형식을대상으로특징을얻으려면한원소차원을제거하고전치하십시오。

featuresTrain = squeeze(mean(featuresTrain,[1 2]))';featuresTest = squeeze(mean(featuresTest,[1 2]))';谁featuresTrain
名称大小字节类属性特征55x128 28160单

더얕은특징을대상으로SVM분류기를훈련시킵니다。테스트정확도를계산합니다。

分类器= fitcecoc (featuresTrain YTrain);YPred =预测(分类器,featuresTest);精度=平均值(YPred == YTest)
精度= 0.9500

훈련된SVM두개모두높은정확도를갖습니다。특징추출을사용했을때의정확도가충분히높지않다면그대신전이학습을사용해보십시오。예제는새로운영상을분류하도록딥러닝신경망훈련시키기항목을참조하십시오。사전훈련된신경망의목록및비교한내용을보려면사전훈련된심층신경망항목을참조하십시오。

참고항목

(统计学和机器学习工具箱)|

관련항목