最新的树莓派4B最大支持8G内存,相对于树莓派派3的2G内存,已经足够gitlab的运行。安装搭建gitlab的环境可以使用源码编译,或参考官网上的安装步骤。但最方便的还是使用docker进行安装。官方的docker镜像没有ARM64的镜像,但提供了一个非官方的链接,使用其提供的镜像可以方便的安装gitlab。
安装方法
1.安装docker镜镜像
相应的安装方法网上很多,不进行累述。
2.pull gitlab镜像
继续阅读最新的树莓派4B最大支持8G内存,相对于树莓派派3的2G内存,已经足够gitlab的运行。安装搭建gitlab的环境可以使用源码编译,或参考官网上的安装步骤。但最方便的还是使用docker进行安装。官方的docker镜像没有ARM64的镜像,但提供了一个非官方的链接,使用其提供的镜像可以方便的安装gitlab。
安装方法
1.安装docker镜镜像
相应的安装方法网上很多,不进行累述。
2.pull gitlab镜像
继续阅读gRPC是google开发的RPC框架。使用gRPC可以方便的在程序间传递protobuf序列化后的数据,而不必考虑数据量大小,断开重连等比较难处理的问题。C++下的使用方法可以参考https://grpc.io/docs/languages/cpp/。下面记录下一些gRPC设置的小技巧
gRPC默认传输的大小限制为4M,如果要传输更大的,需要进行设置。
继续阅读本文参考了https://www.cnblogs.com/hehehaha/p/6332245.html 的内容与python对3次样条插值实现的代码。再原有代码的基础上增加了固定边界和非节点边界的算法,并将接口函数的参数类型改写为Mat,方便一次进行多次样条插值的计算。
继续阅读opencv中的cuda模块封装了大部分常用的图像处理函数。但一些函数只提供了8bit图片的接口,没有16bit图片的接口。如果需要处理10bit 12bit或更高big的图片就需要调用CUDA的原型函数了。下面就简单举例使用opencv中的GpuMat调用cuda原函数的方法。
opencv中存储GPU图片的类型为GpuMat,不需要考虑显存的分配和释放,使用起来比较方便。而CUDA使用的是Npp8u* Npp16u*等指针,这里就涉及指针的转换。以nppiLUTPalette_16u_C1R 函数举例。
Mat img = ….. //读取一张12bit图片
cuda::GpuMat src_img; //初始化Gpu
src_img.upload(img); //上传图片到Gpu
Mat lut(1, 4096, CV_16UC1, lineardata.data()); // 导入lut数据
cuda::GpuMat gpu_lut = new cv::cuda::GpuMat(1, 4096, CV_16UC1);
gpu_lut.upload(lut); //上传lut数据到Gpu,lut数据也要放入Gpu中
cuda::GpuMat dst_gpu(src_img.size(), CV_16UC1); //初始化转化后的GpuMat
NppiSize oSizeROI = { src_img.cols, src_img.rows }; //设置ROI 这里是整张图
//使用prt获取GpuMat的指针
NppStatus status1 = nppiLUTPalette_16u_C1R(src_img.ptr(), static_cast(src_img.step), dst_gpu.ptr(), static_cast(dst_gpu.step), oSizeROI, gpu_lut.ptr(),16);
得到的dst_gpu就是经过lut后的图片,后续的使用也不需要考虑显存的分配和释放。
opencv源代码中包含了dft的demo,但没有使用cuda的demo。下文会简单给出一个cuda例程,并进行简单的高频滤波。
为方便说明,将程序分成了若干部分
1.头文件
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaarithm.hpp>
using namespace cv;
2.导入图片加载到GPU,为简单使用了单色图
opencv从3版本开始就已经支持CNN网络模型的预测,到4版本,主流工具tensorflow,pytorch 生成的模型文件大部分都可以支持。但其一直没有使用到CUDNN。但最新发布的4.2版本的opencv已经支持CUDNN了。以下是功能测试
一。安装编译环境
CUDNN的安装方法可以参考tensorflow中关于cudnn的安装方法https://www.tensorflow.org/install/gpu 接下来也会使用tensorflow作为例子。
二。编译opencv
编译方法参考链接https://docs.opencv.org/4.2.0/d3/d52/tutorial_windows_install.html 其中为了加入CUDNN的支持,有以下需要设置一下
1.勾选cuda和cudnn
2.设置CUDA_ARCH_BIN
cudnn不支持3.5下的显卡。需要根据自己使用的显卡来设置,列表参考https://developer.nvidia.com/cuda-gpus
网上可以找到许多TensorFlow的Mask-RCNN版本,现以github上一个Star较多的版本为例,介绍如何在C#中部署Mask-RCNN模型
1.同步Mask-RCNN的代码,地址为 https://github.com/matterport/Mask_RCNN.git
2.训练模型:
可以使用jupyter打开samples文件夹下的例子进行训练,也可以参考其例子训练自己的模型。目标是生存保存好权重的模型文件。模型每训练一个epochs 会在 model_dir=MODEL_DIR 设置好的文件夹下留下模型文件。具体训练方法就不累述了~~~
3.在VS里使用Nuget,给项目添加OpencvSharp 与 TensorflowSharp
继续阅读TensorFlow 运行时默认会最大化使用显存,如果需要控制其显存的分配,可以进行相应的设定。相关设定大多是在python或c++的运行环境下设置的,c#环境下的设置方法可以如下文。主要使用了 options.SetConfig(InPtr protoData,int length)
1.通过python获取protoData
protoData 是一串二进制流,但c#中没有找到生成这个二进制流的方法,所以只好通过python生成,代码如下
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.3 最大使用30%的显存
bytes = config.SerializeToString()
hexstring = " ".join("%02d" % b for b in bytes)
print(hexstring)
输出为 50 09 09 51 51 51 51 51 51 211 63
2.TensorFlowSharp 中导入二进制流
TFSessionOptions options = new TFSessionOptions();
byte[] data = { 50, 9, 9, 51, 51, 51, 51, 51, 51, 211, 63 }; //0.3
IntPtr buffer = Marshal.AllocHGlobal(data.Length);
Marshal.Copy(data, 0, buffer, data.Length);
TFStatus ts = new TFStatus();
options.SetConfig(buffer, data.Length, ts);
Marshal.FreeHGlobal(buffer);
TFSession session = new TFSession(graph, options);
这样实例化出来的session 就会限制在30%显存运行。如果需要其他设置,只需要在python中获取到相应的二进制流,然后在c#中设置一下就可以了
tensorflowsharp使用C#封装了tensorflow的c-api接口,可以方便的在C#中使用tensorflow的模型。但作者只提供了cpu版本的tensorflow,如果要使用gpu版本的tensorflow,就需要自己编译出一个带CUDA的dll。好在网上资料比较多,编译起来并不是很困难
一.编译环境搭建
windows下搭建tensorflow编译环境可以参考官网上的教程,写得很详细,按照上面一步步操作就可以了。链接https://www.tensorflow.org/install/source_windows
继续阅读opencvsharp 是 opencv的c#版本,近期有项目使用了opencvsharp来进行图像处理。这个github上星级很高的项目果然是不错的,运行起来比较稳定,没有出现大的问题。但opencvsharp中没有cuda的完整支持,只有最基本的类型支持,无任何算法支持,想用就只能靠自己添加了。作者的解释如下:
大概就是说cuda需要用户自己编译opencv ,没有一个统一版本的dll提供使用,所以就删除了cuda的支持
其实也对,cuda的使用涉及cuda版本,使用的显卡算力等。使用c++版本的opencv时,也是要自己编译的。
但c#上使用就没有办法了吗?还好作者已经打好了基础,提供了GpuMat的支持,并有大量cup版本的函数进行参考。添加起来还是比较容易的。
项目目录 https://github.com/shimat/opencvsharp