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

yolov5 python API(供其他程序調(diào)用)

這篇具有很好參考價(jià)值的文章主要介紹了yolov5 python API(供其他程序調(diào)用)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

你的yolov5??是否只局限于detect.py?如果其他程序要調(diào)用yolov5,就需要制作一個(gè)detect.py的python API。python無處不對(duì)象,制作detect API實(shí)際上就是制作detect類。



前言

yolov5源碼版本:截止2022.2.3
鏈接:https://github.com/ultralytics/yolov5

作為一個(gè)“CV”主義者,在此之前在各平臺(tái)都沒有找到合適的API代碼。其中有一篇不錯(cuò)的文章https://www.pythonheidong.com/blog/article/851830/44a42d351037d307d02d/
可惜代碼版本過于“久遠(yuǎn)”,部分函數(shù)已經(jīng)不適用了。本文以一種簡單粗暴的方式制作與detect.py功能一樣的API,即使源碼更新,按照我的方法也能快速制作一個(gè)API供其他程序調(diào)用。

一、總體思路

其他程序調(diào)用yolo,實(shí)際上就是把圖像傳給detect.py。為了最大化實(shí)現(xiàn)detect.py的所有功能,最直接的方式是攝像頭或者視頻流把幀圖像存儲(chǔ)在‘date/images’目錄中,然后把幀圖像從‘runs/detect/exp’中讀取出來。這種方法增加了處理時(shí)間,不過實(shí)測存儲(chǔ)和讀取圖像這部分的延遲很低,即便是在樹莓派上。

二、制作detect類

在detect.py中添加以下代碼

class DetectAPI:
    def __init__(self, weights='weights/yolov5s.pt', data='data/coco128.yaml', imgsz=None, conf_thres=0.25,
                 iou_thres=0.45, max_det=1000, device='0', view_img=False, save_txt=False,
                 save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False,
                 visualize=False, update=False, project='runs/detect', name='myexp', exist_ok=False, line_thickness=3,
                 hide_labels=False, hide_conf=False, half=False, dnn=False):

        if imgsz is None:
            self.imgsz = [640, 640]
        self.weights = weights
        self.data = data
        self.source = 'data/myimages'
        self.imgsz = [640, 640]
        self.conf_thres = conf_thres
        self.iou_thres = iou_thres
        self.max_det = max_det
        self.device = device
        self.view_img = view_img
        self.save_txt = save_txt
        self.save_conf = save_conf
        self.save_crop = save_crop
        self.nosave = nosave
        self.classes = classes
        self.agnostic_nms = agnostic_nms
        self.augment = augment
        self.visualize = visualize
        self.update = update
        self.project = project
        self.name = name
        self.exist_ok = exist_ok
        self.line_thickness = line_thickness
        self.hide_labels = hide_labels
        self.hide_conf = hide_conf
        self.half = half
        self.dnn = dnn

    def run(self):
        source = str(self.source)
        save_img = not self.nosave and not source.endswith('.txt')  # save inference images
        is_file = Path(source).suffix[1:] in (IMG_FORMATS + VID_FORMATS)
        is_url = source.lower().startswith(('rtsp://', 'rtmp://', 'http://', 'https://'))
        webcam = source.isnumeric() or source.endswith('.txt') or (is_url and not is_file)
        if is_url and is_file:
            source = check_file(source)  # download

        # Directories
        save_dir = increment_path(Path(self.project) / self.name, exist_ok=self.exist_ok)  # increment run
        (save_dir / 'labels' if self.save_txt else save_dir).mkdir(parents=True, exist_ok=True)  # make dir

        # Load model
        device = select_device(self.device)
        model = DetectMultiBackend(self.weights, device=device, dnn=self.dnn, data=self.data)
        stride, names, pt, jit, onnx, engine = model.stride, model.names, model.pt, model.jit, model.onnx, model.engine
        imgsz = check_img_size(self.imgsz, s=stride)  # check image size

        # Half
        self.half &= (pt or jit or onnx or engine) and device.type != 'cpu'  # FP16 supported on limited backends with CUDA
        if pt or jit:
            model.model.half() if self.half else model.model.float()

        # Dataloader
        if webcam:
            view_img = check_imshow()
            cudnn.benchmark = True  # set True to speed up constant image size inference
            dataset = LoadStreams(source, img_size=imgsz, stride=stride, auto=pt)
            bs = len(dataset)  # batch_size
        else:
            dataset = LoadImages(source, img_size=imgsz, stride=stride, auto=pt)
            bs = 1  # batch_size
        vid_path, vid_writer = [None] * bs, [None] * bs

        # Run inference
        model.warmup(imgsz=(1, 3, *imgsz), half=self.half)  # warmup
        dt, seen = [0.0, 0.0, 0.0], 0
        for path, im, im0s, vid_cap, s in dataset:
            t1 = time_sync()
            im = torch.from_numpy(im).to(device)
            im = im.half() if self.half else im.float()  # uint8 to fp16/32
            im /= 255  # 0 - 255 to 0.0 - 1.0
            if len(im.shape) == 3:
                im = im[None]  # expand for batch dim
            t2 = time_sync()
            dt[0] += t2 - t1

            # Inference
            visualize = increment_path(save_dir / Path(path).stem, mkdir=True) if self.visualize else False
            pred = model(im, augment=self.augment, visualize=visualize)
            t3 = time_sync()
            dt[1] += t3 - t2

            # NMS
            pred = non_max_suppression(pred, self.conf_thres, self.iou_thres, self.classes, self.agnostic_nms,
                                       max_det=self.max_det)
            dt[2] += time_sync() - t3

            # Second-stage classifier (optional)
            # pred = utils.general.apply_classifier(pred, classifier_model, im, im0s)

            # Process predictions
            for i, det in enumerate(pred):  # per image
                seen += 1
                if webcam:  # batch_size >= 1
                    p, im0, frame = path[i], im0s[i].copy(), dataset.count
                    s += f'{i}: '
                else:
                    p, im0, frame = path, im0s.copy(), getattr(dataset, 'frame', 0)

                p = Path(p)  # to Path
                save_path = str(save_dir / p.name)  # im.jpg
                txt_path = str(save_dir / 'labels' / p.stem) + (
                    '' if dataset.mode == 'image' else f'_{frame}')  # im.txt
                s += '%gx%g ' % im.shape[2:]  # print string
                gn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  # normalization gain whwh
                imc = im0.copy() if self.save_crop else im0  # for save_crop
                annotator = Annotator(im0, line_width=self.line_thickness, example=str(names))
                if len(det):
                    # Rescale boxes from img_size to im0 size
                    det[:, :4] = scale_coords(im.shape[2:], det[:, :4], im0.shape).round()

                    # Print results
                    for c in det[:, -1].unique():
                        n = (det[:, -1] == c).sum()  # detections per class
                        s += f"{n} {names[int(c)]}{'s' * (n > 1)}, "  # add to string

                    mylabel = []
                    # Write results
                    for *xyxy, conf, cls in reversed(det):
                        if self.save_txt:  # Write to file
                            xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywh
                            line = (cls, *xywh, conf) if self.save_conf else (cls, *xywh)  # label format
                            with open(txt_path + '.txt', 'a') as f:
                                f.write(('%g ' * len(line)).rstrip() % line + '\n')

                        if save_img or self.save_crop or self.view_img:  # Add bbox to image
                            c = int(cls)  # integer class
                            label = None if self.hide_labels else (names[c] if self.hide_conf else f'{names[c]} {conf:.2f}')
                            mylabel.append(str(label))
                            annotator.box_label(xyxy, label, color=colors(c, True))
                            if self.save_crop:
                                save_one_box(xyxy, imc, file=save_dir / 'crops' / names[c] / f'{p.stem}.jpg', BGR=True)

                # Print time (inference-only)
                LOGGER.info(f'{s}Done. ({t3 - t2:.3f}s)')

                # Stream results
                im0 = annotator.result()
                if self.view_img:
                    cv2.imshow(str(p), im0)
                    cv2.waitKey(1)  # 1 millisecond

                # Save results (image with detections)
                if save_img:
                    if dataset.mode == 'image':
                        cv2.imwrite(save_path, im0)
                    else:  # 'video' or 'stream'
                        if vid_path[i] != save_path:  # new video
                            vid_path[i] = save_path
                            if isinstance(vid_writer[i], cv2.VideoWriter):
                                vid_writer[i].release()  # release previous video writer
                            if vid_cap:  # video
                                fps = vid_cap.get(cv2.CAP_PROP_FPS)
                                w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH))
                                h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
                            else:  # stream
                                fps, w, h = 30, im0.shape[1], im0.shape[0]
                                save_path += '.mp4'
                            vid_writer[i] = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))
                        vid_writer[i].write(im0)

        # Print results
        t = tuple(x / seen * 1E3 for x in dt)  # speeds per image
        LOGGER.info(f'Speed: %.1fms pre-process, %.1fms inference, %.1fms NMS per image at shape {(1, 3, *imgsz)}' % t)
        if self.save_txt or save_img:
            s = f"\n{len(list(save_dir.glob('labels/*.txt')))} labels saved to {save_dir / 'labels'}" if self.save_txt \
                else ''
            LOGGER.info(f"Results saved to {colorstr('bold', save_dir)}{s}")
        if self.update:
            strip_optimizer(self.weights)  # update model (to fix SourceChangeWarning)

        return mylabel
        

代碼與run函數(shù)基本相同。run函數(shù)的思路是加載模型和圖片,進(jìn)行模型預(yù)測和推理。類中run函數(shù)修改了images目錄,可自行修改。函數(shù)會(huì)返回識(shí)別到的物體標(biāo)簽以及對(duì)應(yīng)的置信度,可用于其他處理。

二、調(diào)用detect類

下面給出使用這個(gè)API的一個(gè)例程,需要將yolov5源碼文件夾放到程序目錄中。

import cv2
import yolov5-master.detect
import os

video_capture = cv2.VideoCapture(0)
detect_api = yolov5-master.detect.DetectAPI(exist_ok=True)

while True:
	k = cv2.waitKey(1)
    ret, frame = video_capture.read()
    
    path = '你的目錄/yolov5-master/data/myimages'
    cv2.imwrite(os.path.join(path, 'test.jpg'), frame)
    
    label = detect_api.run()
    print(str(label))
    
    image = cv2.imread('你的目錄/yolov5-master/runs/detect/myexp/test.jpg', flags=1)
    cv2.imshow("video", image)

    if k == 27:  # 按下ESC退出窗口
        break

video_capture.release()

實(shí)例化對(duì)象中參數(shù)exist_ok=True的作用是生成的exp目錄會(huì)自行覆蓋,不會(huì)有后面的exp1、exp2、exp3等,方便用于實(shí)時(shí)處理。

結(jié)語

本文假設(shè)你已經(jīng)可以成功跑detect.py的基礎(chǔ)上再去制作API接口。在使用IP攝像頭或者視頻流時(shí),修改實(shí)例化中的參數(shù)即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-455250.html

到了這里,關(guān)于yolov5 python API(供其他程序調(diào)用)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • yolov5傻瓜式調(diào)用usb攝像頭

    yolov5傻瓜式調(diào)用usb攝像頭

    環(huán)境:yolov5 5.0 電腦:戴爾筆記本 當(dāng)你用requirement下載好yolov5的對(duì)應(yīng)的包后就需要使用detect去檢測圖片了。 在5.0版本中,detect要修改的部分主要是以下部分 其中第一條是你的模型可以自己訓(xùn)練也可以用它本身自帶的。 我們主要看第二條。 將default改為’0’使用攝像頭。 一般

    2024年02月12日
    瀏覽(18)
  • python:使用RESTful API(flask)調(diào)用python程序傳遞參數(shù),實(shí)現(xiàn)Web端調(diào)用python程序

    python:使用RESTful API(flask)調(diào)用python程序傳遞參數(shù),實(shí)現(xiàn)Web端調(diào)用python程序

    現(xiàn)有一個(gè)用python寫的程序(或者是一個(gè)或幾個(gè)的函數(shù)接口),需要在Web前端調(diào)用python寫的函數(shù)。如果直接用前端java來調(diào)用會(huì)很不方便,而且會(huì)出現(xiàn)各種麻煩的問題,下面給出如何在web前端調(diào)用python的接口。 使用python的RESTful API庫將python寫的函數(shù)封裝為Web端可調(diào)用的接口,在

    2024年01月20日
    瀏覽(20)
  • Tensorflow調(diào)用訓(xùn)練好的yolov5模型進(jìn)行推理

    Tensorflow調(diào)用訓(xùn)練好的yolov5模型進(jìn)行推理

    conda search找找當(dāng)前源下的CUDA與cuDNN有沒有我們要的版本: Onnx(Open Neural Network Exchange)是一種開放的深度學(xué)習(xí)模型交換格式,用于在不同的深度學(xué)習(xí)框架之間共享模型。它提供了一個(gè)中間格式,可以將模型從一個(gè)框架轉(zhuǎn)換為另一個(gè)框架。 Tensorflow是一個(gè)廣泛使用的深度學(xué)習(xí)框

    2024年02月11日
    瀏覽(26)
  • C++調(diào)用yolov5 onnx模型的初步探索

    yolov5-dnn-cpp-python https://github.com/hpc203/yolov5-dnn-cpp-python 轉(zhuǎn)onnx: 用opencv的dnn模塊做yolov5目標(biāo)檢測的程序,包含兩個(gè)步驟:(1).把pytorch的訓(xùn)練模型.pth文件轉(zhuǎn)換到.onnx文件。(2).opencv的dnn模塊讀取.onnx文件做前向計(jì)算。 SiLU其實(shí)就是swish激活函數(shù),而在onnx模型里是不直接支持swish算子的

    2024年02月12日
    瀏覽(24)
  • ChatGPT 使用 拓展資料: OPENAI 函數(shù)調(diào)用和其他 API 更新

    ChatGPT 使用 拓展資料: OPENAI 函數(shù)調(diào)用和其他 API 更新 我們?cè)诮衲暝缧r(shí)候發(fā)布gpt-3.5-turbo,gpt-4在短短幾個(gè)月內(nèi),已經(jīng)看到開發(fā)人員在這些模型之上構(gòu)建了令人難以置信的應(yīng)用程序。 今天,我們將跟進(jìn)一些令人興奮的更新: Chat Completions API 中的新函數(shù)調(diào)用功能 gpt-4和的更新和

    2024年02月10日
    瀏覽(23)
  • 【學(xué)習(xí)筆記】Yolov5調(diào)用手機(jī)攝像頭實(shí)時(shí)檢測(環(huán)境配置+實(shí)現(xiàn)步驟)

    【學(xué)習(xí)筆記】Yolov5調(diào)用手機(jī)攝像頭實(shí)時(shí)檢測(環(huán)境配置+實(shí)現(xiàn)步驟)

    我們需要首先從GitHub獲取到y(tǒng)olov5的源碼,直達(dá)鏈接如下: https://github.com/ultralytics/yolov5 打開后按照如下步驟下載源碼壓縮包即可 權(quán)重文件下載地址:https://download.csdn.net/download/liujiahao123987/87400892 注:我用的iOS,安卓版本沒有\(zhòng)\\"Lite\\\" 需要的就是這個(gè)局域網(wǎng),每個(gè)人的都不一樣 需

    2023年04月25日
    瀏覽(43)
  • Yolov5調(diào)用??稻W(wǎng)口相機(jī)(mv-ca-11gm)

    Yolov5調(diào)用??稻W(wǎng)口相機(jī)(mv-ca-11gm)

    參考:https://blog.csdn.net/qq_39570716/article/details/117073640?spm=1001.2014.3001.5501 若調(diào)用相機(jī)出現(xiàn)黑屏,則說明程序中的寬高與MVS中的寬高不一致,此時(shí)只需打開MVS查看相機(jī)的寬高,然后將程序中的寬高修改即可。 通過設(shè)備管理器-照相機(jī)可以查看電腦有幾個(gè)攝像頭,通常網(wǎng)口相機(jī)不顯

    2024年02月07日
    瀏覽(17)
  • 【TensorRT】基于C#調(diào)用TensorRT 部署Yolov5模型 - 上篇:構(gòu)建TensorRTSharp

    【TensorRT】基于C#調(diào)用TensorRT 部署Yolov5模型 - 上篇:構(gòu)建TensorRTSharp

    ? NVIDIA TensorRT? 是用于高性能深度學(xué)習(xí)推理的 SDK,可為深度學(xué)習(xí)推理應(yīng)用提供低延遲和高吞吐量。詳細(xì)安裝方式參考以下博客: NVIDIA TensorRT 安裝 (Windows C++) ? 前文中已經(jīng)介紹了在C++中利用TensorRT 部署Yolov5模型,但在實(shí)際應(yīng)用中,經(jīng)常會(huì)出現(xiàn)在C#中部署模型的需求,目前T

    2023年04月24日
    瀏覽(21)
  • 深度學(xué)習(xí)(八)---zed調(diào)用yolov5之目標(biāo)檢測遇到的問題及解決

    1.前言 zed調(diào)用yolov5進(jìn)行目標(biāo)檢測時(shí)遇到的問題,記錄下~~ 2.環(huán)境信息 3.問題及解決 問題1: RuntimeError: cuDNN error: CUDNN_STATUS_MAPPING_ERROR 原因: cuda 沒有正確調(diào)用,導(dǎo)致運(yùn)行報(bào)錯(cuò) 解決: 重新正確引用cuda,可以參考 【深度學(xué)習(xí)(八)—zed調(diào)用yolov5模型進(jìn)行實(shí)時(shí)圖像推理】 小記:這

    2024年02月12日
    瀏覽(21)
  • 解決 調(diào)用yolov5的時(shí)候, No module named ‘utils‘ 的問題

    解決 調(diào)用yolov5的時(shí)候, No module named ‘utils‘ 的問題

    這個(gè)是因?yàn)榇蜷_目錄不是yolov5的根目錄,所以找不到y(tǒng)olov5文件夾下的utils模塊 例如是這種情況:在運(yùn)行detector.py時(shí),yolov5作為一個(gè)模塊被調(diào)用,會(huì)顯示這個(gè)問題。 修改sys.path的方法可能有用,但麻煩且不一定成功,因?yàn)閐etector.py還要依賴上面兩個(gè)文件夾 建議直接把文件夾名字

    2024年02月12日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包