日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习入门篇(二)Lenet网络在caffe+QtCreator上部署应用

發布時間:2024/9/21 pytorch 88 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习入门篇(二)Lenet网络在caffe+QtCreator上部署应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.部署流程

  • 先參考上一篇博客,學會Lenet在caffe上訓練
  • caffe+qt+lenet實現手寫體識別源碼下載地址.
  • 把訓練好的權重文件和深度神經網絡部署到Qt上,實現手寫體的識別.
  • 環境要求(*如果未安裝請參考我的其他博客,有具體介紹)

    • Ubuntu
    • openCV
    • QtCreator
    • caffe
  • 部署流程圖

開始點擊選擇圖片按鈕,讀取一張圖片圖片灰度化處理,設置網絡的輸入大小.圖片輸入Lenet深度卷積神經網絡獲得softMax層的值獲得softMax的最大值下標結束
  • 簡單界面設計?

代碼詳細介紹

  • 代碼文件

    • Lenet-5.pro
    • lenet.h
    • mainwindow.h
    • lenet.cpp
    • main.cpp
    • mainwindow.cpp
    • mainwindow.ui
  • Lenet-5.pro,配置文件.添加opencv的庫目錄和caffe庫目錄及相關依賴項

#------------------------------------------------- # # Project created by QtCreator 2018-01-11T23:43:50 # #-------------------------------------------------QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = Lenet-5 TEMPLATE = appSOURCES += main.cpp\mainwindow.cpp \lenet.cppHEADERS += mainwindow.h \lenet.hFORMS += mainwindow.ui#下面代碼為具體配置,路徑根據自己的修改 INCLUDEPATH += /usr/local/include \ /usr/local/include/opencv \ /usr/local/include/opencv2 LIBS += /usr/local/lib/libopencv_calib3d.so \ /usr/local/lib/libopencv_core.so \ /usr/local/lib/libopencv_features2d.so \ /usr/local/lib/libopencv_flann.so \ /usr/local/lib/libopencv_highgui.so \ /usr/local/lib/libopencv_imgcodecs.so \ /usr/local/lib/libopencv_imgproc.so \ /usr/local/lib/libopencv_ml.so \ /usr/local/lib/libopencv_objdetect.so \ /usr/local/lib/libopencv_photo.so \ /usr/local/lib/libopencv_shape.so \ /usr/local/lib/libopencv_stitching.so \ /usr/local/lib/libopencv_superres.so \ /usr/local/lib/libopencv_videoio.so \ /usr/local/lib/libopencv_video.so \ /usr/local/lib/libopencv_videostab.so # caffe INCLUDEPATH += ../include/caffe/include\ ../include/caffe/src \LIBS += /home/jinshan/caffe/build/lib/libcaffe.so LIBS +=../lib/libcaffe.so.1.0.0-rc3 LIBS += -L../lib LIBS += -lglog -lgflags -lprotobuf -lboost_system -lboost_thread -llmdb -lleveldb -lstdc++ -lcblas -latlasQMAKE_CXXFLAGS += -std=c++0x CONFIG += c++11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • lenet.h.創建一個lenet類,包含網絡的具體調用和數據預處理(核心代碼)?
    • Lenet(std::string model_file,std::string delay_file)://初始化網絡,加載權重
    • void WrapInputLayer(const vector imgs, std::vector *input_channels); //多張圖片,h*w*3->3*h*w?
      void WrapInputLayer(const cv::Mat imgs, std::vector *input_channels); //單張圖片,h*w*3->3*h*w
    • int Predict(cv::Mat img); //返回預測結果
    • std::shared_ptr< Net>net; //定義網絡
#ifndef LENET_H #define LENET_H#define CPU_ONLY //CPU Mode#include <caffe/caffe.hpp> #include <opencv2/opencv.hpp> #include <string> #include <vector> #include <math.h> #include <QMessageBox> #include <qfile.h> #include <QTextStream> #include <QStatusBar> #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; using namespace caffe;class Lenet { public:Lenet();~Lenet();Lenet(std::string model_file,std::string delay_file); //model_file->weight delay->file->netFilevoid WrapInputLayer(const vector<cv::Mat> imgs, std::vector<cv::Mat> *input_channels); //多張圖片,h*w*3->3*h*wvoid WrapInputLayer(const cv::Mat imgs, std::vector<cv::Mat> *input_channels); //單張圖片,h*w*3->3*h*wint Predict(cv::Mat img); //返回結果std::shared_ptr< Net<float>>net; //網絡 }; #endif // LENET_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • lenet.cpp
#include "lenet.h"Lenet::Lenet(){}Lenet::~Lenet(){}Lenet::Lenet(std::string model_file,std::string delay_file) {//CPU模式#ifdef CPU_ONLYCaffe::set_mode(Caffe::CPU);//GPU模式#elseCaffe::set_mode(Caffe::GPU);#endifnet.reset(new Net<float>(delay_file,TEST)); //加載網絡文件net->CopyTrainedLayersFrom(model_file); //加載權重文件 } //將w*h*3轉化位3*h*w void Lenet:: WrapInputLayer(const vector<cv::Mat> imgs, std::vector<cv::Mat> *input_channels) {Blob<float> *input_layer = net->input_blobs()[0]; //取數據層blobint width = input_layer->width(); //獲得blob的寬度int height = input_layer->height(); //獲得blob高度int num = input_layer->num(); //blob數量float *input_data = input_layer->mutable_cpu_data(); //指針方向指向數據blobfor (int j = 0; j < num; j++) { //input_data ->input_channels;//std::vector<cv::Mat> *input_channels;for (int k = 0; k < input_layer->channels(); ++k){cv::Mat channel(height, width, CV_32FC1, input_data);input_channels->push_back(channel);input_data += width * height;}cv::Mat img = imgs[j];cv::split(img, *input_channels);//賦值->給網絡賦值,分為三通道:r,g,binput_channels->clear();} }//單張圖片,h*w*3->3*h*wvoid Lenet::WrapInputLayer(const cv::Mat imgs, std::vector<cv::Mat> *input_channels){Blob<float> *input_layer = net->input_blobs()[0]; //取數據層blobint width = input_layer->width(); //獲得blob的寬度int height = input_layer->height(); //獲得blob高度float *input_data = input_layer->mutable_cpu_data(); //指針方向指向數據blobfor (int k = 0; k < input_layer->channels(); ++k){cv::Mat channel(height, width, CV_32FC1, input_data);input_channels->push_back(channel);input_data += width * height;}cv::split(imgs, *input_channels);//賦值->給網絡賦值,分為三通道:r,g,b}//預測結果int Lenet::Predict(cv::Mat img){std::vector<float> softMax;cv::Mat grayImg;if(img.channels()==3){cv::cvtColor(img, grayImg, cv::COLOR_BGR2GRAY);}//輸入必須位灰度圖cv::resize(grayImg,grayImg, cv::Size(28,28),cv::INTER_CUBIC); //輸入為28*28//cv::imwrite("w.jpg", grayImg);grayImg.convertTo(grayImg,CV_32FC1, 0.00392157); //歸一化 //rehape net 設置網絡輸入尺寸Blob<float> *input_layer = net->input_blobs()[0];input_layer->Reshape(1, 1,grayImg.rows, grayImg.cols);net->Reshape();//change channels 數據轉換std::vector<cv::Mat>channels;WrapInputLayer(grayImg,&channels);//forword net 前向傳播net->Forward();//get SOftMax label 取網絡最后一層SoftMaxBlob<float>* out_layer = net->output_blobs()[0];int count = out_layer->count();const float* start_feature = out_layer->cpu_data();const float* end_feature = out_layer->cpu_data() + count;softMax =std::vector<float>(start_feature, end_feature);//獲得最大值的下標index=預測數字float result = softMax[0];int index = 0;cout<< "sfds"<<softMax.size()<<endl;for(int i = 1; i < softMax.size();i++){if(result< softMax[i]){result = softMax[i];index = i;}cout<<i<<":"<<softMax[i];}cout<<"result:"<<index<<" ";return index;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • mainwindow.cpp,網絡調用和初始化,選擇圖片進行處理得出預測
#include "mainwindow.h" #include "ui_mainwindow.h" #include "lenet.h" MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);//設置窗口this->showMaximized(); //最大化ui->srcImage->setScaledContents(true); //圖片自適應label//初始化網絡string model_file = "./lenet_iter_10000.caffemodel"; //權重文件string delay_file = "./lenet_delay.prototxt"; //網絡文件lenetCNN = Lenet(model_file,delay_file); //初始化 }MainWindow::~MainWindow() {delete ui; }void MainWindow::on_selectImage_clicked() //按鈕selectImage的槽函數 {//獲得圖片路徑QString fileName = QFileDialog::getOpenFileName(this, "open image",QDir::currentPath(),"All files(*.jpg *.png *.bmp)");//std::cout<<fileName.toStdString();cv::Mat img; //定義圖片int resultNumber; //識別結果img = cv::imread(fileName.toStdString()); //讀取圖片resultNumber = lenetCNN.Predict(img); //預測ui->reseult->setText("number: " + QString::number(resultNumber)); //顯示// cout<<"number:"<<resultNumber;//圖片顯示到srcImage控件上cv::cvtColor(img, img, CV_BGR2RGB);QImage qImg = QImage((const unsigned char*)(img.data), img.cols, img.rows, img.cols * img.channels(), QImage::Format_RGB888);ui->srcImage->clear();ui->srcImage->setPixmap(QPixmap::fromImage(qImg)); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • main.cpp 沒有改動
#include "mainwindow.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();return a.exec(); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • mainwindow.ui是界面文件,自行下載源碼查看
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/jmu201521121021/article/details/79048220

總結

以上是生活随笔為你收集整理的深度学习入门篇(二)Lenet网络在caffe+QtCreator上部署应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。