예제 #1
0
def embedding_generator(gpu_id, q_in, q_out):
    gpuid = gpu_id
    # from IPython import embed; embed()
    mod = get_mod(gpu_id)
    # from torchvision import transforms as trans
    # test_transform = trans.Compose([
    #  trans.ToTensor(),
    #  trans.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
    #  ])
    while True:
        data = q_in.get(block=True)
        if data is None:
            break
        imlist = []
        imnamelist = []
        for impath in data:
            im = cv2.imread(impath).astype(np.float32)
            if preprocess_img:
                im = im - 127.5
                im = im / 128.
            imlist.append(im[:, :, ::-1])  # RGB
            imnamelist.append(impath.replace(args.prefix, ''))
        batch = np.array(imlist).transpose((0, 3, 1, 2))  # RGB

        if not use_torch:
            data = mx.nd.array(batch)
            db = mx.io.DataBatch(data=(data, ))
            # from IPython import embed; embed()
            mod.forward(db, is_train=False)
            embs = mod.get_outputs()[0].asnumpy()
            if flip_test:
                batch = batch[:, :, :, ::-1]
                data = mx.nd.array(batch)
                db = mx.io.DataBatch(data=(data, ))
                mod.forward(db, is_train=False)
                embs += mod.get_outputs()[0].asnumpy()
        else:
            import lz, torch
            # batch = test_transform(batch)
            #           embed()
            batch = batch - 127.5
            batch = batch / 127.5
            dev = torch.device(f'cuda:{gpuid}')
            #             lz.plt_imshow(batch[0])
            #             lz.plt.savefig('/tmp/t.png')
            with torch.no_grad():
                embs = mod.model(lz.to_torch(batch).to(dev)).cpu().numpy()
                if flip_test:
                    embs += mod.model(
                        lz.to_torch(
                            batch[..., ::-1].copy()).to(dev)).cpu().numpy()

        #         for j in range(embs.shape[0]):
        #             embs[j] = embs[j]/np.sqrt(np.sum(embs[j]**2))
        import sklearn, sklearn.preprocessing
        embs = sklearn.preprocessing.normalize(embs)

        q_out.put((embs, imnamelist))
예제 #2
0
def embedding_generator(gpu_id, q_in, q_out):
    if args.use_torch:
        import torch
        print('-->', torch.cuda.device_count(), gpu_id)
        torch.cuda.set_device(gpu_id)
    mod = get_mod(gpu_id)

    while True:
        data = q_in.get(block=True)
        if data is None:
            break
        imlist = []
        imnamelist = []
        for impath in data:
            assert os.path.exists(impath), impath
            im = cv2.imread(impath).astype(np.float32)
            if preprocess_img:
                im = im - 127.5
                im = im / 128.
            imlist.append(im[:, :, ::-1])  #RGB
            imnamelist.append(impath.replace(args.prefix, ''))
        batch = np.array(imlist).transpose((0, 3, 1, 2))  #RGB

        if not args.use_torch:
            import mxnet as mx
            from mxnet import ndarray as nd
            data = mx.nd.array(batch)
            db = mx.io.DataBatch(data=(data, ))
            mod.forward(db, is_train=False)
            embs = mod.get_outputs()[0].asnumpy()
            if flip_test:
                batch = batch[:, :, :, ::-1]
                data = mx.nd.array(batch)
                db = mx.io.DataBatch(data=(data, ))
                mod.forward(db, is_train=False)
                embs += mod.get_outputs()[0].asnumpy()
        else:
            import lz, torch
            #batch = test_transform(batch)
            batch = batch - 127.5
            batch = batch / 127.5
            dev = torch.device(f'cuda:{gpu_id}')
            #             lz.plt_imshow(batch[0])
            #             lz.plt.savefig('/tmp/t.png')
            with torch.no_grad():
                embs = mod.model(lz.to_torch(batch).to(dev)).cpu().numpy()
                if flip_test:
                    embs += mod.model(
                        lz.to_torch(
                            batch[..., ::-1].copy()).to(dev)).cpu().numpy()


#         for j in range(embs.shape[0]):
#             embs[j] = embs[j]/np.sqrt(np.sum(embs[j]**2))
        import sklearn, sklearn.preprocessing
        embs = sklearn.preprocessing.normalize(embs)
        # from IPython import embed; embed()
        q_out.put((embs, imnamelist))
예제 #3
0
def main(args):
    os.environ["CUDA_VISIBLE_DEVICES"] = str(args.gpu_num)
    batch_size = args.batch_size
    print('#####', args.model, args.output_root)
    gpuid = 0
    import torch, torch.utils.data

    model_prefix, epoch = args.model.split(',')
    sys.path.insert(0, args.code)
    from config import conf
    conf.need_log = False
    from Learner import face_learner, FaceInfer
    learner = FaceInfer(conf, (gpuid, ))
    learner.load_state(resume_path=model_prefix, )
    learner.model.eval()

    loader = torch.utils.data.DataLoader(TestDataset(args),
                                         batch_size=batch_size,
                                         num_workers=12,
                                         shuffle=False,
                                         pin_memory=True,
                                         drop_last=False)
    bin_filename = os.path.join(
        args.images_list.split('/')[-2],
        args.images_list.split('/')[-1].split('.')[0] + '.bin')
    if args.use_torch:
        model_name = model_prefix.strip('/').split('/')[-2]
    else:
        model_name = os.path.basename(model_prefix)
    if args.model_name is not None:
        model_name = args.model_name
    dump_path = os.path.join(args.output_root, model_name, bin_filename)
    print('###### features will be dumped to:%s' % dump_path)
    dirname = os.path.dirname(dump_path)
    if not os.path.exists(dirname):
        os.makedirs(dirname)
    dump = open(dump_path, 'wb')

    for batch in loader:
        import lz, torch
        dev = torch.device(f'cuda:{gpuid}')
        batch = batch - 127.5
        batch = batch / 127.5
        with torch.no_grad():
            embs = learner.model(lz.to_torch(batch).to(dev)).cpu().numpy()
            if flip_test:
                embs += learner.model(
                    lz.to_torch(
                        batch[..., ::-1].copy()).to(dev)).cpu().numpy()
        # from IPython import embed;  embed()
        embs = sklearn.preprocessing.normalize(embs)

        for k in range(embs.shape[0]):
            dump.write(embs[k].astype(np.float32))
            dump.flush()
    dump.flush()
    dump.close()
예제 #4
0
 def __getitem__(self, item):
     img_index = item
     each_line = files[img_index]
     name_lmk_score = each_line.strip().split(' ')
     faceness_score = float(name_lmk_score[-1])
     if self.env is None:
         img_name = os.path.join(img_path, name_lmk_score[0])
         img = cvb.read_img(img_name)
         img = cvb.bgr2rgb(img)  # this is RGB
     else:
         with self.env.begin(write=False) as txn:
             imgbuf = txn.get(str(item).encode())
         buf = six.BytesIO()
         buf.write(imgbuf)
         buf.seek(0)
         f = Image.open(buf)
         img2 = f.convert('RGB')
         img2 = np.asarray(img2)
         img = img2
     assert img is not None, img_name
     lmk = np.array([float(x) for x in name_lmk_score[1:-1]],
                    dtype=np.float32)
     lmk = lmk.reshape((5, 2))
     warp_img = preprocess(img, landmark=lmk)
     # cvb.write_img(warp_img, f'/share/data/aligned/{name_lmk_score[0]}', )
     warp_img = to_image(warp_img)
     if not use_mxnet:
         img = self.test_transform(warp_img)
     else:
         img = np.array(np.transpose(warp_img, (2, 0, 1)))
         img = lz.to_torch(img).float()
     return img, faceness_score, item, name_lmk_score[0]
예제 #5
0
def get_feature(imgs, nets):
    count = len(imgs)
    if not use_mxnet:
        data = torch.zeros((count * 2, 3, imgs[0].shape[0], imgs[0].shape[1]))
        for idx, img in enumerate(imgs):
            img = img[:, :, ::-1].copy()  # to rgb
            img = test_transform(img).numpy()
            for flipid in [0, 1]:
                _img = np.copy(img)
                if flipid == 1:
                    _img = _img[:, :, ::-1].copy()
                _img = lz.to_torch(_img)
                data[count * flipid + idx] = _img
        F = []
        for net in nets:
            with torch.no_grad():
                x = net.model(data).cpu().numpy()
                embedding = x[0:count, :] + x[count:, :]
                embedding = sklearn.preprocessing.normalize(embedding)
                F.append(embedding)
        F = np.concatenate(F, axis=1)
        F = sklearn.preprocessing.normalize(F)
    else:
        data = mx.nd.zeros(shape=(count * 2, 3, imgs[0].shape[0],
                                  imgs[0].shape[1]))
        for idx, img in enumerate(imgs):
            img = img[:, :, ::-1]  # to rgb
            img = np.transpose(img, (2, 0, 1))
            for flipid in [0, 1]:
                _img = np.copy(img)
                if flipid == 1:
                    _img = _img[:, :, ::-1]
                _img = nd.array(_img)
                data[count * flipid + idx] = _img

        F = []
        for net in nets:
            db = mx.io.DataBatch(data=(data, ))
            net.model.forward(db, is_train=False)
            x = net.model.get_outputs()[0].asnumpy()
            embedding = x[0:count, :] + x[count:, :]
            embedding = sklearn.preprocessing.normalize(embedding)
            # print('emb', embedding.shape)
            F.append(embedding)
        F = np.concatenate(F, axis=1)
        F = sklearn.preprocessing.normalize(F)
        # print('F', F.shape)
    return F
예제 #6
0
def main(args):
    os.environ["CUDA_VISIBLE_DEVICES"] = str(args.gpu_num)
    batch_size = args.batch_size

    print('#####', args.model, args.output_root)
    config = tf.ConfigProto()
    config.gpu_options.allow_growth = True
    sess = tf.Session(config=config)
    for_test = np.array(['1231', '213213'], dtype='str')
    test_ims = tf.placeholder(for_test.dtype, [None])

    def input_parser2(filename):
        image_string = tf.read_file(filename)
        image_decoded = tf.image.decode_jpeg(image_string,
                                             dct_method="INTEGER_ACCURATE")
        image = tf.cast(image_decoded, tf.float32)
        image = tf.transpose(image, perm=[2, 0, 1])
        if preprocess_img:
            image = image - 127.5
            image = image / 128.
        return image

    test_data = tf.data.Dataset.from_tensor_slices((test_ims))
    test_data = test_data.map(input_parser2, num_parallel_calls=48)
    test_data = test_data.prefetch(batch_size * 100)
    test_data = test_data.batch(batch_size)
    iterator2 = test_data.make_initializable_iterator()
    next_element2 = iterator2.get_next()
    sess.run(iterator2.initializer, feed_dict={test_ims: for_test})
    if not args.use_torch:
        gpuid = 0
        ctx = mx.gpu(gpuid)
        net = edict()
        net.ctx = ctx
        model_prefix, epoch = args.model.split(',')
        epoch = int(epoch)
        print('loading %s %d' % (model_prefix, epoch))
        net.sym, net.arg_params, net.aux_params = mx.model.load_checkpoint(
            model_prefix, epoch)
        net.sym = net.sym.get_internals()['fc1_output']
        net.model = mx.mod.Module(symbol=net.sym,
                                  context=net.ctx,
                                  label_names=None)
        net.model.bind(for_training=False,
                       data_shapes=[('data', (batch_size, 3, 112, 112))])
        net.model.set_params(net.arg_params, net.aux_params)
    else:
        model_prefix, epoch = args.model.split(',')
        sys.path.insert(0, os.environ['HOME'] + '/prj/InsightFace_Pytorch/')
        from config import conf
        gpuid = 0
        conf.ipabn = False
        conf.need_log = False
        from Learner import face_learner, FaceInfer
        learner = FaceInfer(conf, gpuid)
        learner.load_state(resume_path=model_prefix, )

    #     data = mx.nd.array(np.random.normal(size=(batch_size,3,112,112)))
    #     db = mx.io.DataBatch(data=(data,))
    #     net.model.forward(db, is_train=False)

    spisok = open(args.images_list).read().split('\n')[:-1]
    for i in range(len(spisok)):
        spisok[i] = args.prefix + spisok[i].split(' ')[0]

    for_test = np.array(spisok, dtype='str')
    sess.run(iterator2.initializer, feed_dict={test_ims: for_test})
    bin_filename = os.path.join(
        args.images_list.split('/')[-2],
        args.images_list.split('/')[-1].split('.')[0] + '.bin')
    #     embed()
    if args.use_torch:
        model_name = model_prefix.strip('/').split('/')[-2]
    else:
        model_name = os.path.basename(model_prefix)
    dump_path = os.path.join(args.output_root, model_name, bin_filename)
    print('###### features will be dumped to:%s' % dump_path)
    dirname = os.path.dirname(dump_path)
    if not os.path.exists(dirname):
        os.makedirs(dirname)
    dump = open(dump_path, 'wb')

    for i in tqdm(range(int(np.ceil(len(spisok) / float(batch_size))))):
        batch = sess.run(next_element2)
        data = mx.nd.array(batch)

        # im = np.transpose(batch[0],(1,2,0))
        # cv2.imshow('x',im.astype(np.uint8))
        # cv2.waitKey(0)
        db = mx.io.DataBatch(data=(data, ))

        if not args.use_torch:
            net.model.forward(db, is_train=False)
            embs = net.model.get_outputs()[0].asnumpy()

            if flip_test:
                batch = batch[:, :, :, ::-1]
                data = mx.nd.array(batch)
                db = mx.io.DataBatch(data=(data, ))
                net.model.forward(db, is_train=False)
                embs += net.model.get_outputs()[0].asnumpy()
        else:
            import lz, torch
            dev = torch.device(f'cuda:{gpuid}')
            # batch = test_transform(batch)
            # from IPython import embed; embed()
            batch = batch - 127.5
            batch = batch / 127.5
            with torch.no_grad():
                embs = learner.model(lz.to_torch(batch).to(dev)).cpu().numpy()
                if flip_test:
                    embs += learner.model(
                        lz.to_torch(
                            batch[..., ::-1].copy()).to(dev)).cpu().numpy()

        embs = sklearn.preprocessing.normalize(embs)

        for k in range(embs.shape[0]):
            dump.write(embs[k].astype(np.float32))

    dump.close()