大气建站工作室网站源码,杭州做网站的,沈阳网站设计制作,跑胡子网站开发yolov8 opencv模型部署#xff08;python版#xff09;
使用opencv推理yolov8模型#xff0c;以yolov8n为例子#xff0c;一共几十行代码#xff0c;没有废话#xff0c;给出了注释#xff0c;从今天起#xff0c;少写一行代码#xff0c;少掉一根头发。测试数据有需…yolov8 opencv模型部署python版
使用opencv推理yolov8模型以yolov8n为例子一共几十行代码没有废话给出了注释从今天起少写一行代码少掉一根头发。测试数据有需要见文章结尾。
一、安装yolov8
conda create -n yolov8 python3.9 -y
conda activate yolov8
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple二、导出onnx
导出onnx格式模型的时候注意如果你是自己训练的模型只需要把以下代码中yolov8n.pt修改为自己的模型即可如best.pt。如果是下面代码中默认的模型并且你没有下载到本地系统会自动下载我这里在文章末尾提供了下载链接。 将以下代码创建、拷贝到yolov8根目录下。 具体代码my_export.py
from ultralytics import YOLO
# Load a model
model YOLO(yolov8n.pt) # load an official model
# Export the model
model.export(formatonnx, opset12)执行导出命令
python my_export.py输出如下图信息表明onnx格式的模型被成功导出保存在my_export.py同一级目录。
三、基于opencv推理onnx
在章节一中安装了ultralytics的时候默认安装了opencv-python4.8.0.74所以推理的时候可以直接利用这个python环境。将以下代码创建、拷贝到yolov8根目录下。 具体代码infer_opencv.py
import argparse
import cv2.dnn
import numpy as np
注意如果你推理自己的模型以下类别需要改成你自己的具体类别# coco80个类别
CLASSES {0: person, 1: bicycle, 2: car, 3: motorcycle, 4: airplane, 5: bus, 6: train, 7: truck, 8: boat, 9: traffic light, 10: fire hydrant, 11: stop sign, 12: parking meter, 13: bench, 14: bird, 15: cat, 16: dog, 17: horse, 18: sheep, 19: cow, 20: elephant, 21: bear, 22: zebra, 23: giraffe, 24: backpack, 25: umbrella, 26: handbag, 27: tie, 28: suitcase, 29: frisbee, 30: skis, 31: snowboard, 32: sports ball, 33: kite, 34: baseball bat, 35: baseball glove, 36: skateboard, 37: surfboard, 38: tennis racket, 39: bottle, 40: wine glass, 41: cup, 42: fork, 43: knife, 44: spoon, 45: bowl, 46: banana, 47: apple, 48: sandwich, 49: orange, 50: broccoli, 51: carrot, 52: hot dog, 53: pizza, 54: donut, 55: cake, 56: chair, 57: couch, 58: potted plant, 59: bed, 60: dining table, 61: toilet, 62: tv, 63: laptop, 64: mouse, 65:
remote, 66: keyboard, 67: cell phone, 68: microwave, 69: oven, 70: toaster, 71: sink, 72: refrigerator, 73: book, 74: clock, 75: vase, 76: scissors, 77: teddy bear, 78: hair drier, 79: toothbrush}
# 80个类别对应80中随机颜色
colors np.random.uniform(0, 255, size(len(CLASSES), 3))# 绘制
def draw_bounding_box(img, class_id, confidence, x, y, x_plus_w, y_plus_h):label f{CLASSES[class_id]} ({confidence:.2f})color colors[class_id]# 绘制矩形框cv2.rectangle(img, (x, y), (x_plus_w, y_plus_h), color, 2)# 绘制类别cv2.putText(img, label, (x - 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)def main(onnx_model, input_image):# 使用opencv读取onnx文件model: cv2.dnn.Net cv2.dnn.readNetFromONNX(onnx_model)# 读取原图original_image: np.ndarray cv2.imread(input_image)[height, width, _] original_image.shapelength max((height, width))image np.zeros((length, length, 3), np.uint8)image[0:height, 0:width] original_imagescale length / 640 # 缩放比例# 设置模型输入blob cv2.dnn.blobFromImage(image, scalefactor1 / 255, size(640, 640), swapRBTrue)model.setInput(blob)# 推理outputs model.forward() # output: 1 X 8400 x 84outputs np.array([cv2.transpose(outputs[0])])rows outputs.shape[1]boxes []scores []class_ids []# outputs有8400行遍历每一行筛选最优检测结果for i in range(rows):# 找到第i个候选目标在80个类别中最可能的类别classes_scores outputs[0][i][4:] # classes_scores:80 X 1(minScore, maxScore, minClassLoc, (x, maxClassIndex)) cv2.minMaxLoc(classes_scores)if maxScore 0.25:box [# cx cy w h - x y w h outputs[0][i][0] - (0.5 * outputs[0][i][2]), outputs[0][i][1] - (0.5 * outputs[0][i][3]),outputs[0][i][2], outputs[0][i][3]]boxes.append(box) #边界框scores.append(maxScore) # 置信度class_ids.append(maxClassIndex) # 类别# opencv版最极大值抑制result_boxes cv2.dnn.NMSBoxes(boxes, scores, 0.25, 0.45, 0.5)for i in range(len(result_boxes)):index result_boxes[i]box boxes[index]draw_bounding_box(original_image, class_ids[index], scores[index], round(box[0] * scale), round(box[1] * scale),round((box[0] box[2]) * scale), round((box[1] box[3]) * scale))cv2.imshow(image, original_image)cv2.waitKey(0)cv2.destroyAllWindows()if __name__ __main__:parser argparse.ArgumentParser()parser.add_argument(--model, defaultyolov8n.onnx, helpInput your onnx model.)parser.add_argument(--img, defaultstr(bus.jpg), helpPath to input image.)args parser.parse_args()main(args.model, args.img)
在终端执行推理命令命令如下
python infer_opencv.py --model yolov8n.onnx --img bus.jpg效果图如图所示 资源下载可以自己使用文章代码生成也可以使用以下资源 链接https://pan.baidu.com/s/1mCBx_TVpUhpREoMXhRIlJw?pwdfkmt 提取码fkmt