关于图像:OpenCV图像细化原理thinning-algorithm提取骨架

基础知识:细化是在二值图根底上做的模板点: 一.第一步遍历考查所有的非零点 看是否满足上面四个条件比方 有一个非零点的八邻域是上面状况,判断该点是否满足下述条件:① 2<= (p2+p3+p4+p5+p6+p7+p8+p9) <=6 即是 除了p1以外八个数的和 是否在2-6之间②从p2-p9的程序(就是p2p3,p3p4,p4p5...这种),01的数量为1比方上图 依照程序只有p2p3 p6p7是 01这种模式 数量即为2③ p2p4p6=0④ p4p6p8=0如果满足这四个条件 就记录这个点期待最初删除(即是该点像素值设为0) 二.第二步同样四个条件①同上①②同上②③p2p4p8=0④p2p6p8=0同第一步一样,断定要删除的点只是加以记录而暂不删除,期待最初同时删除!对一副图像重复执行第一步与第二步的算法步骤,直到都没有可删除的点为止!!总结下来,就是遍历每一个前景像素 依据一系列规范重复判断该点是否是须要删除的点 学习自:http://t.csdn.cn/FUOhbhttp://t.csdn.cn/N9P4G

July 6, 2023 · 1 min · jiezi

关于图像:山东大学数字图像处理实验MATLAB的图像显示方法

MATLAB 学习试验目标理解 MATLAB 的基本功能及操作方法。把握典型离散信号的 Matlab 产生和显示。试验原理及办法在 MATLAB 中, 序列是用矩阵向量示意, 但它没有蕴含采样信息, 即序列地位信息, 为 此, 要示意一个序列须要建设两个向量; 一是工夫序列 n , 或称地位序列, 另一个为取值序 列 x ,示意如下: $n=[\cdots,-3,-2,-1,0,1,2,3, \cdots]$ ,$\mathrm{x}=[\cdots, 6,3,5,2,1,7,9, \cdots]$ 个别程序都从 0 地位起始, 则 $x=[x(0), x(1), x(2), \cdots]$ 对于多维信号须要建设矩阵来示意, 矩阵的每个列向量代表一维信号。 数字信号处理中罕用的信号有指数信号、正弦信号、余弦信号、方波信号、锯齿波信号 等, 在 MATLAB 语言中别离由 exp, sin, cos, square, sawtooth 等函数来实现。 试验内容1.用 MATLAB 编制程序, 别离产生长度为 $\mathrm{N}$ (由输出确定) 的序列: (1)单位冲击响应序列: 可用 MATLAB 中 zeros 函数来实现; t=-20:1:20;X=zeros(size (t)) ;X(21)=1;plot(t,x);(2)单位阶跃序列: U(n) 可用 MATLAB 中 ones 函数来实现; ...

March 1, 2023 · 1 min · jiezi

关于图像:图像降噪总结一

呈现噪声的起因深究的话就波及从感光元器件收集到光子,始终到生成数字图像的过程。本文不探讨具体起因 只阐明几种常见的噪声还有一些去噪办法的总结和剖析 1.噪声的由来+分类噪声是在成像设施成像时,受到本身设施和外部环境的影响产生常见的几类噪声 包含 (1)高斯噪声高斯噪声,幅度散布遵从高斯分布,概率谱散布遵从均匀分布。高斯分布也称正态分布,有均值和方差两个参数,均值反馈了对称轴的方位,方差示意了正态分布曲线的胖瘦。高斯分布是最一般的噪声散布。在MATLAB中 有用于创立噪声的函数,调用格局为J=imnoise(I,type),默认方差是0.01 咱们调整方差 方差越大 噪声越显著: (2)泊松噪声图像会呈现泊松噪声呢?因为光具备量子特效,达到光电检测器外表的量子数目存在统计涨落,因而,图像监测具备颗粒性,这种颗粒性造成了图像对比度的变小以及对图像细节信息的遮蔽,咱们对这种因为光量子而造成的测量不确定性成为图像的泊松噪声。泊松噪声个别在亮度很小或者高倍电子放大线路中呈现。 (3)椒盐噪声椒盐噪声又称脉冲噪声,它随机扭转一些像素值,是由图像传感器,传输信道,解码解决等产生的黑白相间的亮暗点噪声。椒盐噪声往往由图像切割引起。 (4)斑点/乘性噪声 咱们给图像别离退出 这四类噪声 2.去噪办法明天先讲 空间域部分滤波的四个办法 (1)线性滤波:原图给原图加了四类噪声当前 ①均值滤波次要原理: 用像素邻域的灰度均值代替该像素的值opencv外面有api 间接用api size 用的是7 对这四张图用均值滤波 (高低是一一对应的)size是10的时候尺寸越大 成果越好 然而越来越含糊 ②高斯滤波 高斯滤波是一种线性平滑滤波,实用于打消高斯噪声,广泛应用于图像处理的减噪过程。艰深的讲,高斯滤波就是对整幅图像进行加权均匀的过程,每一个像素点的值,都由其自身和邻域内的其余像素值通过加权均匀后失去。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权均匀灰度值去代替模板核心像素点的值。 对应均值滤波和方框滤波来说,其邻域内每个像素的权重是相等的。而在高斯滤波中,会将中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和。这里简略说说本人写高斯滤波器 就三个步骤首先依据二维高斯分布确定核外面每个地位的权重而后归一化 最初裁减边界 遍历像素进行卷积即可 咱们先设置size是7 size是15 均值滤波去除椒盐噪声比 高斯滤波强泊松噪声俩个办法都还能够 毕竟泊松噪声看起来扭转不是很大这俩办法都比拟依赖尺寸大小 越大成果越好然而越含糊毕竟是简略的滤波办法 要求不能太高 (2)非线性滤波①中值滤波跟均值滤波一样 实现起来很简略size=7这个椒盐噪声去除的还挺好 size=15 ②双边滤波一种非线性的保边滤波算法 是一种联合图像的空间邻近度与像素值类似度的解决方法 在滤波时,该滤波办法同时思考空间邻近信息与色彩类似信息,在滤除噪声、平滑图像的同时,又做到边缘保留。几何空间间隔 + 像素差值 这两个因素简略来说 就是计算权值时不只思考 空间邻近度(间隔)还思考了像素类似度(像素差值) 对高斯噪声 进行解决:opencv自带的 解决成果 感觉不咋滴 : (3)总结①对于均值滤波来说 尺寸越大 成果越好 然而越含糊 均值滤波会把噪声分化/弱化到四周像素上,而后噪声幅度变小,然而噪声面积变大 ②高斯滤波是利用基于邻域的加权平均值代替中心点像素值 然而权重仅思考间隔 没有思考图像自身的内容③中值滤波对椒盐去除成果较好 然而因为选取的是中值 如果存在一些点 线之类的让像素产生渐变的邻域 那么中值滤波可能就会把这些不是噪声的点 线去掉 从而失落图像信息④双边滤波 加了像素类似度计算权值 长处在于能够保留边缘 然而它只能保留整体形态 比拟适宜美颜磨皮之类的。 ...

February 28, 2023 · 1 min · jiezi

关于图像:论文笔记三关于色块的提取图像分割形态学处理等

论文思路:这个色块提取办法发了专利: 一种反对多源拼接图像的色块主动宰割办法 能够去度娘写的比拟水hhh 一 色块提取办法:①首先是色调模型的转换 由RGB色彩空间转到HSV色彩空间 起因:RGB色彩空间适宜显示零碎,然而各重量间相关性很强,比方当图像亮度发生变化时,RGB三个重量都会产生相应扭转 然而HSV色彩空间更能感知色彩的变动,比如说 H=60时 就是黄色 S和V只是决定了黄色的饱和度和明度 所以更适宜进行图像宰割另一方面 我解决的多源拼接图像 可能存在的问题 可能是亮度也可能是色调的不同 所以用HSV重量更适宜咱们察看到多源拼接影像 色块间亮度或者色彩差别很大 然而可能说不晓得哪个重量更适宜进行图像宰割等操作 兴许人眼能够看进去比方亮度差别过大的时候 咱们采纳V重量 色调差别能够用H或者S 然而为了省掉这个人为抉择重量的麻烦 也是为了实现自动化 咱们对这三个重量都做解决 而后主动判断哪个后果最好 对HSV三个重量进行上面步骤②大津法宰割图像咱们的目标是取得高低散布的色块 并且是下面全是前景区域 上面全是背景区域 所以用大津法做了一个初步的图像宰割 ③小连通区去除大津法宰割图像当前 上边前景区域还包含很多 背景区域(同样下边背景区域也包含局部前景区域) 所以进行图像闭运算(先收缩后侵蚀 收缩的目标是去除下面前景区域的小背景区域 而后再进行雷同尺寸的侵蚀让他回到原来的形态 )然而 边界四周有很多小的连通区,收缩当前会毁坏边界线信息 影响后续的轮廓拟合 比方b外面分界线四周有小连通区 先收缩在侵蚀当前边界线会发生变化 所以要在闭运算之前进行小连通区去除 ④ 图像闭运算 + 轮廓拟合小连通区干掉当前,能够进行图像闭运算了 然而这个尺寸如何确定: 咱们收集的数据集大多数在500X500左右 闭运算适宜的尺寸在30左右 然而为了尽可能适宜大多数图像咱们还是设置了一个闭运算的范畴 尺寸从10-100 ,而后主动判断出 哪个尺寸的闭运算失去的后果最为合乎色块散布 所以这里就要有一个判断规范 判断哪个闭运算尺寸失去的后果最好(最合乎色块散布)什么时候最合乎色块散布嘞 我抉择的是 均值差 高低色块在某个重量的均值差比方 b是 H重量 它的高低色块 像素值之间差别是很显著的 高低色块的均值差是最大的这个最大 是跟 (10-100共10个尺寸)所有闭运算尺寸解决的所有重量 计算出的均值差后果比的有点形象(或者我语言表达的不到家) 咱们计算了 十个尺寸三个重量 也就是三十个均值差数据 看上面的图 对H重量 尺寸是40和20的后果 计算红黄两个区域的均值差 40的必定大于20的这个论断一方面是察看的 另一方面做了几十组试验失去的 ...

February 24, 2023 · 1 min · jiezi

关于图像:宝藏昇腾AI应用推荐CANN带你体验黑白图像自动上色的快乐

摘要:属于“你”那边的麦田 天空 河水 骏马 树木……会是什么色彩呢?黑白与色调 仿佛把时代宰割了两半~ 我在这头看见了错乱热闹,目不暇接,看见疾速消长的色彩缤纷。 打开一张黑白照片 我能看到世代流传的印记,一种历久弥新的美 我能看到但我却又看不到“你”能看到的风景 这看似不经意的一眼却在我心里犹如惊鸿一瞥 令人望而却步 却又不住的悄悄空想 属于“你”那边的麦田 天空 河水 骏马 树木…… 会是什么色彩呢? 就在此刻的定格 我愿把万千色调赋予给“你”, 带你独特体验这万千热闹盛景~ 黑白图像上色模型原理本利用基于昇腾AI异构计算架构CANN,应用黑白图像上色模型搭建,实用于Atlas 200 DK及Atlas 300I等相干推理产品。 对物件(包含背景色)(L通道代表的灰度图)应用卷积运算提取特色,而后同样用卷积进行分类,从而尝试给出对灰度图片每个像素点的色调预期(ab通道)。而后,将ab通道的值resize到原始图片宽高并与L通道叠加后,转为RGB图片即可失去彩色图像。其中模型的输出为L通道的数据(224,224,1),输入为ab通道的数据(56,56,2)。 咱们也能够通过开源模型的测试脚本来了解原始模型的输出和输入,以及输出前的计算过程(也叫前解决)和输入后的处理过程(也叫后处理)。 预处理过程:RGB格局读入转Lab,resize到224224,提取L通道,减均值(-50)后处理过程:推理的后果ab通道,resize到224224,与输出L合并为Lab,转RGB,保留为jpeg图片 模型原始链接:https://github.com/richzhang/... 筹备模型昇腾张量编译器ATC(Ascend Tensor Compiler)能够将开源框架的网络模型(如Caffe、TensorFlow等)以及Ascend IR定义的单算子形容文件换成昇腾AI处理器反对的离线模型,模型转换过程中能够实现算子调度的优化、权重数据重排、内存应用优化等,能够脱离设施实现模型的预处理。 应用ATC将黑白图像上色模型转换为昇腾AI处理器反对的离线模型命令如下: atc --input_shape="data_l:1,1,224,224" --weight="./colorization.caffemodel" --input_format=NCHW --output="./colorization" --soc_version=Ascend310 --framework=0 --model="./colorization.prototxt"利用开发本利用采纳了下图所示的模块化设计,通过各模块之间的协调配合实现一张图片的推理输入;对视频的推理也是一样的,能够间接参考开源仓中的源码实现。在这里就不再赘述了。 其中各个模块的次要性能点如下所示: 运行治理资源申请用于初始化零碎外部资源,固定的调用流程。 加载模型文件并构建输入内存从文件加载离线模型数据,须要由用户自行治理模型运行的内存,依据内存中加载的模型获取模型的根本信息蕴含模型输出、输入数据的数据buffer大小;由模型的根本信息构建模型输入内存,为接下来的模型推理做好筹备。 数据预处理接管外界传递的图像数据,对读入的图像数据进行预处理,而后构建模型的输出数据。 模型推理依据构建好的模型输出数据进行模型推理。 解析推理后果依据模型输入,解析模型的推理后果。应用opencv将转换后的彩色图像数据保留成图片文件。 预处理图像图像预处理局部,应用opencv的imread接口读取图片,读取进去的是BGR格局。 模型输出为224×224,因而须要把读取到的图像resize到224×224。Resize后对数据做归一化解决。 如算法设计局部所言,该模型采纳Lab色调空间,因而须要把BGR格局转为Lab格局数据。该模型用L通道数据预测出可能的ab空间数据,所以要从Lab数据中拆散出L通道数据。再对所得的数据减均值,即可失去模型须要的输出数据。 模型推理模型推理局部,要害流程阐明如下: 调用aclmdlCreateDesc接口创立形容模型根本信息的数据类型;modelDesc_ = aclmdlCreateDesc(); 调用aclmdlGetDesc接口依据模型加载中返回的模型ID获取模型根本信息。aclError ret = aclmdlGetDesc(modelDesc_, modelId_);筹备模型推理的输出、输入数据;执行模型推理,调用aclmdlExecute接口;aclError ret = aclmdlExecute(modelId_, input_, output_);获取模型推理的后果,用于后续解决。开释内存。调用aclrtFree接口开释Device上的内存。开释相干数据类型的数据。在模型推理完结后,需及时调用aclDestroyDataBuffer接口和aclmdlDestroyDataset接口开释形容模型输出的数据,且先调用aclDestroyDataBuffer接口,再调用aclmdlDestroyDataset接口。如果存在多个输出、输入,需调用屡次aclDestroyDataBuffer接口。后处理局部图像后处理局部,应用opencv。对于模型推理失去预测出的ab空间数据。 首先把失去的数据resize回原图像大小,而后和原图像L通道数据合并,即失去残缺Lab图像。 把Lab图像转回BGR格局即可保留为jpeg图片,失去上色后的图像。 黑白图像上色是一种艺术,也是一门技术~ ...

September 2, 2021 · 1 min · jiezi

关于图像:想知道你未来宝宝长什么样吗

摘要:本案例可依据一张父亲和母亲的正脸照片,生成孩子的照片,并且能够调节参数,看看不同性别和年龄孩子的长相。本文分享自华为云社区《BabyGAN:依据父母照片生成孩子照片》,作者: 山海之光。 本案例可依据一张父亲和母亲的正脸照片,生成孩子的照片,并且能够调节参数,看看不同性别和年龄孩子的长相。 为保障照片的生成成果,上传父母的照片时尽量上传能露出五官且浅色底的照片。 本案例仅用于学习交换,请勿用于其余用处。 另外,因为技术不欠缺的起因,生成的孩子照片可能会有扭曲或失真,你能够更换不同的父母照片,从新生成孩子照片,直到达到称心的生成成果为止。 上面开始按步骤运行本案例。 1. 装置所需的模块本步骤耗时约4分钟 !pip install imutils moviepy dlib 2. 下载代码和模型文件import osimport moxing as moxroot_dir = '/home/ma-user/work/ma_share/'code_dir = os.path.join(root_dir, 'BabyGAN')if not os.path.exists(os.path.join(root_dir, 'BabyGAN.zip')): mox.file.copy('obs://arthur-1/BabyGAN/BabyGAN.zip', os.path.join(root_dir, 'BabyGAN.zip')) os.system('cd %s; unzip BabyGAN.zip' % root_dir)os.chdir(code_dir)3. 加载相干模块及模型import cv2import mathimport pickleimport imageioimport warningsimport PIL.Imageimport numpy as npfrom glob import globfrom PIL import Imageimport tensorflow as tffrom random import randrangeimport moviepy.editor as mpyimport matplotlib.pyplot as pltfrom IPython.display import clear_outputfrom moviepy.video.io.ffmpeg_writer import FFMPEG_VideoWriterimport configimport dnnlibimport dnnlib.tflib as tflibfrom encoder.generator_model import Generator%matplotlib inlinewarnings.filterwarnings("ignore")加载模型文件,本代码块只可执行一次,如果产生报错,请restart kernel,从新运行所有代码 ...

August 20, 2021 · 4 min · jiezi

关于图像:鸿蒙图像系统

全新设计的GUI零碎 物联网设施应用的屏幕品种繁多、形态不一,这也是困扰物联网设施开发者、造成物联网设施碎片化的难题之一。尽管市面上存在许多图形引擎,但都败给了物联网设施资源少,品种多的限度。因而华为给鸿蒙专门开发了一套轻量级的GUI零碎,它仅占用小于100K的ROM,30K的RAM即可运行达到30FPS以上的帧率,晋升传奇游戏的晦涩度。 轻量级图形凋谢框架ACE 与其余图形引擎相比,ACE没有采纳虚拟机的计划,而是应用C++编写的高性能渲染引擎。同时ACE也为开发者保留了极大的灵活性,它反对前后端拆散,如果开发者在非凡设施上须要应用OpenCV或OpenGL,只有合乎软件接口就能够替换原有的高性能引擎。 ACE框架对异形屏的反对在智能手表的圆形屏幕上失去过验证。ACE框架反对JS/java作为前端开发工具,反对常见的图片格式。通过freetype字体引擎生成字体的“bin”二进制文件,加上HarBuzz与ICU工具实现了在RAM大小仅有640K的设施中72种罕用语言的显示与切换。 鸿蒙图形系统整体框架 鸿蒙图形系统框架分成UIKit(UI编程层)、Engine(引擎层)、Server(服务层)、HDI(硬件接口层)、HW(硬件层)。 鸿蒙图像子系统 在UIKit中提供了丰盛控件,次要分成一般控件和容器控件两大类。开发方式与GUI开发统一。

July 22, 2021 · 1 min · jiezi

关于图像:孙略视频技术基础笔记整理逐渐更新

一、人眼视觉与数字图像属性1、人眼构造巩膜:非通明红色组织,起爱护眼球作用。虹膜和脉络膜组成。 脉络膜:含丰盛的色素,彩色,遮光作用。 虹膜:具备种族差别,彩色、褐色、蓝色(欧美蓝眼睛),虹膜两头的圆孔即瞳孔。 ▲瞳孔:与光圈雷同,管制进入眼内的光通量。虹膜的环状肌肉调节其大小。 视网膜:共10层,其中8层对光通明即不起作用。第9层是感光层,布满视神经细胞。第10层间接与脉络膜相连。在视网膜上造成光学影像。 黄斑:靠近视网膜两头,椭圆形小区,呈黄色,凹坑状。感光细胞密集区。每一条感光细胞都对应一条视神经,此区域感知风物清晰度最高。相同,间隔黄斑区越远的区域,感光细胞散布稀松,多个感光细胞对应一条视神经,清晰度越低。 感光细胞:取得光信息,通过视神经传至人的大脑,使人产生视觉 ▲感光细胞分类: 名称又名数量性能条件/前提散布柱状细胞暗视觉细胞约1亿多只能分辨光的强弱只在光弱下起作用视网膜边缘区域锥状细胞明视觉细胞约700万不仅能分辨光的强弱还可分辨色彩只在亮堂下起作用视网膜中心区【口诀】:柱暗锥明,暗多明少,暗弱亮堂,暗边缘明核心 晶状体:瞳孔前面那个扁球形透明体,与照相机的镜头作用类似,使风物得以在视网膜上清晰成像。 盲点:所有的感光细胞都与视神经连贯,视神经会集到视网膜上的一点,而后通向大脑,该汇集点无感光细胞,即盲区 眼球前室后室: 前室,充斥通明液体,对紫外线具备肯定排汇作用。后室,充斥玻璃质液体,起肯定滤光爱护作用2、人眼视觉视角:由外界两点收回的光线汇聚于人眼时所造成的夹角。视力表就是依据视角的原理设计的。 ▲人眼的最小视角:1/60°,也就是1‘【1度=60’(60分)】 ▲视觉惰性: 临界闪动频率: 人眼对亮度的反馈:

July 21, 2021 · 1 min · jiezi

关于场景:技术面对面基于场景图的多物体图像生成技术

京东科技产品技术研讨会是京东科技定期举办的技术分享交流会,流动通过解读京东科技最新成绩,分享重点产品翻新利用案例,致力于增进技术团队间彼此理解与信赖,从而营造翻新凋谢的技术理念,造成互相成就的单干气氛。 本次分享次要聚焦: 场景图概念及相干利用;多物体图像生成技术介绍;基于文本的多物体图像生成技术;基于场景图的多物体图像生成技术。听众收益: 从根底登程,简略论述场景图的相干概念以及利用价值,具体阐明多物体图像生成技术发展趋势、钻研内容以及理论利用价值;基于惯例文本生成多物体图像的技术总结;基于场景图的多物体图像生成的难点以及技术瓶颈论述。通过凸显多物体之间的交互关系等信息晋升图像生成后果真实性的技术分享等。欢送扫描下方二维码 或点击此处链接 举荐浏览AI 科学家带你疾速 Get 人工智能最热技术京东电商场景下的AI实际 - 基于关键词主动生成摘要AI端侧落地,京东AI技术如何部署边缘?欢送点击【京东科技】,理解开发者社区 更多精彩技术实际与独家干货解析 欢送关注【京东科技开发者】公众号

March 29, 2021 · 1 min · jiezi

关于深度学习:图像视频压缩深度学习有一套

摘要:得益于深度神经网络提取信源特色的能力,深度学习技术在信源压缩编码畛域获得了比传统办法更本文分享自华为云社区《基于深度学习的图像视频压缩编码》,原文作者:罗鹏。 得益于深度神经网络提取信源特色的能力,深度学习技术在信源压缩编码畛域获得了比传统办法更优异的成果。 基于深度学习的图像压缩编码自编码器Ballé1 提出了一种基于变分自编码器的端到端图像压缩模型,采纳联合边信息(side information)的超先验的计划。模型如下图所示。 Q 示意量化;AE 和 AD 别离示意算术编码和解码;卷积参数示意为层times×长times×宽/下采纳或上采样,uparrow↑示意上采样,downarrow↓示意下采样。 Minnen2 提出了一种超先验联合自回归模型的计划。 循环神经网络(Recurrent Neural Network, RNN)Google3 团队提出一种基于长短期记忆(long short-term memory, LTSM)的神经网络架构对图像进行可变压缩率的编码方法。模型如下图所示。 上图是基于卷积核逆卷积的残差编码器,将上上层各第二和第三的卷积/逆卷积模块换成 LTSM 模块即为所提出的模型。 Google4 团队在后面工作的根底上引入了 GRU 和 ResNet 模块,并采纳熵编码进一步晋升了压缩率。 模型如下图所示。 生成反抗网络(Generative Adversarial Network, GAN)Agustsson5 提出了一种基于 GAN 的图像压缩计划,可选择地对局部/全副图像生成对应语义标签;解码时,失常压缩的图像局部失常解码,无图像局部由 GAN 网络生成。模型如下图所示。 E_E_ 为编码器;q_q_ 为量化器;G_G_ 为解码和生成器;D_D_ 为反抗器。 基于深度学习的视频压缩编码基于深度学习的视频编码分为两种: 采纳深度学习代替传统视频编码中局部模块端到端采纳深度学习编码压缩局部计划采样深度神经网络能够代替传统视频编码中的模块包含:帧内/帧间预测、变换、高低采样、环路滤波、熵编码等6。 端到端计划Lu7 提出了一个端到端采纳深度学习进行视频编码压缩的计划;其采纳卷积光流预计来进行静止预计,并应用两个自编码器对光流信息和残差信息进行编码压缩。编码框架如下图所示: 采纳一个卷积网络模块进行光流预计8,以作为静止预计。采纳自编码器对光流信息进行压缩,自编码器网络如下图所示: 联合上一帧图像和光流信息,取得静止弥补图像。静止弥补网络如下图所示: 将原图像与弥补图像进行差计算取得残差,残差也应用自编码器压缩。 Rippel9 提出了一种端到端基于机器学习(包含深度学习)的视频压缩计划;采纳多帧参考的光流预计做静止预计,采纳自编码器对光流信息和残差编码压缩,采纳机器学习做码率管制。 Reference[2018 ICLR]Variational image compression with a scale hyperprior[2018 NIPS]Joint Autoregressive and Hierarchical Priors for Learned Image Compression[2016 ICLR]Variable Rate Image Compression with Recurrent Neural Networks[2017 CVPR]Full Resolution Image Compression with Recurrent Neural Networks[2019 ICCV]Generative Adversarial Networks for Extreme Learned Image Compression[2019 MM]Deep Learning-Based Video Coding: A Review and A Case Study[2019 CVPR]DVC: An End-to-end Deep Video Compression Framework[2017 CVPR]Optical Flow Estimation using a Spatial Pyramid Network[2019 ICCV]Learned Video Compression点击关注,第一工夫理解华为云陈腐技术~ ...

March 23, 2021 · 1 min · jiezi

关于图像:一文带你了解传统手工特征的骨龄评估方法的发展历史

摘要:基于传统手工特色的骨龄评估办法次要包含预处理、要害区域检测、手骨宰割、特征提取、测量五个步骤。基于传统手工特色的骨龄评估办法次要包含预处理、要害区域检测、手骨宰割、特征提取、测量五个步骤,见图1,以下为该类办法的倒退历史介绍。 图1 前人基于手工特色的骨龄评估办法的次要技术路线 1989年,Michael和Nelson共同开发了世界上第一套基于模型的半自动化手骨测量零碎,并将其命名为HANDX。该零碎蕴含了三个次要模块:预处理、宰割和测量。首先结构直方图模型用于加强图像,应用高斯分布函数将图像大抵分为三类:背景,软组织和骨骼;而后,采纳自适应轮廓迫近算法逐渐勾画出每块骨骼的形态;最初,通过找到每块骨骼的长轴和短轴来计算测量值。HANDX零碎须要基于手的地位作为先验常识输出到零碎中,并未进行大规模的数据测试。 1991年,Pietka等人提出了一种基于测量指骨长度来预计骨龄的简便办法。通过对二值化后的图像放大范畴,确定大抵的指骨及其骨骺感兴趣区(phalangeal ROI,PROI)并对图像进行旋转,取得大抵PROI垂直正位X光片,应用Sobel梯度算子进行边缘检测,依据教训抉择适合的阈值,从而取得指骨及其骨骺的边缘图。而后依据中指位于图像最顶端的个性,找出中指的近端指骨、中端指骨和远端指骨并测量他们的长度。通过查阅中指的规范指骨长度表,对应给出大抵预计的骨龄。该办法与影像科医生的人工读片相比,测量指骨长度的误差更小,但总共只测试了50例样本,且指骨长度自身只能用于大抵预计骨龄,无奈进行准确估测。 1994年,Tanner和Gibbons提出了一种基于TW2计分法的骨龄评分计算机辅助零碎(Computer-Assisted Skeletal Age Scores,,CASAS)。该零碎手动对TW2规范中的每块骨头进行放大,而后与其不同成熟等级的X光规范模版进行比照,选取其中最为类似的2-3幅模板图,通过疾速傅立叶变换后计算与原图的相关系数,从而依据每块骨头的相关系数状况综合计分,计算得出TW2规范产生的骨龄评分。CASAS零碎的图像处理步骤简洁,可重复性高。但其仍须要大量的人工干预。 1996年,约旦的AI-Taani等人应用了120幅规范年龄组图像的点散布模型(Point Distribution Models, PDM)对图像进行了不同年龄的分类。对于图中每块骨头,应用鼠标手动抉择它的边界点,提取骨骼轮廓。而后建设每一年龄组所有骨头的模型。当输出新图像时,让所有年龄组的模型图与输出图像进行比照,采纳最小间隔分类器将输出图像匹配到其最靠近的模型组。该办法在中指的远端指骨和中节骨骺两处进行了分类匹配测试,试验结果显示在远端指骨处的成功率为70.5%,中节骨骺的成功率为73.7%。该办法的次要毛病是需手动抉择边界点。 2000年,Mahmoodi等人利用被动形态模型(Active Shape Model, ASM)和基于常识的办法进行了骨龄评估。该零碎首先利用分水岭算法来确定每块骨骼的大抵轮廓地位,而后联合ASM模型和手骨状态的先验常识,应用散布在骨骼边缘上的固定数量的点来提取骨骼的形态。这些点进一步被用于找出近端指骨的骨骺和干骺端骨之间的宽度比例,这一比例与生物学年龄之间具备很高的相关性。因而,基于输入的近端指骨的骨骺和干骺端之间的宽度估测骨龄。这种办法能够提供较准确的后果,但须要较长的计算解决工夫来剖析检测可变形的形态,此外还须要大量的训练和测试样本,整个过程比较复杂。 2003年,Niemeijer等人利用ASM模型和训练神经网络,联合TW2办法中骨头的形态和纹理特色,实现了骨龄主动评估。首先,他们先失去了TW规范里所有发育等级中感兴趣区ROI的均匀图像;而后看待测图像应用ASM模型,确定待测图像中ROI区域的形态和地位;将找到的待测图像中ROI区域与TW规范中ROI均匀图像比照,计算其相关系数,取得5个相关系数值;抉择最高相关系数值的发育等级作为骨龄匹配的模版。同时,这5个相关系数也可作为特色输出训练神经网络(Neural Network,NN)来预测骨龄。比照测试显示,一阶神经网络的后果更好。为了进步预测骨龄的准确率,可从ASM模型中提取额定的纹理特色,输出前期的神经网络。 2007年,Gertych等人提出一种基于手骨要害区域特色的骨龄评估办法。通过对要害指骨骨骺和腕骨的宰割来提取要害特色。共提取了尺寸、形态等11组特色,之后输出含糊分类器(Fuzzy Classifier)进行骨龄评估。该工作的次要奉献是提供了一个骨龄公开数据库The Digital Hand Atlas Database,该数据库收集了洛杉矶医院19世纪90年代到2017年来的骨龄X线图像,共1391张图像,包含了来自亚洲人、非裔美洲人、西班牙人、高加索人四种人种的图像,且提供了每张图像基于GP法的骨龄诊断后果。 另外,Aifeng Zhang等人提出了一种基于常识的全自动腕骨宰割和特征提取的骨龄评估办法。在评估0至7岁儿童的骨龄时,腕骨起到了十分要害的作用。然而腕骨因其数量不确定、与四周组织比照不强等起因,始终是手骨宰割的难点。该办法首先利用了动静阈值法定位腕骨的大抵地位,而后采纳了一种Perona和Malik提出的各向异性扩散滤波器[38]进一步降噪,接着通过Canny边缘检测器进行边缘检测,找出腕骨ROI区域。此时的腕骨ROI区域仍包含腕骨、局部桡骨、尺骨和掌骨,所以接下来利用腕骨地位、形态及成长特点等先验常识,实现了进一步的腕骨辨认。提取腕骨ROI中钩状骨和头状骨的直径、离心率、实心率和三角形变等特色,输出含糊分类器(Fuzzy Classifier)进行训练,别离输入两块骨头各自的匹配骨龄。零碎的最终骨龄是钩状骨和头状骨预测骨龄的逻辑平均值。该办法在2至7岁儿童中的腕骨宰割准确率为100%,但在2岁以下的腕骨宰割中,因其腕骨与背景对比度较差,宰割准确率只有80%。 同一年,Hsieh等人对仅基于腕骨的骨龄预测办法进行了补充,提出了一种联合指骨几何特色和腕骨含糊信息的骨龄主动评估办法。该办法首先通过剖析手的几何属性对整张X光片进行主动校准。而后别离从指骨ROI和腕骨ROI提取生理和状态特色,别离输出反对向量机(Support Vector Machine,SVM)和含糊分类器,预测指骨和腕骨骨龄。最初联合指骨和腕骨骨龄独特评估骨龄。该办法的评测结果显示,腕骨特色在0至9岁儿童的骨龄评估中起决定性作用。而在0至9岁儿童中仅采纳基于指骨几何特色的SVM分类办法时,其预测后果与两者联合相比没有显著性差别,表明指骨的几何特色与腕骨相比,在预测骨龄时具备更好的年龄泛化性。 2012年,Lindner 等人在被动轮廓模型的根底上,提出了基于随机森林和束缚部分模型的主动标定办法。试验结果表明:在保障形态模型训练样本数量的前提下,该办法具备较好的宰割准确度。 迄今为止,最胜利的商用全自动骨龄评测软件系统是BoneXpert。该零碎自2009年起在欧洲被许可上市以来,已有数百家医院在应用其生成的报告,生成一份报告的费用约10欧元左右。该零碎能够抉择基于TW3计分法或G-P图谱法输入骨龄,整个处理过程分为三个阶段:首先通过被动外观模型(Active Appearance Model, AAM)算法主动宰割出手骨和腕骨部位的15块骨头;而后在每块骨头上利用主成分分析法,依据形态、密度和纹理特色计算零碎自定义的intrinsic age;最初依据每块骨头的intrinsic age,依照TW法或G-P法给出最终骨龄。该零碎可能预测的男孩年龄段为2.5至17岁,女孩年龄段为2至15岁。另外,作者指出该零碎尚无奈解决图像品质较差或手骨有形变的X光片。 综上,前人基于图像处理的骨龄评估办法包含预处理、要害区域检测、手骨宰割、特征提取、测量五个步骤。对于手骨宰割步骤,因为设施等因素,手段部X光片的比照存在偏差,并且因为手骨和软组织区域存在着肯定重叠,导致手骨边缘含糊,也加大了宰割的难度。更重要的是,手骨宰割步骤,只是骨龄评估总框架中的一环,前人往往没有独自对手骨宰割的成果进行评估,只通过最终的骨龄评估的准确度对系统进行总统评估。然而,一旦如特征提取等后续解决阶段以失败的手骨宰割后果作为输出,那么最终评估的骨龄并不牢靠。在为数不多的探讨手骨宰割的工作中,对骨骺的检测成功率为86%,而对远端指骨骨骺的检测率只有50%。这意味着手骨宰割的稳定性不高,间接影响了后续特征提取和骨龄评估的成果。 另外,传统手工特色品种繁多,且图像的成像比照等因素也在变动,导致不同特色对骨龄评估后果影响很大,如何选取适合的特色来评估骨龄也是一个难点。 本文分享自华为云社区《基于传统手工特色的骨龄评估办法 》,原文作者:医疗人工智能 。 点击关注,第一工夫理解华为云陈腐技术~

December 22, 2020 · 1 min · jiezi

Spark内置图像数据源初探

概述在Apache Spark 2.4中引入了一个新的内置数据源, 图像数据源.用户可以通过DataFrame API加载指定目录的中图像文件,生成一个DataFrame对象.通过该DataFrame对象,用户可以对图像数据进行简单的处理,然后使用MLlib进行特定的训练和分类计算.    本文将介绍图像数据源的实现细节和使用方法. 简单使用先通过一个例子来简单的了解下图像数据源使用方法. 本例设定有一组图像文件存放在阿里云的OSS上, 需要对这组图像加水印,并压缩存储到parquet文件中. 废话不说,先上代码: // 为了突出重点,代码简化图像格式相关的处理逻辑 def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local[*]") val spark = SparkSession.builder() .config(conf) .getOrCreate() val imageDF = spark.read.format("image").load("oss://<bucket>/path/to/src/dir") imageDF.select("image.origin", "image.width", "image.height", "image.nChannels", "image.mode", "image.data") .map(row => { val origin = row.getAs[String]("origin") val width = row.getAs[Int]("width") val height = row.getAs[Int]("height") val mode = row.getAs[Int]("mode") val nChannels = row.getAs[Int]("nChannels") val data = row.getAs[Array[Byte]]("data") Row(Row(origin, height, width, nChannels, mode, markWithText(width, height, BufferedImage.TYPE_3BYTE_BGR, data, "EMR"))) }).write.format("parquet").save("oss://<bucket>/path/to/dst/dir") } def markWithText(width: Int, height: Int, imageType: Int, data: Array[Byte], text: String): Array[Byte] = { val image = new BufferedImage(width, height, imageType) val raster = image.getData.asInstanceOf[WritableRaster] val pixels = data.map(_.toInt) raster.setPixels(0, 0, width, height, pixels) image.setData(raster) val buffImg = new BufferedImage(width, height, imageType) val g = buffImg.createGraphics g.drawImage(image, 0, 0, null) g.setColor(Color.red) g.setFont(new Font("宋体", Font.BOLD, 30)) g.drawString(text, width/2, height/2) g.dispose() val buffer = new ByteArrayOutputStream ImageIO.write(buffImg, "JPG", buffer) buffer.toByteArray }从生成的parquet文件中抽取一条图像二进制数据,保存为本地jpg,效果如下: ...

June 17, 2019 · 3 min · jiezi

十张伟大的科学瞬间

题图: 搭载 ORBCOMM OG2-M1 卫星的猎鹰 9 号运载火箭发射,人类一直很渺小。▎2019 更新北京时间 2019 年 4 月 10 日 21 点,人类首张黑洞照片正式发布!这次的直接成像除了帮助我们直接确认了黑洞的存在,同时也通过模拟观测数据对爱因斯坦的广义相对论做出了验证。1. 1927 年第五届索尔维会议这张照片几乎是世界上最著名的物理学家会面,会议里讨论了新制定的量子理论。主要人物是爱因斯坦和玻尔,然而与会的其他人员也全是大牌!29 位与会者中的 17 人曾获诺贝尔奖,其中居里夫人甚至在两个独立的学科中获得诺贝尔奖。从左到右:A. Piccard, E. Henriot, P. Ehrenfest, E. Herzen(赫尔岑), Th. de Donder, E. Schrödinger(薛定谔), J.E. Verschaffelt, W. Pauli, W. Heisenberg(海森堡), R.H. Fowler, L. BrillouinP. Debye, M. Knudsen, W.L. Bragg, H.A. Kramers, P.A.M. Dirac, A.H. Compton, L. de Broglie, M. Born, N. Bohr(玻尔)I. Langmuir, M. Planck(普朗克), M. Skłodowska-Curie(居里夫人), H.A. Lorentz(洛伦兹), A. Einstein(爱因斯坦), P. Langevin, Ch.-E. Guye, C.T.R. Wilson, O.W. Richardson2. 磁感应线可视化一根巨大的棒状磁铁放置在一系列罗盘上,你可以清楚地看到由北至南的磁感应线。3. Golden Record!Carl Sagan 召集了各领域的翘楚,制作了一张留声机记录,里面收录了 55 种人类语言以及一种鲸的歌声向外星生命发出的问候、90 分钟的来自世界各地最伟大的音乐、一部关于进化历史的音频「地球之声」,以及 118 张表现地球与人类的照片。尽管很多人觉得,在茫茫的太空中,这两个小小的航天器被其他文明截获的可能为零,做这样一个项目简直就是不切实际。但萨根很清楚,相比金唱片向其他文明传达了什么,更重要的是它向我们自身传达了什么 ——「很多时候我们会困惑,我们自诩为骄傲的人类文明,究竟是怎样的一种存在?这张唱片代表了我们整体,是全人类融合的未来。」4. 暗淡蓝点这张照片是旅行者 1 号拍摄的最著名的地球照片之一,显示了地球悬浮在太阳系漆黑的背景中。在照片中,地球的表观尺寸小于一个像素,而加尔文也这么描述过 ——「我们的地球是无限海滩上的一粒沙粒中的亚原子粒子。」可能我们正栖息在灰尘上。5. 大象之腿 (Elephant’s foot Chernobyl,Ukraine)1986 年 4 月 26 日切尔诺贝尔核电厂发生事故,图中是被称为「Elephant’s Foot(大象之腿)」的物体,它是一个混合了大量熔解后的混凝土、沙子、核燃料及密封材料等而成的固体,就处于事故核心位置的地下室。在当年此位置的辐射水平达到每小时 10,000 伦琴(roentgens),人类接近一分钟也足以致命。上图照片是在核难过去十年后拍摄,辐射量只有当年的十份之一。但是在它面前曝露身体的话,仅仅 500 秒便足以致命。特别值得留意是,这些照片之所以很粗糙、很多颗粒,并不是拍摄技术或当年苏俄相机问题,而是菲林受到辐射的影响。5. 火箭升空瞬间的青蛙NASA 发射 LADEE 月球大气与粉尘探测器时,火箭起飞时所产生的强大气流将一只青蛙吹飞,成为了真正的「火箭蛙」。美国宇航局证实,这张照片是真实的,爆炸声触发了一架远方的照相机,拍下了这张图片。6. 西西里岛埃特纳火山戒指上帝也抽烟?位于意大利西西里岛的埃特纳火山是著名的活火山,不仅喷发频次高,还有一个极罕见的现象:喷烟圈。2010 年冰岛埃亚菲亚德拉火山喷发时,美国地质学家记录到这一现象。7. Bruce McCandless 的太空漫步宇航员 Bruce McCandless 可能是历史上最为大胆的宇航员了,他装备了氮气推动力的背包设备,在地球轨道「自由飞翔」。图片拍摄于 1984 年 2 月 12 日。9. 地球上空的人造卫星这张照片包含了所有在地球轨道上的人造卫星。10. 癫痫患者大脑表面照片这是一张癫痫患者大脑表面的照片,它获得了 2012 年维康显微图像奖总冠军,维康显微图像奖是用于表彰能够呈现令人惊异的生物医学结构和图像的显微摄影作品。它显示的是一位癫痫患者大脑表面,这张照片是在接受颅内电极记录程序之前拍摄的,灵活的电极栅附加在大脑表面。之后患者被送至遥测病房监护,在这里可以记录大脑活跃性。医生使用这些记忆来鉴别大脑的特殊区域,据说这位患者最终完全恢复健康,癫痫症得以被根治。原文链接: 十张伟大的科学瞬间推荐阅读: 超过 20 万张照片可商用,美国大都会博物馆免费下载欢迎关注微信号「极光开发者」 ...

April 11, 2019 · 1 min · jiezi

color

命名空间System.Drawing.ColorColor是结构体,值类型.字段Empty,表示无效颜色,不是任何颜色,可以用来初始化一个color变量.Color c = Color.Empty;属性public byte A { get; }public byte R { get; }public byte G { get; }public byte B { get; }返回color的alpha,red,green,blue分量.其他属性都是系统颜色,可以为color变量赋值Color c = Color.OrangeRed;方法public static Color FromArgb(int alpha, int red, int green, int blue);Color c = Color.FromArgb(1,2,3,4);虽然参数是int类型,但是只能传入0-255,即一个bytealpha = 255表示完全不透明.

April 10, 2019 · 1 min · jiezi

用PyTorch创建一个图像分类器?So easy!(Part 2)

摘要: 学习完了如何加载预训练神经网络,下面就让我们来看看如何训练分类器吧!在第一部分中,我们知道了为什么以及如何加载预先训练好的神经网络,我们可以用自己的分类器代替已有神经网络的分类器。那么,在这篇文章中,我们将学习如何训练分类器。训练分类器首先,我们需要为分类器提供待分类的图像。本文使用ImageFolder加载图像,预训练神经网络的输入有特定的格式,因此,我们需要用一些变换来调整图像的大小,即在将图像输入到神经网络之前,对其进行裁剪和标准化处理。具体来说,将图像大小调整为224*224,并对图像进行标准化处理,即均值为 [0.485,0.456,0.406],标准差为[0.229,0.224,0.225],颜色管道的均值设为0,标准差缩放为1。然后,使用DataLoader批量传递图像,由于有三个数据集:训练数据集、验证数据集和测试数据集,因此需要为每个数据集创建一个加载器。一切准备就绪后,就可以训练分类器了。在这里,最重要的挑战就是——正确率(accuracy)。让模型识别一个已经知道的图像,这不算啥事,但是我们现在的要求是:能够概括、确定以前从未见过的图像中花的类型。在实现这一目标过程中,我们一定要避免过拟合,即“分析的结果与特定数据集的联系过于紧密或完全对应,因此可能无法对其他数据集进行可靠的预测或分析”。隐藏层实现适当拟合的方法有很多种,其中一种很简单的方法就是:隐藏层。我们很容易陷入这样一种误区:拥有更多或更大的隐藏层,能够提高分类器的正确率,但事实并非如此。增加隐藏层的数量或大小以后,我们的分类器就需要考虑更多不必要的参数。举个例子来说,将噪音看做是花朵的一部分,这会导致过拟合,也会降低精度,不仅如此,分类器还需要更长的时间来训练和预测。因此,我建议你从数量较少的隐藏层开始,然后根据需要增加隐藏层的数量或大小,而不是一开始就使用特别多或特别大的隐藏层。在第一部分介绍的《AI Programming with Python Nanodegree》课程中的花卉分类器项目中,我只需要一个小的隐藏层,在第一个完整训练周期内,就得到了70%以上的正确率。数据增强我们有很多图像可供模型训练,这非常不错。如果拥有更多的图像,数据增强就可以发挥作用了。每个图像在每个训练周期都会作为神经网络的输入,对神经网络训练一次。在这之前,我们可以对输入图像做一些随机变化,比如旋转、平移或缩放。这样,在每个训练周期内,输入图像都会有差异。增加训练数据的种类有利于减少过拟合,同样也提高了分类器的概括能力,从而提高模型分类的整体准确度。Shuffle在训练分类器时,我们需要提供一系列随机的图像,以免引入任何误差。举个例子来说,我们刚开始训练分类器时,我们使用“牵牛花”图像对模型进行训练,这样一来,分类器在后续训练过程中将会偏向“牵牛花”,因为它只知道“牵牛花”。因此,在我们使用其他类型的花进行训练时,分类器最初的偏好也将持续一段时间。为了避免这一现象,我们就需要在数据加载器中使用不同的图像,这很简单,只需要在加载器中添加shuffle=true,代码如下:trainloader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)Dropout有的时候,分类器中的节点可能会导致其他节点不能进行适当的训练,此外,节点可能会产生共同依赖,这就会导致过拟合。Dropout技术通过在每个训练步骤中使一些节点处于不活跃状态,来避免这一问题。这样一来,在每个训练阶段都使用不同的节点子集,从而减少过拟合。除了过拟合,我们一定要记住,学习率( learning rate )是最关键的超参数。如果学习率过大,模型的误差永远都不会降到最小;如果学习率过小,分类器将会训练的特别慢,因此,学习率不能过大也不能过小。一般来说,学习率可以是0.01,0.001,0.0001……,依此类推。最后,在最后一层选择正确的激活函数会对模型的正确率会产生特别大的影响。举个例子来说,如果我们使用 negative log likelihood loss(NLLLoss),那么,在最后一层中,建议使用LogSoftmax激活函数。结论理解模型的训练过程,将有助于创建能够概括的模型,在预测新图像类型时的准确度更高。在本文中,我们讨论了过拟合将会如何降低模型的概括能力,并学习了降低过拟合的方法。另外,我们也强调了学习率的重要性及其常用值。最后,我们知道,为最后一层选择正确的激活函数非常关键。现在,我们已经知道应该如何训练分类器,那么,我们就可以用它来预测以前从未见过的花型了!本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 20, 2018 · 1 min · jiezi

用PyTorch创建一个图像分类器?So easy!(Part 1)

摘要: 本文将为你介绍为何要重用神经网络?哪部分可以重用,哪部分不可以重用。了解完这些基础概念,你就可以自行创建一个图像分类器了。经过了几个月的学习和实践,我完成了优达学城网站上《Python Programming with Python Nanodegree》课程的学习,该课程的终极项目就是使用Pytorch为102种不同类型的花创建一个图像分类器。在完成这个项目的过程中,我和其他学员一样,都碰到了各种问题和挑战,因此写下了这篇文章。希望你读完这篇文章以后,会对你的机器学习有所裨益。本文介绍了如何实现图像分类的基础概念,即理解图像内容的算法。本文并不会详细分步说明构建模型的具体步骤,而是从宏观上介绍整个过程,如果你正在学习机器学习或人工智能,相信这篇文章将会对你很有帮助。在第一部分中,我们将介绍加载预训练的神经网络,为什么要“重用”网络(即使用预训练神经网络),指明哪些部分可以重用,哪些部分不可以重用,以及如何自定义预训练网络。加载一个预训练网络“重用”是一个非常合理的策略,特别是当某些工具是大家都认可为标准的时候,“重用”更显得尤为重要。在这个例子中,我们的出发点是torchvision提供的一个模型框架。现在,我们要做的是加载一个预先训练好的网络,并用自己的网络替换它的分类器,然后,我们就可以训练自己的分类器了。虽然这个想法很合理,但是也比较麻烦,因为加载一个预先训练好的网络,并不会节省我们训练分类器的工作量。所以,使用预训练网络到底有什么好处呢?当我们人类在看图像的时候,我们会识别线条和形状,鉴于此,我们才可以将图像内容与之前看到的内容联系起来。现在,我们希望分类器也能做到这点,但是,图像并不是一个简单的数据,而是由数千个独立的像素组成,每个像素又由3个不同的值组合起来,形成颜色,即红色、绿色和蓝色。 如果我们希望分类器能够处理这些数据,我们要做的就是将每个待处理图像所包含的信息,以分类器可以理解的格式传给分类器,这就是预训练网络发挥作用的地方。这些预训练网络主要由一组特征检测器和分类器组成,其中,特征检测器被训练成可以从每个图像中提取信息,分类器被训练成理解特征层提供的输入。在这里,特征检测器已经在ImageNet中接受过训练,并且性能良好,我们希望这点能够继续保持。在训练分类器时,为了防止特征层被篡改,我们得对特征层进行“冻结”,下面这些代码可以很轻松的解决这一问题:for param in model.parameters(): param.requires_grad = False那么,问题又来了,既然我们可以“重用”特征检测器,我们为什么不能“重用”分类器?要回答这个问题,我们先来看看VGG16架构的默认分类器:(classifier): Sequential( (0): Linear(in_features=25088, out_features=4096, bias=True) (1): ReLU(inplace) (2): Dropout(p=0.5) (3): Linear(in_features=4096, out_features=4096, bias=True) (4): ReLU(inplace) (5): Dropout(p=0.5) (6): Linear(in_features=4096, out_features=1000, bias=True))首先,我们没办法保证这些代码能够起作用,在我们特定的环境中,这些默认层、元素、激活函数以及Dropout值并不一定是最佳的。尤其是最后一层的输出是1000个元素,这就容易理解了。在我们的例子中,我们要对102种不同类型的花进行分类,因此,我们的分类器输出必须是102,而不是1000。从上面VGG16架构的默认分类器中,我们还可以注意到,分类器的输入层有25088个元素,这是特定预训练模型中特征检测器的输出大小,因此,我们的分类器大小也必须要与要特征层的输出相匹配。结论从上面的分析,本文能够得到以下结论:1.预先训练好的网络非常有用。使用预训练模型,可以让我们更加专注于我们自己用例的具体细节,还可以重用众所周知的工具,对用例中的图像进行预处理。2.分类器的输出大小必须与我们希望识别的图像数量相同。3.特征层的输出和自定义分类器的输入大小必须相匹配。在下一篇文章中,我们将深入探讨,在训练分类器过程中,如何避免一些常见的陷阱,并学习如何调整超参数,来提高模型的准确性。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 19, 2018 · 1 min · jiezi

一文带你学会使用YOLO及Opencv完成图像及视频流目标检测(上)|附源码

摘要: 本文介绍使用opencv和yolo完成图像目标检测,代码解释详细,附源码,上手快。计算机视觉领域中,目标检测一直是工业应用上比较热门且成熟的应用领域,比如人脸识别、行人检测等,国内的旷视科技、商汤科技等公司在该领域占据行业领先地位。相对于图像分类任务而言,目标检测会更加复杂一些,不仅需要知道这是哪一类图像,而且要知道图像中所包含的内容有什么及其在图像中的位置,因此,其工业应用比较广泛。那么,今天将向读者介绍该领域中表现优异的一种算算法——“你只需要看一次”(you only look once,yolo),提出该算法的作者风趣幽默可爱,其个人主页及论文风格显示了其性情,目前该算法已是第三个版本,简称YoLo V3。闲话少叙,下面进入教程的主要内容。在本教程中,将学习如何使用YOLO、OpenCV和Python检测图像和视频流中的对象。主要内容有:简要讨论YOLO算法;使用YOLO、OpenCV、Python进行图像检测;使用YOLO、OpenCV、Python进行视频流检测;讨论YOLO算法的优点和缺点;什么是YOLO?当涉及基于深度学习的对象检测时,常用的三类算法有:R-CNN家族系列算法:R-CNN、fast R-CNN以及faster R-CNN;单发检测器(SSD);YOLO算法;R-CNN算法是最早的基于深度学习的目标检测器之一,其结构是两级网络:首先需要诸如选择性搜索之类的算法来提出可能包含对象的候选边界框;然后将这些区域传递到CNN算法进行分类;R-CNN算法存在的问题在于其仿真很慢,并且不是完整的端到端的目标检测器。Fast R-CNN算法对原始R-CNN进行了相当大的改进,即提高准确度并减少执行正向传递所花费的时间,但是,该模型仍然依赖于外部区域搜索算法。直到2015年,faster R-CNN才成为真正的端到端深度学习目标检测器,删除了选择性搜索的要求,而是依赖于(1)完全卷积的区域提议网络(RPN)和(2)可以预测对象边界框和“对象”分数(量化它是一个区域的可能性的分数)。然后将RPN的输出传递到R-CNN组件以进行最终分类和标记。R-CNN系列算法的检测结果一般都非常准确,但R-CNN系列算法最大的问题在仿真速度——非常慢,即使是在GPU上也仅获得5 FPS。为了提高基于深度学习的目标检测器的速度,单次检测器(SSD)和YOLO都使用单级检测器策略(one stage)。这类算法将对象检测视为回归问题,获取给定的输入图像并同时学习边界框坐标和相应的类标签概率。通常,单级检测器往往不如两级检测器准确,但其速度明显更快。YOLO是单级检测器中一个很好的算法。YOLO算法于2015年提出,在GPU上获得了 45 FPS性能,此外,同时也提出了一个较小的变体称为“Fast YOLO”,在GPU上达到155 FPS的性能。YOLO经历了许多次的迭代,包括YOLOv2,能够检测超过9,000个目标。直到最近提出的YOLOv3算法,YOLOv3模型比之前的版本要复杂得多,但它是YOLO系列目标检测器中最好的一款。本文使用YOLOv3,并在COCO数据集上进行训练。COCO数据集由80个标签组成,可以使用此链接找到YOLO在COCO数据集上训练的内容的完整列表。项目结构在终端中使用tree命令,可以很方便快捷地生成目标树:$ tree.├── images│ ├── baggage_claim.jpg│ ├── dining_table.jpg│ ├── living_room.jpg│ └── soccer.jpg├── output│ ├── airport_output.avi│ ├── car_chase_01_output.avi│ ├── car_chase_02_output.avi│ └── overpass_output.avi├── videos│ ├── airport.mp4│ ├── car_chase_01.mp4│ ├── car_chase_02.mp4│ └── overpass.mp4├── yolo-coco│ ├── coco.names│ ├── yolov3.cfg│ └── yolov3.weights├── yolo.py└── yolo_video.py从上面可以看出,项目包括4个文件夹和2个Python脚本。目录(按重要性顺序)是:yolo - coco / :YOLOv3对象检测器预先(在COCO数据集上)训练得到最终的权重文件,可以在Darknet团队主页找到对应的文件;images / :此文件夹包含四个静态图像,之后将执行对象检测以进行测试和评估;videos/ :使用YOLO对图像进行目标检测器后,将实时处理视频。该文件夹中包含四个示例视频可供测试;输出/ :输出已由YOLO处理并带有边界框和类名称注释的视频可以放在此文件夹中;此外还有两个Python脚本——yolo .py和 yolo_video.py ,第一个脚本用于图像处理,第二个脚本用于视频处理。下面进入实战内容,你准备好了吗?将YOLO应用于图像对象检测首先将YOLO目标检测器应用于图像中,首先打开项目中的 yolo .py并插入以下代码:# import the necessary packagesimport numpy as npimport argparseimport timeimport cv2import os# construct the argument parse and parse the argumentsap = argparse.ArgumentParser()ap.add_argument("-i", “–image”, required=True, help=“path to input image”)ap.add_argument("-y", “–yolo”, required=True, help=“base path to YOLO directory”)ap.add_argument("-c", “–confidence”, type=float, default=0.5, help=“minimum probability to filter weak detections”)ap.add_argument("-t", “–threshold”, type=float, default=0.3, help=“threshold when applying non-maxima suppression”)args = vars(ap.parse_args())在使用之前,需要为此脚本安装 3.4.2+版本以上的OpenCV,可以直接使用pip install opencv-python==3.4.2安装,你也可以在这里找到OpenCV安装教程,这里注意一点,OpenCV 4目前处于测试阶段,这里建议去安装OpenCV 3.4.2+。首先,导入所需的数据包——OpenCV和NumPy。现在解析四个命令行参数,命令行参数在运行时处理,允许我们从终端更改脚本的输入。如果你对其不熟悉,建议阅读相关的内容。命令行参数包括:– image :输入图像的路径;– yolo :YOLO文件路径,脚本将加载所需的YOLO文件,以便在图像上执行对象检测;– confidence :过滤弱检测的最小概率,默认值设置为0.5,但该值也可以随意设置;– threshold :非最大值抑制阈值,默认值设置为 0.3,可以在此处阅读有关非最大值抑制的更多信息。解析之后,args变量是一个包含命令行参数的键值对的字典。下面为每个标签设置随机颜色:# load the COCO class labels our YOLO model was trained onlabelsPath = os.path.sep.join([args[“yolo”], “coco.names”])LABELS = open(labelsPath).read().strip().split("\n")# initialize a list of colors to represent each possible class labelnp.random.seed(42)COLORS = np.random.randint(0, 255, size=(len(LABELS), 3), dtype=“uint8”)上述加载所有类 LABELS,其类型是列表,保存的是类别名称,然后将随机颜色分配给每个标签 。下面设置YOLO权重和配置文件的路径,然后从磁盘加载YOLO文件:# derive the paths to the YOLO weights and model configurationweightsPath = os.path.sep.join([args[“yolo”], “yolov3.weights”])configPath = os.path.sep.join([args[“yolo”], “yolov3.cfg”])# load our YOLO object detector trained on COCO dataset (80 classes)print("[INFO] loading YOLO from disk…")net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)从磁盘加载YOLO文件后,并利用OpenCV中的cv2.dnn.readNetFromDarknet函数从中读取网络文件及权重参数,此函数需要两个参数configPath 和 weightsPath,这里再次强调,:OpenCV 的版本至少是3.4.2及以上才能运行此代码,因为它需要加载YOLO所需的更新的 dnn模块。下面加载图像并处理:# load our input image and grab its spatial dimensionsimage = cv2.imread(args[“image”])(H, W) = image.shape[:2]# determine only the output layer names that we need from YOLOln = net.getLayerNames()ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]# construct a blob from the input image and then perform a forward# pass of the YOLO object detector, giving us our bounding boxes and# associated probabilitiesblob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416), swapRB=True, crop=False)net.setInput(blob)start = time.time()layerOutputs = net.forward(ln)end = time.time()# show timing information on YOLOprint("[INFO] YOLO took {:.6f} seconds".format(end - start))在该代码中:加载输入 图像并获得其尺寸;确定YOLO模型中的输出图层名称;从图像构造一个 blob结构;如果你对blob和cv2.dnn.blobFromImage有疑问,可以看这篇博客进一步的了解。当blob准备好了后,我们就会通过YOLO网络进行前向传递;显示YOLO的推理时间;现在采取措施来过滤和可视化最终的结果。首先,让我们初步化一些处理过程中需要的列表:# initialize our lists of detected bounding boxes, confidences, and# class IDs, respectivelyboxes = []confidences = []classIDs = []这些列表包括:boxes :对象的边界框。confidences :YOLO分配给对象的置信度值,较低的置信度值表示该对象可能不是网络认为的对象。上面的命令行参数中将过滤掉不大于 0.5阈值的对象。classIDs :检测到的对象的类标签。下面用YOLO layerOutputs中的数据填充这些列表 :# loop over each of the layer outputsfor output in layerOutputs: # loop over each of the detections for detection in output: # extract the class ID and confidence (i.e., probability) of # the current object detection scores = detection[5:] classID = np.argmax(scores) confidence = scores[classID] # filter out weak predictions by ensuring the detected # probability is greater than the minimum probability if confidence > args[“confidence”]: # scale the bounding box coordinates back relative to the # size of the image, keeping in mind that YOLO actually # returns the center (x, y)-coordinates of the bounding # box followed by the boxes’ width and height box = detection[0:4] * np.array([W, H, W, H]) (centerX, centerY, width, height) = box.astype(“int”) # use the center (x, y)-coordinates to derive the top and # and left corner of the bounding box x = int(centerX - (width / 2)) y = int(centerY - (height / 2)) # update our list of bounding box coordinates, confidences, # and class IDs boxes.append([x, y, int(width), int(height)]) confidences.append(float(confidence)) classIDs.append(classID)在这个块中:循环遍历每个 layerOutputs;循环每个detection中 output;提取 classID和 confidence;使用 confidence滤除弱检测;过滤掉了不需要的检测结果后,我们将:缩放边界框坐标,以便我们可以在原始图像上正确显示它们;提取边界框的坐标和尺寸,YOLO返回边界框坐标形式: (centerX ,centerY ,width,height);使用此信息导出边界框的左上角(x,y)坐标;更新boxes, confidences ,classIDs列表。有了这些数据后,将应用“非最大值抑制”(non-maxima suppression,nms):# apply non-maxima suppression to suppress weak, overlapping bounding# boxesidxs = cv2.dnn.NMSBoxes(boxes, confidences, args[“confidence”], args[“threshold”])YOLO算法并没有应用非最大值抑制,这里需要说明一下。应用非最大值抑制可以抑制明显重叠的边界框,只保留最自信的边界框,NMS还确保我们没有任何冗余或无关的边界框。利用OpenCV内置的NMS DNN模块实现即可实现非最大值抑制 ,所需要的参数是边界 框、 置信度、以及置信度阈值和NMS阈值。最后在图像上绘制检测框和类文本:# ensure at least one detection existsif len(idxs) > 0: # loop over the indexes we are keeping for i in idxs.flatten(): # extract the bounding box coordinates (x, y) = (boxes[i][0], boxes[i][1]) (w, h) = (boxes[i][2], boxes[i][3]) # draw a bounding box rectangle and label on the image color = [int(c) for c in COLORS[classIDs[i]]] cv2.rectangle(image, (x, y), (x + w, y + h), color, 2) text = “{}: {:.4f}".format(LABELS[classIDs[i]], confidences[i]) cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)# show the output imagecv2.imshow(“Image”, image)cv2.waitKey(0)假设存在至少一个检测结果,就循环用非最大值抑制确定idx 。然后,我们使用随机类颜色在图像上绘制边界框和文本 。最后,显示结果图像,直到用户按下键盘上的任意键。下面进入测试环节,打开一个终端并执行以下命令:$ python yolo.py –image images/baggage_claim.jpg –yolo yolo-coco[INFO] loading YOLO from disk…[INFO] YOLO took 0.347815 seconds从上图可以看到,YOLO不仅检测了输入图像中的每个人,还检测了手提箱。此外,可以从图像的右上角看到,YOLO还检测到女士肩上的手提包。我们试试另一个例子:$ python yolo.py –image images/living_room.jpg –yolo yolo-coco[INFO] loading YOLO from disk…[INFO] YOLO took 0.340221 secondsYOLO还可以检测电视显示器和椅子,令我惊讶的是YOLO能够检测到椅子,因为它是手工制作的老式“婴儿高脚椅”。有趣的是,YOLO认为我手中有一个遥控器,它实际上不是遥控器——玻璃反射的VHS录,仔细盯着这个地方看,它实际上看起来非常像遥控器。以下示例图像演示了YOLO对象检测器的局限性和弱点:$ python yolo.py –image images/dining_table.jpg –yolo yolo-coco[INFO] loading YOLO from disk…[INFO] YOLO took 0.362369 seconds虽然YOLO正确检测到葡萄酒瓶、餐桌和花瓶,但只有两个酒杯中的一个被正确检测到。下面尝试最后一幅图像:$ python yolo.py –image images/soccer.jpg –yolo yolo-coco[INFO] loading YOLO from disk…[INFO] YOLO took 0.345656 secondsYOLO能够正确地检测球场上的每个球员,包括足球本身。请注意,尽管区域高度模糊且部分遮挡,但仍会检测到背景中的人。以上内容就是图像检测部分的全部内容,下一节将介绍视频流中对象检测以及YOLO算法的总结。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

November 21, 2018 · 4 min · jiezi