CoolFace
Apppublic

samH98/LungCancerDetection

sourceHugging Faceupdated 3y agoView on Hugging Face
0likes
detect.py205 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, TracedModel16 17 18def detect(save_img=False):19    source, weights, view_img, save_txt, imgsz, trace = opt.source, opt.weights, opt.view_img, opt.save_txt, opt.img_size, not opt.no_trace20    save_img = not opt.nosave and not source.endswith('.txt')  # save inference images21    webcam = source.isnumeric() or source.endswith('.txt') or source.lower().startswith(22        ('rtsp://', 'rtmp://', 'http://', 'https://'))23 24    # Directories25    save_dir = Path(increment_path(Path(opt.project) / opt.name, exist_ok=opt.exist_ok))  # increment run26    (save_dir / 'labels' if save_txt else save_dir).mkdir(parents=True, exist_ok=True)  # make dir27 28    # Initialize29    set_logging()30    device = select_device(opt.device)31    half = device.type != 'cpu'  # half precision only supported on CUDA32 33    # Load model34    model = attempt_load(weights, map_location=device)  # load FP32 model35    stride = int(model.stride.max())  # model stride36    imgsz = check_img_size(imgsz, s=stride)  # check img_size37 38    if trace:39        model = TracedModel(model, device, opt.img_size)40 41    if half:42        model.half()  # to FP1643 44    # Second-stage classifier45    classify = False46    if classify:47        modelc = load_classifier(name='resnet101', n=2)  # initialize48        modelc.load_state_dict(torch.load('weights/resnet101.pt', map_location=device)['model']).to(device).eval()49 50    # Set Dataloader51    vid_path, vid_writer = None, None52    if webcam:53        view_img = check_imshow()54        cudnn.benchmark = True  # set True to speed up constant image size inference55        dataset = LoadStreams(source, img_size=imgsz, stride=stride)56    else:57        dataset = LoadImages(source, img_size=imgsz, stride=stride)58 59    # Get names and colors60    names = model.module.names if hasattr(model, 'module') else model.names61    colors = [[random.randint(0, 255) for _ in range(3)] for _ in names]62 63    # Run inference64    if device.type != 'cpu':65        model(torch.zeros(1, 3, imgsz, imgsz).to(device).type_as(next(model.parameters())))  # run once66    old_img_w = old_img_h = imgsz67    old_img_b = 168 69    t0 = time.time()70    for path, img, im0s, vid_cap in dataset:71        img = torch.from_numpy(img).to(device)72        img = img.half() if half else img.float()  # uint8 to fp16/3273        img /= 255.0  # 0 - 255 to 0.0 - 1.074        if img.ndimension() == 3:75            img = img.unsqueeze(0)76 77        # Warmup78        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]):79            old_img_b = img.shape[0]80            old_img_h = img.shape[2]81            old_img_w = img.shape[3]82            for i in range(3):83                model(img, augment=opt.augment)[0]84 85        # Inference86        t1 = time_synchronized()87        with torch.no_grad():   # Calculating gradients would cause a GPU memory leak88            pred = model(img, augment=opt.augment)[0]89        t2 = time_synchronized()90 91        # Apply NMS92        pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms)93        t3 = time_synchronized()94 95        # Apply Classifier96        if classify:97            pred = apply_classifier(pred, modelc, img, im0s)98 99        # Process detections100        # detected_classes = []101        # names = ['class1', 'class2', 'class3', 'class 4']  # Replace this list with the actual class names used in detect.py102        for i, det in enumerate(pred):  # detections per image103            if webcam:  # batch_size >= 1104                p, s, im0, frame = path[i], '%g: ' % i, im0s[i].copy(), dataset.count105            else:106                p, s, im0, frame = path, '', im0s, getattr(dataset, 'frame', 0)107 108            p = Path(p)  # to Path109            save_path = str(save_dir / p.name)  # img.jpg110            txt_path = str(save_dir / 'labels' / p.stem) + ('' if dataset.mode == 'image' else f'_{frame}')  # img.txt111            gn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  # normalization gain whwh112            if len(det):113                # Rescale boxes from img_size to im0 size114                det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()115                116                for c in det[:, -1].unique():117                    n = (det[:, -1] == c).sum()118                    s += f"{n} {names[int(c)]}{'s' * (n > 1)},"119                    # detected_classes.append(names[int(c)])120 121                # Print results122                # for c in det[:, -1].unique():123                #     n = (det[:, -1] == c).sum()  # detections per class124                #     s += f"{n} {names[int(c)]}{'s' * (n > 1)}, "  # add to string125 126                # Write results127                for *xyxy, conf, cls in reversed(det):128                    if save_txt:  # Write to file129                        xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywh130                        line = (cls, *xywh, conf) if opt.save_conf else (cls, *xywh)  # label format131                        with open(txt_path + '.txt', 'a') as f:132                            f.write(('%g ' * len(line)).rstrip() % line + '\n')133 134                    if save_img or view_img:  # Add bbox to image135                        label = f'{names[int(cls)]} {conf:.2f}'136                        plot_one_box(xyxy, im0, label=label, color=colors[int(cls)], line_thickness=1)137 138            # Print time (inference + NMS)139            print(f'{s}Done. ({(1E3 * (t2 - t1)):.1f}ms) Inference, ({(1E3 * (t3 - t2)):.1f}ms) NMS')140 141            # Stream results142            if view_img:143                cv2.imshow(str(p), im0)144                cv2.waitKey(1)  # 1 millisecond145 146            # Save results (image with detections)147            if save_img:148                if dataset.mode == 'image':149                    cv2.imwrite(save_path, im0)150                    print(f" The image with the result is saved in: {save_path}")151                else:  # 'video' or 'stream'152                    if vid_path != save_path:  # new video153                        vid_path = save_path154                        if isinstance(vid_writer, cv2.VideoWriter):155                            vid_writer.release()  # release previous video writer156                        if vid_cap:  # video157                            fps = vid_cap.get(cv2.CAP_PROP_FPS)158                            w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH))159                            h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))160                        else:  # stream161                            fps, w, h = 30, im0.shape[1], im0.shape[0]162                            save_path += '.mp4'163                        vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))164                    vid_writer.write(im0)165 166    if save_txt or save_img:167        s = f"\n{len(list(save_dir.glob('labels/*.txt')))} labels saved to {save_dir / 'labels'}" if save_txt else ''168        #print(f"Results saved to {save_dir}{s}")169 170    print(f'Done. ({time.time() - t0:.3f}s)')171    # return detected_classes172 173 174if __name__ == '__main__':175    parser = argparse.ArgumentParser()176    parser.add_argument('--weights', nargs='+', type=str, default='yolov7.pt', help='model.pt path(s)')177    parser.add_argument('--source', type=str, default='inference/images', help='source')  # file/folder, 0 for webcam178    parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')179    parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')180    parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')181    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')182    parser.add_argument('--view-img', action='store_true', help='display results')183    parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')184    parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')185    parser.add_argument('--nosave', action='store_true', help='do not save images/videos')186    parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3')187    parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')188    parser.add_argument('--augment', action='store_true', help='augmented inference')189    parser.add_argument('--update', action='store_true', help='update all models')190    parser.add_argument('--project', default='runs/detect', help='save results to project/name')191    parser.add_argument('--name', default='exp', help='save results to project/name')192    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')193    parser.add_argument('--no-trace', action='store_true', help='don`t trace model')194    opt = parser.parse_args()195    print(opt)196    #check_requirements(exclude=('pycocotools', 'thop'))197 198    with torch.no_grad():199        if opt.update:  # update all models (to fix SourceChangeWarning)200            for opt.weights in ['yolov7.pt']:201                detect()202                strip_optimizer(opt.weights)203        else:204            detect()205