物體檢測-Faster R-CNN(1)
物體檢測-Faster R-CNN
物體檢測是計算機視覺中的一個重要的研究領域,在人流檢測,行人跟蹤,自動駕駛,醫學影像等領域有著廣泛的應用。不同于簡單的圖像分類,物體檢測旨在對圖像中的目標進行精確識別,包括物體的位置和分類,因此能夠應用于更多高層視覺處理的場景。例如在自動駕駛領域,需要辨識攝像頭拍攝的圖像中的車輛、行人、交通指示牌及其位置,以便進一步根據這些數據決定駕駛策略。上一期學習案例中,我們聚焦于YOLO算法,YOLO(You Only Look Once)是一種one-stage物體檢測算法,在本期案例中,我們介紹一種two-stage算法——Faster R-CNN,將目標區域檢測和類別識別分為兩個任務進行物體檢測。
點擊跳轉至Faster-RCNN模型簡介
進入環境
進入ModelArts
點擊如下鏈接:https://www.huaweicloud.com/product/modelarts.html?, 進入ModelArts主頁。點擊“立即使用”按鈕,輸入用戶名和密碼登錄,進入ModelArts使用頁面
創建ModelArts notebook
下面,我們在ModelArts中創建一個notebook開發環境,ModelArts notebook提供網頁版的Python開發環境,可以方便的編寫、運行代碼,并查看運行結果。
第一步:在ModelArts服務主界面依次點擊“開發環境”、“創建”
第二步:填寫notebook所需的參數:
第三步:配置好notebook參數后,點擊下一步,進入notebook信息預覽。確認無誤后,點擊“立即創建“
第四步:創建完成后,返回開發環境主界面,等待Notebook創建完畢后,打開Notebook,進行下一步操作
在ModelArts中創建開發環境
接下來,我們創建一個實際的開發環境,用于后續的實驗步驟。
第一步:點擊下圖所示的“打開”按鈕,進入剛剛創建的Notebook,
第二步:創建一個Python3環境的的Notebook。點擊右上角的\"New\",然后選擇Pytorch-1.0.0開發環境。
第三步:點擊左上方的文件名\"Untitled\",并輸入一個與本實驗相關的名稱,
在Notebook中編寫并執行代碼
在Notebook中,我們輸入一個簡單的打印語句,然后點擊上方的運行按鈕,可以查看語句執行的結果:",
開發環境準備好啦,接下來可以愉快地寫代碼啦!"
數據準備
首先,我們將需要的代碼和數據下載到Notebook。
本案例我們使用PASCAL VOC 2007數據集訓練模型,共20個類別的物體。
In?[1]:
import os from modelarts.session import Session sess = Session() if sess.region_name == 'cn-north-1': bucket_path="modelarts-labs/notebook/DL_object_detection_faster/fasterrcnn.tar.gz" elif sess.region_name == 'cn-north-4': bucket_path="modelarts-labs-bj4/notebook/DL_object_detection_faster/fasterrcnn.tar.gz" else: print("請更換地區到北京一或北京四") if not os.path.exists('./experiments'): sess.download_data(bucket_path=bucket_path, path="./fasterrcnn.tar.gz") if os.path.exists('./fasterrcnn.tar.gz'): # 解壓壓縮包 os.system("tar -xf ./fasterrcnn.tar.gz") # 清理壓縮包 os.system("rm -r ./fasterrcnn.tar.gz")
安裝依賴并引用
In?[2]:
!pip install pycocotools==2.0.0 !pip install torchvision==0.4.0 !pip install protobuf==3.9.0
Collecting pycocotools==2.0.0 Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/96/84/9a07b1095fd8555ba3f3d519517c8743c2554a245f9476e5e39869f948d2/pycocotools-2.0.0.tar.gz (1.5MB) 100% |████████████████████████████████| 1.5MB 54.9MB/s eta 0:00:01 Building wheels for collected packages: pycocotools Running setup.py bdist_wheel for pycocotools ... done Stored in directory: /home/ma-user/.cache/pip/wheels/94/39/5f/52a87f45927330522a105995b30ee880c64da963c6d879c819 Successfully built pycocotools Installing collected packages: pycocotools Successfully installed pycocotools-2.0.0 You are using pip version 9.0.1, however version 20.0.2 is available. You should consider upgrading via the 'pip install --upgrade pip' command. Collecting torchvision==0.4.0 Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/06/e6/a564eba563f7ff53aa7318ff6aaa5bd8385cbda39ed55ba471e95af27d19/torchvision-0.4.0-cp36-cp36m-manylinux1_x86_64.whl (8.8MB) 100% |████████████████████████████████| 8.8MB 90.7MB/s eta 0:00:01 | 2.7MB 80.7MB/s eta 0:00:01 Requirement already satisfied: numpy in /home/ma-user/anaconda3/envs/Pytorch-1.0.0/lib/python3.6/site-packages (from torchvision==0.4.0) Requirement already satisfied: six in /home/ma-user/anaconda3/envs/Pytorch-1.0.0/lib/python3.6/site-packages (from torchvision==0.4.0) Requirement already satisfied: pillow>=4.1.1 in /home/ma-user/anaconda3/envs/Pytorch-1.0.0/lib/python3.6/site-packages (from torchvision==0.4.0) Collecting torch==1.2.0 (from torchvision==0.4.0) Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/30/57/d5cceb0799c06733eefce80c395459f28970ebb9e896846ce96ab579a3f1/torch-1.2.0-cp36-cp36m-manylinux1_x86_64.whl (748.8MB) 89% |████████████████████████████▋ | 669.3MB 108.2MB/s eta 0:00:01 100% |████████████████████████████████| 748.9MB 58.2MB/s ta 0:00:011% |████████████████████████████▊ | 673.3MB 86.1MB/s eta 0:00:01 0:00:02 90% |█████████████████████████████ | 680.3MB 57.0MB/s eta 0:00:02█████▏ | 682.4MB 86.9MB/s eta 0:00:01?██████▎ | 684.7MB 104.6MB/s eta 0:00:01█████▍ | 686.5MB 79.7MB/s eta 0:00:01??█████▌ | 689.1MB 92.9MB/s eta 0:00:01.1MB 82.5MB/s eta 0:00:01█████▋ | 693.3MB 91.1MB/s eta 0:00:01█████▉ | 697.9MB 51.3MB/s eta 0:00:01.3MB 73.7MB/s eta 0:00:013.2MB 101.2MB/s eta 0:00:01??███████████████████████████▏ | 705.9MB 43.8MB/s eta 0:00:01?████████▎ | 708.1MB 108.8MB/s eta 0:00:01████████▍ | 711.7MB 104.5MB/s eta 0:00:01.0MB/s eta 0:00:01████████████████████████████▋ | 715.4MB 105.9MB/s eta 0:00:01?████████████████████████████▊ | 719.5MB 96.1MB/s eta 0:00:01███████▉ | 721.7MB 62.6MB/s eta 0:00:01?██████████████████████████ | 723.9MB 33.8MB/s eta 0:00:01?████████ | 726.3MB 84.3MB/s eta 0:00:01??█████████████████▏| 729.0MB 86.4MB/s eta 0:00:01?| 736.4MB 85.2MB/s eta 0:00:01?█████████████████▋| 738.7MB 100.0MB/s eta 0:00:01??████▊| 741.2MB 106.9MB/s eta 0:00:01?████▊| 743.6MB 110.3MB/s eta 0:00:01??██████████████████▉| 746.1MB 105.4MB/s eta 0:00:01████| 748.7MB 69.5MB/s eta 0:00:01 Installing collected packages: torch, torchvision Found existing installation: torch 1.0.0 Uninstalling torch-1.0.0: Successfully uninstalled torch-1.0.0 Found existing installation: torchvision 0.2.1 Uninstalling torchvision-0.2.1: Successfully uninstalled torchvision-0.2.1 Successfully installed torch-1.2.0 torchvision-0.4.0 You are using pip version 9.0.1, however version 20.0.2 is available. You should consider upgrading via the 'pip install --upgrade pip' command. Collecting protobuf==3.9.0 Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/dc/0e/e7cdff89745986c984ba58e6ff6541bc5c388dd9ab9d7d312b3b1532584a/protobuf-3.9.0-cp36-cp36m-manylinux1_x86_64.whl (1.2MB) 100% |████████████████████████████████| 1.2MB 65.7MB/s eta 0:00:01 Requirement already satisfied: six>=1.9 in /home/ma-user/anaconda3/envs/Pytorch-1.0.0/lib/python3.6/site-packages (from protobuf==3.9.0) Requirement already satisfied: setuptools in /home/ma-user/anaconda3/envs/Pytorch-1.0.0/lib/python3.6/site-packages (from protobuf==3.9.0) Installing collected packages: protobuf Found existing installation: protobuf 3.5.1 Uninstalling protobuf-3.5.1: Successfully uninstalled protobuf-3.5.1 Successfully installed protobuf-3.9.0 You are using pip version 9.0.1, however version 20.0.2 is available. You should consider upgrading via the 'pip install --upgrade pip' command.
In?[3]:
import tools._init_paths %matplotlib inline from __future__ import absolute_import from __future__ import division from __future__ import print_function import tensorboardX as tb from datasets.factory import get_imdb from model.train_val import get_training_roidb, train_net from model.config import cfg, cfg_from_file, cfg_from_list, get_output_dir, get_output_tb_dir
In?[4]:
import roi_data_layer.roidb as rdl_roidb from roi_data_layer.layer import RoIDataLayer import utils.timer import pickle import torch import torch.optim as optim from nets.vgg16 import vgg16 import numpy as np import os import sys import glob import time
神經網絡搭建
模型訓練超參設置
為了減少訓練時間,我們在預訓練模型的基礎上進行訓練。這里,我們使用VGG16作為FasterRCNN的主干網絡。
In?[5]:
imdb_name = "voc_2007_trainval" imdbval_name = "voc_2007_test" # 使用的預訓練模型位置 weight = "./data/imagenet_weights/vgg16.pth" # 訓練迭代次數 max_iters = 100 # cfg模型文件位置 cfg_file = './experiments/cfgs/vgg16.yml' set_cfgs = None if cfg_file is not None: cfg_from_file(cfg_file) if set_cfgs is not None: cfg_from_list(set_cfgs) print('Using config:') print(cfg)
定義讀取數據集函數
數據集的標注格式是PASCAL VOC格式。
In?[6]:
def combined_roidb(imdb_names): def get_roidb(imdb_name): # 加載數據集 imdb = get_imdb(imdb_name) print('Loaded dataset `{:s}` for training'.format(imdb.name)) # 使用ground truth作為數據集策略 imdb.set_proposal_method(cfg.TRAIN.PROPOSAL_METHOD) print('Set proposal method: {:s}'.format(cfg.TRAIN.PROPOSAL_METHOD)) roidb = get_training_roidb(imdb) return roidb roidbs = [get_roidb(s) for s in imdb_names.split('+')] roidb = roidbs[0] if len(roidbs) > 1: for r in roidbs[1:]: roidb.extend(r) tmp = get_imdb(imdb_names.split('+')[1]) imdb = datasets.imdb.imdb(imdb_names, tmp.classes) else: imdb = get_imdb(imdb_names) return imdb, roidb
設置模型訓練參數
In?[7]:
np.random.seed(cfg.RNG_SEED) # 加載訓練數據集 imdb, roidb = combined_roidb(imdb_name) print('{:d} roidb entries'.format(len(roidb))) # 設置輸出路徑 output_dir = get_output_dir(imdb,None) print('Output will be saved to `{:s}`'.format(output_dir)) # 設置日志保存路徑 tb_dir = get_output_tb_dir(imdb, None) print('TensorFlow summaries will be saved to `{:s}`'.format(tb_dir)) # 加載驗證數據集 orgflip = cfg.TRAIN.USE_FLIPPED cfg.TRAIN.USE_FLIPPED = False _, valroidb = combined_roidb(imdbval_name) print('{:d} validation roidb entries'.format(len(valroidb))) cfg.TRAIN.USE_FLIPPED = orgflip # 創建backbone網絡 # 在案例中使用的是VGG16模型,可以嘗試其他不同的模型結構,例如Resnet等 net = vgg16()
Using config: {'TRAIN': {'LEARNING_RATE': 0.001, 'MOMENTUM': 0.9, 'WEIGHT_DECAY': 0.0001, 'GAMMA': 0.1, 'STEPSIZE': [30000], 'DISPLAY': 10, 'DOUBLE_BIAS': True, 'TRUNCATED': False, 'BIAS_DECAY': False, 'USE_GT': False, 'ASPECT_GROUPING': False, 'SNAPSHOT_KEPT': 3, 'SUMMARY_INTERVAL': 180, 'SCALES': [600], 'MAX_SIZE': 1000, 'IMS_PER_BATCH': 1, 'BATCH_SIZE': 128, 'FG_FRACTION': 0.25, 'FG_THRESH': 0.5, 'BG_THRESH_HI': 0.5, 'BG_THRESH_LO': 0.1, 'USE_FLIPPED': True, 'BBOX_REG': True, 'BBOX_THRESH': 0.5, 'SNAPSHOT_ITERS': 5000, 'SNAPSHOT_PREFIX': 'res101_faster_rcnn', 'BBOX_NORMALIZE_TARGETS': True, 'BBOX_INSIDE_WEIGHTS': [1.0, 1.0, 1.0, 1.0], 'BBOX_NORMALIZE_TARGETS_PRECOMPUTED': True, 'BBOX_NORMALIZE_MEANS': [0.0, 0.0, 0.0, 0.0], 'BBOX_NORMALIZE_STDS': [0.1, 0.1, 0.2, 0.2], 'PROPOSAL_METHOD': 'gt', 'HAS_RPN': True, 'RPN_POSITIVE_OVERLAP': 0.7, 'RPN_NEGATIVE_OVERLAP': 0.3, 'RPN_CLOBBER_POSITIVES': False, 'RPN_FG_FRACTION': 0.5, 'RPN_BATCHSIZE': 256, 'RPN_NMS_THRESH': 0.7, 'RPN_PRE_NMS_TOP_N': 12000, 'RPN_POST_NMS_TOP_N': 2000, 'RPN_BBOX_INSIDE_WEIGHTS': [1.0, 1.0, 1.0, 1.0], 'RPN_POSITIVE_WEIGHT': -1.0, 'USE_ALL_GT': True}, 'TEST': {'SCALES': [600], 'MAX_SIZE': 1000, 'NMS': 0.3, 'SVM': False, 'BBOX_REG': True, 'HAS_RPN': False, 'PROPOSAL_METHOD': 'gt', 'RPN_NMS_THRESH': 0.7, 'RPN_PRE_NMS_TOP_N': 6000, 'RPN_POST_NMS_TOP_N': 300, 'MODE': 'nms', 'RPN_TOP_N': 5000}, 'RESNET': {'MAX_POOL': False, 'FIXED_BLOCKS': 1}, 'MOBILENET': {'REGU_DEPTH': False, 'FIXED_LAYERS': 5, 'WEIGHT_DECAY': 4e-05, 'DEPTH_MULTIPLIER': 1.0}, 'PIXEL_MEANS': array([[[102.9801, 115.9465, 122.7717]]]), 'RNG_SEED': 3, 'ROOT_DIR': '/home/ma-user/work', 'DATA_DIR': '/home/ma-user/work/data', 'MATLAB': 'matlab', 'EXP_DIR': 'default', 'USE_GPU_NMS': True, 'POOLING_MODE': 'align', 'POOLING_SIZE': 7, 'ANCHOR_SCALES': [8, 16, 32], 'ANCHOR_RATIOS': [0.5, 1, 2], 'RPN_CHANNELS': 512} Loaded dataset `voc_2007_trainval` for training Set proposal method: gt Appending horizontally-flipped training examples... wrote gt roidb to /home/ma-user/work/data/cache/voc_2007_trainval_gt_roidb.pkl done Preparing training data... done 10022 roidb entries Output will be saved to `/home/ma-user/work/output/default/voc_2007_trainval/default` TensorFlow summaries will be saved to `/home/ma-user/work/tensorboard/default/voc_2007_trainval/default` Loaded dataset `voc_2007_test` for training Set proposal method: gt Preparing training data... wrote gt roidb to /home/ma-user/work/data/cache/voc_2007_test_gt_roidb.pkl done 4952 validation roidb entries
In?[8]:
from model.train_val import filter_roidb, SolverWrapper # 對ROI進行篩選,將無效的ROI數據篩選掉 roidb = filter_roidb(roidb) valroidb = filter_roidb(valroidb) sw = SolverWrapper( net, imdb, roidb, valroidb, output_dir, tb_dir, pretrained_model=weight) print('Solving...')
Filtered 0 roidb entries: 10022 -> 10022 Filtered 0 roidb entries: 4952 -> 4952 Solving...
In?[9]:
# 顯示所有模型屬性 sw.__dict__.keys()
Out[9]:
dict_keys(['net', 'imdb', 'roidb', 'valroidb', 'output_dir', 'tbdir', 'tbvaldir', 'pretrained_model'])
In?[10]:
# sw.net為主干網絡 print(sw.net)
vgg16()
定義神經網絡結構
使用PyTorch搭建神經網絡。
部分實現細節可以去相應的文件夾查看源碼。
In?[11]:
# 構建網絡結構,模型加入ROI數據層 sw.data_layer = RoIDataLayer(sw.roidb, sw.imdb.num_classes) sw.data_layer_val = RoIDataLayer(sw.valroidb, sw.imdb.num_classes, random=True) # 構建網絡結構,在VGG16基礎上加入ROI和Classifier部分 lr, train_op = sw.construct_graph() # 加載之前的snapshot lsf, nfiles, sfiles = sw.find_previous() # snapshot 為訓練提供了斷點訓練,如果有snapshot將加載進來,繼續訓練 if lsf == 0: lr, last_snapshot_iter, stepsizes, np_paths, ss_paths = sw.initialize() else: lr, last_snapshot_iter, stepsizes, np_paths, ss_paths = sw.restore(str(sfiles[-1]), str(nfiles[-1])) iter = last_snapshot_iter + 1 last_summary_time = time.time() # 在之前的訓練基礎上繼續進行訓練 stepsizes.append(max_iters) stepsizes.reverse() next_stepsize = stepsizes.pop() # 將net切換成訓練模式 print("網絡結構:") sw.net.train() sw.net.to(sw.net._device)
Loading initial model weights from ./data/imagenet_weights/vgg16.pth Loaded. 網絡結構:
Out[11]:
vgg16( (vgg): VGG( (features): Sequential( (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU(inplace=True) (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU(inplace=True) (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (6): ReLU(inplace=True) (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (8): ReLU(inplace=True) (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (11): ReLU(inplace=True) (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (13): ReLU(inplace=True) (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (15): ReLU(inplace=True) (16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (18): ReLU(inplace=True) (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (20): ReLU(inplace=True) (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (22): ReLU(inplace=True) (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (25): ReLU(inplace=True) (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (27): ReLU(inplace=True) (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (29): ReLU(inplace=True) (30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) ) (avgpool): AdaptiveAvgPool2d(output_size=(7, 7)) (classifier): Sequential( (0): Linear(in_features=25088, out_features=4096, bias=True) (1): ReLU(inplace=True) (2): Dropout(p=0.5, inplace=False) (3): Linear(in_features=4096, out_features=4096, bias=True) (4): ReLU(inplace=True) (5): Dropout(p=0.5, inplace=False) ) ) (rpn_net): Conv2d(512, 512, kernel_size=[3, 3], stride=(1, 1), padding=(1, 1)) (rpn_cls_score_net): Conv2d(512, 18, kernel_size=[1, 1], stride=(1, 1)) (rpn_bbox_pred_net): Conv2d(512, 36, kernel_size=[1, 1], stride=(1, 1)) (cls_score_net): Linear(in_features=4096, out_features=21, bias=True) (bbox_pred_net): Linear(in_features=4096, out_features=84, bias=True) )
開始訓練
In?[12]:
while iter < max_iters + 1: if iter == next_stepsize + 1: # 加入snapshot節點 sw.snapshot(iter) lr *= cfg.TRAIN.GAMMA scale_lr(sw.optimizer, cfg.TRAIN.GAMMA) next_stepsize = stepsizes.pop() utils.timer.timer.tic() # 數據通過ROI數據層,進行前向計算 blobs = sw.data_layer.forward() now = time.time() if iter == 1 or now - last_summary_time > cfg.TRAIN.SUMMARY_INTERVAL: # 計算loss函數 # 根據loss函數對模型進行訓練 rpn_loss_cls, rpn_loss_box, loss_cls, loss_box, total_loss, summary = \ sw.net.train_step_with_summary(blobs, sw.optimizer) for _sum in summary: sw.writer.add_summary(_sum, float(iter)) # 進行數據層驗證計算 blobs_val = sw.data_layer_val.forward() summary_val = sw.net.get_summary(blobs_val) for _sum in summary_val: sw.valwriter.add_summary(_sum, float(iter)) last_summary_time = now else: rpn_loss_cls, rpn_loss_box, loss_cls, loss_box, total_loss = \ sw.net.train_step(blobs, sw.optimizer) utils.timer.timer.toc() if iter % (cfg.TRAIN.DISPLAY) == 0: print('iter: %d / %d, total loss: %.6f\n >>> rpn_loss_cls: %.6f\n ' '>>> rpn_loss_box: %.6f\n >>> loss_cls: %.6f\n >>> loss_box: %.6f\n >>> lr: %f' % \ (iter, max_iters, total_loss, rpn_loss_cls, rpn_loss_box, loss_cls, loss_box, lr)) print('speed: {:.3f}s / iter'.format( utils.timer.timer.average_time())) # 進行snapshot存儲 if iter % cfg.TRAIN.SNAPSHOT_ITERS == 0: last_snapshot_iter = iter ss_path, np_path = sw.snapshot(iter) np_paths.append(np_path) ss_paths.append(ss_path) # 刪掉多余的snapshot if len(np_paths) > cfg.TRAIN.SNAPSHOT_KEPT: sw.remove_snapshot(np_paths, ss_paths) iter += 1 if last_snapshot_iter != iter - 1: sw.snapshot(iter - 1) sw.writer.close() sw.valwriter.close()
iter: 10 / 100, total loss: 1.025015 >>> rpn_loss_cls: 0.387036 >>> rpn_loss_box: 0.004538 >>> loss_cls: 0.366100 >>> loss_box: 0.267340 >>> lr: 0.001000 speed: 0.666s / iter iter: 20 / 100, total loss: 2.173192 >>> rpn_loss_cls: 0.363755 >>> rpn_loss_box: 0.094425 >>> loss_cls: 1.005797 >>> loss_box: 0.709214 >>> lr: 0.001000 speed: 0.396s / iter iter: 30 / 100, total loss: 1.212159 >>> rpn_loss_cls: 0.144665 >>> rpn_loss_box: 0.043567 >>> loss_cls: 0.626252 >>> loss_box: 0.397675 >>> lr: 0.001000 speed: 0.305s / iter iter: 40 / 100, total loss: 0.848530 >>> rpn_loss_cls: 0.756678 >>> rpn_loss_box: 0.079122 >>> loss_cls: 0.012730 >>> loss_box: 0.000000 >>> lr: 0.001000 speed: 0.259s / iter iter: 50 / 100, total loss: 1.012320 >>> rpn_loss_cls: 0.318012 >>> rpn_loss_box: 0.029802 >>> loss_cls: 0.507314 >>> loss_box: 0.157193 >>> lr: 0.001000 speed: 0.232s / iter iter: 60 / 100, total loss: 0.994835 >>> rpn_loss_cls: 0.353266 >>> rpn_loss_box: 0.043218 >>> loss_cls: 0.404328 >>> loss_box: 0.194023 >>> lr: 0.001000 speed: 0.214s / iter iter: 70 / 100, total loss: 0.686826 >>> rpn_loss_cls: 0.259330 >>> rpn_loss_box: 0.006708 >>> loss_cls: 0.420788 >>> loss_box: 0.000000 >>> lr: 0.001000 speed: 0.200s / iter iter: 80 / 100, total loss: 1.976414 >>> rpn_loss_cls: 0.153041 >>> rpn_loss_box: 0.103065 >>> loss_cls: 1.080667 >>> loss_box: 0.639641 >>> lr: 0.001000 speed: 0.190s / iter iter: 90 / 100, total loss: 2.763836 >>> rpn_loss_cls: 0.700790 >>> rpn_loss_box: 0.201123 >>> loss_cls: 1.155626 >>> loss_box: 0.706297 >>> lr: 0.001000 speed: 0.182s / iter iter: 100 / 100, total loss: 1.721430 >>> rpn_loss_cls: 0.281938 >>> rpn_loss_box: 0.036765 >>> loss_cls: 0.779848 >>> loss_box: 0.622879 >>> lr: 0.001000 speed: 0.176s / iter Wrote snapshot to: /home/ma-user/work/output/default/voc_2007_trainval/default/res101_faster_rcnn_iter_100.pth
機器學習 神經網絡
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。