人脸识别原理详解:使用tfrecord集合网络训练所有数据

由于工作繁忙原因,对人脸识别技术原理的连载停了一段时间,从今天开始尝试恢复回来。我们先回想一下前面完成的工作。这几节主要任务就是为神经网络的训练准备足够多的数据,第一步是创建不包含或者包含人脸部分小于30%的图片,我们从人脸图片数据集中的每张图片随机选取一个矩形区域,确定该区域与人脸区域不重合或重合部分少于30%,这部分数据我们成为neg,目的是告诉网络没有人脸的图片是怎样的。

接着再次选取一系列区域,这次确保选取的区域与人脸区域的重合度高于30%但是低于65%,这类数据我们称为part,其目的是训练网络识别部分人脸,由此增强网络对人脸的认知能力。第三部分就是选取一系列矩形区域,确保区域与人脸部分的重合度大于65%,这部分数据称为positive,其目的是让网络学会识别人脸特征。

同时我们还找来数据集“Deep Convolutional Network Cascade for Facial Point Detection”,该数据集包含了众多人脸图片,同时标记了人脸中五个关键点的坐标,这些关键点分别为左右眼睛,鼻子,还有两边嘴角,我们要训练网络在识别图片时能找到这5个关键点所在位置,这样才能有效提高网络对图片中人脸的查询能力。

这一系列数据要输入网络时,读取IO是一个瓶颈。为了提升读取效率,我们需要将这些数据集中起来形成联系的存储块,这样读入内存时效率才能保证,要知道我们需要将几十万张小图片输入给网络,因此IO读写是有效训练神经网络的关键,此次我们采用tensorflow框架下的tfrecord来存储数据,其原理与我们在上一节讲解过的protocol buffer一模一样。

接下来我们要把前面几节获取的相关图片数据,人脸矩形归一化后对应的坐标,人脸五个关键点归一化坐标等,这里总共有将近一百多万条数据需要处理,因此数据的读写非常棘手,首先要做的就是将所有坐标信息从多个文件读取到内存中,代码如下:


def  get_dataset(dir, item): #对应生成的train_pnet_landmark.txt
    print('dir is: ', dir, item)
    dataset_dir = os.path.join(dir, item)
    print('join path: ', os.path.join(dir, item))
    print('dataset dir: ', dataset_dir)
    image_list = open(dataset_dir, 'r')
    dataset = []
    for line in tqdm(image_list.readlines()):
        info = line.strip().split(' ')
        if len(info) < 2:
            print('info err: ', info)

        data_example = {}
        bbox = {}
        data_example['filename'] = info[0]
        data_example['label'] = int(info[1])
        bbox['xmin'] = 0.0  #初始化人脸区域
        bbox['ymin'] = 0.0
        bbox['xmax'] = 0.0
        bbox['ymax'] = 0.0
        bbox['xlefteye'] = 0.0 #初始化10个关键点
        bbox['ylefteye'] = 0.0
        bbox['xrighteye'] = 0.0
        bbox['yrighteye'] = 0.0
        bbox['xnose'] = 0.0
        bbox['ynose'] = 0.0
        bbox['xleftmouth'] = 0.0
        bbox['yleftmouth'] = 0.0
        bbox['xrightmouth'] = 0.0
        bbox['yrightmouth'] = 0.0
        if len(info) == 6: #当前记录只包含人脸区域
            bbox['xmin'] = float(info[2])
            bbox['ymin'] = float(info[3])
            bbox['xmax'] = float(info[4])
            bbox['ymax'] = float(info[5])
        if len(info) == 12:  #当前记录包含了10个人脸关键点
            bbox['xlefteye'] =  float(info[2])#初始化10个关键点
            bbox['ylefteye'] = float(info[3])
            bbox['xrighteye'] = float(info[4])
            bbox['yrighteye'] = float(info[5])
            bbox['xnose'] = float(info[6])
            bbox['ynose'] = float(info[7])
            bbox['xleftmouth'] = float(info[8])
            bbox['yleftmouth'] = float(info[9])
            bbox['xrightmouth'] = float(info[10])
            bbox['yrightmouth'] = float(info[11])
        data_example['bbox'] = bbox
        dataset.append(data_example)
    return dataset

这些信息存储在前面几节我们生成的pos_12.txt,landmark_12_aug.txt等文件中,接下来是把前面截取的图片块数据转换成字符串读取到内存中:

def  process_image(filename):
    try:
      image = cv2.imread(filename)
      #print('image to string')
      image_data = image.tostring()
      #print('finish image to string')
      assert len(image.shape) == 3
      height = image.shape[0]
      width = image.shape[1]
      assert image.shape[2] == 3
      return image_data, height, width
    except Exception as e:
      #print('process image err: ', e, filename)
      return None, None, None

第三部就是将前面两步读取的信息写入到tfrecord数据结构中,该结构会以特定格式存储成文件:

def  _int64_feature(value):
    if not isinstance(value, list):
        value = [value]
    try:
        return tf.train.Feature(int64_list=tf.train.Int64List(value = value))
    except Exception as e:
        print('int64 err: ', e)
def  _float_feature(value):
    if not isinstance(value, list):
        value = [value]
    try:
        return tf.train.Feature(float_list=tf.train.FloatList(value = value))
    except Exception as e:
        print('float err: ', e)
def  _bytes_feature(value):
    if not isinstance(value, list):
        value = [value]
    try:
        return tf.train.Feature(bytes_list = tf.train.BytesList(value = value))
    except Exception as e:
        print('bytes err: ', e)

def  convert_to_example(image_example, image_buffer):
    class_label = image_example['label']
    bbox = image_example['bbox']
    roi = [bbox['xmin'], bbox['ymin'], bbox['xmax'], bbox['ymax']]
    landmark = [bbox['xlefteye'], bbox['ylefteye'], bbox['xrighteye'], bbox['yrighteye'],
                bbox['xnose'], bbox['ynose'], bbox['xleftmouth'],
                bbox['yleftmouth'], bbox['xrightmouth'], 
                bbox['yrightmouth']]
    try:
      example = tf.train.Example(features = tf.train.Features(feature = {
          'image/encoded': _bytes_feature(image_buffer),
          'image/label': _int64_feature(class_label),
          'image/roi': _float_feature(roi),
          'image/landmark': _float_feature(landmark)
      }))
      return example
    except Exception as e:
      print('example err: ',e , image_example)

def  add_to_tfrecord(filename, image_example, tfrecord_writer):
    begin = time.time()
    image_data, height, width = process_image(filename)
    end = time.time() 
   # print('time for process image: ', end-begin, filename)
    if image_data != None:
       # print('convert to example ')
        example = convert_to_example(image_example, image_data)
       # print('after convert to example')
        tfrecord_writer.write(example.SerializeToString())
        print('tfrecord write')

dataset_dir = '/content/drive/MyDrive/my_mtcnn/data'
import tensorflow as tf
def  create_tf_record(size):
    output_dir = os.path.join(dataset_dir, str(size) + "/tf_record")
    if not os.path.exists(output_dir):
        os.mkdir(output_dir)
    if size == 12:
        net = 'PNet'
        tf_filenames = [os.path.join(output_dir, 'train%s_landmark.tfrecord' %(net))]
        items = ['train_pnet_landmark.txt']
    elif size == 24: #以后再考虑余下两只情况
        pass  
    elif  size == 48:
        pass
    if  tf.io.gfile.exists(tf_filenames[0]):
        print("tf record file alreay created")
    for tf_filename, item in zip(tf_filenames, items): #在size=12时看似多于,在后面处理size=24或48时用上
        print('reading daa....')
        dataset = get_dataset(dataset_dir, item)
        tf_filename = tf_filename + '_shuffle'
        random.shuffle(dataset)
        print('transform to tfrecord')
        with tf.io.TFRecordWriter(tf_filename) as tfrecord_writer:
            for image_example in tqdm(dataset):
                filename = image_example['filename']
                try:
                    add_to_tfrecord(filename, image_example, tfrecord_writer)
                except Exception as e:
                    print('tf record exception: ', e)
    print('completing transform..!')
  
create_tf_record(12)

大家注意看上面关于tfrecord结构的代码,也就是下面这段:

  example = tf.train.Example(features = tf.train.Features(feature = {
          'image/encoded': _bytes_feature(image_buffer),
          'image/label': _int64_feature(class_label),
          'image/roi': _float_feature(roi),
          'image/landmark': _float_feature(landmark)
      }))

从这里可以看出tfrecord结构跟json或是python的字典结构很像,它也是以key-value的方式存储,而value则对应byte,float,int等基本数据结构,也就是它特别用于存储二进制数据,上面的代码运行后就可以生成基于tfrecord的二进制文件,该文件会把前面几节我们生成的训练数据集合到一个文件里,在笔者试验过程中发现该过程相当缓慢,笔者使用的是colab和google drive,由于数据琐碎且数量众多,要完成该步骤,笔者预计要10个小时以上,当我完成该步骤的运行后,我会把结果分享给大家以避免读者朋友浪费太多时间在数据预处理上。

已标记关键词 清除标记
<p style="font-size:16px;"> 本课程适合具有一定深度学习基础,希望发展为深度学习之计算机视觉方向的算法工程师和研发人员的同学们。<br /> <br /> 基于深度学习的计算机视觉是目前人工智能最活跃的领域,应用非常广泛,如人脸识别和无人驾驶中的机器视觉等。该领域的发展日新月异,网络模型和算法层出不穷。如何快速入门并达到可以从事研发的高度对新手和中级水平的学生而言面临不少的挑战。精心准备的本课程希望帮助大家尽快掌握基于深度学习的计算机视觉的基本原理、核心算法和当前的领先技术,从而有望成为深度学习之计算机视觉方向的算法工程师和研发人员。<br /> <br /> 本课程系统全面地讲述基于深度学习的计算机视觉技术的原理并进行项目实践。课程涵盖计算机视觉的七大任务,包括图像分类、目标检测、图像分割(语义分割、实例分割、全景分割)、人脸识别、图像描述、图像检索、图像生成(利用生成对抗网络)。本课程注重原理和实践相结合,逐篇深入解读经典和前沿论文70余篇,图文并茂破译算法难点, 使用思维导图梳理技术要点。项目实践使用Keras框架(后端为Tensorflow),学员可快速上手。<br /> <br /> 通过本课程的学习,学员可把握基于深度学习的计算机视觉的技术发展脉络,掌握相关技术原理和算法,有助于开展该领域的研究与开发实战工作。另外,深度学习之计算机视觉方向的知识结构及学习建议请参见本人CSDN博客。<br /> <br /> 本课程提供课程资料的课件PPT(pdf格式)和项目实践代码,方便学员学习和复习。<br /> <br /> 本课程分为上下两部分,其中上部包含课程的前五章(课程介绍、深度学习基础、图像分类、目标检测、图像分割),下部包含课程的后四章(人脸识别、图像描述、图像检索、图像生成)。 </p> <p style="font-size:16px;"> <br /> </p> <p style="font-size:16px;"> <img src="https://img-bss.csdn.net/201902221256508000.gif" alt="" /><img src="https://img-bss.csdn.net/201902221257045928.gif" alt="" /><img src="https://img-bss.csdn.net/201902221257156312.gif" alt="" /><img src="https://img-bss.csdn.net/201902221257252319.gif" alt="" /> </p>
相关推荐
<span style="color:#E53333;"><span style="color:#000000;"> </span></span> <p style="font-size:16px;"> <span style="color:#3A4151;">课程演示环境:Ubuntu </span> </p> <p style="font-size:16px;"> </p><p> <span><span style="color:#0070C0;">需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:人脸口罩佩戴检测》</span></span> </p> <p> <span><span style="color:#0070C0;">课程链接:https://edu.csdn.net/course/detail/29123</span></span>  </p> <p style="font-size:16px;"> <span style="background-color:#FFFFFF;">当前,人脸口罩佩戴检测是急需的应用,而YOLOv4是最新的强悍的目标检测技术。本课程使用</span><strong><span style="color:#C00000;">YOLOv4实现实时的人脸口罩佩戴检测</span></strong><span style="background-color:#FFFFFF;">。课程提供</span><strong><span style="color:#C00000;">超万张已标注人脸口罩数据集</span></strong><span style="background-color:#FFFFFF;">。训练后的YOLOv4可对真实场景下人脸口罩佩戴进行</span><span style="background-color:#FFFFFF;">高精度地</span><span style="background-color:#FFFFFF;">实时检测。</span> </p> <p style="font-size:16px;"> <span style="background-color:#FFFFFF;"><br /></span> </p> <p style="font-size:16px;"> <span><span style="background-color:#FFFFFF;"><span style="font-size:16px;">本课程会讲述本项目超万张人脸口罩数据集的制作方法,包括使用labelImg标注工具标注以及如何使用Python代码对第三方数据集进行修复和清洗。</span><br /></span></span> </p> <p style="font-size:16px;"> <span><span style="background-color:#FFFFFF;"><br /></span></span> </p> <p style="font-size:16px;"> 本课程的YOLOv4使用AlexyAB/darknet,在Ubuntu系统上做项目演示。具体项目过程包括:安装YOLOv4、训练集和测试集自动划分、修改配置文件、训练网络模型、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类分析。  </p> <p style="font-size:16px;"> <br /></p> <p style="font-size:16px;"> <br /></p> <p style="font-size:16px;"> <img src="https://img-bss.csdn.net/202005200601524939.jpg" alt="" /></p> <p style="font-size:16px;"> <strong>YOLOv4人脸口罩佩戴检测效果</strong> </p> <p style="font-size:16px;"> <img src="https://img-bss.csdn.net/202005200603052758.jpg" alt="" /></p> <p style="font-size:16px;"> <br /></p> <span style="color:#000000;"></span>
<p> 需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:原理与源码解析》, </p> <p> 课程链接 https://edu.csdn.net/course/detail/29865 </p> <h3> <span style="color:#3598db;">【为什么要学习这门课】</span> </h3> <p> <span>Linux</span>创始人<span>Linus Torvalds</span>有一句名言:<span>Talk is cheap. Show me the code. </span><strong><span style="color:#ba372a;">冗谈不够,放码过来!</span></strong> </p> <p> <span> </span>代码阅读是从基础到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。 </p> <p> YOLOv4是最近推出的基于深度学习的端到端实时目标检测方法。 </p> <p> YOLOv4的实现darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。 </p> <h3> <span style="color:#3598db;">【课程内容与收获】</span> </h3> <p> 本课程将解析YOLOv4的实现原理和源码,具体内容包括: </p> <p> - YOLOv4目标检测原理<br /> - 神经网络及darknet的C语言实现,尤其是反向传播的梯度求解和误差计算<br /> - 代码阅读工具及方法<br /> - 深度学习计算的利器:BLAS和GEMM<br /> - GPU的CUDA编程方法及在darknet的应用<br /> - YOLOv4的程序流程 </p> <p> - YOLOv4各层及关键技术的源码解析 </p> <p> 本课程将提供注释后的darknet的源码程序文件。 </p> <h3> <strong><span style="color:#3598db;">【相关课程】</span></strong> </h3> <p> 除本课程《YOLOv4目标检测:原理与源码解析》外,本人推出了有关YOLOv4目标检测的系列课程,包括: </p> <p> 《YOLOv4目标检测实战:训练自己的数据集》 </p> <p> 《YOLOv4-tiny目标检测实战:训练自己的数据集》 </p> <p> 《YOLOv4目标检测实战:人脸口罩佩戴检测》<br /> 《YOLOv4目标检测实战:中国交通标志识别》 </p> <p> 建议先学习一门YOLOv4实战课程,对YOLOv4的使用方法了解以后再学习本课程。 </p> <h3> <span style="color:#3598db;">【YOLOv4网络模型架构图】</span> </h3> <p> 下图由白勇老师绘制 </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202006291526195469.jpg" /> </p> <p>   </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202007011518185782.jpg" /> </p>
<p> <span style="font-size:18px;color:#E53333;"><strong><span style="color:#000000;">课程演示环境:Ubuntu</span><br /> <br /> <span style="color:#000000;">需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:训练自己的数据集》,课程链接https://edu.csdn.net/course/detail/28748</span><br /> <br /> YOLOv4</strong></span><span style="font-size:18px;color:#E53333;"><strong>来了!速度和精度双提升!</strong></span> </p> <p> <span style="font-size:16px;"> </span> </p> <p> <span style="font-size:16px;">与</span><span style="font-size:16px;"> YOLOv3 </span><span style="font-size:16px;">相比,新版本的</span><span style="font-size:16px;"> AP(精度) </span><span style="font-size:16px;">和</span><span style="font-size:16px;"> FPS </span><span style="font-size:16px;">(每秒帧率)分别提高了</span><span style="font-size:16px;"> 10% </span><span style="font-size:16px;">和</span><span style="font-size:16px;"> 12%</span><span style="font-size:16px;">。</span><span></span> </p> <p> <span style="font-size:16px;"> </span> </p> <p> <span style="font-size:16px;">YOLO系列是基于深度学习的端到端实时目标检测方法。本课程将手把手地教大家使用</span><span style="font-size:16px;">labelImg</span><span style="font-size:16px;">标注和使用</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。</span><span></span> </p> <p> <span style="font-size:16px;"> </span> </p> <p> <span style="font-size:16px;">本课程的</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">使用</span><span style="font-size:16px;">AlexAB/darknet</span><span style="font-size:16px;">,在</span><span style="font-size:16px;">Ubuntu</span><span style="font-size:16px;">系统上做项目演示。包括:安装</span><span style="font-size:16px;">YOLOv4、</span><span style="font-size:16px;">标注自己的数据集、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计</span><span style="font-size:16px;">(mAP</span><span style="font-size:16px;">计算和画出</span><span style="font-size:16px;">PR</span><span style="font-size:16px;">曲线</span><span style="font-size:16px;">)</span><span style="font-size:16px;">和先验框聚类分析。还将介绍改善</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">目标训练性能的技巧。</span><span></span> </p> <p> <span style="font-size:16px;"> </span> </p> <p> <span style="font-size:16px;">除本课程《</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">目标检测实战:训练自己的数据集》外,本人将推出有关</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">目标检测的系列课程。请持续关注该系列的其它视频课程,包括:</span><span></span> </p> <p> <span style="font-size:16px;">《</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">目标检测实战:人脸口罩佩戴识别》</span><br /> <span style="font-size:16px;">《</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">目标检测实战:中国交通标志识别》</span><br /> <span style="font-size:16px;">《</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">目标检测:原理与源码解析》</span> </p> <p> <br /> </p> <p> <span style="font-size:16px;"><br /> </span> </p> <p> <span style="font-size:16px;"><img src="https://img-bss.csdn.net/202004260858382698.jpg" alt="" /><br /> </span> </p> <p> <span style="font-size:16px;"><br /> </span> </p> <p> <span style="font-size:16px;"><img src="https://img-bss.csdn.net/202004260858535136.jpg" alt="" /><br /> </span> </p> <p> <span style="font-size:16px;"><img src="https://img-bss.csdn.net/202004260859074920.jpg" alt="" /><br /> </span> </p> <p> <span></span> </p> <p> <span></span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值