文号
826004
阅读
16668
回复
1
收藏
3
所有教程由网友发布,仅供参考,请谨慎采纳。科创不对教程的科学性、准确性、可靠性负责。
让Baka也能学会玩神经网络的教程(WIP)
2016/09/24
IP:河北

教程中所用到的资源:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

(这里是尚未编写完成的教程)

通常来说,只有训练过的内容神经网络才会认识。

无标题3.png

无标题2.png

无标题.png

附源码:

dnndemo.h

#ifndef DNNDEMO_H
#define DNNDEMO_H

#include <qobject>
#include <qimage>

#include <opencv2 dnn.hpp>
#include <opencv2 imgproc.hpp>

typedef struct classIdProb
{
    int classId;
    double classProb;
} ClassIdProb;

class DnnDemo : public QObject
{
    Q_OBJECT
public:
    explicit DnnDemo(QObject *parent = 0);
    ClassIdProb getClassIdProbByImage(QImage image);

private:
    cv::dnn::Net net;
    void getMaxClass(cv::dnn::Blob &probBlob, int *classId, double *classProb);

signals:

public slots:
};

#endif // DNNDEMO_H

</opencv2></opencv2></qimage></qobject>

dnndemo.cpp

#include "dnndemo.h"

#include <opencv2 dnn.hpp>
#include <opencv2 imgproc.hpp>

using namespace cv;
using namespace cv::dnn;

DnnDemo::DnnDemo(QObject *parent) : QObject(parent)
{
    //prototxt和caffemodel文件的路径,看起来很丑,我不知如何使用相对路径打开它
    const char * modelTxt = "C:/Users/ml/Documents/build-CvDnnDemo-Desktop_Qt_5_7_0_MinGW_32bit-Debug/bvlc_googlenet.prototxt";
    const char * modelBin = "C:/Users/ml/Documents/build-CvDnnDemo-Desktop_Qt_5_7_0_MinGW_32bit-Debug/bvlc_googlenet.caffemodel";
    //加载prototxt和caffemodel文件
    Ptr<dnn::importer> importer = dnn::createCaffeImporter(modelTxt, modelBin);
    //初始化神经网络,不细说
    importer->populateNet(net);
    //不再需要这个importer了,释放
    importer.release();
}

ClassIdProb DnnDemo::getClassIdProbByImage(QImage image)
{
    //GoogleNet规定了只许使用224x224的RGB图像,这里是从QImage到Mat的各种转换,不细说
    image = image.convertToFormat(QImage::Format_RGB888);
    Mat img = Mat(image.height(), image.width(), CV_8UC3, image.scanLine(0));;
    resize(img, img, Size(224, 224));

    //把Mat图像类型数据转换成给神经网络使用的Blob
    dnn::Blob inputBlob = dnn::Blob(img);

    //设置".data"层的输入数据,"data"是模型文件bvlc_googlenet.prototxt当中一个层,位于最前,至于为什么加一个"."我也不懂,尚且留着吧。。。
    net.setBlob(".data", inputBlob);        //set the network input

    //使用神经网络做运算
    net.forward();

    //获取神经网络中"prob"的输出结果,"prob"也是模型文件bvlc_googlenet.prototxt当中一个层的名字,位于最后
    dnn::Blob prob = net.getBlob("prob");

    //ClassIdProb是我随便定义的一个struct,方便用来同时保存Id和Prob的值
    ClassIdProb result;
    //寻找最佳匹配分类
    getMaxClass(prob, &result.classId, &result.classProb);

    return result;
}

/* 使用神经网络运算结果寻找最佳的匹配 */
void DnnDemo::getMaxClass(dnn::Blob &probBlob, int *classId, double *classProb)
{
    //一堆巴拉巴拉的转换,你要是数学好可以自己琢磨琢磨它是啥原理,总之就是把之前神经网络运算的结果变成一个Mat类型的变量了
    Mat probMat = probBlob.matRefConst().reshape(1, 1);
    Point classNumber;

    //第二个参数是最小的匹配,这里用不到,就省略了
    minMaxLoc(probMat, NULL, classProb, NULL, &classNumber);
    *classId = classNumber.x;
}

</dnn::importer></opencv2></opencv2>

因为绝对路径的关系就不上传 bin 文件了,有兴趣的朋友自己编译体会一下吧。

[ 修改于10年2个月前 - 2016/09/24 18:04:34 ]
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的