当前位置:   article > 正文

人工智能辅助的数据标记方法

智能 分类 数据标签
 
 

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达


1a7ac7b7027c07835f2d778b30aea950.png

本文想与大家分享一下我们在使用人工智能技术自动生成数据标签方面所做的工作。

在我们深入了解我们的方法之前,首先让我们了解一下数据标签是什么。

在机器学习中,数据标记只是识别原始数据(图像、视频、音频文件、文本文件等)的过程,并添加一个或多个有意义且信息丰富的标签以提供上下文,以便机器学习模型可以从中学习和推断。

大多数最先进的机器学习模型高度依赖于大量标记数据的可用性,这是监督任务中必不可少的一步。各种用例都需要数据标签,包括计算机视觉、自然语言处理和语音识别。

传统上,到目前为止,标记数据的这一繁琐而平凡的过程主要是由人类完成的。为了帮助人类从零开始尽可能减少数据标记的工作和努力,我们提出了一种自动化算法解决方案,旨在减少大量手动工作。

在这里,将讨论计算机视觉任务。计算机视觉仅仅是复制人类视觉(人眼视觉)的复杂性和对周围环境的理解。计算机视觉任务包括获取、处理、分析和理解数字图像的方法,以及从现实世界中提取高维数据以产生数字或符号信息的方法,例如以决策的形式。

在计算机视觉领域,有许多不同的任务。将不详细介绍这些任务,例如分类、检测、分割等。但是,下图提供了这些任务的清晰概述和目标,并给出了上下文中对象的示例——“香蕉”。

一个示例上下文-标记数据的需求

2622817500166ae7b0d1e2d52b8aa8d7.png

对于检测对象“香蕉”的监督模型,注释标签被馈送到模型,以便它可以学习香蕉像素的表示,并在上下文中对其进行定位,然后可以使用上下文来推断不可见/新数据。

实例分割任务旨在检测对象,定位这些对象,并提供它们的数量、大小和形状信息。

我们使用这样一种最先进的实例分割模型——“Mask R-CNN”作为我们框架的核心主干,但在这里,我们可以根据其需求和目标使用任何其他网络体系结构。

我们坚持使用mask R-CNN,因为它可以有效地检测图像中的对象,同时为每个对象生成高质量的分段掩码。对于我们检测到的新冠病毒感染的特定测试用例,感染区域的精确位置至关重要,因此像素级检测在这种情况下更合适。

我们的方法

我们工具的管道如下图所示,主要由检测器和跟踪器、自动标签模块和I/O模块组成,用于将机器注释标签输出并保存到磁盘。

步骤1:-目标检测和跟踪以进行像素级分类

8c716d37e2075db1fdb3630e214dfd15.png

一个定制的弱训练mask-RCNN模型用于检测极少数标记实例(<10个样本)的新冠病毒感染。

为了标记感染区域,我们使用VGG图像注释器(VIA)图像注释工具。这是一个简单和独立注释图像,音频和视频的软件。

VIA在web浏览器中运行,不需要任何安装或设置。完整的VIA软件可以放在一个独立的HTML页面中,页面大小小于400KB,在大多数现代web浏览器中作为离线应用程序运行。

VIA是一个完全基于HTML、Javascript和CSS(不依赖于外部库)的开源项目。VIA由Visual Geometry Group(VGG)开发,根据BSD-2条款许可证发布,可用于学术项目和商业应用。

检测器用于获取本地化的掩码、边界框和类。接下来,为了沿着输入视频数据流对多个感染区域进行统一跟踪和标记,我们使用了中心点跟踪算法。下面给出了我们的mask RCNN covid检测器的一个片段。

  1. # 使用MaskRCNN进行对象检测
  2. def MaskRCNNDetection(self, frame, epsilon=None, auto_mask=True):
  3.  '''
  4.  通过掩码来检测帧中的对象
  5.  
  6.  :param frame: BGR格式的图像。
  7.  :type frame: :class:`numpy.ndarray`
  8.  :param None epsilon: 仅用于具有一致性,没有在算法中使用
  9.  :param bool auto_mask: 是否自动掩码
  10.  :return: 返回带有边界框的帧的副本。
  11.  :rtype: :class:`numpy.ndarray`
  12.  '''
  13.  frame_copy = frame.copy()
  14.  result = self._models['mrcnn'].detect([frame_copy])[0]
  15.  N = result['rois'].shape[0]
  16.  if N == 0:
  17.   return frame_copy
  18.  rects = []
  19.  object_info = []
  20.  for i in range(N):
  21.   y1, x1, y2, x2 = result['rois'][i]
  22.   rects.append((x1, y1, x2-x1, y2-y1))
  23.    
  24.  # 保存掩码以删除手动注释工作
  25.  if auto_mask:
  26.   self._autoLabel(frame, rects, result['masks'])
  27.   
  28.  mask = np.where(result['masks'].any(axis=2), 2550)
  29.  mask = mask.astype(np.uint8)
  30.  masked = cv2.bitwise_and(frame_copy, frame_copy, mask=mask)
  31.  # print(frame.shape, mask.shape, masked.shape)
  32.  add_thread = Thread(target=self._addAllFeatures,
  33.        args=(rects, masked, object_info))
  34.  add_thread.start()
  35.  
  36.  object_ids = self._update(rects)
  37.  for i, object_id in enumerate(object_ids):
  38.   object_info[i]['id'] = object_id
  39.   
  40.  for (x, y, w, h), object_id in zip(rects, object_ids):
  41.   # 在输出帧上绘制对象的ID和对象的质心
  42.   centroid = [x + w//2, y + h//2]
  43.   text = f'covidInfectionMaskID-{object_id:03d}'  
  44.   cv2.putText(frame_copy, text, (centroid[0] - 10, centroid[1] - 10),
  45.       cv2.FONT_HERSHEY_SIMPLEX, 0.5, (00255), 2)
  46.    
  47.   # 在感染周围绘制边界框
  48.   cv2.rectangle(frame_copy, (x, y), (x+w, y+h), (02550), 2)
  49.   # cv2.circle(frame_copy, (centroid[0], centroid[1]), 2, (00255), -1)
  50.   
  51.  add_thread.join()
  52.  self._output.append(object_info)
  53.  self._gf = pd.DataFrame(object_info)
  54.  self._gf = self._gf[self._gf_params]
  55.  return frame_copy

步骤2:-逐帧数据标记

来自预训练的检测器模型的推理用于获取边界框的位置,并创建json元数据。

一旦使用Mask RCNN对帧进行分割,就会生成相应的感兴趣区域(ROI)。此外,生成每个ROI的掩码,然后在整个图像帧上进行轮廓检测。然后,从轮廓中提取(x,y)坐标。最后,这些形状、区域和坐标属性逐帧保存到磁盘中。

下面给出了我们的自动标记算法的片段。

  1. def _autoLabel(self, img, rects, masks):
  2.  with open(self._via_export_json, 'r') as fr:
  3.   json_file = json.load(fr)
  4.  regions = []
  5.  N = len(rects)  
  6.  for i in range(N):
  7.   mask = masks[..., i]
  8.   mask = np.where(mask, 2550).astype(np.uint8)
  9.   contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  10.   if len(contours) == 1:
  11.    contour = contours[0].reshape(-12)
  12.    x = list(map(int, contour[:, 0]))
  13.    y = list(map(int, contour[:, 1]))
  14.    regions.append({
  15.     'shape_attributes': {
  16.      'name''polyline',
  17.      'all_points_x': x,
  18.      'all_points_y': y
  19.     },
  20.     'region_attributes': {}
  21.    })
  22.   
  23.  fn = f'covid{self._last_image_count + 1}.png' 
  24.  fp = join(self._auto_mask_dir, fn)
  25.  if cv2.imwrite(fp, img):
  26.   filesize = getsize(fp)
  27.   info = {
  28.    'filename': fn,
  29.    'size': filesize,
  30.    'regions': regions,
  31.    'file_attributes': {}
  32.   }
  33.   json_file[fn+str(filesize)] = info
  34.   self._last_image_count += 1
  35.   
  36.  # 保存数量
  37.  with open(self._last_img_fn, 'w') as fw:
  38.   fw.write(str(self._last_image_count))
  39.   
  40.  # 保存JSON文件
  41.  with open(self._via_export_json, 'w') as fw:
  42.   json.dump(json_file, fw)

示例-新冠病毒-19感染检测和自动标记

我们测试了我们的方法,目的是为新冠病毒感染区域自动生成计算机标签。

机器生成标签和人工标注标签的结果如下所示。可以看出,自动注释引擎生成的合成标签质量相当好,可用于重新训练对象检测模型或生成更多可用于不同任务的注释数据。

6bead75b3d9636a21ad28a16f6af85f6.png

总结

数据标记是一项非常重要的任务,也是有监督学习管道的关键组成部分之一。

这是一项需要大量手动操作的任务。那么,我们就可以让这些平凡的、劳动密集型的、耗时的工作中的大部分由机器自主驱动,从而最大限度地减少人类的大部分任务。

注意:-我们的工具目前处于alpha测试阶段。目前,我们设计的框架基于mask R-CNN和VIA注释格式。

我们还希望将我们的原型推广到包括不同的最先进的检测器,例如YOLO和相应的YOLO兼容注释格式。此外,我们还计划集成COCO注释格式。它值得将所有不同的图像注释集成为我们框架的一部分,同时为设施提供不同的库,即Torch、TensorFlow、Caffe等。

在这里查看github页面https://github.com/ajayarunachalam

好消息!

小白学视觉知识星球

开始面向外开放啦

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/846885
推荐阅读
相关标签