<> problem

In training face dataset MS1M Time , use pytorch Of ImageFolder
Read the original image . Because the face data is small , And the quantity is large , cause GPU The training will be finished soon , however IO But it's slow , So it took the whole training time .

<> resolvent

The root cause of the above problems lies in pytorch You don't have your own data format , image TF Of TFrecorde,mx Of rec And documents caffe use lmdb, They all have their own formats . therefore , We can use the format of other frameworks to read data ,pytorch Let's do the training .

*
Because I don't like to use it myself tf Of TFrecorde( Early learning tf I don't like it at all ),mx Of and torch Very similar ,lmdb Although it can be used independently of the framework , But you need to master it well , Here is only about your own use mx Of rec
<> step

First, the compression problem : stay mxnet Of github Download the source code file , among tools Of img2rec.py That is, the code file given by the official website

The image folder is as follows :
imgs

* id1---->images
* id2---->images
First generate .lst file , This file contains all the paths of the image . Execution code
python img2rec.py train_data imgs --list --recursive --num-thread=10
* train_data by .lst The name of the file
* imgs The path to the folder containing the image
* --list Representation generation .lst file
* --recursive Represents all files in the browse path
* --num-thread Represents multithreading , Be sure to set it , Otherwise, it's the default 1, It will be very slow
And then according to the generated .lst File generation rec file

Execution code
python img2rec train_data images --num-thread=10
* here train_data Still .lst file name
* images For the rec The file name of the
* Two files are generated : images.rec and images.idx, These are the documents we need
The formal code section

* Recommended mxnet Of gluon This packaged module import mxnet as mx from mxnet.gluon.data.vision
import ImageRecordDataset from mxnet.gluon.data import DataLoader import torch
import numpy as np from PIL import Image def load_mx_rec(): data =
ImageRecordDataset('F:/MXnet/train_data.rec') train_loader = DataLoader(data,
batch_size=4, shuffle=False) train_transform = transforms.Compose([transforms.
Resize([int(128 * 128 / 112) , int(128 * 128 / 112)]), transforms.RandomCrop([
128, 128]) , transforms.RandomHorizontalFlip(), transforms.ToTensor()]) for
input, label in iter(train_loader): inputs = input.asnumpy() nB = torch.rand(4,
3, 128, 128) for i in range(4): image = Image.fromarray(inputs[i,:,:,:]) image =
train_transform(image) nB[i,:,:,:] = image labels = label.asnumpy() labels =
torch.from_numpy(labels).long() # load_mx_rec() import mxnet as mx from mxnet.
gluon.data.vision import ImageRecordDataset from mxnet.gluon.data import
DataLoaderimport torch import numpy as np import cv2 def load_mx_rec_2(): data =
ImageRecordDataset('F:/MXnet/train_data.rec') data1 = datasets.ImageFolder(
'F:/MXnet/images') train_loader = DataLoader(data, batch_size=4, shuffle=False)
# train_transform = transforms.Compose([transforms.Resize([int(128 * 128 / 112)
# , int(128 * 128 / 112)]), transforms.RandomCrop([128, 128]) # ,
transforms.RandomHorizontalFlip(), transforms.ToTensor()]) for input, label in
iter(train_loader): inputs = input.asnumpy() nB = torch.rand(4, 3, 128, 128) for
iin range(4): image = cv2.cvtColor(inputs[i,:,:,:], cv2.COLOR_RGB2BGR) size = (
int(128 * 128 / 112), int(128 * 128 / 112)) image = cv2.resize(image, size) x =
np.random.randint(0, int(128*128/112)-128) y = np.random.randint(0, int(128*128/
112)-128) image = image[x:x+128, y:y+128] if random.choice([0,1])>0: cv2.flip(
image, 1, image) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = image.
transpose(3, 1, 2).astype(np.float32) / 255 image[0,:,:] = (image[0,:,:] - 0.5)
/ 0.5 image[1,:,:] = (image[1,:,:] - 0.5) / 0.5 image[2,:,:] = (image[2,:,:] -
0.5) / 0.5 image = torch.from_numpy(image) nB[i,:,:,:] = image labels = label.
asnumpy() labels = torch.from_numpy(labels).long() load_mx_rec_2()
* The above two codes can achieve the function we want
* code 1 In order to use pytorch Of transforms, It's in the middle PIL Format of , If transforms It's complicated , It's not easy to use itself cv2 realization , You can do that
* Recommended code 2, utilize cv2 To replace transforms, More efficient .

Technology