国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【目標檢測】YOLOv5算法實現(xiàn)(八):模型驗證

這篇具有很好參考價值的文章主要介紹了【目標檢測】YOLOv5算法實現(xiàn)(八):模型驗證。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??本系列文章記錄本人碩士階段YOLO系列目標檢測算法自學及其代碼實現(xiàn)的過程。其中算法具體實現(xiàn)借鑒于ultralytics YOLO源碼Github,刪減了源碼中部分內(nèi)容,滿足個人科研需求。
??本系列文章主要以YOLOv5為例完成算法的實現(xiàn),后續(xù)修改、增加相關模塊即可實現(xiàn)其他版本的YOLO算法。

文章地址:
YOLOv5算法實現(xiàn)(一):算法框架概述
YOLOv5算法實現(xiàn)(二):模型加搭建
YOLOv5算法實現(xiàn)(三):數(shù)據(jù)集加載
YOLOv5算法實現(xiàn)(四):正樣本匹配與損失計算
YOLOv5算法實現(xiàn)(五):預測結(jié)果后處理
YOLOv5算法實現(xiàn)(六):評價指標及實現(xiàn)
YOLOv5算法實現(xiàn)(七):模型訓練
YOLOv5算法實現(xiàn)(八):模型驗證
YOLOv5算法實現(xiàn)(九):模型預測

0 引言

??本篇文章綜合之前文章中的功能,實現(xiàn)模型的驗證。模型驗證的邏輯如圖1所示。
【目標檢測】YOLOv5算法實現(xiàn)(八):模型驗證,YOLO算法實現(xiàn),目標檢測,YOLO,yolov5,模型驗證文章來源地址http://www.zghlxwxcb.cn/news/detail-814576.html

圖1 模型驗證流程

1 模型驗證(validation.py)

def validation(parser_data):
    device = torch.device(parser_data.device if torch.cuda.is_available() else "cpu")
    print("Using {} device validation.".format(device.type))

    # read class_indict
    label_json_path = './data/object.json'
    assert os.path.exists(label_json_path), "json file {} dose not exist.".format(label_json_path)
    with open(label_json_path, 'r') as f:
        class_dict = json.load(f)

    category_index = {v: k for k, v in class_dict.items()}

    data_dict = parse_data_cfg(parser_data.data)
    test_path = data_dict["valid"]

    # 注意這里的collate_fn是自定義的,因為讀取的數(shù)據(jù)包括image和targets,不能直接使用默認的方法合成batch
    batch_size = parser_data.batch_size
    nw = min([os.cpu_count(), batch_size if batch_size > 1 else 0, 8])  # number of workers
    print('Using %g dataloader workers' % nw)

    # load validation data set
    val_dataset = LoadImagesAndLabels(test_path, parser_data.img_size, batch_size,
                                      hyp=parser_data.hyp,
                                      rect=False)  # 將每個batch的圖像調(diào)整到合適大小,可減少運算量(并不是512x512標準尺寸)

    val_dataset_loader = torch.utils.data.DataLoader(val_dataset,
                                                     batch_size=batch_size,
                                                     shuffle=True,
                                                     num_workers=nw,
                                                     pin_memory=True,
                                                     collate_fn=val_dataset.collate_fn)

    # create model
    model = Model(parser_data.cfg, ch=3, nc=parser_data.nc)
    weights_dict = torch.load(parser_data.weights, map_location='cpu')
    weights_dict = weights_dict["model"] if "model" in weights_dict else weights_dict
    model.load_state_dict(weights_dict, strict=False)
    model.to(device)

    # evaluate on the test dataset

    # 計算PR曲線和AP
    stats = []
    iouv = torch.linspace(0.5, 0.95, 10, device=device)  # iou vector for mAP@0.5:0.95
    niou = iouv.numel()
    # 混淆矩陣
    confusion_matrix = ConfusionMatrix(nc=3, conf=0.6)
    model.eval()

    with torch.no_grad():
        for imgs, targets, paths, shapes, img_index in tqdm(val_dataset_loader, desc="validation..."):
            imgs = imgs.to(device).float() / 255.0  # uint8 to float32, 0 - 255 to 0.0 - 1.0
            nb, _, height, width = imgs.shape  # batch size, channels, height, width
            targets = targets.to(device)
            preds = model(imgs)[0]  # only get inference result
            preds = non_max_suppression(preds, conf_thres=0.3, iou_thres=0.6, multi_label=False)
            targets[:, 2:] *= torch.tensor((width, height, width, height), device=device)
            outputs = []
            for si, pred in enumerate(preds):
                '''
                labels: [clas, x, y, w, h] (訓練圖像上絕對坐標)
                pred: [x,y,x,y,obj,cls] (訓練圖像上絕對坐標)
                predn: [x,y,x,y,obj,cls] (輸入圖像上絕對坐標)
                labels: [x,y,x,y,class] (輸入圖像上絕對坐標)
                shapes[si][0]: 輸入圖像大小
                shapes[si][1]
                '''
                labels = targets[targets[:, 0] == si, 1:]  # 當前圖片的標簽信息
                nl = labels.shape[0]  # number of labels # 當前圖片標簽數(shù)量
                if pred is None:
                    npr = 0
                else:
                    npr = pred.shape[0]  # 預測結(jié)果數(shù)量
                correct = torch.zeros(npr, niou, dtype=torch.bool, device=device)  # 判斷在不同IoU下預測是否預測正確
                path, shape = Path(paths[si]), shapes[si][0]  # 當前圖片shape(原圖大小)
                if npr == 0:  # 若沒有預測結(jié)果
                    if nl:  # 沒有預測結(jié)果但有實際目標
                        # 不同IoU閾值下預測準確率,目標類別置信度,預測類別,實際類別
                        stats.append((correct, *torch.zeros((2, 0), device=device), labels[:, 0]))
                        # 混淆矩陣計算(類別信息)
                        confusion_matrix.process_batch(detections=None, labels=labels[:, 0])
                    continue
                predn = pred.clone()
                scale_boxes(imgs[si].shape[1:], predn[:, :4], shape, shapes[si][1])  # native-space pred
                if nl:  # 有預測結(jié)果且有實際目標
                    tbox = xywh2xyxy(labels[:, 1:5])  # target boxes
                    scale_boxes(imgs[si].shape[1:], tbox, shape, shapes[si][1])  # native-space labels
                    labelsn = torch.cat((labels[:, 0:1], tbox), 1)  # native-space labels
                    correct = process_batch(predn, labelsn, iouv)
                    confusion_matrix.process_batch(predn, labelsn)
                stats.append((correct, pred[:, 4], pred[:, 5], labels[:, 0]))  # 預測結(jié)果在不同IoU是否預測正確, 預測置信度, 預測類別, 實際類別
        confusion_matrix.plot(save_dir=parser_data.save_path, names=["normal", 'defect', 'leakage'])

    # 圖片:預測結(jié)果在不同IoU下預測結(jié)果,預測置信度,預測類別,實際類別
    stats = [torch.cat(x, 0).cpu().numpy() for x in zip(*stats)]  # to numpy
    if len(stats) and stats[0].any():
        tp, fp, p, r, f1, ap, ap_class = ap_per_class(*stats, names=["normal", 'defect', 'leakage'])
        ap50, ap = ap[:, 0], ap.mean(1)  # AP@0.5, AP@0.5:0.95
        mp, mr, map50, map = p.mean(), r.mean(), ap50.mean(), ap.mean()
        print(map50)

if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(
        description=__doc__)

    # 使用設備類型
    parser.add_argument('--device', default='cuda', help='device')

    # 檢測目標類別數(shù)
    parser.add_argument('--nc', type=int, default=3, help='number of classes')
    file = 'yolov5s'
    cfg = f'cfg/models/{file}.yaml'
    parser.add_argument('--cfg', type=str, default=cfg, help="*.cfg path")
    parser.add_argument('--data', type=str, default='data/my_data.data', help='*.data path')
    parser.add_argument('--hyp', type=str, default='cfg/hyps/hyp.scratch-med.yaml', help='hyperparameters path')
    parser.add_argument('--img-size', type=int, default=640, help='test size')

    # 訓練好的權重文件
    weight_1 = f'./weights/{file}/{file}' + '-best_map.pt'
    weight_2 = f'./weights/{file}/{file}' + '.pt'
    weight = weight_1 if os.path.exists(weight_1) else weight_2
    parser.add_argument('--weights', default=weight, type=str, help='training weights')
    parser.add_argument('--save_path', default=f'results/{file}', type=str, help='result save path')

    # batch size
    parser.add_argument('--batch_size', default=2, type=int, metavar='N',
                        help='batch size when validation.')

    args = parser.parse_args()

    validation(args)

到了這里,關于【目標檢測】YOLOv5算法實現(xiàn)(八):模型驗證的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包