# FW2_2 **Repository Path**: applezyh/FW2_2 ## Basic Information - **Project Name**: FW2_2 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-21 - **Last Updated**: 2022-05-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 高级语言程序设计2-2课程作业 #### 简介 基于Qt完成的图形处理小程序,支持对图片的读取、保存、锐化、模糊、饱和度调整、画图编辑等基础图片处理功能。运行演示示例见 [视频链接](https://www.bilibili.com/video/BV1H44y1u7va/) #### 项目结构 QtWidgetsApplication.cpp&&.hpp 文件为程序主界面,所有组件包括画布、滑动窗、功能按钮均在主界面数据结构中实现。 my_label.h&&.cpp继承QtLabel类实现了程序画布类,主要作用是保存图片并且响应各种事件(鼠标点击、移动),并且在该源文件中实现了三个图像处理程序来完成图像模糊、锐化和对比度调整操作。 #### 关联项目 minnet 关联项目由于时间问题为集成到图像处理小程序中,但也具有一定的工作量。 minnet是一个基于C++20标准实现的轻量深度学习框架,除C++标准库外不依赖任何第三方库,源码仅有2000行左右,适合帮助深度学习初学者更加深入理解深度学习算法、流程的实现。框架支持神经网络模型的搭建、训练和推理过程。 ## 基于C++的深度学习框架: minnet ### 1. 框架配置 该框架基于C++20标准实现,除了demo对图像的读写和显示功能会用到OpenCV库之外没有其他外部依赖。 在Linux操作系统下,需要保证您的编译器支持C++20标准,如果想要运行演示程序,需要安装OpenCV。 构建方法: 根目录运行: ```shell mkdir build && cd build && cmake .. ``` 完成项目构建,构建完成后可以在{根目录}/build/src目录下找到对应的静态链接库文件lib_minnet.a。如果运行机器安装有OpenCV您也可以在{根目录}/build/example目录下找到对应的演示程序,演示程序将基于mnist数据集进行训练并且输出测试结果。 运行演示程序需要提前安装OpenCV,并且准备好mnist数据集,项目提供mnist数据集下载脚本。使用python(版本要求3.X)运行`example/script/download_mnist.py`脚本,会自动下载mnist数据集到example/mnist文件夹下。 关于OpenCV的安装,这里给出源码安装的方式,同样安装OpenCV需要保证安装环境配置有cmake。 ```shell // 选择合适的安装目录 // 在OpenCV项目根目录下 mkdir build && cd build && cmake .. && make install // 运行上述命令,然后等待OpenCV安装 ``` 运行演示程序需要在命令行给出mnist数据集所在的目录路径,以在根目录下运行演示程序为例。 ```shell ./build/example/cnn_demo ./example/msist/ ``` 演示程序会利用mnist训练集进行模型训练,并且在测试集上进行测试。模型配置如下: ```C++ class Net :public minnet::Model { public: Net() { conv1 = minnet::Conv2d(1, 1); conv2 = minnet::Conv2d(1, 1); fc1 = minnet::Linear(1 * (7 * 7), 10); dropout = minnet::DropOut(0.5); add_layer(&conv1); add_layer(&conv2); add_layer(&fc1); add_layer(&dropout); } minnet::Tensor Forward(minnet::Tensor input) override { minnet::Tensor out = conv1(input); out = dropout(out); out = minnet::Relu(out); out = minnet::MaxPool2d(out); out = conv2(out); out = dropout(out); out = minnet::Relu(out); out = minnet::MaxPool2d(out); out = out.reshape(1, -1); return fc1(out); } private: minnet::Conv2d conv1; minnet::Conv2d conv2; minnet::Linear fc1; minnet::DropOut dropout; }; ``` 感兴趣可以修改模型配置重新编译运行演示程序。 ### 2. 目录结构 * src目录下存放着框架核心代码。 * Tensor: 框架核心数据结构 * Optimizer: 优化器,目前只实现了SGD优化器 * Layer: 模型核心数据结构,卷积层和全连接层和模型基类 * Function: 常用损失函数 * include目录存放着对应头文件 * example目录下存放着演示程序,想要编译运行需要安装OpenCV ### 3.框架结构 构建以动态图的形式构建神经网络,只有在运算发生时网络才会构建。 核心数据结构Tensor类,该类重载了加、减、乘、除、卷积、矩阵乘法...等运算,并且根据运算完成自动求导,最终实现构建神经网络。神经网络最为核心的前向传播和反向传播功能均由此数据结构实现。 // TODO(详细介绍) 如果您对该框架感兴趣,不妨联系我说出您的想法与问题。email:applezyh@outlook.com