ONNX模型推理,图像显示,看图不知道是哪的问题
推理第一张图片没问题,到第二张就奔溃了,不知道哪的问题
这里插入完整代码,找问题,例子都是按官方示例写的
|
测试_ONNX | | | |
模型路劲 | 文本型 | | | | 图片路径 | 文本型 | | | | 类Txt文件 | 文本型 | | | | 模型输入形状 | Size | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | N | 整数型 | | | net | Net | | | modelInput | Mat | | | class | 文本型 | | 0 | classes | VectorString | | | col | 整数型 | | | row | 整数型 | | | max | 整数型 | | | result | Mat | | | blob | Mat | | | outputs | VectorMat | | | classnames | VectorString | | | rows | 整数型 | | | dimensions | 整数型 | | | size | 整数型 | | 0 | i | 整数型 | | | yolov8 | 逻辑型 | | | data | 整数型 | | | classes_scores | 整数型 | | | x_factor | 小数型 | | | y_factor | 小数型 | | | scores | Mat | | | dims | 整数型 | | | minLoc | Point | | | maxLoc | Point | | | maxClassScore | 双精度小数型 | | | x | 小数型 | | | y | 小数型 | | | w | 小数型 | | | h | 小数型 | | | left | 整数型 | | | top | 整数型 | | | width | 整数型 | | | height | 整数型 | | | class_ids | Vectorint | | | confidences | Vectorfloat | | | boxes | VectorRect | | | nms_result | Vectorint | | | modelConfidenceThreshold | 小数型 | | | modelScoreThreshold | 小数型 | | | modelNMSThreshold | 小数型 | | | idx | 整数型 | | | class_id | 整数型 | | | color | Scalar | | | box | Rect | | | classString | 文本型 | | | textSize | Size | | | frame | Mat | | |
net = readNetFromONNX (模型路劲 ) 如果真 (net. empty ()) 调试输出 (“加载模型失败!”) 返回 () 如果真 (是否为空 (类Txt文件 ))  class = { “person”, “bicycle”, “car”, “motorcycle”, “airplane”, “bus”, “train”, “truck”, “boat”, “traffic light”, “fire hydrant”, “stop sign”, “parking meter”, “bench”, “bird”, “cat”, “dog”, “horse”, “sheep”, “cow”, “elephant”, “bear”, “zebra”, “giraffe”, “backpack”, “umbrella”, “handbag”, “tie”, “suitcase”, “frisbee”, “skis”, “snowboard”, “sports ball”, “kite”, “baseball bat”, “baseball glove”, “skateboard”, “surfboard”, “tennis racket”, “bottle”, “wine glass”, “cup”, “fork”, “knife”, “spoon”, “bowl”, “banana”, “apple”, “sandwich”, “orange”, “broccoli”, “carrot”, “hot dog”, “pizza”, “donut”, “cake”, “chair”, “couch”, “potted plant”, “bed”, “dining table”, “toilet”, “tv”, “laptop”, “mouse”, “remote”, “keyboard”, “cell phone”, “microwave”, “oven”, “toaster”, “sink”, “refrigerator”, “book”, “clock”, “vase”, “scissors”, “teddy bear”, “hair drier”, “toothbrush” } 计次循环首 (取数组成员数 (class ), i )  classes. push_back (class [i ]) 计次循环尾 () 如果真 (是否为空 (模型输入形状 ))  模型输入形状.width = 640  模型输入形状.height = 640 net.setPreferableBackend ( #DNN_BACKEND_OPENCV )net. setPreferableTarget ( #DNN_TARGET_CPU )net. enableFusion (假) modelConfidenceThreshold = 0.25 modelScoreThreshold = 0.45 modelNMSThreshold = 0.5 计次循环首 (取数组成员数 (图片路径 ), N ) modelInput. 指针 (imread (图片路径 [N ]))  如果真 (modelInput. Empty ())  调试输出 (“读取图片失败!”, 图片路径 [N ]) 到循环尾 () 如果真 (模型输入形状.width = 模型输入形状.height )  col = modelInput. Cols ()  row = modelInput. Rows ()  max = 到整数 (最大值 (col, row ))   result. zeros (max, max, #CV_8UC3 ) 调试输出 (“col: ” + 到文本 (result. Cols ()) + “ row: ” + 到文本 (result. Rows ()) + “ channels: ” + 到文本 (result. channels ()) )  modelInput. copyTrect (result, Rect (0, 0, col, row ))  调试输出 (“col: ” + 到文本 (result. Cols ()) + “ row: ” + 到文本 (result. Rows ()) + “ channels: ” + 到文本 (result. channels ()) )  modelInput = result   blobFromImage2 (modelInput, blob, 1 ÷ 255, 模型输入形状, , 真, 假) net. setInput (blob ) classnames = net. getUnconnectedOutLayersNames () 计次循环首 (classnames. size (), i ) 调试输出 (“classnames: ”, classnames. at (i - 1 ))  计次循环尾 () net. forward3 (outputs, classnames ) 如果真 (outputs. size () ≤ 0 或 outputs. empty ())  到循环尾 ()   outputs. at (0 ). size (size ) rows = size [2 ] dimensions = size [3 ] 调试输出 (“outputs: ”, size [1 ], rows, dimensions ) 如果真 (dimensions > rows )   yolov8 = 真   rows = size [3 ]  dimensions = size [2 ]   outputs. IndexReshape (0, 1, dimensions ) transpose (outputs. at (0 ), outputs. at (0 )) data = outputs.at (0).dataToF () x_factor = modelInput. Cols () ÷ 模型输入形状.width  y_factor = modelInput. Rows () ÷ 模型输入形状.height  outputs. at (0 ). size (size )  变量循环首 (0, rows - 1, 1, i )  判断 (yolov8 )   classes_scores = 指针_到地址_ASM (data, 4, 4 )     scores. NewTData (1, classes. size (), #CV_32FC1, classes_scores )  minMaxLoc (scores, , maxClassScore, minLoc, maxLoc )   如果真 (maxClassScore > modelScoreThreshold )    confidences. push_back (maxClassScore )    class_ids. push_back (maxLoc.x )    x = array_float (data, 0 )    y = array_float (data, 1 )    w = array_float (data, 2 )    h = array_float (data, 3 )    left = 取整 ( (x - 0.5 × w ) × x_factor )    top = 取整 ( (y - 0.5 × h ) × y_factor )    width = 取整 (w × x_factor )    height = 取整 (h × y_factor )   调试输出 (“[ ” + 到文本 (i ) + “ ] ” + 到文本 (x ) + “ - ” + 到文本 (y ) + “ - ” + 到文本 (w ) + “ - ” + 到文本 (h ) + “ left:” + 到文本 (left ) + “ top:” + 到文本 (top ) + “ width:” + 到文本 (width ) + “ height:” + 到文本 (height ))     boxes. push_back (Rect (left, top, width, height ))           data = 指针_到地址_ASM (data, dimensions, 4) 变量循环尾 () NMSBoxes (boxes, confidences, modelScoreThreshold, modelNMSThreshold, nms_result ) 调试输出 (“完成推理图像 【 ” + 到文本 (N ) + “ 】 - ” + 到文本 (nms_result. size ()) ) 变量循环首 (0, nms_result. size () - 1, 1, i )  idx = nms_result. at (i )  class_id = class_ids. at (idx ) 调试输出 (“idx: ” + 到文本 (idx ) + “ class_id : ” + 到文本 (class_id ))    color = Scalar (取随机数 (0, 255 ), 取随机数 (0, 255 ), 取随机数 (0, 255 ), 255 )  box = boxes. at (idx ) rectangle2 (result, box, color, 2 )   classString = classes. at (class_id ) + “ ” + 取文本左边 (到文本 (confidences. at (idx )), 4 )  textSize = getTextSize (classString, #FONT_HERSHEY_DUPLEX, 1, 0 )  rectangle2 (result, Rect (box.x, box.y - 40, textSize.width + 10, textSize.height + 20 ), color, #FILLED ) putText (result, classString, Point (box.x + 5, box.y - 10 ), #FONT_HERSHEY_DUPLEX, 1, Scalar (, , , 100 ), 2, 0 ) 变量循环尾 () resize (result, frame, Size (result. Cols () × 0.8, result. Rows () × 0.8 ), , ) imshow (“推理结果”, frame ) waitKey () destroyWindow (“推理结果”) boxes. New () confidences. New () nms_result. New () outputs. New () 计次循环尾 ()destroyAllWindows ()调试输出 (“================================= ok ====================================”)
补充内容 (2025-3-4 08:25):
第一张检测完,检测第二张报错位置: result.zeros (max, max, #CV_8UC3)
补充内容 (2025-3-4 09:01):
自己找到问题了,是自己代码逻辑没写好,.版本 2
result.copyTo (modelInput)
' modelInput = result
修改一下这句两问题都就解决了 |