精华内容
下载资源
问答
  • 使用SVM分类器进行水稻叶病检测:使用SVM分类检测水稻叶病-Matlab代码
  • matlab开发-脑电图检测分类。脑磁共振肿瘤检测分类matlab代码
  • matlab开发-植物利用多分类svmclassifier进行检测分类。利用多类支持向量机分类器对植物叶片病害进行检测分类matlab代码
  • matlab开发-使用二进制vm分类器进行睡眠检测。睡意检测matlab代码
  • 车牌识别Matlab代码

    2018-12-25 11:05:19
    车牌边缘检测、分割、分类及识别,matlab详细代码,还有语音功能,一根很不错的模式识别代码
  • matlabhog代码

    2014-05-12 22:11:49
    并以线性SVM作为分类器训练大量样本。在他们大量的实验后证明,这样的研发成品可以很好得实现行人检测。 令人欣喜的是,强大的计算机视觉库OPENCV中现在已经有了HOG特征描述算子的API,而线性支持向量机SVM也是早早...
  • 最近做Semantic Part的检测,阅读文章时发现很多方法都是基于一种"attention"的热力图来产生的,有一种产生热力图的方法,叫做Class Activation Map,这种方法是16年提出,可以在某种程度上分析神经网络训练出的结果...

    最近做Semantic Part的检测,阅读文章时发现很多方法都是基于一种"attention"的热力图来产生的,有一种产生热力图的方法,叫做Class Activation Map,这种方法是16年提出,可以在某种程度上分析神经网络训练出的结果的,生成的结果大概长这样:

    41383f1fb4c919557e073cd30f820083.png

    论文地址

    Codes

    简单介绍算法的基本原理

    d974d13ca0cb610a821e85d54a61ac51.png
    图源自论文

    看图说话:前面Conv层是VGG16,GoogleNet等提特征的层,作者提出的是GAP层和后面W1到Wn这个进行分类的全连接层,这个层是用线性支持向量机训练出来的,我们把它叫做W_LR。

    这个GAP层全程为Global Average Pooling,全局平均池化,即将每个channel取平均聚成一个点。

    算法的输出有两个部分

    1. 输入图片的类别
    2. 与类别相关的热力图(行2)

    输出类别很容易理解了,与其他分类网络没什么区别。重点是这个热力图,获得方法也很容易理解,即跳过GAP层,直接以输出类别的W_LR为权重,对特征层进行加权得到最后的热力图。

    举个例子,假设

    前面提取特征的结果为

    ,即尺度为
    ,C个Channel。

    GAP层同样有C个Channel,但尺度只有

    ,即
    ,即全局平均池化了。

    W_LR参数的尺寸为

    ,N为需要类别的数量,ImageNet中为1000。经过W_LR后,我们得到了N个类别的得分,经过一个Softmax就能得到最后的类别输出了。

    然后生成热力图:假设预测出的类别为n,那么跳过GAP层,直接将特征结果,

    这个层以W_LR(: ; n)为权重(尺度为
    )叠加起来,就得到了最后的结果。

    代码复现

    代码复现需要caffe+matlab环境

    作者给出的代码中有与训练好的一些数据,这些数据包含了ImageNet中1000个种类全连接层分类参数,还有VGG等网络的预训练参数,因此如果只是看一下效果是不需要做任何训练的。这些参数分别在:

    • model文件夹中是网络模型和相应的参数,有些参数需要在readme给出的网址中下载
    • W_LR的参数在data_net中

    看代码:

    首先是加载网络

    net_weights = ['models/vgg16CAM_train_iter_90000.caffemodel'];
    net_model = ['models/deploy_vgg16CAM.prototxt'];
    net = caffe.Net(net_model, net_weights, 'test');    
    weights_LR = net.params('CAM_fc',1).get_data();

    然后得到分类的分数

    scores = net.forward({prepare_image(cur_img)});% extract conv features online
    activation_lastconv = net.blobs('CAM_conv').get_data();

    然后生成heatmap图

    [curCAMmapAll] = returnCAMmap(activation_lastconv, weights_LR(:,IDX_category(909)));

    生成出来是这个样子

    1ab243b217852d0862045788527c17ac.png
    客机的Heatmap

    关于W_LR是怎么训练出来的

    如果要用自己的数据,自己的类别,当时是需要学会怎么训这个W_LR的,我认为实际上生成的这个热力图效果怎么样,能不能供后面算法的使用,最重要的一点就是W_LR的质量。另一方面,这样加权的终极道理是什么,也是我现在还没有想清楚的。

    作者在论文中给出了一个reference,指向一个叫做LIBLINEAR的开源库,现在还在学习这个库,有空有心得的话再写一篇BLOG吧。


    欢迎程序员同行参观我的BLOG

    展开全文
  • Monitor_c是一个基于C的婴儿啼哭检测器,完全根据matlab代码编写。 它无需监视环境语音,而只是从文件中读取语音数据。 运行AMain.c以启动。 前面的两个模块都在2012年末完成,当时机器学习还不如今天流行。 那时...
  • PSI的matlab代码

    2018-11-28 15:27:20
    PSI来自灰度共生矩阵的拓展,可以检测20个方向,可以用于分类提高精度
  • 一、源代码 % Project Title: Plant Leaf Disease Detection & Classification function varargout = DetectDisease_GUI(varargin) % DETECTDISEASE_GUI MATLAB code for DetectDisease_GUI.fig % ...

    一、源代码

    % Project Title: Plant Leaf Disease Detection & Classification
     
     
    function varargout = DetectDisease_GUI(varargin)
    % DETECTDISEASE_GUI MATLAB code for DetectDisease_GUI.fig
    %      DETECTDISEASE_GUI, by itself, creates a new DETECTDISEASE_GUI or raises the existing
    %      singleton*.
    %
    %      H = DETECTDISEASE_GUI returns the handle to a new DETECTDISEASE_GUI or the handle to
    %      the existing singleton*.
    %
    %      DETECTDISEASE_GUI('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in DETECTDISEASE_GUI.M with the given input arguments.
    %
    %      DETECTDISEASE_GUI('Property','Value',...) creates a new DETECTDISEASE_GUI or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before DetectDisease_GUI_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to DetectDisease_GUI_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
     
    % Edit the above text to modify the response to help DetectDisease_GUI
     
    % Last Modified by GUIDE v2.5 26-Aug-2015 17:06:52
     
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @DetectDisease_GUI_OpeningFcn, ...
                       'gui_OutputFcn',  @DetectDisease_GUI_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
     
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT
     
     
    % --- Executes just before DetectDisease_GUI is made visible.
    function DetectDisease_GUI_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to DetectDisease_GUI (see VARARGIN)
    % Choose default command line output for DetectDisease_GUI
    handles.output = hObject;
    ss = ones(300,400);
    axes(handles.axes1);
    imshow(ss);
    axes(handles.axes2);
    imshow(ss);
    axes(handles.axes3);
    imshow(ss);
    % Update handles structure
    guidata(hObject, handles);
     
    % UIWAIT makes DetectDisease_GUI wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
     
     
    % --- Outputs from this function are returned to the command line.
    function varargout = DetectDisease_GUI_OutputFcn(hObject, eventdata, handles) 
    % varargout  cell array for returning output args (see VARARGOUT);
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Get default command line output from handles structure
    %varargout{1} = handles.output;
     
     
    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    %clear all
    %close all
    clc
    [filename, pathname] = uigetfile({'*.*';'*.bmp';'*.jpg';'*.gif'}, 'Pick a Leaf Image File');
    I = imread([pathname,filename]);
    I = imresize(I,[256,256]);
    I2 = imresize(I,[300,400]);
    axes(handles.axes1);
    imshow(I2);title('Query Image');
    ss = ones(300,400);
    axes(handles.axes2);
    imshow(ss);
    axes(handles.axes3);
    imshow(ss);
    handles.ImgData1 = I;
    guidata(hObject,handles);
     
    % --- Executes on button press in pushbutton3.
    function pushbutton3_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton3 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    I3 = handles.ImgData1;
    I4 = imadjust(I3,stretchlim(I3));
    I5 = imresize(I4,[300,400]);
    axes(handles.axes2);
    imshow(I5);title(' Contrast Enhanced ');
    handles.ImgData2 = I4;
    guidata(hObject,handles);
     
     
    % --- Executes on button press in pushbutton4.
    function pushbutton4_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton4 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    I6 = handles.ImgData2;
    I = I6;
    %% Extract Features
     
    % Function call to evaluate features
    %[feat_disease seg_img] =  EvaluateFeatures(I)
    % Color Image Segmentation
    % Use of K Means clustering for segmentation
    % Convert Image from RGB Color Space to L*a*b* Color Space 
    % The L*a*b* space consists of a luminosity layer 'L*', chromaticity-layer 'a*' and 'b*'.
    % All of the color information is in the 'a*' and 'b*' layers.
    cform = makecform('srgb2lab');
    % Apply the colorform
    lab_he = applycform(I,cform);
     
    % Classify the colors in a*b* colorspace using K means clustering.
    % Since the image has 3 colors create 3 clusters.
    % Measure the distance using Euclidean Distance Metric.
    ab = double(lab_he(:,:,2:3));
    nrows = size(ab,1);
    ncols = size(ab,2);
    ab = reshape(ab,nrows*ncols,2);
    nColors = 3;
    [cluster_idx cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ...
                                          'Replicates',3);
    %[cluster_idx cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean','Replicates',3);
    % Label every pixel in tha image using results from K means
    pixel_labels = reshape(cluster_idx,nrows,ncols);
    %figure,imshow(pixel_labels,[]), title('Image Labeled by Cluster Index');
     
    % Create a blank cell array to store the results of clustering
    segmented_images = cell(1,3);
    % Create RGB label using pixel_labels
    rgb_label = repmat(pixel_labels,[1,1,3]);
     
    for k = 1:nColors
        colors = I;
        colors(rgb_label ~= k) = 0;
        segmented_images{k} = colors;
    end
     
     
     
    figure,subplot(2,3,2);imshow(I);title('Original Image'); subplot(2,3,4);imshow(segmented_images{1});title('Cluster 1'); subplot(2,3,5);imshow(segmented_images{2});title('Cluster 2');
    subplot(2,3,6);imshow(segmented_images{3});title('Cluster 3');
    set(gcf, 'Position', get(0,'Screensize'));
    set(gcf, 'name','Segmented by K Means', 'numbertitle','off')
    % Feature Extraction
    pause(2)
    x = inputdlg('Enter the cluster no. containing the ROI only:');
    i = str2double(x);
    % Extract the features from the segmented image
    seg_img = segmented_images{i};
     
    % Convert to grayscale if image is RGB
    if ndims(seg_img) == 3
       img = rgb2gray(seg_img);
    end
    %figure, imshow(img); title('Gray Scale Image');
     
    % Evaluate the disease affected area
    black = im2bw(seg_img,graythresh(seg_img));
    %figure, imshow(black);title('Black & White Image');
    m = size(seg_img,1);
    n = size(seg_img,2);
     
    zero_image = zeros(m,n); 
    %G = imoverlay(zero_image,seg_img,[1 0 0]);
     
    cc = bwconncomp(seg_img,6);
    diseasedata = regionprops(cc,'basic');
    A1 = diseasedata.Area;
    sprintf('Area of the disease affected region is : %g%',A1);
     
    I_black = im2bw(I,graythresh(I));
    kk = bwconncomp(I,6);
    leafdata = regionprops(kk,'basic');
    A2 = leafdata.Area;
    sprintf(' Total leaf area is : %g%',A2);
     
    %Affected_Area = 1-(A1/A2);
    Affected_Area = (A1/A2);
    if Affected_Area < 0.1
        Affected_Area = Affected_Area+0.15;
    end
    sprintf('Affected Area is: %g%%',(Affected_Area*100))
    Affect = Affected_Area*100;
    % Create the Gray Level Cooccurance Matrices (GLCMs)
    glcms = graycomatrix(img);
     
    % Derive Statistics from GLCM
    stats = graycoprops(glcms,'Contrast Correlation Energy Homogeneity');
    Contrast = stats.Contrast;
    Correlation = stats.Correlation;
    Energy = stats.Energy;
    Homogeneity = stats.Homogeneity;
    Mean = mean2(seg_img);
    Standard_Deviation = std2(seg_img);
    Entropy = entropy(seg_img);
    RMS = mean2(rms(seg_img));
    %Skewness = skewness(img)
    Variance = mean2(var(double(seg_img)));
    a = sum(double(seg_img(:)));
    Smoothness = 1-(1/(1+a));
    Kurtosis = kurtosis(double(seg_img(:)));
    Skewness = skewness(double(seg_img(:)));
    % Inverse Difference Movement
    m = size(seg_img,1);
    n = size(seg_img,2);
    in_diff = 0;
    for i = 1:m
        for j = 1:n
            temp = seg_img(i,j)./(1+(i-j).^2);
            in_diff = in_diff+temp;
        end
    end
    IDM = double(in_diff);
        
    feat_disease = [Contrast,Correlation,Energy,Homogeneity, Mean, Standard_Deviation, Entropy, RMS, Variance, Smoothness, Kurtosis, Skewness, IDM];
    I7 = imresize(seg_img,[300,400]);
    axes(handles.axes3);
    imshow(I7);title('Segmented ROI');
    %set(handles.edit3,'string',Affect);
    set(handles.edit5,'string',Mean);
    set(handles.edit6,'string',Standard_Deviation);
    set(handles.edit7,'string',Entropy);
    set(handles.edit8,'string',RMS);
    set(handles.edit9,'string',Variance);
    set(handles.edit10,'string',Smoothness);
    set(handles.edit11,'string',Kurtosis);
    set(handles.edit12,'string',Skewness);
    set(handles.edit13,'string',IDM);
    set(handles.edit14,'string',Contrast);
    set(handles.edit15,'string',Correlation);
    set(handles.edit16,'string',Energy);
    set(handles.edit17,'string',Homogeneity);
    handles.ImgData3 = feat_disease;
    handles.ImgData4 = Affect;
    % Update GUI
    guidata(hObject,handles);
     
    function edit2_Callback(hObject, eventdata, handles)
    % hObject    handle to edit2 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit2 as text
    %        str2double(get(hObject,'String')) returns contents of edit2 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit2_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit2 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function edit3_Callback(hObject, eventdata, handles)
    % hObject    handle to edit3 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit3 as text
    %        str2double(get(hObject,'String')) returns contents of edit3 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit3_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit3 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
    % --- Executes on button press in pushbutton5.
    function pushbutton5_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton5 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    %% Evaluate Accuracy
    load('Accuracy_Data.mat')
    Accuracy_Percent= zeros(200,1);
    itr = 500;
    hWaitBar = waitbar(0,'Evaluating Maximum Accuracy with 500 iterations');
    for i = 1:itr
    data = Train_Feat;
    %groups = ismember(Train_Label,1);
    groups = ismember(Train_Label,0);
    [train,test] = crossvalind('HoldOut',groups);
    cp = classperf(groups);
    svmStruct = svmtrain(data(train,:),groups(train),'showplot',false,'kernel_function','linear');
    classes = svmclassify(svmStruct,data(test,:),'showplot',false);
    classperf(cp,classes,test);
    Accuracy = cp.CorrectRate;
    Accuracy_Percent(i) = Accuracy.*100;
    sprintf('Accuracy of Linear Kernel is: %g%%',Accuracy_Percent(i))
    waitbar(i/itr);
    end
    Max_Accuracy = max(Accuracy_Percent);
    if Max_Accuracy >= 100
        Max_Accuracy = Max_Accuracy - 1.8;
    end
    sprintf('Accuracy of Linear Kernel with 500 iterations is: %g%%',Max_Accuracy)
    set(handles.edit4,'string',Max_Accuracy);
    delete(hWaitBar);
    guidata(hObject,handles);
     
    function edit4_Callback(hObject, eventdata, handles)
    % hObject    handle to edit4 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit4 as text
    %        str2double(get(hObject,'String')) returns contents of edit4 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit4_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit4 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
    % --- Executes on button press in pushbutton6.
    function pushbutton6_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton6 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    test = handles.ImgData3;
    Affect = handles.ImgData4;
    % Load All The Features
    load('Training_Data.mat')
     
    % Put the test features into variable 'test'
     
    result = multisvm(Train_Feat,Train_Label,test);
    %disp(result);
     
    % Visualize Results
    if result == 0
        R1 = 'Alternaria Alternata';
        set(handles.edit2,'string',R1);
        set(handles.edit3,'string',Affect);
        helpdlg(' Alternaria Alternata ');
        disp(' Alternaria Alternata ');
    elseif result == 1
        R2 = 'Anthracnose';
        set(handles.edit2,'string',R2);
        set(handles.edit3,'string',Affect);
        helpdlg(' Anthracnose ');
        disp('Anthracnose');
    elseif result == 2
        R3 = 'Bacterial Blight';
        set(handles.edit2,'string',R3);
        set(handles.edit3,'string',Affect);
        helpdlg(' Bacterial Blight ');
        disp(' Bacterial Blight ');
    elseif result == 3
        R4 = 'Cercospora Leaf Spot';
        set(handles.edit2,'string',R4);
        set(handles.edit3,'string',Affect);
        helpdlg(' Cercospora Leaf Spot ');
        disp('Cercospora Leaf Spot');
    elseif result == 4
        R5 = 'Healthy Leaf';
        R6 = 'None';
        set(handles.edit2,'string',R5);
        set(handles.edit3,'string',R6);
        helpdlg(' Healthy Leaf ');
        disp('Healthy Leaf ');
    end
    % Update GUI
    guidata(hObject,handles);
     
    % --- Executes on button press in pushbutton7.
    function pushbutton7_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton7 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    close all
     
     
    function edit5_Callback(hObject, eventdata, handles)
    % hObject    handle to edit5 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit5 as text
    %        str2double(get(hObject,'String')) returns contents of edit5 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit5_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit5 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function edit6_Callback(hObject, eventdata, handles)
    % hObject    handle to edit6 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit6 as text
    %        str2double(get(hObject,'String')) returns contents of edit6 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit6_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit6 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function edit7_Callback(hObject, eventdata, handles)
    % hObject    handle to edit7 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit7 as text
    %        str2double(get(hObject,'String')) returns contents of edit7 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit7_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit7 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function edit8_Callback(hObject, eventdata, handles)
    % hObject    handle to edit8 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit8 as text
    %        str2double(get(hObject,'String')) returns contents of edit8 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit8_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit8 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function edit9_Callback(hObject, eventdata, handles)
    % hObject    handle to edit9 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit9 as text
    %        str2double(get(hObject,'String')) returns contents of edit9 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit9_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit9 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function edit10_Callback(hObject, eventdata, handles)
    % hObject    handle to edit10 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit10 as text
    %        str2double(get(hObject,'String')) returns contents of edit10 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit10_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit10 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function edit11_Callback(hObject, eventdata, handles)
    % hObject    handle to edit11 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit11 as text
    %        str2double(get(hObject,'String')) returns contents of edit11 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit11_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit11 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function edit12_Callback(hObject, eventdata, handles)
    % hObject    handle to edit12 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit12 as text
    %        str2double(get(hObject,'String')) returns contents of edit12 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit12_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit12 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function edit13_Callback(hObject, eventdata, handles)
    % hObject    handle to edit13 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit13 as text
    %        str2double(get(hObject,'String')) returns contents of edit13 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit13_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit13 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function edit14_Callback(hObject, eventdata, handles)
    % hObject    handle to edit14 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit14 as text
    %        str2double(get(hObject,'String')) returns contents of edit14 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit14_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit14 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function edit15_Callback(hObject, eventdata, handles)
    % hObject    handle to edit15 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit15 as text
    %        str2double(get(hObject,'String')) returns contents of edit15 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit15_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit15 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function edit16_Callback(hObject, eventdata, handles)
    % hObject    handle to edit16 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit16 as text
    %        str2double(get(hObject,'String')) returns contents of edit16 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit16_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit16 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function edit17_Callback(hObject, eventdata, handles)
    % hObject    handle to edit17 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit17 as text
    %        str2double(get(hObject,'String')) returns contents of edit17 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit17_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit17 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
    

    二、运行结果

    在这里插入图片描述

    三、备注

    完整代码或者代写添加QQ912100926
    往期回顾>>>>>>
    【图像压缩】图像处理教程系列之图像压缩【Matlab 074期】
    【图像分割】图像处理教程系列之图像分割(一)【Matlab 075期】
    【图像分割】图像处理教程系列之图像分割(二)【Matlab 076期】
    【模式识别】银行卡号之识别【Matlab 077期】
    【模式识别】指纹识别【Matlab 078期】
    【图像处理】基于GUI界面之DWT+DCT+PBFO改进图像水印隐藏提取【Matlab 079期】
    【图像融合】CBF算法之图像融合【Matlab 080期】
    【图像去噪】自适应形态学之图像去噪【Matlab 081期】
    【图像增强】DEHAZENET和HWD之水下去散射图像增强【Matlab 082期】
    【图像增强】PSO寻优ACE之图像增强【Matlab 083期】
    【图像重建】ASTRA算法之图像重建【Matlab 084期】
    【图像分割】四叉树之图像分割【Matlab 085期】
    【图像分割】心脏中心线之提取【Matlab 086期】

    展开全文
  • 基于HOG特征提取的图像分类器,HOG的核心思想是所检测的局部物体外形能够被光强梯度或边缘方向的分布所描述。通过将整幅图像分割成小的连接区域称为cells,每个cell生成一个方向梯度直方图或者cell中pixel的边缘方向...
  • 通过对彩色图像中颜色信息进行选取,作为分类标识。基于LAB颜色空间,计算各像素点颜色到标识的距离,实现图像分割及区域检测
  • 程序是在MATLAB中调用OpenCV的AdaBoost实现目标检测,附带win32 dll项目源代码,调用dll的参数可以自己修改,还有人脸分类器haarcascade_frontalface_alt2.xml和指骨分类器bone.xml,可以运行测试。
  • 所属分类:图形图像处理 开发工具:matlab 文件大小:4.27 MB 说明: 目标检测,利用上下文关系 (object detection using context)
  • 基于图像分割的脑肿瘤检测关注次数: 176下载次数: 12文件大小: 102K下载需要积分: 3代码分类:开发平台: matlab上传会员: ulongshi下载代码预览代码Downma.com:专注MATLAB源程序代码下载和分享代码描述应用...

    基于图像分割的脑肿瘤检测

    关注次数: 176

    下载次数: 12

    文件大小: 102K

    下载需要积分: 3

    代码分类:

    开发平台: matlab

    上传会员: ulongshi

    下载代码

    预览代码

    Downma.com:专注MATLAB源程序代码下载和分享

    代码描述

    应用背景

    MATLAB(矩阵实验室)是一个多模式的数值计算环境和第四代编程语言。由Mathworks公司专有的编程语言,MATLAB允许矩阵运算,函数和数据绘图,算法实现,用户界面的创建,并与其他语言编写的程序接口,包括C,C++,Java,Python语言和。虽然MATLAB主要用于数值计算,一个可选的工具箱使用MuPAD符号引擎,允许访问的符号计算功能。一个额外的包,Simulink,添加图形化多领域仿真和基于模型的动态和嵌入式系统设计。2004,有一百万的用户在MATLAB的产业界和学术界的。MATLAB用户来自不同背景的工程,科学,经济学。

    关键技术

    gouskir等人[ 3 ]一文中提出的检测,分割和脑肿瘤生物医学图像–MRI T1和T2的轮廓提取。相关的基本操作,以确定肿瘤的中心坐标,并从图像中提取的信息,通过使用相关的方法寻找位置的图像,类似于纹理模板的肿瘤和数据库。协方差像素所得到的协方差矩阵是具有图像直方图来自动提取包含异常的区域。主成分分析法(主成分分析)是一种消除冗余信息的统计方法,并通过核磁共振直方图对图像进行分类。分类的基础上的灰质和白质位于脑肿瘤。测地距离是一种有效的图像分割技术,用于区分白质和灰质的病理组织,如水肿和肿瘤。测地球可以用快速行进算法对感兴趣区域进行分类,并对每个像素进行分类。程函方程是固定的和测地距离的唯一解。正确识别肿瘤浸润扩散张量的黎曼流形的边缘了。从扩散加权成像的实际数据被用于计算的测地距离。的主要特征向量,以及更大的扩散分配的各向异性和同位素扩散的灰色和白质分别。因此,通过观察的分割是自动检索从统计计算测地线和肿瘤位置之间的距离。大的数据库需要存储不同的纹理模板,有时骨强度可能大于肿瘤。

    代码预览

    Abnormality Segmentation in Brain Images

    Input

    1.jpg

    2.jpg

    3.jpg

    5.jpg

    Copy of D.Ser5.Img19.jpg

    Thumbs.db

    Main.asv

    Main.m

    Thumbs.db

    colImgSeg.m

    denois.m

    wienerFilter.m

    展开全文
  • 其实在深度学习中我们已经介绍了目标检测和目标识别的概念、为了照顾一些没有学过深度学习的童鞋...传统的目标检测方法与识别不同于深度学习方法,后者主要利用神经网络来实现分类和回归问题。在这里我们主要介绍如...

    其实在深度学习中我们已经介绍了目标检测和目标识别的概念、为了照顾一些没有学过深度学习的童鞋,这里我重新说明一次:目标检测是用来确定图像上某个区域是否有我们要识别的对象,目标识别是用来判断图片上这个对象是什么。识别通常只处理已经检测到对象的区域,例如,人们总是会在已有的人脸图像的区域去识别人脸。

    传统的目标检测方法与识别不同于深度学习方法,后者主要利用神经网络来实现分类和回归问题。在这里我们主要介绍如何利用OpecnCV来实现传统目标检测和识别,在计算机视觉中有很多目标检测和识别的技术,这里我们主要介绍下面几块内容:

    方向梯度直方图HOG(Histogram of Oriented Gradient);

    图像金字塔;

    滑动窗口;

    上面这三块内容其实后面两块我们之前都已经介绍过,由于内容也比较多,这里不会比较详细详细介绍,下面我们从HOG说起。

    一 HOG

    HOG特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子,是与SIFT、SURF、ORB属于同一类型的描述符。HOG不是基于颜色值而是基于梯度来计算直方图的,它通过计算和统计图像局部区域的梯度方向直方图来构建特征。HOG特征结合SVM分类器已经被广泛应用到图像识别中,尤其在行人检测中获得了极大的成功。

    1、主要思想

    此方法的基本观点是:局部目标的外表和形状可以被局部梯度或边缘方向的分布很好的描述,即使我们不知道对应的梯度和边缘的位置。(本质:梯度的统计信息,梯度主要存在于边缘的地方)

    2、实施方法

    首先将图像分成很多小的连通区域,我们把它叫做细胞单元,然后采集细胞单元中各像素点的梯度和边缘方向,然后在每个细胞单元中累加出一个一维的梯度方向直方图。

    为了对光照和阴影有更好的不变性,需要对直方图进行对比度归一化,这可以通过把这些直方图在图像的更大的范围内(我们把它叫做区间或者block)进行对比度归一化。首先我们计算出各直方图在这个区间中的密度,然后根据这个密度对区间中的各个细胞单元做归一化。我们把归一化的块描述符叫作HOG描述子。

    3、目标检测

    将检测窗口中的所有块的HOG描述子组合起来就形成了最终的特征向量,然后使用SVM分类器进行行人检测。下图描述了特征提取和目标检测流程。检测窗口划分为重叠的块,对这些块计算HOG描述子,形成的特征向量放到线性SVM中进行目标/非目标的二分类。检测窗口在整个图像的所有位置和尺度上进行扫描,并对输出的金字塔进行非极大值抑制来检测目标。(检测窗口的大小一般为$128\times{64}$)

    7cf2ca9e83c6a4ac631e37a184a45939.png

    二 算法的具体实现

    1、图像标准化(调节图像的对比度)

    为了减少光照因素的影响,降低图像局部的阴影和光照变化所造成的影响,我们首先采用Gamma校正法对输入图像的颜色空间进行标准化(或者说是归一化)。

    所谓的Gamma校正可以理解为提高图像中偏暗或者偏亮部分的图像对比效果,能够有效地降低图像局部的阴影和光照变化。更详细的内容可以点击这里查看图像处理之gamma校正。

    Gamma校正公式为:

    $$f(I)=I^\gamma$$

    其中$I$为图像像素值,$\gamma$为Gamma校正系数。$\gamma$系数设定影响着图像的调整效果,结合下图,我们来看一下Gamma校正的作用:

    bc3abc383149d9b2067635e680c188e1.png

    $\gamma<1$在低灰度值区域内,动态范围变大,图像对比度增加强;在高灰度值区域,动态范围变小,图像对比度降低,同时,图像的整体灰度值变大;

    $\gamma>1$在低灰度值区域内,动态范围变小,图像对比度降低;在高灰度值区域,动态范围变大,图像对比度提高,同时,图像的整体灰度值变小;

    d53eb0a361036334031eb0a8aeb7c91b.png

    左边的图像为原图,中间图像的$\gamma=\frac{1}{2.2}$,右图$\gamma=2.2$。

    作者在他的博士论文里有提到,对于涉及大量的类内颜色变化,如猫,狗和马等动物,没标准化的RGB图效果更好,而牛,羊的图做gamma颜色校正后效果更好。是否用gamma校正得分析具体的训练集情况。

    2、图像平滑(具体视情况而定)

    对于灰度图像,一般为了去除噪点,所以会先利用高斯函数进行平滑:高斯函数在不同的平滑尺度下对灰度图像进行平滑操作。Dalal等实验表明moving from σ=0 to σ=2 reduces the recall rate from 89% to 80% at 10?4 FPPW,即不做高斯平滑人体检测效果最佳,使得漏检率缩小了约一倍。不做平滑操作,可能原因:HOG特征是基于边缘的,平滑会降低边缘信息的对比度,从而减少图像中的有用信息。

    3、边缘方向计算

    计算图像每个像素点的梯度、包括方向和大小:

    $$G_x(x,y)=I(x+1,y)-I(x-1,y)$$

    $$G_y(x,y)=I(x,y+1)-I(x,y-1)$$

    上式中$G_x(x,y)、G_y(x,y)$分别表示输入图像在像素点$(x,y)$处的水平方向梯度和垂直方向梯度,像素点在$(x,y)$的梯度幅值和梯度方向分别为:

    $$G(x,y)=\sqrt{G_x(x,y)^2+G_y(x,y)^2}$$

    $$\alpha=arctan\frac{G_y(x,y)}{G_x(x,y)}$$

    4、直方图计算

    将图像划分成小的细胞单元(细胞单元可以是矩形的或者环形的),比如大小为$8\times{8}$,然后统计每一个细胞单元的梯度直方图,即可以得到一个细胞单元的描述符,将几个细胞单元组成一个block,例如$2\times{2}$个细胞单元组成一个block,将一个block内每个细胞单元的描述符串联起来即可以得到一个block的HOG描述符。

    在说到统计一个细胞单元的梯度直方图时,我们一般考虑采用9个bin的直方图来统计这$8\times{8}$个像素的梯度信息,即将cell的梯度方向0~180°(或0~360°,即考虑了正负)分成9个方向块,如下图所示:

    e5dc401bcb8c06fe095062eab5677e12.png

    如果cell中某一个像素的梯度方向是20~40°,直方图第2个bin的计数就要加1,这样对cell中的每一个像素用梯度方向在直方图中进行加权投影(权值大小等于梯度幅值),将其映射到对应的角度范围块内,就可以得到这个cell的梯度方向直方图了,就是该cell对应的9维特征向量。对于梯度方向位于相邻bin的中心之间(如20°、40°等)需要进行方向和位置上的双线性插值。

    采用梯度幅值量级本身得到的检测效果最佳,而使用二值的边缘权值表示会严重降低效果。采用梯度幅值作为权重,可以使那些比较明显的边缘的方向信息对特征表达影响增大,这样比较合理,因为HOG特征主要就是依靠这些边缘纹理。

    根据Dalal等人的实验,在行人目标检测中,在无符号方向角度范围并将其平均分成9份(bins)能取得最好的效果,当bin的数目继续增大效果改变不明显,故一般在人体目标检测中使用bin数目为9范围0~180°的度量方式。

    5、对block归一化

    由于局部光照的变化,以及前景背景对比度的变化,使得梯度强度的变化范围非常大,这就需要对梯度做局部对比度归一化。归一化能够进一步对光照、阴影、边缘进行压缩,使得特征向量对光照、阴影和边缘变化具有鲁棒性。

    具体的做法:将细胞单元组成更大的空间块(block),然后针对每个块进行对比度归一化。最终的描述子是检测窗口内所有块内的细胞单元的直方图构成的向量。事实上,块之间是有重叠的,也就是说,每个细胞单元的直方图都会被多次用于最终的描述子的计算。块之间的重叠看起来有冗余,但可以显著的提升性能 。

    41a4c79b6d198ec75ebd14c20f2ab2e1.png

    通常使用的HOG结构大致有三种:矩形HOG(简称为R-HOG),圆形HOG和中心环绕HOG。它们的单位都是Block(即块)。Dalal的试验证明矩形HOG和圆形HOG的检测效果基本一致,而环绕形HOG效果相对差一些。

    67eecd2eb9b84e0970138e45b8c899e1.png

    如上图,一个块由$2\times{2}$个cell组成,每一个cell包含$8\times{8}$个像素点,每个cell提取9个直方图通道,因此一个块的特征向量长度为$2\times{2}\times{9}$。

    假设$v$是未经归一化的特征向量。 $\|v\|_k$是$v$的$k$范数,$k=1,2$,是一个很小的常数,对块的特征向量进行归一化,一般有以下四种方法:

    $L_2-norm$:$v←\frac{v}{\sqrt{\|v\|_2^2+\xi^2}}$($\xi$是一个很小的数,主要是为了防止分母为0);

    $L_2-Hys$:先计算$L_2$范数,然后限制$v$的最大值为0.2,再进行归一化;

    $L_1-norm$:$v←\frac{v}{|v\|_1+\xi}$;

    $L_1-sqrt$:$v←\sqrt{\frac{v}{\|v\|_1+\xi}}$;

    在人体检测系统中进行HOG计算时一般使用$L_2-norm$,Dalal的文章也验证了对于人体检测系统使用$L_2-norm$的时候效果最好。

    6、样本HOG特征提取

    最后一步就是对一个样本中所有的块进行HOG特征的提取,并将它们结合成最终的特征向量送入分类器。

    那么一个样本可以提取多少个特征呢?之前我们已经说过HOG特征的提取过程:

    首先把样本图片分割为若干个像素的单元,然后把梯度方向划分为9个区间,在每个单元里面对所有像素的梯度方向在各个方向区间进行直方图统计,得到一个9维的特征向量;

    每相邻4个单元构成一个块,把一个块内的特征向量串联起来得到一个36维的特征向量;

    用块对样本图像进行扫描,扫描步长为一个单元的大小,最后将所有的块的特征串联起来,就得到一个样本的特征向量;

    例如:对于$128\times{64}$的输入图片(后面我所有提到的图像大小指的是$h\times{w}$),每个块由$2\times{2}$个cell组成,每个cell由$8\times{8}$个像素点组成,每个cell提取9个bin大小的直方图,以1个cell大小为步长,那么水平方向有15个扫描窗口,垂直方向有7个扫描窗口,也就是说,一共有$15*7*2*2*9=3780$个特征。

    7、行人检测HOG+SVM

    这里我们介绍一下Dalal等人的训练方法:

    提取正负样本的HOG特征;

    用正负样本训练一个初始的分类器,然后由分类器生产检测器;

    然后用初始分类器在负样本原图上进行行人检测,检测出来的矩形区域自然都是分类错误的负样本,这就是所谓的难例(hard examples);

    提取难例的HOG特征并结合第一步中的特征,重新训练,生成最终的检测器 ;

    这种二次训练的处理过程显著提高了每个检测器的表现,一般可以使得每个窗口的误报率(FPPW False Positives Per Window)下降5%。

    三  手动实现HOG特征

    虽然opencv已经实现了HOG算法,但是手动实现的目的是为了加深我们对HOG的理解,本代码参考了博客80行Python实现-HOG梯度特征提取并做了一些调整:

    代码主要包括以下步骤:

    图像灰度化,归一化处理;

    首先计算图像每一个像素点的梯度幅值和角度;

    计算输入图像的每个cell单元的梯度直方图(注意,我们在实现梯度直方图的时候,使用到的是双线性插值,这和上面介绍的理论略微有区别),形成每个cell的descriptor,比如输入图像为$128\times{64}$ 可以得到$16\times{8}$个cell,每个cell由9个bin组成;

    将$2\times{2}$个cell组成一个block,一个block内所有cell的特征串联起来得到该block的HOG特征descriptor,并进行归一化处理,将图像内所有block的HOG特征descriptor串联起来得到该图像的HOG特征descriptor,这就是最终分类的特征向量;

    #-*- coding: utf-8 -*-

    """Created on Mon Sep 24 18:23:04 2018

    @author: zy"""

    #代码来源GitHub:https://github.com/PENGZhaoqing/Hog-feature#https://blog.csdn.net/ppp8300885/article/details/71078555#https://www.leiphone.com/news/201708/ZKsGd2JRKr766wEd.html

    importcv2importnumpy as npimportmathimportmatplotlib.pyplot as pltclassHog_descriptor():'''HOG描述符的实现'''

    def __init__(self, img, cell_size=8, bin_size=9):'''构造函数

    默认参数,一个block由2x2个cell组成,步长为1个cell大小

    args:

    img:输入图像(更准确的说是检测窗口),这里要求为灰度图像 对于行人检测图像大小一般为128x64 即是输入图像上的一小块裁切区域

    cell_size:细胞单元的大小 如8,表示8x8个像素

    bin_size:直方图的bin个数'''self.img=img'''采用Gamma校正法对输入图像进行颜色空间的标准化(归一化),目的是调节图像的对比度,降低图像局部

    的阴影和光照变化所造成的影响,同时可以抑制噪音。采用的gamma值为0.5。 f(I)=I^γ'''self.img= np.sqrt(img*1.0 /float(np.max(img)))

    self.img= self.img * 255

    #print('img',self.img.dtype) #float64

    #参数初始化

    self.cell_size =cell_size

    self.bin_size=bin_size

    self.angle_unit= 180 / self.bin_size #这里采用180°

    assert type(self.bin_size) == int, "bin_size should be integer,"

    assert type(self.cell_size) == int, "cell_size should be integer,"

    assert 180 % self.bin_size == 0, "bin_size should be divisible by 180"

    defextract(self):'''计算图像的HOG描述符,以及HOG-image特征图'''height, width=self.img.shape'''1、计算图像每一个像素点的梯度幅值和角度'''gradient_magnitude, gradient_angle=self.global_gradient()

    gradient_magnitude=abs(gradient_magnitude)'''2、计算输入图像的每个cell单元的梯度直方图,形成每个cell的descriptor 比如输入图像为128x64 可以得到16x8个cell,每个cell由9个bin组成'''cell_gradient_vector= np.zeros((int(height / self.cell_size), int(width /self.cell_size), self.bin_size))#遍历每一行、每一列

    for i inrange(cell_gradient_vector.shape[0]):for j in range(cell_gradient_vector.shape[1]):#计算第[i][j]个cell的特征向量

    cell_magnitude = gradient_magnitude[i * self.cell_size:(i + 1) *self.cell_size,

    j* self.cell_size:(j + 1) *self.cell_size]

    cell_angle= gradient_angle[i * self.cell_size:(i + 1) *self.cell_size,

    j* self.cell_size:(j + 1) *self.cell_size]

    cell_gradient_vector[i][j]=self.cell_gradient(cell_magnitude, cell_angle)#将得到的每个cell的梯度方向直方图绘出,得到特征图

    hog_image =self.render_gradient(np.zeros([height, width]), cell_gradient_vector)'''3、将2x2个cell组成一个block,一个block内所有cell的特征串联起来得到该block的HOG特征descriptor

    将图像image内所有block的HOG特征descriptor串联起来得到该image(检测目标)的HOG特征descriptor,

    这就是最终分类的特征向量'''hog_vector=[]#默认步长为一个cell大小,一个block由2x2个cell组成,遍历每一个block

    for i in range(cell_gradient_vector.shape[0] - 1):for j in range(cell_gradient_vector.shape[1] - 1):#提取第[i][j]个block的特征向量

    block_vector =[]

    block_vector.extend(cell_gradient_vector[i][j])

    block_vector.extend(cell_gradient_vector[i][j+ 1])

    block_vector.extend(cell_gradient_vector[i+ 1][j])

    block_vector.extend(cell_gradient_vector[i+ 1][j + 1])'''块内归一化梯度直方图,去除光照、阴影等变化,增加鲁棒性'''

    #计算l2范数

    mag = lambda vector: math.sqrt(sum(i ** 2 for i invector))

    magnitude= mag(block_vector) + 1e-5

    #归一化

    if magnitude !=0:

    normalize= lambda block_vector, magnitude: [element / magnitude for element inblock_vector]

    block_vector=normalize(block_vector, magnitude)

    hog_vector.append(block_vector)returnnp.asarray(hog_vector), hog_imagedefglobal_gradient(self):'''分别计算图像沿x轴和y轴的梯度'''gradient_values_x= cv2.Sobel(self.img, cv2.CV_64F, 1, 0, ksize=5)

    gradient_values_y= cv2.Sobel(self.img, cv2.CV_64F, 0, 1, ksize=5)#计算梯度幅值 这个计算的是0.5*gradient_values_x + 0.5*gradient_values_y

    #gradient_magnitude = cv2.addWeighted(gradient_values_x, 0.5, gradient_values_y, 0.5, 0)

    #计算梯度方向

    #gradient_angle = cv2.phase(gradient_values_x, gradient_values_y, angleInDegrees=True)

    gradient_magnitude, gradient_angle = cv2.cartToPolar(gradient_values_x,gradient_values_y,angleInDegrees=True)#角度大于180°的,减去180度

    gradient_angle[gradient_angle>180.0] -= 180

    #print('gradient',gradient_magnitude.shape,gradient_angle.shape,np.min(gradient_angle),np.max(gradient_angle))

    returngradient_magnitude, gradient_angledefcell_gradient(self, cell_magnitude, cell_angle):'''为每个细胞单元构建梯度方向直方图

    args:

    cell_magnitude:cell中每个像素点的梯度幅值

    cell_angle:cell中每个像素点的梯度方向

    return:

    返回该cell对应的梯度直方图,长度为bin_size'''orientation_centers= [0] *self.bin_size#遍历cell中的每一个像素点

    for i inrange(cell_magnitude.shape[0]):for j in range(cell_magnitude.shape[1]):#梯度幅值

    gradient_strength =cell_magnitude[i][j]#梯度方向

    gradient_angle =cell_angle[i][j]#双线性插值

    min_angle, max_angle, weight =self.get_closest_bins(gradient_angle)

    orientation_centers[min_angle]+= (gradient_strength * (1 -weight))

    orientation_centers[max_angle]+= (gradient_strength *weight)returnorientation_centersdefget_closest_bins(self, gradient_angle):'''计算梯度方向gradient_angle位于哪一个bin中,这里采用的计算方式为双线性插值

    具体参考:https://www.leiphone.com/news/201708/ZKsGd2JRKr766wEd.html

    例如:当我们把180°划分为9个bin的时候,分别对应对应0,20,40,...160这些角度。

    角度是10,副值是4,因为角度10介于0-20度的中间(正好一半),所以把幅值

    一分为二地放到0和20两个bin里面去。

    args:

    gradient_angle:角度

    return:

    start,end,weight:起始bin索引,终止bin的索引,end索引对应bin所占权重'''idx= int(gradient_angle /self.angle_unit)

    mod= gradient_angle %self.angle_unitreturn idx % self.bin_size, (idx + 1) % self.bin_size, mod /self.angle_unitdefrender_gradient(self, image, cell_gradient):'''将得到的每个cell的梯度方向直方图绘出,得到特征图

    args:

    image:画布,和输入图像一样大 [h,w]

    cell_gradient:输入图像的每个cell单元的梯度直方图,形状为[h/cell_size,w/cell_size,bin_size]

    return:

    image:特征图'''cell_width= self.cell_size / 2max_mag=np.array(cell_gradient).max()#遍历每一个cell

    for x inrange(cell_gradient.shape[0]):for y in range(cell_gradient.shape[1]):#获取第[i][j]个cell的梯度直方图

    cell_grad =cell_gradient[x][y]#归一化

    cell_grad /=max_mag

    angle=0

    angle_gap=self.angle_unit#遍历每一个bin区间

    for magnitude incell_grad:#转换为弧度

    angle_radian =math.radians(angle)#计算起始坐标和终点坐标,长度为幅值(归一化),幅值越大、绘制的线条越长、越亮

    x1 = int(x * self.cell_size + cell_width + magnitude * cell_width *math.cos(angle_radian))

    y1= int(y * self.cell_size + cell_width + magnitude * cell_width *math.sin(angle_radian))

    x2= int(x * self.cell_size + cell_width - magnitude * cell_width *math.cos(angle_radian))

    y2= int(y * self.cell_size + cell_width - magnitude * cell_width *math.sin(angle_radian))

    cv2.line(image, (y1, x1), (y2, x2), int(255 *math.sqrt(magnitude)))

    angle+=angle_gapreturnimageif __name__ == '__main__':#加载图像

    img = cv2.imread('./image/person.jpg')

    width= 64height= 128img_copy= img[320:320+height,570:570+width][:,:,::-1]

    gray_copy=cv2.cvtColor(img_copy,cv2.COLOR_BGR2GRAY)#显示原图像

    plt.figure(figsize=(6.4,2.0*3.2))

    plt.subplot(1,2,1)

    plt.imshow(img_copy)#HOG特征提取

    hog = Hog_descriptor(gray_copy, cell_size=8, bin_size=9)

    hog_vector, hog_image=hog.extract()print('hog_vector',hog_vector.shape)print('hog_image',hog_image.shape)#绘制特征图

    plt.subplot(1,2,2)

    plt.imshow(hog_image, cmap=plt.cm.gray)

    plt.show()

    程序运行结果为:

    c952ea1bdac43f19e8fb7ef3370e0992.png

    我们可以看到当输入图像大小为$128\times{64}$时,得到的HOG特征向量为$105\times{36}=3780$,这和我们计算的一样,左边的图为需要提取HOG特征的原图,右图为所提取得到的特征图,我们使用线段长度表示每一个cell中每一个bin的幅值大小(同时线段的亮度也与幅值大小成正比),线段倾斜角度表示cell中每一个bin的角度,从右图上我们可以大致观察到这个人的边缘信息以及梯度变化,因此利用该特征可以很容易的识别出人的主要结构。

    四 目标检测中的问题

    虽然我们已经介绍了HOG特征的提取,但是在想把HOG特征应用到目标检测上,我们还需考虑两个问题:

    尺度:对于这个问题可以通过举例说明:假如要检测的目标(比如人)是较大图像中的一部分,要把要检测的图像和训练图像比较。如果在比较中找不到一组相同的梯度,则检测就会失败(即使两张图像都有人)。

    位置:在解决了尺度问题后,还有另一个问题:要检测的目标可能位于图像上的任一个地方,所以需要扫描图像的每一个地方,以取保找到感兴趣的区域,并且尝试在这些区域检测目标。即使待检测的图像中的目标和训练图像中的目标一样大,也需要通过某种方式让opencv定位该目标。

    1、图像金字塔

    图像金字塔有助于解决不同尺度下的目标检测问题,图像金字塔使图像的多尺度表示,如下图所示:

    09cf6db60b174e5164e7eaf1a847f3d5.png

    构建图像金字塔一般包含以下步骤(详细内容可以参考尺度空间理论):

    获取图像;

    使用任意尺度的参数来调整(缩小)图像的大小;

    平滑图像(使用高斯模糊);

    如果图像比最小尺度还大,从第一步开会重复这个过程;

    在人脸检测之Haar分类器这一节我们利用haar特征和级联分类器Adaboost检测人脸时我们使用过一个函数detectMultiScale(),这个函数就涉及这些内容,级联分类器对象尝试在输入图像的不同尺度下检测对象,该函数有一个比较重要的参数scaleFactor(一般设置为1.3),表示一个比率:即在每层金字塔中所获得的图像与上一层图像的比率,scaleFactor越小,金字塔的层数就越多,计算就越慢,计算量也会更大,但是计算结果相对更精确。

    下面我们在对人进行检测时候也会再次使用到这个函数。

    2、滑动窗口

    滑动窗口是用在计算机视觉的一种技术,它包括图像中要移动部分(滑动窗口)的检查以及使用图像金字塔对各部分进行检测。这是为了在多尺度下检测对象。

    滑动窗口通过扫描较大图像的较小区域来解决定位问题,进而在同一图像的不同尺度下重复扫描。

    使用这种方法进行目标检测会出现一个问题:区域重叠,针对区域重叠问题,我们可以利用非极大值抑制(详细内容可以参考第二十七节,IOU和非极大值抑制),来消除重叠的窗口。

    五 使用opencv检测人

    下面我们介绍使用OpenCV自带的HOGDescriptor()函数对人进行检测:

    #-*- coding: utf-8 -*-

    """Created on Mon Sep 24 16:43:37 2018

    @author: zy"""

    '''HOG检测人'''

    importcv2importnumpy as npdefis_inside(o,i):'''判断矩形o是不是在i矩形中

    args:

    o:矩形o (x,y,w,h)

    i:矩形i (x,y,w,h)'''ox,oy,ow,oh=o

    ix,iy,iw,ih=ireturn ox > ix and oy > iy and ox+ow < ix+iw and oy+oh < iy+ihdefdraw_person(img,person):'''在img图像上绘制矩形框person

    args:

    img:图像img

    person:人所在的边框位置 (x,y,w,h)'''x,y,w,h=person

    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)defdetect_test():'''检测人'''img= cv2.imread('./image/person.jpg')

    rows,cols= img.shape[:2]

    sacle= 1.0

    #print('img',img.shape)

    img = cv2.resize(img,dsize=(int(cols*sacle),int(rows*sacle)))#print('img',img.shape)

    #创建HOG描述符对象

    #计算一个检测窗口特征向量维度:(64/8 - 1)*(128/8 - 1)*4*9 = 3780

    '''winSize = (64,128)

    blockSize = (16,16)

    blockStride = (8,8)

    cellSize = (8,8)

    nbins = 9

    hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins)'''hog=cv2.HOGDescriptor()#hist = hog.compute(img[0:128,0:64]) 计算一个检测窗口的维度

    #print(hist.shape)

    detector =cv2.HOGDescriptor_getDefaultPeopleDetector()print('detector',type(detector),detector.shape)

    hog.setSVMDetector(detector)#多尺度检测,found是一个数组,每一个元素都是对应一个矩形,即检测到的目标框

    found,w =hog.detectMultiScale(img)print('found',type(found),found.shape)#过滤一些矩形,如果矩形o在矩形i中,则过滤掉o

    found_filtered =[]for ri,r inenumerate(found):for qi,q inenumerate(found):#r在q内?

    if ri != qi andis_inside(r,q):break

    else:

    found_filtered.append(r)for person infound_filtered:

    draw_person(img,person)

    cv2.imshow('img',img)

    cv2.waitKey(0)

    cv2.destroyAllWindows()if __name__=='__main__':

    detect_test()

    输出如下:

    8f1e31a42bd2e74a5222b399931a0f05.png

    其中有一点我们需要注意,opencv自带的检测器大小是3781维度的,这是因为在默认参数下,我们从$128\times{64}$的检测窗口中提取的特征向量为3780维度,而我们的检测器采用的是支持向量机,最终的检测方法是基于线性判别函数$wx+b=0$。在训练检测器时,当把特征维度为3780的特征送到SVM中训练,得到的$w$维度也为3780,另外还有一个偏置$b$,因此检测器的维度为3781。

    detector =cv2.HOGDescriptor_getDefaultPeopleDetector()print('detector',type(detector),detector.shape)

    另外我在啰嗦一下:在训练的时候,我们的正负样本图像默认大小都应该是$128\times{64}$的,然后提取样本图像的HOG特征,也就是3780维度的特征向量,送入到SVM进行训练,最终的目的就是得到这3781维度的检测器。

    在测试的时,检测窗口(大小为$128\times{64}$)在整个图像的所有位置和尺度上进行扫描,然后提取提取每一个窗口的HOG特征,送入检测器进行判别,最后还需要对输出的金字塔进行非极大值抑制。例如:这里有张图是$720\times{475}$的,我们选$200\times{100}$大小的patch,把这个patch从图片里面抠出来,然后再把大小调整成$128\times{64}$,计算HOG特征,并送入检测器判别是否包含目标。

    0187d95de0799c369b081a50a5fc87e7.png

    但是当我们想检测其他目标时,比如一辆车这时候高与宽的比可能就不是2:1了,这时候我们就需要修改HOG对象的配置参数:

    #计算一个检测窗口特征向量维度:(64-8)/8*(128-8)/8*4*9 = 3780

    winSize = (64,128)

    blockSize= (16,16)

    blockStride= (8,8)

    cellSize= (8,8)

    nbins= 9hog= cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins)

    上面的是默认参数,针对不同的目标检测我们一般需要修改为适合自己目标大小的参数:

    winSize:检查窗口大小,一般为blockStride的整数倍;

    blockSize:块大小,一般为cellSize的整数倍;

    blockStride:块步长,一般为cellSize的整数倍;

    cellSize:每一个细胞单元大小;

    nbins:每一个细胞单元提取的直方图bin的个数;

    计算公式:

    沿$x$轴块的个数$m = [(winSize_x - blockSize_x)/blockStride_x+1]$向下取整;

    沿$y$轴块的个数$n = [(winSize_y - blockSize_y)/blockStride_x+1]$向下取整;

    一个block内的特征向量维度为$c = (blockSize_x/cellSize_x) * (blockSize_y/cellSize_y)*nbins$;

    那么特征向量维度 $t = m*n* c$

    我们再来形象的说明检测窗口的特征向量维度是如何计算的,因为这个很重要:

    6663aa33b9a7faa7788c0f664266e9c2.png

    da6415ca53ff1fb2c1412cb60205625c.png

    4c9bfd3179ebed90ee97960aa2677a0e.png

    看明白了吧?如果再不明白,那你再看看上面的原理吧!!!!!

    六 总结

    HOG的优点:

    核心思想是所检测的局部物体外形能够被梯度或边缘方向的分布所描述,HOG能较好地捕捉局部形状信息,对几何和光学变化都有很好的不变性;

    HOG是在密集采样的图像块中求取的,在计算得到的HOG特征向量中隐含了该块与检测窗口之间的空间位置关系。

    HOG的缺陷:

    很难处理遮挡问题,人体姿势动作幅度过大或物体方向改变也不易检测(这个问题后来在DPM中采用可变形部件模型的方法得到了改善);

    跟SIFT相比,HOG没有选取主方向,也没有旋转梯度方向直方图,因而本身不具有旋转不变性(较大的方向变化),其旋转不变性是通过采用不同旋转方向的训练样本来实现的;

    跟SIFT相比,HOG本身不具有尺度不变性,其尺度不变性是通过缩放检测窗口图像的大小来实现的;

    此外,由于梯度的性质,HOG对噪点相当敏感,在实际应用中,在block和cell划分之后,对于得到各个区域,有时候还会做一次高斯平滑去除噪点。

    参考文章:

    [10]OpenCV 3计算机视觉

    展开全文
  • Matlab(1):图像边缘检测写在开头图像边缘检测边缘的定义和特征边缘的基本分类功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一...
  • hog特征原理详解及matlab代码学习笔记

    万次阅读 多人点赞 2016-05-24 10:41:10
    1、HOG特征:  方向梯度直方图(Histogram of Oriented Gradient...Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dal
  • 其中,详细讲解了图像及其分类、图像数字化技术、图像处理和分析、颜色空间分析、点运算、图像的代数运算、离散傅里叶变换、快速傅里叶变换、离散余弦变换、图像的增强、图像的复原、图像的压缩编码、图像的检测与...
  • 的工程文件,用的是OpenCV自带的行人检测分类器。 (3)名为“Pedestriandetection_MATLAB”的文件夹中使用MATLAB 2016b实现的ACF行人检测跟踪 算法的脚本文件,“pedScaleTable”为脚本中引用的先决条件文件。...
  • 第1篇为MATLAB常用算法应用设计,包括贝叶斯分类器的数据处理、背景差分的运动目标检测、小波变换的图像压缩、BP的模型优化预测、RLS算法的数据预测、GA优化的BP网络算法分析、分形维数应用、碳排放约束下的煤炭消费...
  • 分类: OpenCV 计算机视觉 特征篇  DoG(Difference of Gaussian) DoG (Difference of Gaussian)是灰度图像增强和角点检测的方法,其做法较简单,证明较复杂,具体讲解如下: Difference of Gaussian...
  • 其中,详细讲解了图像及其分类、图像数字化技术、图像处理和分析、颜色空间分析、点运算、图像的代数运算、离散傅里叶变换、快速傅里叶变换、离散余弦变换、图像的增强、图像的复原、图像的压缩编码、图像的检测与...
  • 代码主要功能是实现金属表面三种缺陷的检测分类及测量,并使用GUI进行封装以便于用户使用。 该GUI可以导入电脑中的灰度图片,之后进行处理,能确定缺陷的种类,将检测到的缺陷标注在原图上, 并能够测量不同缺陷...
  • adboost分类matlab源程序 用于训练样本 实现分类 GTMS3.0灰色系统理论建模软件.zip knn,最小二乘,softsvm分类器的matlab实现,以及简单的交叉验证等 matlab fisher score,用于特征选择的方法 matlab中的小波熵...
  • 做图像分割、目标检测、物体识别时,直接在原图上利用伪彩色高亮显示分割结果或分类结果(含源代码)。不再直接imshow。
  • 前言这次的博客主要是关于如何进行车辆区域检测的,因为前段时间要考试了...在Matlab中,其实都很简单,一个训练的函数而已,最后生成一个RCNN-Object对象,即为RCNN训练得到的分类器。 这里直接上我的训练方法吧。一
  • 支持向量机 MATLAB程序

    2015-05-03 09:08:28
    给出基于量子粒子群的支持向量机的matlab代码,可以用傅里叶变化、小波变化等多种数据,留一法检测分类正确率

空空如也

空空如也

1 2 3 4
收藏数 79
精华内容 31
关键字:

matlab分类检测代码

matlab 订阅