所有教程由网友发布,仅供参考,请谨慎采纳。科创不对教程的科学性、准确性、可靠性负责。
让Baka也能学会玩神经网络的教程(WIP)
我说要有光2016/09/24软件综合 IP:河北

教程中所用到的资源:

XXXXXXXXXXXXXXXXX/download-open-source/#section-2

XXXXXXXXXXXXXXXXX/XXXXXXXXXXXXml

XXXXXXXXXXXXXXXXXX/opencv/opencv_contrib

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

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

无标题3.png

无标题2.png

无标题.png

附源码:

dnndemo.h

<code class="language-c">#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></code>

dnndemo.cpp

<code class="language-c">#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></code>

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

[修改于 7年7个月前 - 2016/09/24 18:04:34]

来自:计算机科学 / 软件综合严肃内容:教程/课程
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
acmilan
7年7个月前 修改于 7年7个月前 IP:四川
826009
GetFullPathNameA
_getcwd然后strcat
filesystem::absolute
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
我说要有光
进士 学者 机友 笔友
文章
317
回复
5531
学术分
15
2008/03/06注册,1时50分前活动

Inspiration, Innovation, Discovery

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}