deepfashion2 數據集位置與目錄
├── DeepFashion2
│ └── train
│ ├── annos
│ └── image
下載 Detectron2 環境
docker run --gpus all -d \
-it \
-e DISPLAY \
-e QT_X11_NO_MITSHM=1 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v $HOME/.Xauthority:/root/.Xauthority \
-v /home/ubuntu/dataset/:/app/detectron2_repo/datasets/data \
--name Detectron2-deepfashion2 \
--restart=always \
--shm-size="1g" \
raidavid/detectron2:base
注意掛載目錄對應上面 deepfashion2 實際路徑
轉換為 COCO 格式
使用 deepfashion2 提供的轉換工具 將格式轉換為 coco
from PIL import Image
import numpy as np
import json
dataset = {
"info": {},
"licenses": [],
"images": [],
"annotations": [],
"categories": []
}
lst_name = ['short_sleeved_shirt', 'long_sleeved_shirt', 'short_sleeved_outwear', 'long_sleeved_outwear',
'vest', 'sling', 'shorts', 'trousers', 'skirt', 'short_sleeved_dress',
'long_sleeved_dress', 'vest_dress', 'sling_dress']
for idx, e in enumerate(lst_name):
dataset['categories'].append({
'id': idx + 1,
'name': e,
'supercategory': "clothes",
'keypoints': ['%i' % (i) for i in range(1, 295)],
'skeleton': []
})
num_images = 32153 #191961
sub_index = 0 # the index of ground truth instance
for num in range(1, num_images + 1):
json_name = '/app/detectron2_repo/datasets/data/DeepFashion2/train/annos/' + str(num).zfill(6) + '.json'
image_name = '/app/detectron2_repo/datasets/data/DeepFashion2/train/image/' + str(num).zfill(6) + '.jpg'
if (num >= 0):
imag = Image.open(image_name)
width, height = imag.size
with open(json_name, 'r') as f:
temp = json.loads(f.read())
pair_id = temp['pair_id']
dataset['images'].append({
'coco_url': '',
'date_captured': '',
'file_name': str(num).zfill(6) + '.jpg',
'flickr_url': '',
'id': num,
'license': 0,
'width': width,
'height': height
})
for i in temp:
if i == 'source' or i == 'pair_id':
continue
else:
points = np.zeros(294 * 3)
sub_index = sub_index + 1
box = temp[i]['bounding_box']
w = box[2] - box[0]
h = box[3] - box[1]
x_1 = box[0]
y_1 = box[1]
bbox = [x_1, y_1, w, h]
cat = temp[i]['category_id']
style = temp[i]['style']
seg = temp[i]['segmentation']
landmarks = temp[i]['landmarks']
points_x = landmarks[0::3]
points_y = landmarks[1::3]
points_v = landmarks[2::3]
points_x = np.array(points_x)
points_y = np.array(points_y)
points_v = np.array(points_v)
case = [0, 25, 58, 89, 128, 143, 158, 168, 182, 190, 219, 256, 275, 294]
idx_i, idx_j = case[cat - 1], case[cat]
for n in range(idx_i, idx_j):
points[3 * n] = points_x[n - idx_i]
points[3 * n + 1] = points_y[n - idx_i]
points[3 * n + 2] = points_v[n - idx_i]
num_points = len(np.where(points_v > 0)[0])
dataset['annotations'].append({
'area': w * h,
'bbox': bbox,
'category_id': cat,
'id': sub_index,
'pair_id': pair_id,
'image_id': num,
'iscrowd': 0,
'style': style,
'num_keypoints': num_points,
'keypoints': points.tolist(),
'segmentation': seg,
})
json_name = '/app/detectron2_repo/datasets/data/deepfashion2_validation.json'
with open(json_name, 'w') as f:
json.dump(dataset, f)
訓練模型
建立 train.py
# Setup detectron2 logger
import detectron2
from detectron2.utils.logger import setup_logger
setup_logger()
# import some common libraries
import os
import numpy as np
import cv2
import random
# import some common detectron2 utilities
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.engine import DefaultTrainer
from detectron2.config import get_cfg
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog
from detectron2.data.datasets import register_coco_instances
#register_coco_instances("deepfashion_train", {}, "/content/DeepFashion2/deepfashion2_train.json", "/content/DeepFashion2/train/image")
register_coco_instances("deepfashion_val", {}, "/app/detectron2_repo/datasets/data/deepfashion2_validation.json", "/app/detectron2_repo/datasets/data/DeepFashion2/train/image/")
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml"))
cfg.DATASETS.TRAIN = ("deepfashion_val",)
cfg.DATASETS.TEST = ()
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml") # Let training initialize from model zoo
cfg.SOLVER.IMS_PER_BATCH = 4
cfg.SOLVER.BASE_LR = 0.001
cfg.SOLVER.WARMUP_ITERS = 1000
cfg.SOLVER.MAX_ITER = 1500
# cfg.SOLVER.STEPS = (1000, 1500)
cfg.SOLVER.STEPS = []
cfg.SOLVER.GAMMA = 0.05
cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 64
cfg.MODEL.ROI_HEADS.NUM_CLASSES = 13
cfg.TEST.EVAL_PERIOD = 500
os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)
trainer = DefaultTrainer(cfg)
trainer.resume_or_load(resume=False)
trainer.train()
觀看訓練狀況
tensorboard --logdir output
