非刚性人脸识别 —— 实用工具

➨ 报告电子版到听道官方博客下载:http://blog.tingyun.com/web/article/detail/1352

面向对象设计

  与人脸检测与人脸识别一样,人脸跟踪也由于少有构成:数据和算法。算法通过事先储存(即离线)的数据来训练模型,然后针对新来之(即在线)数据实行某类操作。因此,采用面向对象设计是对的选择。

  在
opencv 2.x 版本中,可方便引入
XML/YAML 文件存储类型,对算法来讲,会大大简化组织离线数据任务。下面通过一个假象类来展示是意义

  

  • 于定义类
    foo

     1 // foo.h
     2 /*
     3     在下面的代码中,定义了一个序列化函数,可对 I/O 函数 read 和 write 实现序列化。
     4     FileStorage 类支持两种能被序列化的数据结构类型。
     5     为了简单起见,本章所有类将采用映射,其中每个用于存储的变量都会创建一个 FileNode::MAP 类型的 FileNode 对象。
     6     这需要分配给变量中的每个元素唯一键。为了保持一致性,将变量名作为标签
     7 */
     8 
     9 #include <opencv2/opencv.hpp>
    10 #include <iostream>
    11 using namespace cv;
    12 using namespace std;
    13 
    14 class foo {
    15 public:
    16     int a, b;        
    17     void write(FileStorage &fs) const {            // 序列化存储自定义数据类型
    18         assert(fs.isOpened());
    19         fs << "{" << "a" << a << "b" << b << "}";        // 创建 FileNode::MAP 类型的对象
    20     }
    21     void read(const FileNode& node) {            // 读取数据
    22         assert(node.type() == FileNode::MAP);
    23         node["a"] >> a;    node["b"] >> b;
    24     }
    25 };
    
  • 以要
    FileStorage 类的序列化能健康干活,还用定义write,
    read函数

     1 template<class T>
     2 void 
     3 write(FileStorage& fs, 
     4       const string&, 
     5       const T& x)
     6 {
     7   x.write(fs);
     8 }
     9 //==============================================================================
    10 template<class T>
    11 void 
    12 read(const FileNode& node, 
    13      T& x,
    14      const T& d)
    15 {
    16   if(node.empty())x = d; else x.read(node);
    17 }
    

     

 

  • 为吃保存及加载采用了序列化的用户从定义类易得易,采用模块化函数定义了load_ft,save_ft函数

     1 template <class T> 
     2 T load_ft(const char* fname){
     3   T x; FileStorage f(fname,FileStorage::READ);
     4   f["ft object"] >> x; f.release(); return x;    // 定义与对象关联的标签都为 ft object
     5 }
     6 //==============================================================================
     7 template<class T>
     8 void save_ft(const char* fname,const T& x){
     9   FileStorage f(fname,FileStorage::WRITE);
    10   f << "ft object" << x; f.release();
    11 }
    
  • 将上述定义在
    ft.hpp 中
    图片 1图片 2

     1 /*
     2     ft.hpp
     3     用于加载、保存对象数据
     4 */
     5 
     6 #ifndef _FT_FT_HPP_
     7 #define _FT_FT_HPP_
     8 #include <opencv2/opencv.hpp> 
     9 //==============================================================================
    10 // 为了让保存和加载采用了序列化的用户自定义类变得容易,采用模块化函数定义了load_ft,save_ft函数
    11 template <class T> 
    12 T load_ft(const char* fname){
    13   T x; FileStorage f(fname,FileStorage::READ);
    14   f["ft object"] >> x; f.release(); return x;    // 定义与对象关联的标签都为 ft object
    15 }
    16 //==============================================================================
    17 template<class T>
    18 void save_ft(const char* fname,const T& x){
    19   FileStorage f(fname,FileStorage::WRITE);
    20   f << "ft object" << x; f.release();
    21 }
    22 //==============================================================================
    23 // 为了使 FileStorage 类的序列化能正常工作,还需要定义write, read函数
    24 template<class T>
    25 void 
    26 write(FileStorage& fs, 
    27       const string&, 
    28       const T& x)
    29 {
    30   x.write(fs);
    31 }
    32 //==============================================================================
    33 template<class T>
    34 void 
    35 read(const FileNode& node, 
    36      T& x,
    37      const T& d)
    38 {
    39   if(node.empty())x = d; else x.read(node);
    40 }
    41 //==============================================================================
    42 #endif
    

    ft.hpp

  • 主函数,有一个问题,储存到
    xml 文件连续报错,而 yaml 文件可以正常存取

     1 /*
     2     main.cpp
     3     测试 opencv 文件储存
     4 */
     5 
     6 #include "opencv_hotshots/ft/ft.hpp"
     7 #include "foo.h"
     8 
     9 int main() {
    10     foo A;                // 初始化自定义对象 A
    11     A.a = 1; A.b = 2;
    12     save_ft<foo>("foo.yaml", A);    // 将自定义对象存到 foo.yaml
    13     foo B = load_ft<foo>("foo.yaml");    // 读取对象
    14     cout << B.a << "," << B.b << endl;
    15 
    16     system("pause");
    17     return 0;
    18 }
    
  • 程序运行结果

       
        图片 3               
  图片 4

 

 

 

 

数量收集:图像及视频标注

  现代人脸跟踪技术几乎全盘是数码驱动,即用来检测图像中面部特征位置的算法依靠面部特征的外观模型与几哪里依赖性,该依赖性来自样本集中人脸间的对立位置。样本集越怪,算法就再度具鲁棒性,因为人口脸所展现来之变型范围就重新明了。因此,构建人脸跟踪算法的首先步是开创用于开展图像/视频的标号工具,用户可用之工具来指定在每个样本图中怀念只要之脸部特征位置。

  1. ### 训练数据类型

  训练人脸跟踪算法的多寡貌似由以下四组成部分组成:

    • 图像:这有的凡是包含全体人脸图像(图像或看频帧)的联谊
    • 号:这部分使用手工方法标明每幅图像中于盯梢的脸部特征的相对位置
    • 对如性索引:这一部分对准定义了双方对如特征的面特征点都封存了一个号码,以便用来镜像训练图像,可有效地于教练集大小增加一倍
    • 连通性索引:这一部分是同组标注的目录对,它们定义了脸面特征的语义解释。连通性对可视化跟踪结果充分有因此

  这四只零部件的可视化情形显示在生图被,从左到右依次是老图像、脸部特征标注、颜色编码的双方对称点、镜像图像以及相应标注、面部特征的连通性。

   
  图片 5

 

  为了方便管理这种数据,需兑现所有读写功能的切近。本章将使于
ft_data.hpp 头文件中定义的
ft_data 类,它是遵照面部跟踪数据的风味专门规划之。所有因素都定义成类的国有成员变量,如下所示

1 class ft_data{                             //人脸跟踪数据
2 public:
3   vector<int> symmetry;                    // 人脸特征点的索引,维数与用户定义的特征点数一样
4   vector<Vec2i> connections;               // 定义一对连通的面部特征
5   vector<string> imnames;                  // 存储每个图像文件名
6   vector<vector<Point2f> > points;         // 存储特征点的位置
7   ...
8 }

 

 

  ft_data 类实现了过多做客数的行方法。为了看数据集的图像,可用
get_image 函数加载图像。使用该函数得点名加载图像的索引 idx
,以及是否以图像为 y 轴做镜像。该函数实现如下:

 1 Mat
 2 ft_data::
 3 get_image(const int idx,    // 图像索引
 4       const int flag)        // 0=gray,1=gray+flip,2=rgb,3=rgb+flip
 5 {
 6   if((idx < 0) || (idx >= (int)imnames.size()))return Mat();
 7   Mat img,im;
 8   if(flag < 2)img = imread(imnames[idx],0);        // gray
 9   else img = imread(imnames[idx],1);            // rgb
10   if(flag % 2 != 0)flip(img,im,1);                // 以 y 轴做镜像
11   else im = img;
12   return im;
13 }

 

 

  为了通过点名的目来取相应图像的一个点集,可运
get_points 函数由此镜像索引来得到一个因浮点的坐标向量

 1 vector<Point2f>
 2 ft_data::
 3 get_points(const int idx,        // 相应图像的索引
 4        const bool flipped)        // 是否以 y 轴做镜像
 5 {
 6   if((idx < 0) || (idx >= (int)imnames.size()))return vector<Point2f>();
 7   vector<Point2f> p = points[idx];
 8   if(flipped){        // 以 y 轴做镜像
 9     Mat im = this->get_image(idx,0);    // im 用来获取图像的宽度
10     int n = p.size(); vector<Point2f> q(n);
11     for(int i = 0; i < n; i++){            // 沿竖直方向翻转    
12       q[i].x = im.cols-1-p[symmetry[i]].x;
13       q[i].y = p[symmetry[i]].y;
14     }return q;
15   }else return p;
16 }

 

 

  ft_data 类还落实了一个函数
rm_incomplete_samples,该函数删除集合中莫进展对应标注的范本,具体贯彻如下:

 1 void
 2 ft_data::
 3 rm_incomplete_samples()        // 删除集合中没有进行相应标注的样本
 4 {
 5   int n = points[0].size(),N = points.size();
 6   // 找出标注数最多的样本,作为标准样本
 7   for(int i = 1; i < N; i++)n = max(n,int(points[i].size()));    
 8   for(int i = 0; i < int(points.size()); i++){
 9     if(int(points[i].size()) != n){        // 样本标注点的数量小于标准样本标注点数,从样本中删除
10       points.erase(points.begin()+i); imnames.erase(imnames.begin()+i); i--;
11     }else{
12       int j = 0;
13       for(; j < n; j++){
14         // 若点的(x,y)存在小于0,则可认为它在相应的图像中不存在
15         if((points[i][j].x <= 0) || (points[i][j].y <= 0))break;
16       }
17       if(j < n){    // 从样本中删除
18     points.erase(points.begin()+i); imnames.erase(imnames.begin()+i); i--;
19       }
20     }
21   }
22 }

 

 

  ft_data 类还实现了函数 read 和 write 的序列化,这样就得便宜地蕴藏和加载该类。

图片 6图片 7

 1 void 
 2 ft_data::
 3 write(FileStorage &fs) const
 4 {
 5   assert(fs.isOpened()); 
 6   fs << "{";
 7   fs << "n_connections" << (int)connections.size();        // 面部特征的语义解释
 8   for(int i = 0; i < int(connections.size()); i++){
 9     char str[256]; const char* ss;
10     sprintf(str,"connections %d 0",i); ss = str; fs << ss << connections[i][0];
11     sprintf(str,"connections %d 1",i); ss = str; fs << ss << connections[i][1];
12   }
13   fs << "n_symmetry" << (int)symmetry.size();            // 特征点的索引
14   for(int i = 0; i < int(symmetry.size()); i++){
15     char str[256]; const char* ss;
16     sprintf(str,"symmetry %d",i); ss = str; fs << ss << symmetry[i];
17   }
18   fs << "n_images" << (int)imnames.size();                // 图像绝对路径
19   for(int i = 0; i < int(imnames.size()); i++){
20     char str[256]; const char* ss;
21     sprintf(str,"image %d",i); ss = str; fs << ss << imnames[i];
22   }
23   int n = points[0].size(),N = points.size();            // 描述人脸特征点的结构
24   Mat X(2*n,N,CV_32F); X = -1;
25   for(int i = 0; i < N; i++){
26     if(int(points[i].size()) == n){
27       for(int j = 0; j < n; j++){
28     X.at<float>(2*j  ,i) = points[i][j].x;
29     X.at<float>(2*j+1,i) = points[i][j].y;
30       }
31     }
32   }
33   fs << "shapes" << X << "}";
34 }
35 //==============================================================================
36 void
37 ft_data::
38 read(const FileNode& node)
39 {
40   assert(node.type() == FileNode::MAP);
41   int n; node["n_connections"] >> n; connections.resize(n);
42   for(int i = 0; i < n; i++){
43     char str[256]; const char* ss;
44     sprintf(str,"connections %d 0",i); ss = str; node[ss] >> connections[i][0];
45     sprintf(str,"connections %d 1",i); ss = str; node[ss] >> connections[i][1];
46   }
47   node["n_symmetry"] >> n; symmetry.resize(n);
48   for(int i = 0; i < n; i++){
49     char str[256]; const char* ss;
50     sprintf(str,"symmetry %d",i); ss = str; node[ss] >> symmetry[i];
51   }
52   node["n_images"] >> n; imnames.resize(n);
53   for(int i = 0; i < n; i++){
54     char str[256]; const char* ss;
55     sprintf(str,"image %d",i); ss = str; node[ss] >> imnames[i];
56   }
57   Mat X; node["shapes"] >> X; int N = X.cols; n = X.rows/2; 
58   points.resize(N);
59   for(int i = 0; i < N; i++){
60     points[i].clear();
61     for(int j = 0; j < n; j++){
62       Point2f p(X.at<float>(2*j,i),X.at<float>(2*j+1,i));
63       if((p.x >= 0) && (p.y >= 0))points[i].push_back(p);
64     }
65   }
66 }

read write

 

 

 

  为对数据集进行可视化操作,
ft_data 实现了许多用以绘图的函数。

图片 8图片 9

  1 void
  2 ft_data::
  3 draw_points(Mat &im,
  4         const int idx,
  5         const bool flipped,
  6         const Scalar color,
  7         const vector<int> &pts)
  8 {
  9   if((idx < 0) || (idx >= (int)imnames.size()))return;
 10   int n = points[idx].size();
 11   if(pts.size() == 0){
 12     for(int i = 0; i < n; i++){
 13       if(!flipped)circle(im,points[idx][i],1,color,2,CV_AA);
 14       else{
 15     Point2f p(im.cols - 1 - points[idx][symmetry[i]].x,
 16           points[idx][symmetry[i]].y);
 17     circle(im,p,1,color,2,CV_AA);
 18       }
 19     }
 20   }else{
 21     int m = pts.size();
 22     for(int j = 0; j < m; j++){
 23       int i = pts[j]; if((i < 0) || (i >= n))continue;
 24       if(!flipped)circle(im,points[idx][i],1,color,2,CV_AA);
 25       else{
 26     Point2f p(im.cols - 1 - points[idx][symmetry[i]].x,
 27           points[idx][symmetry[i]].y);
 28     circle(im,p,1,color,2,CV_AA);
 29       }
 30     }
 31   }
 32 }
 33 //==============================================================================
 34 void
 35 ft_data::
 36 draw_sym(Mat &im,
 37      const int idx,
 38      const bool flipped,
 39      const vector<int> &pts)
 40 {
 41   if((idx < 0) || (idx >= (int)imnames.size()))return;
 42   int n = points[idx].size();
 43   RNG rn; vector<Scalar> colors(n); 
 44   for(int i = 0; i < n; i++)colors[i] = Scalar::all(0.0);
 45   for(int i = 0; i < n; i++){
 46     if(colors[i] == Scalar::all(0.0)){
 47       colors[i] = Scalar(rn.uniform(0,255),rn.uniform(0,255),rn.uniform(0,255));
 48       colors[symmetry[i]] = colors[i];
 49     }
 50   }
 51   vector<Point2f> p = this->get_points(idx,flipped); 
 52   if(pts.size() == 0){
 53     for(int i = 0; i < n; i++){circle(im,p[i],1,colors[i],2,CV_AA);}
 54   }else{
 55     int m = pts.size();
 56     for(int j = 0; j < m; j++){
 57       int i = pts[j]; if((i < 0) || (i >= n))continue;
 58       circle(im,p[i],1,colors[i],2,CV_AA);
 59     }
 60   }
 61 }
 62 //==============================================================================
 63 void
 64 ft_data::
 65 draw_connect(Mat &im,
 66          const int idx,
 67          const bool flipped,
 68          const Scalar color,
 69          const vector<int> &con)
 70 {
 71   if((idx < 0) || (idx >= (int)imnames.size()))return;
 72   int n = connections.size();
 73   if(con.size() == 0){    
 74     for(int i = 0; i < n; i++){
 75       int j = connections[i][0],k = connections[i][1];
 76       if(!flipped)line(im,points[idx][j],points[idx][k],color,1);
 77       else{
 78     Point2f p(im.cols - 1 - points[idx][symmetry[j]].x,
 79           points[idx][symmetry[j]].y);
 80     Point2f q(im.cols - 1 - points[idx][symmetry[k]].x,
 81           points[idx][symmetry[k]].y);
 82     line(im,p,q,color,1);
 83       }
 84     }
 85   }else{
 86     int m = con.size();
 87     for(int j = 0; j < m; j++){
 88       int i = con[j]; if((i < 0) || (i >= n))continue;
 89       int k = connections[i][0],l = connections[i][1];
 90       if(!flipped)line(im,points[idx][k],points[idx][l],color,1);
 91       else{
 92     Point2f p(im.cols - 1 - points[idx][symmetry[k]].x,
 93           points[idx][symmetry[k]].y);
 94     Point2f q(im.cols - 1 - points[idx][symmetry[l]].x,
 95           points[idx][symmetry[l]].y);
 96     line(im,p,q,color,1);
 97       }
 98     }
 99   }
100 }

绘画图函数

 

 

 

评测说明

  2. 标工具

   为了要生成的标能给本章中之代码用,可每当 annotate.cpp 文件被找到一个中心的标注工具。该工具将一个视屏流作为输入,这个视频流可以来文件要相机、使用该工具的经过发生如下五单步骤:

  • 抓获图像:第一步是将图像流显示在屏幕及,用户按下
    S 键就可选取图像进行标注。

    • 主要代码如下:

       1 //选择图像进行标注
       2 annotation.set_capture_instructions();        // 显示帮助信息
       3 while (cam.get(CV_CAP_PROP_POS_AVI_RATIO) < 0.999999){    // 循环遍历每一帧
       4     Mat im, img; cam >> im; 
       5     annotation.image = im.clone();
       6     annotation.draw_instructions();
       7     imshow(annotation.wname, annotation.image);        // 显示当前帧
       8     int c = waitKey(0);        // 等待按键,q 退出,s 选择图像进行标注,其它任意键 下一帧
       9     if (c == 'q')break;
      10     else if (c == 's'){
      11         int idx = annotation.data.imnames.size(); char str[1024];
      12         if (idx < 10)sprintf(str, "00%d.png", idx);
      13         else if (idx < 100)sprintf(str, "0%d.png",idx);
      14         else               sprintf(str, "%d.png", idx);        // 文件名格式 三位整数.png
      15         imwrite(str, im);        // 保存该帧图像
      16         annotation.data.imnames.push_back(str);
      17         cam >> im;                // 显示下一帧
      18         imshow(annotation.wname, im);
      19     }
      20 }
      21 if (annotation.data.imnames.size() == 0)return 0;
      22 annotation.data.points.resize(annotation.data.imnames.size());
      

       

    • 运作效果: 
                                                                     
                                                                   
         图片 10 
           图片 11

  • 标第一帧图:第二步首先以直达一样步着率先帧图展现给用户,然后用户会于马上幅图被选取用跟的脸特征位置。

    • 重中之重代码如下:

       1 // 标注第一幅图像
       2 setMouseCallback(annotation.wname, pp_MouseCallback, 0);
       3 annotation.set_pick_points_instructions();    // 显示帮助信息
       4 annotation.set_current_image(0);        // 选择第一幅图像
       5 annotation.draw_instructions();
       6 annotation.idx = 0;
       7 while (1){            // 在键入 q 之前,鼠标单击标注特征点
       8     annotation.draw_points();
       9     imshow(annotation.wname, annotation.image); 
      10     if (waitKey(0) == 'q')break;
      11 }
      12 if (annotation.data.points[0].size() == 0)return 0;
      13 annotation.replicate_annotations(0);    // 保存特征点位置信息
      
    • 运转效果(为检验代码,只选取三独特征点):

      
        图片 12

 

  • 号连通性:在马上无异步着,用户需要选择将两组点连接起来,以起人脸模型的连通性结构

    • 重点代码如下:

       1 //标注连通性
       2 setMouseCallback(annotation.wname, pc_MouseCallback, 0);
       3 annotation.set_connectivity_instructions();    // 帮助信息
       4 annotation.set_current_image(0);
       5 annotation.draw_instructions();
       6 annotation.idx = 0;
       7 while (1){            // 在键入 q 之前,鼠标单击一组点建立连接
       8     annotation.draw_connections();
       9     imshow(annotation.wname, annotation.image); if (waitKey(0) == 'q')break;
      10 }
      11 save_ft(fname.c_str(), annotation.data);
      

       

    • 运行效果如下:

      
     图片 13

  •  标注对称性:这等同步还是以上同一步的图像,用户用选出左右针对性如之点。

    • 重在代码如下:

       1 //标注对称性
       2 setMouseCallback(annotation.wname, ps_MouseCallback, 0);
       3 annotation.initialise_symmetry(0);
       4 annotation.set_symmetry_instructions();
       5 annotation.set_current_image(0);
       6 annotation.draw_instructions();
       7 annotation.idx = 0; annotation.pidx = -1;
       8 while (1){            // 在键入 q 之前,鼠标单击特征点标注对称性
       9     annotation.draw_symmetry();
      10     imshow(annotation.wname, annotation.image); if (waitKey(0) == 'q')break;
      11 }
      12 save_ft(fname.c_str(), annotation.data);
      

       

    •  运行效果如下:

      
      图片 14

  •  号剩下的图像:重复第
    2 步到第 4 步,移动特征点使特征点对承诺特征位置

    • 主要代码如下:

       1 //标注剩下的图像
       2 if (type != 2){
       3     setMouseCallback(annotation.wname, mv_MouseCallback, 0);
       4     annotation.set_move_points_instructions();        // 帮助信息
       5     annotation.idx = 1; annotation.pidx = -1;
       6     while (1){
       7         annotation.set_current_image(annotation.idx);
       8         annotation.draw_instructions();
       9         annotation.set_clean_image();        // 背景图
      10         annotation.draw_connections();        // 连线
      11         imshow(annotation.wname, annotation.image);
      12         int c = waitKey(0);        // q 退出,p 下一幅图像,o 上一幅图像
      13         if (c == 'q')break;
      14         else if (c == 'p'){ annotation.idx++; annotation.pidx = -1; }
      15         else if (c == 'o'){ annotation.idx--; annotation.pidx = -1; }
      16         if (annotation.idx < 0)annotation.idx = 0;
      17         if (annotation.idx >= int(annotation.data.imnames.size()))
      18             annotation.idx = annotation.data.imnames.size() - 1;
      19     }
      20 }
      21 save_ft(fname.c_str(), annotation.data);
      

       

    • 运转效果如下:

      
      图片 15

 

  该工具将标数据存储到
ann.yaml 中,如下:

     
                  图片 16

评测目标:同一应用(网站)在不同云上的用户访问体验,以及对出口资源的利用

   3. 备选标注数据( MUCT 数据集)

  为了为本章的标号工作转移得轻松局部,可采取公开之
MUCT 数据集。这个数目集由
3755 张人脸图像构成,每张人脸有76只点作为标志。数据集的图像是在不同光照条件及头颅姿势下摄影的人,他们自不同年龄和种。

  该数量集只包含了标注点,需要打定义连通性和指向称性。标注连通性和针对称性之后效果如下图左,标注数据储存在 annotations.yaml 中,如下图右:

   
 图片 17   
  图片 18

  

  visualize_annotations.cpp 实现对数码集可视化操作,关键代码如下:

图片 19图片 20

 1 cout << "n images: " << data.imnames.size() << endl
 2     << "n points: " << data.symmetry.size() << endl
 3     << "n connections: " << data.connections.size() << endl;
 4 // 可视化标注数据
 5 namedWindow("Annotations");
 6 int index = 0; bool flipped = false;
 7 while(1){
 8 Mat image;
 9 if(flipped)image = data.get_image(index,3);
10 else image = data.get_image(index,2);            // 背景图片
11 data.draw_connect(image,index,flipped);            // 连通
12 data.draw_sym(image,index,flipped);                // 对称
13 imshow("Annotations",image);
14 int c = waitKey(0);            // q 退出,p 下一张,o 上一张,f 翻转
15 if(c == 'q')break;
16 else if(c == 'p')index++;
17 else if(c == 'o')index--;
18 else if(c == 'f')flipped = !flipped;
19 if(index < 0)index = 0;
20 else if(index >= int(data.imnames.size()))index = data.imnames.size()-1;
21 }

可视化数据

  运行效果如下:

     
 图片 21 
  图片 22   
 图片 23

 

 

 

察周期和范围:2017年4月-2017年9月

访问量:6642000PV

评测工具:听云Network、听云Server、听云Sys、压力IO程序、云计算调查问卷

 

开口服务配置

图片 24

 

国内出口服务现状

     
 在为智能时代形成的历程中,云计算,大数目及人造智能等作为最强劲的推动力,正在变成众人在和行事被不可缺失的组成部分。如今大部分口于称计算一词早已有了迟早之摸底,但是摆计算的真正意义相信没有稍微人能说之理解。

     
 据IDC预计,在2020年之前,中国的IaaS市场需求仍然很怪,年复合增长率将生36.6%的升级换代空间。而满讲话计算服务市场用因每年32.2%底快增长,2020年将达成50亿美元以上的市场范围。因此于互联网时代之浪潮中,云计算服务由降生到成熟所花费的年华以见面随地缩水,其市场份额的增速也会越来越快。

     
 随着云计算的热潮在中国起,越来越多的云服务厂商投入到就会“厮杀”中。而于出口的选啊变为了尤其多企业所关切的重要,在时下各家云都发出个别所关心的主要,每一样寒都起独家的优势。而听云的云评测报告就是完善的针对性每家云之各项指标进行了合的测试,在报遭遇显出出了各家云的优势和不足,为商家召开言语之选型提供相应的参考。

 

一言九鼎挑战

     
 AWS、Azure、IBM等也代表的五洲领先的云计算厂商也看了中华即特大的市场需求,相继进入中国开展业务,并因其自丰富的技术实力,在入国内出口服务市场晚火速占领了肯定份额,虽无对阿里云、腾讯云等国内出口服务巨头有实质性的震慑,但是那针对性国内中小型云厂商也带了巨大的挑战。

     
 国内出口计算市场前景上扬之根本趋势在是否以研发、生态系统与商店管理再好之组合。当前境内出口计算服务以处“单打独斗,提供单纯为服务”的号,完整生态模式尚未搭建好。

     
 生态数据安全题材,目前境内出口计算发展速度了快,导致数据安全地方以总体发展及粗发向下。由于都行业都向互联网靠拢,企业无形之数字资产价值逾突出,而眼下国内云服务提供商无法提供完整生态环境,因此怎样当缺乏日内升任自我之平安戒备能力,将改成当下国内云服务提供商急需加强的根本片段。

 

评测方法求证

1.听云云计算调查问卷

     
 通过听云《2017说道计算调查问卷》对计量,存储、网络、弹性伸缩、监控、技术支持与数据服务中共计132起能力对谈服务力量及基础设备开展调研,并冲调查结果对各家云进行一切的估测。

听云云评测调查问卷架构图详见:附表一

 

2.验证式评测

     
 所有出口服务通过k8s进行联合配备监督,每家云之服务器通过运行Wordpress程序并通过听云Network模拟真用户发起持续访问,同时使压力IO程序来对服务器进行加压(具体加压方法也,同一压力IO
程序部署于不同之说话服务遭遇之所以提高服务器CPU压力,不同云服务以运行压力IO程序后所吃CPU比例不同,从而体现出云服务CPU性能差异),最后经听云Server和听云Sys对服务端性能进行评测。

验证式评测架构图详见:附表二

 

评测架构

图片 25

图片 26

 

 

无异于、云计算综合用户体验

     
 自我国进入互联网时代后,互联网行业之腾飞已经日新月异,“快”一直是互联网行业之太追求。而当互联网行业的命门,网络性问题则直是震慑互联网产品发展趋势的重点因素有。而网络问题之多样性、频发性、不重复性导致了每次运维人员全都无法迅速灵地诊断故障原因,从而白白流失故障修复的黄金时间。再长要三良运营商间的纱延迟等国内有意的网性问题,使得国内的网络环境更为特别。而网环境的转变的快,更是我们鞭长莫及预想的。

 

     
 影响网络性表现的指标来首页打开成功率、首页打开时以及首屏时间(图备受之各级地段用户体验得分是依据本次听云评分标准,并出于这三码相加得出),而影响这三单指标的属性因素来DNS时间、建连时间、首包时间、延时暨丢包率。

图片 27

图片 28

 图片 29

     
 从全国地图来拘禁,在全国范围外,山西跟陕西之一体化网络性用户体验表现最理想。其中,以山西地区呢例,经听云测试得出,阿里云以山西地区底首屏时间吧1.21s,首页打开成功率也99.96%,首页打开时啊2.93s;根据听云本次的分值计算规则,故而阿里云以山西地区底大网用户体验得分为28。

       性能指标部分,DNS时间部分,上海地区最缓慢,达到了9.
20ms,而青海地区绝抢,为1.42ms;建并时部分,西藏地区太缓慢,达到了102.24ms,北京地区最抢,为30.32ms;首包时间有,云南地区耗时最为丰富,达到了298.28ms,北京地区耗时最短缺,为234.55ms;延时有,西藏地区延时太老,达到了75ms,北京地区延时最好小,为16ms;丢包率部分,湖北地区丢包率最高,达到了2.17%,江西地区丢包率最低,为0.12%。根据上述指标计算得出每地方各指标的汇总得分情况只要雷达图所示。

 

图片 30

图片 31

     
 从全国地图来拘禁,在举国范围外,宁夏底圆网络性用户体验表现无与伦比了不起。其中,经听云测试得出,AWS在宁夏地区底首屏时间也1.11s,首页打开成功率为99.98%,首页打开时呢1.89s;根据听云本次的分值计算规则,故而AWS在宁夏地区底网络用户体验得分为29。

     
 性能指标部分,DNS时间有些,山西地区无与伦比缓慢,达到了8.60ms,青海地区最好抢,为1.41ms;
建连时部分,西藏地区最缓慢,达到了148.84ms,河北地区顶抢,为25.19ms;首包时间部分,
西藏地区耗时不过丰富,达到了395.11ms,北京地区耗时最好短,为201.97ms;延时有的,西藏地区延时最为要命,达到了76ms,北京地区延时太小,为10ms;丢包率部分,吉林地区丢包率最高,达到了1.65%,陕西及浙江地区丢包率最低,为0.01%。根据上述指标计算得出每地方号指标的归纳得分情况要雷达图所示。

 

图片 32

图片 33

 

     
 从全国地图来拘禁,在举国上下范围外,山西底完好网络性用户体验表现最美妙。其中,经听云测试得出,华为云于山西地区底首屏时间吧1.
17s, 首页打开成功率也99.91%,首页打开时为3.41s;
根据听云本次的分值计算规则,故而华也提于山西地区的纱用户体验得分也27。

     
 性能指标部分,DNS时间有些,山西地区绝缓慢,达到了23.96ms,青海地区太抢,为1.55ms;建并时有些,西藏地区极端缓慢,达到了107.32ms,北京地区最抢,为30.62ms;首包时间部分,福建地区耗时极其丰富,达到了308ms,陕西地区耗时极端短缺,为228.94ms;延时部分,西藏地区延时极度特别,达到了79ms,北京地区延时最为小,为11ms;丢包率部分,黑龙江地区丢包率最高,达到了10.30%,
江西、新疆跟青海地区丢包率最低,为0.41%。根据以上指标计算得出每地段号指标的综合得分情况而雷达图所示。

 

 

图片 34图片 35

     
 从全国地图来拘禁,在举国范围外,山西底一体化网络性用户体验表现无与伦比美妙。其中,经听云测试得出,金山云于山西地区之首屏时间也1.15s,
首页打开成功率也99.94%,首页打开时吗3.46s;根据听云本次的分值计算规则,故而金山云在山西地区底纱用户体验得分为27。

     
 性能指标部分,DNS时间部分,上海地区最缓慢,达到了9.53ms,青海地区最好抢,为1.39ms;建并时部分,贵州地区最缓慢,达到了108.54ms,北京地区最抢,为21.09ms;首包时间有,云南地区耗时最丰富,达到了318.89ms,北京地区耗时极短,为240.11ms;延时片,西藏地区延时太深,达到了72ms,北京地区延时极其小,为9ms;丢包率部分,山东地区丢包率最高,达到了2.45%,新疆地区丢包率最低,为0.20%。根据上述指标计算得出每地方号指标的综合得分情况只要雷达图所示。

流淌:特别说明的凡,评测期间我们随便抽取了金山云在北京1区之机房用于证明评测,属俗扁平网络,此机房以本次报告发布时既不复出售。

 

图片 36

图片 37

     
 从全国地图来拘禁,在全国限制外,山西、安徽跟河南之整网络性用户体验表现极其理想。其中坐河南地区啊例,经听云测试得出,腾讯云于河南地区之首屏时间为1.28s,首页打开成功率也99.95%,首页打开时吗3.67s;根据听云本次的分值计算规则,故使腾讯云在河南地区之网用户体验得分为26。

     
 性能指标部分,DNS时间部分,上海地区最缓慢,达到了10.27ms,青海地区顶抢,为1.57ms;建并时有,西藏地区极缓慢,达到了102.98ms,辽宁地区尽抢,为37.14ms;首包时间有些,广西地区耗时极度丰富,达到了288.77ms,河南地区耗时不过缺,为230.15ms;延时局部,西藏地区延时最好老,达到了75ms,河北及河南地区延时最为小,为21ms;丢包率部分,陕西和贵州地区丢包率最高,达到了1.27%,江西地区丢包率最低,为0.16%。根据以上指标计算得出每地段各指标的归纳得分情况如果雷达图所示。

 

 

图片 38

图片 39

     
 从全国地图来拘禁,在全国限制外,宁夏与青海之完好网络性用户体验表现最精彩。其中因青海地区吗条例,经听云测试得出,UCloud在青海地区之首屏时间吧1.10s,首页打开成功率也100%,首页打开时啊3.42s;根据听云本次的分值计算规则,故而UCloud在青海地区底网络用户体验得分为28。

     
 性能指标部分,DNS时间部分,上海地区最缓慢,达到了9.39ms,青海地区不过抢,为1.36ms;
建连时有,西藏地区无限缓慢,达到了106.25ms,陕西地区无与伦比抢,为38.59ms;首包时间有些,广西地区耗时太丰富,达到了332.95ms,北京地区耗时极其缺少,为258.96ms;延时有些,西藏地区延时极端要命,达到了80ms,北京地区延时极小,为19ms;丢包率部分,云南地区丢包率最高,达到了5.21%,江西地区丢包率最低,为0.13%。根据上述指标计算得出每地段各指标的归纳得分情况要雷达图所示。

 

 

图片 40

图片 41

     
 从全国地图来拘禁,在举国范围外,微软云于宁夏、青海、山西、甘肃、河南同河北的完整网络性用户体验表现最好理想。其中坐河北地区也例,经听云测试得出,微软云在河北地区的首屏时间吗1.13s,首页打开成功率也97.64%,首页打开时吧3.96s;根据听云本次的分值计算规则,故而微软云在河北地区网络用户体验得分为25。

     
 性能指标部分,DNS时间有,山西地区尽缓慢,达到了8.65ms,青海地区绝抢,为1.40ms;建并时有些,贵州地区极其缓慢,达到了107.10ms,山西地区极端抢,为25.91ms;首包时间部分,广西地区耗时极丰富,达到了319.71ms,北京地区耗时太差,为216ms;延时有的,云南地区延时极其要命,达到了73ms,天津地区延时极端小,为8ms;丢包率部分,黑龙江地区丢包率最高,达到了1.29%,四川地区丢包率最低,为0.1%。根据以上指标计算得出每地方各项指标的汇总得分情况如果雷达图所示。

 

 

 

图片 42

图片 43

     
 从全国地图来拘禁,在举国上下范围外,移动称于山东的共同体网络性用户体验表现极其精彩。其中因山东地区吧例,经听云测试得出,移动称于山东地区之首屏时间为1.96s,首页打开成功率也99.82%,首页打开时吗4.76s;根据听云本次的分值计算规则,故而移动称于山东地区底纱用户体验得分也22。

     
 性能指标部分,DNS时间部分,山西地区最为缓慢,达到了12.60ms,新疆地区最抢,为1.65ms;建并时部分,西藏地区顶缓慢,达到了136.89ms,江苏地区极抢,为62.05ms;首包时间有,内蒙古地区耗时最为丰富,达到了417.71ms,海南地区耗时极短,为330.67ms;延时有些,西藏地区延时太要命,达到了97ms,广西跟海南地区延时极其小,为24ms;丢包率部分,北京地区丢包率最高,达到了9.45%,重庆地区丢包率最低,为0.1%。根据以上指标计算得出每地段各指标的综合得分情况而雷达图所示。

 

老二、云计算性能和可用性

     
 “性能为先行、用户也帝”这些名词伴随在走互联网的进化逐步深入人心。云服务相比传统IDC机房,其优势就是是削减资本、方便维护和强可用,而大可用则正是这三者中绝无仅有影响企业营收的严重性元素。并且,云服务可用性的音量,是足以一直当使用过程中感知到的,这同一有,会是所有云服务提供商最为关心的一样局部。

 

     
 分值计算部分,听云有谈得来之等同套评分标准,通过对System-CPU使用率、User-CPU使用率、系统负荷等图被所蕴涵的性能指标进行分值为1-10之分。

图片 44

       阿里云以讲话计算可用性方面,Stolen CPU
usage是它们极充分之优势,经听道详细测评后得出该翔数据,阿里云Stolen CPU
usage为0。相较于即方面的优势,其System-CPU使用率和磁盘IO-写速率是极其紧要的有数单毛病,其针对性许数据System-CPU使用率也45.21%、磁盘IO-写速率为32.18MB/s。根据听云此次的分值计算标准,评分结果如果图上所示。

 

图片 45

       AWS在谈话计算可用性方面,System-CPU使用率、User-CPU使用率以及IO
wait
CPU使用率是它们极其可怜之优势,经听道详细测评后得出该翔数据:分别吗System-CPU使用率为21.64%,User-CPU使用率为7.91%,IO
wait
CPU使用率也0.000009%。相较于当下三面的优势,其磁盘IO-写速率以及磁盘IO读速率是不过根本的星星点点独毛病,其中磁盘IO写速率具体数据吧33.34
MB/s,磁盘IO读速率则为40.75MB/s。根据听云此次的分值计算标准,评分结果如果图上所示。

 

图片 46

       华为叙于说计算可用性方面,Stolen CPU
usage与磁盘IO-写速率是彼最为酷的优势,所对应的详尽数据Stolen CPU
usage为0,磁盘IO-写速率为52.34MB/s。与的相反,系统负荷和System-CPU使用率是那简单个极度可怜的弱项,系统负荷为3.06,System-CPU使用率也41.85%。根据听云此次的分值计算标准,评分结果如图及所示。

 

图片 47

     
 金山云在谈计算可用性方面,数据库响应时间是那尽酷的卖点。此次数据库响应时间指标是由于Select、Insert、Update、Delete和Call这五桩数据库操作时之与和0.2彼此就所查获的结果,金山云的数据库响应时间呢0.21ms,在本次评测云厂商之中处于领先地位。相反,其System-CPU使用率则是该无与伦比弱的相同桩,所指向承诺数据也45.05%。根据听云此次的分值计算标准,评分结果如图及所示。

 

图片 48

       腾讯云在云计算可用性放面,Stolen CPU
usage是其最充分之优势之一,经听道详细测评后,得出Stolen CPU
usage为0;相较于当时地方的优势,System-CPU使用率和IO wait
CPU使用率是彼无与伦比弱的鲜项,其中System-CPU使用率为44.82%,IO wait
CPU使用率0.32%。根据听云此次的分值计算标准,评分结果要图上所示。

 

 

图片 49

       UCloud在提计算可用性方面,系统负荷、数据库响应时间跟Stolen CPU
usage是其极其要命之老三只优势,经听道详细测评后,得出UCloud系统负荷的事无巨细数据吧1.08,数据库响应时间吗0.17ms,Stolen
CPU
usage为0.02%;相较于立有限上面的优势,System-CPU使用率是其极其充分之弱势,其中System-CPU
的详细数据为41.47%。根据听云此次的分值计算标准,评分结果如果图上所示。

 

图片 50

       微软云在说话计算可用性方面,Stolen CPU
usage是绝要命优势,经听道详细测评后,得出微软云的Stolen CPU
usage详细数据为0;同时,其系负荷和磁盘IO-读速率则是微软云的有数高居弱项,其中网负荷的详细数据为2.83,磁盘IO-读速率的详尽数据吧45.91MB/s。根据听云此次的分值计算标准,评分结果如图上所示。

 

图片 51

        移动称于开口计算可用性方面,磁盘IO-读速率和Stolen CPU
usage是彼尽可怜之片远在优势,经听道详细测评后,得出移动云的磁盘IO-读速率详细数据吧97.23MB/s,是此次具有评测云厂商中性能最美的,另外移动云的Stolen
CPU
usage的详尽数据为0;同时,System-CPU使用率是那最为弱的一律件,其详细数据吧43.42%。根据听云此次的分值计算标准,评分结果要图及所示。

 

其三、云计算易用性

     
 以使用者也主导,操作简便、性价比高、功能完善等等,这些不仅限于2C端,2B端也同适用。每个人还于追效率的最大化,都当追求以最好缺乏日外完成最好特别成效的劳作。所以说计算如何体现出自我之优越性,就在同民俗数码主导相比,如何用极少之拼命发挥至极深的机能。同理,在决斗用户之历程被,哪一样方的操作简便,功能实用且覆盖面广,那这无异于正值虽见面怀有再多的用户。

 

     
 易用性评分标准,通过结合听云《2017言计算调查问卷》与自己对叙服务商的莫过于评测结果综合得出,最后换算为百分制,分值范围为0-100。

图片 52

       阿里云于叙计算易用性方面,
监控以及网是其最精的一定量码,其中监控部分,阿里云的警报通知方式、支持第三在监测软件以及由定义服务正常决定高历史命运方面俱位居行业前列。阿里云于实例之中的纱加密、NAT网关、多虚拟NIC等网络有的支撑呢得行业蒙受比高之程度。

 

图片 53

     
 AWS在开口计算易用性方面,监控、弹性伸缩以及台网等都是AWS在易用性方面的优势所当,但是打图中只是看其来积存服务显著滞后于任何服务,
一方面是由于目前用户对于仓储需求项目的不止转变,国内出口计算市场大对此这种状态反馈无就,另一方面是因为新上国内市场,对于国内企业于仓储方的实战需求并无酷清楚,从而致使现在对此仓储服务支撑度于逊色的范围。

 

图片 54

     
 华也道于道计算易用性方面,弹性伸缩是那个表现太美妙的平片段,其对正规实例替换、静态弹性伸缩服务等方面的支持程度较高。其它地方则相比弹性伸缩而言支持程度不够,但是目前来说是居于并发展之号,并无明白的缺陷。

 

图片 55

     
 金山云以讲计算易用性方面,其弹性伸缩是颇具云评测厂商被呈现最好好之,对于约定增加,减少实例池的实例数量、故障实例替换为常规实例的支撑度杀高;但是于仓储方,如为每个对象分配一个或多独首批数据标签、指定某些存储交互的优先级等方面的支持力度尚不够。同时体系化的老数目平台做将凡未来的等同百般趋势,在即时无异趋势下,通过出同样系列包括行业解决方案定制、用户画像分析、优化数据传和迁移等各个详细划分的数据服务,金山云将连续自己之无微不至平衡的向上路径。

 

图片 56

     
 腾讯云在云计算易用性方面,对于易用性服务之支撑表现较为平缓,没有专门突出的优势而呢并未明确的劣势,整体而言对于弹性伸缩、网络及技术支持与劳务者的支撑过于强。同时由报告所含有的提服务提供商整体表现上来拘禁,各家所提供的储存服务能力连没有了与达到市场之急需,可见存储服务具有巨大的发展潜力,以不断数据保护为条例,其意图是于讲话服务有其他故障与问题常常亦可对企业数量及时进行灾备,这是用户以时下同未来特别为难改变的重中之重要求有,因此腾讯云在仓储服务上的随地发力势必以越来越巩固自身以易用性方面的优势。

 

图片 57

     
 UCloud在提计算易用性性方面,对于弹性伸缩和计量实例的支持是它们的少数个优点,以计算实例为条例,其对VM主机故障恢复、实例维护及故障通知以及Windows、Linux系统镜像的支撑等地方抱有好高的支持度;但是相较于其它地方,对于仓储服务的支持程度显而易见不够。

 

图片 58

     
 微软云在提计算易用性方面呈现较平衡,弹性伸缩是表现最精彩的劳动有,对于负载均衡的布置,动态弹性伸缩等方面的劳务支持度于高。但是对于仓储服务之支持力度则远不够,比如不支持SSD混合存储、NFS协议等,总体来说对于仓储方面的服务支撑还有待提高。

 

图片 59

     
 移动称于说话计算易用性方面,其技术支持与劳务点领先于任何评测中之说道厂商,无论是云端还是多少机房,数据安全和灾备能力永远是极度给关注的有数独点,而移动云的技术支持与服务有则是领先于上述任何云服务提供商,这吗只要该平台级异地灾备的力量获得了好的反映,同时巩固并频频上扬就同优势,对于扎实的运动称就当前之事态来说更适用。但是相较于这地方,移动云于数据服务和存储方的支持程度还有待健全。

 

评测指标说明

1.用户体验指标:

首屏时间:浏览器显示第一屏主页面的吃时间。首屏的定义为1024X768像素尺寸为业内。从初始监测开始算时,到IE浏览器页面显示高度上768如素且此区域发生内容显示之后的时。

首页打开时:首页打开时是据,打开一个网页的毕竟吃时间,即由DNS解析开始交浏览器返回就时之工夫。

首页打开成功率:首页打开成功率是凭借成开拓网页次数和总看次数之比值。

DNS时间:通过域名解析服务(DNS),将点名的域名解析成IP地址之消耗时间。

建连时间:IE浏览器与Web服务器建立TCP/IP连接的损耗时间。

首包时间:首包时间是赖浏览器从发送HTTP请求了起,到收到及Web服务器返回的首先单数据包的损耗时间。

延时:延时凡是靠一个报文或分组由一个网络的同样端传送至外一个端所需要的年月。

丢包率:丢包率是恃测试中所遗失数据包数量占所发送数据组的比值。

 

2.云计算性能与可用性指标:

System-CPU使用率:系统实行系统经过占用CPU的比重。

User-CPU使用率:系统执行用户进程所占CPU比例。

Stolen CPU
usage:服务器资源泄漏所占有的CPU比例(此桩指标过大说明服务器出现了资源隔离的题目)。

IO wait CPU使用率:系统以实行io操作时所占据的CPU比例。

数据库响应时间:数据库5栽SQL操作(INSERT、UPDATE、SELECT、DELETE、CALL)的平分响应时间。

磁盘IO-读速率:每秒进行读(I/O)操作的大大小小。

磁盘IO-写速率:每秒进行勾勒(I/O)操作的分寸。

服务器响应时间:应用服务器从接受请求到回响应的日子。

网负荷:系统CPU繁忙程度之量,即产生略进程在待于CPU调度。

 

3.云计算易用性指标:

数据服务:数据服务是负道厂商对数据处理组件支持力的体现。

监察:监控是赖道厂商对用户所挑选服务器运行状况的监控性能。

弹性伸缩:弹性伸缩是凭借道厂商对用户需要跟方针自动调整其弹性计算资源的管理服务。

纱:网络是因称厂商基础设备被的网建设状况。

囤:存储是指称厂商对和储存服务之支撑情况。

测算实例:计算实例是凭称厂商服务器支持情况及其基础设备建设状况。

技术支持与劳务:技术支持与劳务是凭借说厂商对用户所提供的支持及服务水平的景象。

 

注:

1.此次评测中所选运营商网络为(中国移动,中国联通,中国电信,中国铁通,教育网)各运营商所占用比重为同比例。评测中所选择实例均为同样配置主机,系统盘为创建实例时系统活动提供的系统盘(没有单身挂载磁盘)。

2.本告被颇具雷达图中分值越强所占面积逾怪。

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注