CoolFace
Apppublic

Maximef/Yologo

sourceHugging Faceupdated 4y agoView on Hugging Face
0likes
detect.py200 linesDownload Raw Back to root
1import argparse2import time3from pathlib import Path4 5import cv26import torch7import torch.backends.cudnn as cudnn8from numpy import random9 10from models.experimental import attempt_load11from utils.datasets import LoadStreams, LoadImages12from utils.general import check_img_size, check_requirements, check_imshow, non_max_suppression, apply_classifier, \13    scale_coords, xyxy2xywh, strip_optimizer, set_logging, increment_path14from utils.plots import plot_one_box15from utils.torch_utils import select_device, load_classifier, time_synchronized, TracedModel16from recommendation import SimilarityRecommender17 18 19def detect(save_img=False):20    recommender = SimilarityRecommender("./TopBrands.xlsx")21    source, weights, view_img, save_txt, imgsz, trace = opt.source, opt.weights, opt.view_img, opt.save_txt, opt.img_size, not opt.no_trace22    save_img = not opt.nosave and not source.endswith('.txt')  # save inference images23    webcam = source.isnumeric() or source.endswith('.txt') or source.lower().startswith(24        ('rtsp://', 'rtmp://', 'http://', 'https://'))25 26    # Directories27    save_dir = Path(increment_path(Path(opt.project) / opt.name, exist_ok=opt.exist_ok))  # increment run28    (save_dir / 'labels' if save_txt else save_dir).mkdir(parents=True, exist_ok=True)  # make dir29 30    # Initialize31    set_logging()32    device = select_device(opt.device)33    half = device.type != 'cpu'  # half precision only supported on CUDA34 35    # Load model36    model = attempt_load(weights, map_location=device)  # load FP32 model37    stride = int(model.stride.max())  # model stride38    imgsz = check_img_size(imgsz, s=stride)  # check img_size39 40    if trace:41        model = TracedModel(model, device, opt.img_size)42 43    if half:44        model.half()  # to FP1645 46    # Second-stage classifier47    classify = False48    if classify:49        modelc = load_classifier(name='resnet101', n=2)  # initialize50        modelc.load_state_dict(torch.load('weights/resnet101.pt', map_location=device)['model']).to(device).eval()51 52    # Set Dataloader53    vid_path, vid_writer = None, None54    if webcam:55        view_img = check_imshow()56        cudnn.benchmark = True  # set True to speed up constant image size inference57        dataset = LoadStreams(source, img_size=imgsz, stride=stride)58    else:59        dataset = LoadImages(source, img_size=imgsz, stride=stride)60 61    # Get names and colors62    names = model.module.names if hasattr(model, 'module') else model.names63    colors = [[random.randint(0, 255) for _ in range(3)] for _ in names]64 65    # Run inference66    if device.type != 'cpu':67        model(torch.zeros(1, 3, imgsz, imgsz).to(device).type_as(next(model.parameters())))  # run once68    old_img_w = old_img_h = imgsz69    old_img_b = 170 71    t0 = time.time()72    for path, img, im0s, vid_cap in dataset:73        img = torch.from_numpy(img).to(device)74        img = img.half() if half else img.float()  # uint8 to fp16/3275        img /= 255.0  # 0 - 255 to 0.0 - 1.076        if img.ndimension() == 3:77            img = img.unsqueeze(0)78 79        # Warmup80        if device.type != 'cpu' and (old_img_b != img.shape[0] or old_img_h != img.shape[2] or old_img_w != img.shape[3]):81            old_img_b = img.shape[0]82            old_img_h = img.shape[2]83            old_img_w = img.shape[3]84            for i in range(3):85                model(img, augment=opt.augment)[0]86 87        # Inference88        t1 = time_synchronized()89        pred = model(img, augment=opt.augment)[0]90        t2 = time_synchronized()91 92        # Apply NMS93        pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms)94        t3 = time_synchronized()95 96        # Apply Classifier97        if classify:98            pred = apply_classifier(pred, modelc, img, im0s)99 100        # Process detections101        for i, det in enumerate(pred):  # detections per image102            if webcam:  # batch_size >= 1103                p, s, im0, frame = path[i], '%g: ' % i, im0s[i].copy(), dataset.count104            else:105                p, s, im0, frame = path, '', im0s, getattr(dataset, 'frame', 0)106 107            p = Path(p)  # to Path108            save_path = str(save_dir / p.name)  # img.jpg109            txt_path = str(save_dir / 'labels' / p.stem) + ('' if dataset.mode == 'image' else f'_{frame}')  # img.txt110            gn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  # normalization gain whwh111            if len(det):112                # Rescale boxes from img_size to im0 size113                det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()114 115                # Print results116                for c in det[:, -1].unique():117                    n = (det[:, -1] == c).sum()  # detections per class118                    s += f"{n} {names[int(c)]}{'s' * (n > 1)}, "  # add to string119 120                # Write results121                for *xyxy, conf, cls in reversed(det):122                    name_class = names[int(cls.item())]123                    name_recommanded = recommender.make_recommendation(name_class)124                    if save_txt:  # Write to file125                        xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywh126                        line = (cls, *xywh, conf) if opt.save_conf else (cls, *xywh)  # label format127                        with open(txt_path + '.txt', 'a') as f:128                            f.write(('%g ' * len(line)).rstrip() % line + '\n')129 130                    if save_img or view_img:  # Add bbox to image131                        label = f'{names[int(cls)]} {conf:.2f} || Recommendation : {name_recommanded.lower()}'132                        plot_one_box(xyxy, im0, label=label, color=colors[int(cls)], line_thickness=1)133 134            # Print time (inference + NMS)135            print(f'{s}Done. ({(1E3 * (t2 - t1)):.1f}ms) Inference, ({(1E3 * (t3 - t2)):.1f}ms) NMS')136 137            # Stream results138            if view_img:139                cv2.imshow(str(p), im0)140                cv2.waitKey(1)  # 1 millisecond141 142            # Save results (image with detections)143            if save_img:144                if dataset.mode == 'image':145                    cv2.imwrite(save_path, im0)146                    print(f" The image with the result is saved in: {save_path}")147                else:  # 'video' or 'stream'148                    if vid_path != save_path:  # new video149                        vid_path = save_path150                        if isinstance(vid_writer, cv2.VideoWriter):151                            vid_writer.release()  # release previous video writer152                        if vid_cap:  # video153                            fps = vid_cap.get(cv2.CAP_PROP_FPS)154                            w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH))155                            h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))156                        else:  # stream157                            fps, w, h = 30, im0.shape[1], im0.shape[0]158                            save_path += '.mp4'159                        vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))160                    vid_writer.write(im0)161 162    if save_txt or save_img:163        s = f"\n{len(list(save_dir.glob('labels/*.txt')))} labels saved to {save_dir / 'labels'}" if save_txt else ''164        #print(f"Results saved to {save_dir}{s}")165 166    print(f'Done. ({time.time() - t0:.3f}s)')167 168 169if __name__ == '__main__':170    parser = argparse.ArgumentParser()171    parser.add_argument('--weights', nargs='+', type=str, default='yolov7.pt', help='model.pt path(s)')172    parser.add_argument('--source', type=str, default='inference/images', help='source')  # file/folder, 0 for webcam173    parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')174    parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')175    parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')176    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')177    parser.add_argument('--view-img', action='store_true', help='display results')178    parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')179    parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')180    parser.add_argument('--nosave', action='store_true', help='do not save images/videos')181    parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3')182    parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')183    parser.add_argument('--augment', action='store_true', help='augmented inference')184    parser.add_argument('--update', action='store_true', help='update all models')185    parser.add_argument('--project', default='runs/detect', help='save results to project/name')186    parser.add_argument('--name', default='exp', help='save results to project/name')187    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')188    parser.add_argument('--no-trace', action='store_true', help='don`t trace model')189    opt = parser.parse_args()190    print(opt)191    #check_requirements(exclude=('pycocotools', 'thop'))192 193    with torch.no_grad():194        if opt.update:  # update all models (to fix SourceChangeWarning)195            for opt.weights in ['yolov7.pt']:196                detect()197                strip_optimizer(opt.weights)198        else:199            detect()200