如何在张量流中加载并保存ssd网络的Widerface数据集?

问题描述:

我想加载并保存ssd(single shot multibox detector)网络的Widerface标签,但是张力很大,但是wider_face_train_bbx_gt太复杂了。如何在张量流中加载并保存ssd网络的Widerface数据集?

如何在张量流中保存ssd网络的标签?

+0

我们可以,但我们需要一些更多的上下文。我可耻承认,我从来没有听说过SSD网络,Widerface数据集或相关标签保存问题。究竟是什么问题? – Drop

+0

ssd是一种卷积网络。你可以在这里看到它:https://arxiv.org/pdf/1512.02325.pdf Widerface是一个很好的人脸检测数据集,它可以在这里找到:http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/ 。 Widerface有一个文本文件注释。我想加载这个数据集,并准备在ssd网络中使用它。我的意思是这个版本的ssd是由Tensorflow实现的:https://github.com/balancap/SSD-Tensorflow – Mosi

+0

你可以像我这样在TensorPack中加载它们:https://gist.github.com/PatWie/ a743d2349f388b27ed3ef783919c3882 运行这个脚本应该会给你带包围盒的图像 – Patwie

要加载数据集,我给你一个解释如何在TensorFlow中使用TensorPack(仅用于数据)来完成此操作。

首先,我们需要包含边界框的zip文件和mat文件。下面的部分主要直接从zip文件和MAT文件

class RawWiderFaceReader(RNGDataFlow): 
    """Read images directly from tar file without unpacking 
    boxes: left, top, width, height 
    """ 
    def __init__(self, matfile, zipfile): 
     super(RawWiderFaceReader, self).__init__() 
     self.matfile = matfile 
     self.zipfile = zipfile 
     self.subset = matfile.split('_')[-1].replace('.mat', '') 
     f = sio.loadmat(matfile) 
     events = [f['event_list'][i][0][0] for i in range(len(f['event_list']))] 
     raw_files = [f['file_list'][i][0] for i in range(len(f['file_list']))] 
     raw_bbx = [f['face_bbx_list'][i][0] for i in range(len(f['face_bbx_list']))] 

     col_files = [] 
     for file, bbx in zip(raw_files, raw_bbx): 
      for filee, bbxe in zip(file, bbx): 
       col_files.append((filee[0][0], bbxe[0])) 

     self.col_files2 = [] 
     for file, bbx in col_files: 
      for ev in events: 
       if file.startswith(ev.replace('--', '_')): 
        self.col_files2.append((str('WIDER_%s/images/' % self.subset + ev + 
              '/' + file + '.jpg').encode('ascii', 'ignore'), bbx)) 
        break 

    def get_data(self): 
     with ZipFile(self.zipfile, 'r') as zip_hnd: 
      for fn, bbx in self.col_files2: 
       buf = zip_hnd.read('%s' % fn) 
       yield [buf, bbx] 

它给你一台发电机get_data()返回JPEG编码的图像和包围盒读取。它的存储方式似乎很复杂,因为它是一个包含由Matlab生成的边界框的文件。 要绘制边界框,你可以使用:

def draw_rect(img, top, left, bottom, right, rgb, margin=1): 
    m = margin 
    r, g, b = rgb 
    img[top:bottom, left - m:left + m, 0] = r 
    img[top:bottom, left - m:left + m, 1] = g 
    img[top:bottom, left - m:left + m, 2] = b 

    img[top:bottom, right - m:right + m, 0] = r 
    img[top:bottom, right - m:right + m, 1] = g 
    img[top:bottom, right - m:right + m, 2] = b 

    img[top - m:top + m, left:right, 0] = r 
    img[top - m:top + m, left:right, 1] = g 
    img[top - m:top + m, left:right, 2] = b 

    img[bottom - m:bottom + m, left:right, 0] = r 
    img[bottom - m:bottom + m, left:right, 1] = g 
    img[bottom - m:bottom + m, left:right, 2] = b 

    return img 

整个脚本是在这里: https://gist.github.com/PatWie/a743d2349f388b27ed3ef783919c3882

pip install -U git+https://github.com/ppwwyyxx/tensorpack.git后,您可以通过

python data_sampler.py --zip /scratch/patwie/data/wider_face/WIDER_val.zip \ 
         --mat wider_face_split/wider_face_val.mat \ 
         --debug 

火起来要将其转换成lmdb-file可以使用其他参数。这里不需要解压缩数据。

使用数据,这就像在脚本:

from tensorpack import * 
ds = LMDBDataPoint('/scratch/wieschol/data/wider_face/WIDER_train.lmdb', shuffle=True) 
ds = RawWiderFaceReader(matfile=args.mat, zipfile=args.zip) 
ds.reset_state() 
for jpeg, bbx in ds.get_data(): 
    rgb = cv2.imdecode(np.asarray(jpeg), cv2.IMREAD_COLOR) 
+0

谢谢。我做了所有这些,但是在你的整个剧本中我有点困惑。我的错在这里? (' - zip','C:/用户/用户/文档/ FirstCode/Datasett/Wider_Face_Imdb')解析器.add_argument(' - lmdb','C:/ Users/User/Documents/FirstCode/Datasett/Wider_Face_Imdb') parser.add_argument第一代码/数据集/ Wider_Face',默认='WIDER_train.zip') parser.add_argument(' - mat','C:/ Users/User/Documents/FirstCode/Datasett/Wider_Face',default ='wide_face_split/wide_face_train。 mat') parser.add_argument(' - debug',action ='store_true',help ='只显示图像')' – Mosi