加载中
加载中
表情图片
评为精选
鼓励
加载中...
分享
加载中...
文件下载
加载中...
修改排序
加载中...
所有教程由网友发布,仅供参考,请谨慎采纳。科创不对教程的科学性、准确性、可靠性负责。
让Baka也能学会玩神经网络的教程(WIP)
我说要有光2016/09/24软件综合 IP:河北

教程中所用到的资源:

https://www.qt.io/download-open-source/#section-2

http://opencv.org/downloads.html

https://github.com/opencv/opencv_contrib

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

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

无标题3.png

无标题2.png

无标题.png

附源码:

dnndemo.h

Other
#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

Other
#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 文件了,有兴趣的朋友自己编译体会一下吧。

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

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

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

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

Inspiration, Innovation, Discovery

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的