OpenCV4.x可实现加载模型与执行推断

概述
opencv4.x发布以后,有很多新的特性与黑科技支持,无论是支持openvino加速、图计算模块、二维码识别,还是dnn中新增加的人脸检测与识别模型,作为opencv开发者的我深深被吸引,几乎只要有时间就会一个一个的去发现与之前的不同之处。opencv dnn模块,不仅支持图像分类、对象检测、人脸检测、图像分割等操作除外,还支持对灰度图像的自动彩色化转换,而且效果十分靠谱,亲测有效!
着色模型(colorization model)
该模型是在2016发表在eccv上面的,该模型与之前的基于cnn模型的不同之处在于,它是一个无监督的学习过程,不会把着色对象与训练生成看成是一个回归问题、而且是使用cie lab色彩空间,使用l分量作为输入,输出为颜色分量a,b,通过对颜色分量进行量化,把网络作为一个分类问题对待, 对得到输出结果,最终加上l分量之后,得到着色之后的图像,模型架构如下:
其中卷积层每一个block是有几个重复的conv卷积操作与relu + bn层构成!其中蓝色部分,是a,b颜色的313对ab量化表示。最终学习到的就是wxhx313输出,进一步转换为color ab的输出, 加上l分量之后就是完整的图像输出!313对ab色彩空间量化表示如下:
针对自然场景下,ab值较低导致生成图像的失真问题,作者通过分类再平衡技术依靠训练阶段,通过对损失函数调整像素权重,实现了比较好的效果。作者的github上可以查看该模型的实现源码。
模型下载地址如下
https://github.com/e-lab/enet-training
论文地址
https://arxiv.org/abs/1606.02147
opencv中使用
下载enet预训练模型,通过opencv dnn支持,可以实现加载模型与执行推断,对大多数的灰度图像实现自然着色,毫无违和感!步骤如下:
加载模型
modeltxt = d:/projects/models/color/colorization_deploy_v2.prototxt;modelbin = d:/projects/models/color/colorization_release_v2.caffemodel;pts_txt = d:/projects/models/color/pts_in_hull.npy;# 加载网络net = cv.dnn.readnetfromcaffe(modeltxt, modelbin)pts_in_hull = np.load(pts_txt) # load cluster centers# populate cluster centers as 1x1 convolution kernelpts_in_hull = pts_in_hull.transpose().reshape(2, 313, 1, 1)net.getlayer(net.getlayerid('class8_ab')).blobs = [pts_in_hull.astype(np.float32)]net.getlayer(net.getlayerid('conv8_313_rh')).blobs = [np.full([1, 313], 2.606, np.float32)]  
转换输入与执行
frame = cv.imread(d:/images/yuan_test.png)h, w = frame.shape[:2]img_rgb = (frame[:,:,[2, 1, 0]] * 1.0 / 255).astype(np.float32)# 色彩空间转换img_lab = cv.cvtcolor(img_rgb, cv.color_bgr2lab)img_l = img_lab[:,:,0] # pull out l channel(h_orig,w_orig) = img_rgb.shape[:2] # original image size# resize为输入网络图像大小img_rs = cv.resize(img_rgb, (w_in, h_in))img_lab_rs = cv.cvtcolor(img_rs, cv.color_bgr2lab)# 选择一l通道分量img_l_rs = img_lab_rs[:,:,0]img_l_rs -= 50 # subtract 50 for mean-centering# 输入l分量,开始操作net.setinput(cv.dnn.blobfromimage(img_l_rs))ab_dec = net.forward()[0,:,:,:].transpose((1,2,0))  
解码输出结果
# 解码输出颜色值(h_out,w_out) = ab_dec.shape[:2]ab_dec_us = cv.resize(ab_dec, (w_orig, h_orig))img_lab_out = np.concatenate((img_l[:,:,np.newaxis],ab_dec_us),axis=2)img_bgr_out = np.clip(cv.cvtcolor(img_lab_out, cv.color_lab2bgr), 0, 1)  
显示着色图像
# 显示着色frame = cv.resize(frame, (w, h))cv.imshow('origin', frame)cv.imshow('gray', cv.cvtcolor(frame, cv.color_rgb2gray))# fix 4.0 imshow issuecv.normalize(img_bgr_out, img_bgr_out, 0, 255, cv.norm_minmax)cv.imshow('colorized', cv.resize(np.uint8(img_bgr_out), (w, h)))  
运行结果:
输入彩色图像,转为灰度图像,然后自动着色对比一下!
直接输入灰度图像,着色:
看效果,从此以后再也不担心灰度图像无法自动上色啦!
opencv成功解锁!


斩波型运放减少噪声 怎么做到的?
圣邦终止收购钰泰半导体71.3%股权
晶电有望成为苹果MiniLED供应商之一
全球半导体市场销售额再度下调,2020年将同比下降4%
通信机房电源-48伏与48伏相同吗
OpenCV4.x可实现加载模型与执行推断
小米8SE和荣耀8X哪个游戏性能最好
宝马mini电动车型生产线将迁至中国 大众168亿与地平线成立新公司
“人脑”模仿受挫 通往“智能机器”的新路线
高性能数字化电源芯片的新标尺——InnoSwitch4-Pro
PCB中有黄金?一文带你了解沉金工艺!
如何调整振荡器电路,工程师学会这3招免烦恼!
韩国阿里郎TV使用千视NDI编解码器打造智能直播间
iphone8什么时候上市最新消息:iphone8售价有望突破1000美元,有可能只有这两种版本!
中国移动率先启动 5G友好用户招募!
李开复预测:人工智能将是有史以来最大的风口
基于GIO/FVID的F2812DSP的视频处理系统
北京数字资产币币撮合交易系统开发公司
华为Mate 40系列采用的“自研闪存”来自长江存储
压电陶瓷功率放大器在超声洁牙机中的研究应用