update
4
onnx2rknn/datasets_gift.txt
Normal file
@ -0,0 +1,4 @@
|
||||
./gift_data/01_20220915-184726_e9ade0d6-fc05-4fec-8031-0a576f8603e4_6974844373504_5_01.jpg
|
||||
./gift_data/01_20220916-162541_f81f6704-5a94-4d40-b628-2ebecd406050_8000500384794_2_01.jpg
|
||||
./gift_data/01_20220919-180140_e1d7626f-37ac-46bc-8267-01562fecdc79_6972526870914_7_01.jpg
|
||||
./gift_data/01_20220919-180140_e1d7626f-37ac-46bc-8267-01562fecdc79_6972526870914_7_01.jpg
|
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 54 KiB |
242
onnx2rknn/onnx2rknn_demo_v10n_224x224_sigmoid.py
Normal file
@ -0,0 +1,242 @@
|
||||
import os
|
||||
import urllib
|
||||
import traceback
|
||||
import time
|
||||
import sys
|
||||
import numpy as np
|
||||
import cv2
|
||||
from rknn.api import RKNN
|
||||
from math import exp
|
||||
|
||||
|
||||
ONNX_MODEL = '../ckpts/20250514/best_gift_v10n_rk.onnx'
|
||||
#RKNN_MODEL = './rk21b/best_0375.rknn'
|
||||
RKNN_MODEL = '../ckpts/20250514/best_gift_v10n.rknn'
|
||||
#RKNN_MODEL = './rk23b/best_v10s_width0375_1205.rknn'
|
||||
|
||||
DATASET = './datasets_gift.txt'
|
||||
|
||||
QUANTIZE_ON = True
|
||||
|
||||
|
||||
#CLASSES = ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light']
|
||||
#CLASSES = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
|
||||
CLASSES = ['tag', 'bandage']
|
||||
|
||||
meshgrid = []
|
||||
|
||||
class_num = len(CLASSES)
|
||||
head_num = 3
|
||||
strides = [8, 16, 32]
|
||||
map_size = [[28, 28], [14, 14], [7, 7]]
|
||||
object_thresh = 0.3
|
||||
|
||||
input_height = 224
|
||||
input_width = 224
|
||||
|
||||
topK = 50
|
||||
|
||||
|
||||
class DetectBox:
|
||||
def __init__(self, classId, score, xmin, ymin, xmax, ymax):
|
||||
self.classId = classId
|
||||
self.score = score
|
||||
self.xmin = xmin
|
||||
self.ymin = ymin
|
||||
self.xmax = xmax
|
||||
self.ymax = ymax
|
||||
|
||||
|
||||
def GenerateMeshgrid():
|
||||
for index in range(head_num):
|
||||
for i in range(map_size[index][0]):
|
||||
for j in range(map_size[index][1]):
|
||||
meshgrid.append(j + 0.5)
|
||||
meshgrid.append(i + 0.5)
|
||||
|
||||
|
||||
def TopK(detectResult):
|
||||
if len(detectResult) <= topK:
|
||||
return detectResult
|
||||
else:
|
||||
predBoxs = []
|
||||
sort_detectboxs = sorted(detectResult, key=lambda x: x.score, reverse=True)
|
||||
for i in range(topK):
|
||||
predBoxs.append(sort_detectboxs[i])
|
||||
return predBoxs
|
||||
|
||||
|
||||
def sigmoid(x):
|
||||
return 1 / (1 + exp(-x))
|
||||
|
||||
|
||||
def postprocess(out, img_h, img_w):
|
||||
print('postprocess ... ')
|
||||
|
||||
detectResult = []
|
||||
output = []
|
||||
for i in range(len(out)):
|
||||
output.append(out[i].reshape((-1)))
|
||||
|
||||
scale_h = img_h / input_height
|
||||
scale_w = img_w / input_width
|
||||
|
||||
gridIndex = -2
|
||||
cls_index = 0
|
||||
cls_max = 0
|
||||
|
||||
for index in range(head_num):
|
||||
reg = output[index * 2 + 0]
|
||||
cls = output[index * 2 + 1]
|
||||
|
||||
for h in range(map_size[index][0]):
|
||||
for w in range(map_size[index][1]):
|
||||
gridIndex += 2
|
||||
|
||||
if 1 == class_num:
|
||||
# cls_max = sigmoid(cls[0 * map_size[index][0] * map_size[index][1] + h * map_size[index][1] + w])
|
||||
cls_max = cls[0 * map_size[index][0] * map_size[index][1] + h * map_size[index][1] + w]
|
||||
cls_index = 0
|
||||
else:
|
||||
for cl in range(class_num):
|
||||
cls_val = cls[cl * map_size[index][0] * map_size[index][1] + h * map_size[index][1] + w]
|
||||
if 0 == cl:
|
||||
cls_max = cls_val
|
||||
cls_index = cl
|
||||
else:
|
||||
if cls_val > cls_max:
|
||||
cls_max = cls_val
|
||||
cls_index = cl
|
||||
# cls_max = sigmoid(cls_max)
|
||||
cls_max = cls_max
|
||||
|
||||
if cls_max > object_thresh:
|
||||
regdfl = []
|
||||
for lc in range(4):
|
||||
sfsum = 0
|
||||
locval = 0
|
||||
for df in range(16):
|
||||
temp = exp(reg[((lc * 16) + df) * map_size[index][0] * map_size[index][1] + h * map_size[index][1] + w])
|
||||
reg[((lc * 16) + df) * map_size[index][0] * map_size[index][1] + h * map_size[index][ 1] + w] = temp
|
||||
sfsum += temp
|
||||
|
||||
for df in range(16):
|
||||
sfval = reg[((lc * 16) + df) * map_size[index][0] * map_size[index][1] + h * map_size[index][
|
||||
1] + w] / sfsum
|
||||
locval += sfval * df
|
||||
regdfl.append(locval)
|
||||
|
||||
x1 = (meshgrid[gridIndex + 0] - regdfl[0]) * strides[index]
|
||||
y1 = (meshgrid[gridIndex + 1] - regdfl[1]) * strides[index]
|
||||
x2 = (meshgrid[gridIndex + 0] + regdfl[2]) * strides[index]
|
||||
y2 = (meshgrid[gridIndex + 1] + regdfl[3]) * strides[index]
|
||||
|
||||
xmin = x1 * scale_w
|
||||
ymin = y1 * scale_h
|
||||
xmax = x2 * scale_w
|
||||
ymax = y2 * scale_h
|
||||
|
||||
xmin = xmin if xmin > 0 else 0
|
||||
ymin = ymin if ymin > 0 else 0
|
||||
xmax = xmax if xmax < img_w else img_w
|
||||
ymax = ymax if ymax < img_h else img_h
|
||||
|
||||
box = DetectBox(cls_index, cls_max, xmin, ymin, xmax, ymax)
|
||||
detectResult.append(box)
|
||||
# topK
|
||||
print('before topK num is:', len(detectResult))
|
||||
predBox = TopK(detectResult)
|
||||
|
||||
return predBox
|
||||
|
||||
|
||||
|
||||
def export_rknn_inference(img):
|
||||
# Create RKNN object
|
||||
rknn = RKNN(verbose=False)
|
||||
|
||||
# pre-process config
|
||||
print('--> Config model')
|
||||
rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], quantized_algorithm='normal', quantized_method='channel', target_platform='rk3588')
|
||||
print('done')
|
||||
|
||||
# Load ONNX model
|
||||
print('--> Loading model')
|
||||
ret = rknn.load_onnx(model=ONNX_MODEL)
|
||||
if ret != 0:
|
||||
print('Load model failed!')
|
||||
exit(ret)
|
||||
print('done')
|
||||
|
||||
# Build model
|
||||
print('--> Building model')
|
||||
ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET, rknn_batch_size=1)
|
||||
if ret != 0:
|
||||
print('Build model failed!')
|
||||
exit(ret)
|
||||
print('done')
|
||||
|
||||
# Export RKNN model
|
||||
print('--> Export rknn model')
|
||||
ret = rknn.export_rknn(RKNN_MODEL)
|
||||
if ret != 0:
|
||||
print('Export rknn model failed!')
|
||||
exit(ret)
|
||||
print('done')
|
||||
|
||||
# Init runtime environment
|
||||
print('--> Init runtime environment')
|
||||
ret = rknn.init_runtime()
|
||||
# ret = rknn.init_runtime(target='rk3566')
|
||||
if ret != 0:
|
||||
print('Init runtime environment failed!')
|
||||
exit(ret)
|
||||
print('done')
|
||||
|
||||
# Inference
|
||||
print('--> Running model')
|
||||
outputs = rknn.inference(inputs=[img])
|
||||
rknn.release()
|
||||
print('done')
|
||||
|
||||
return outputs
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print('This is main ...')
|
||||
GenerateMeshgrid()
|
||||
|
||||
img_path = './test/fg_mat.png'
|
||||
src_img = cv2.imread(img_path)
|
||||
img_h, img_w = src_img.shape[:2]
|
||||
|
||||
|
||||
input_img = cv2.resize(src_img, (input_width, input_height))
|
||||
input_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2RGB)
|
||||
|
||||
input_img = np.expand_dims(input_img, 0)
|
||||
|
||||
outputs = export_rknn_inference(input_img)
|
||||
|
||||
out = []
|
||||
for i in range(len(outputs)):
|
||||
out.append(outputs[i])
|
||||
|
||||
predbox = postprocess(out, img_h, img_w)
|
||||
|
||||
print(len(predbox))
|
||||
|
||||
for i in range(len(predbox)):
|
||||
xmin = int(predbox[i].xmin)
|
||||
ymin = int(predbox[i].ymin)
|
||||
xmax = int(predbox[i].xmax)
|
||||
ymax = int(predbox[i].ymax)
|
||||
classId = predbox[i].classId
|
||||
score = predbox[i].score
|
||||
|
||||
cv2.rectangle(src_img, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2)
|
||||
title = CLASSES[classId] + ":%.2f" % (score)
|
||||
cv2.putText(src_img, title, (xmin, ymin), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2, cv2.LINE_AA)
|
||||
|
||||
cv2.imwrite('./test_rknn_result_cls10.jpg', src_img)
|
||||
|
242
onnx2rknn/onnx2rknn_demo_v10n_224x224_sigmoid.py.bak
Normal file
@ -0,0 +1,242 @@
|
||||
import os
|
||||
import urllib
|
||||
import traceback
|
||||
import time
|
||||
import sys
|
||||
import numpy as np
|
||||
import cv2
|
||||
from rknn.api import RKNN
|
||||
from math import exp
|
||||
|
||||
|
||||
ONNX_MODEL = '../ckpts/best_gift_v10n_rk.onnx'
|
||||
#RKNN_MODEL = './rk21b/best_0375.rknn'
|
||||
RKNN_MODEL = '../ckpts/best_gift_v10n_rk.rknn'
|
||||
#RKNN_MODEL = './rk23b/best_v10s_width0375_1205.rknn'
|
||||
|
||||
DATASET = './datasets_gift.txt'
|
||||
|
||||
QUANTIZE_ON = True
|
||||
|
||||
|
||||
|
||||
CLASSES = ['tag', 'bandage']
|
||||
|
||||
meshgrid = []
|
||||
|
||||
class_num = len(CLASSES)
|
||||
head_num = 3
|
||||
strides = [8, 16, 32]
|
||||
map_size = [[28, 28], [14, 14], [7, 7]]
|
||||
object_thresh = 0.3
|
||||
|
||||
input_height = 224
|
||||
input_width = 224
|
||||
|
||||
topK = 50
|
||||
|
||||
|
||||
class DetectBox:
|
||||
def __init__(self, classId, score, xmin, ymin, xmax, ymax):
|
||||
self.classId = classId
|
||||
self.score = score
|
||||
self.xmin = xmin
|
||||
self.ymin = ymin
|
||||
self.xmax = xmax
|
||||
self.ymax = ymax
|
||||
|
||||
|
||||
def GenerateMeshgrid():
|
||||
for index in range(head_num):
|
||||
for i in range(map_size[index][0]):
|
||||
for j in range(map_size[index][1]):
|
||||
meshgrid.append(j + 0.5)
|
||||
meshgrid.append(i + 0.5)
|
||||
|
||||
|
||||
def TopK(detectResult):
|
||||
if len(detectResult) <= topK:
|
||||
return detectResult
|
||||
else:
|
||||
predBoxs = []
|
||||
sort_detectboxs = sorted(detectResult, key=lambda x: x.score, reverse=True)
|
||||
for i in range(topK):
|
||||
predBoxs.append(sort_detectboxs[i])
|
||||
return predBoxs
|
||||
|
||||
|
||||
def sigmoid(x):
|
||||
return 1 / (1 + exp(-x))
|
||||
|
||||
|
||||
def postprocess(out, img_h, img_w):
|
||||
print('postprocess ... ')
|
||||
|
||||
detectResult = []
|
||||
output = []
|
||||
for i in range(len(out)):
|
||||
output.append(out[i].reshape((-1)))
|
||||
|
||||
scale_h = img_h / input_height
|
||||
scale_w = img_w / input_width
|
||||
|
||||
gridIndex = -2
|
||||
cls_index = 0
|
||||
cls_max = 0
|
||||
|
||||
for index in range(head_num):
|
||||
reg = output[index * 2 + 0]
|
||||
cls = output[index * 2 + 1]
|
||||
|
||||
for h in range(map_size[index][0]):
|
||||
for w in range(map_size[index][1]):
|
||||
gridIndex += 2
|
||||
|
||||
if 1 == class_num:
|
||||
# cls_max = sigmoid(cls[0 * map_size[index][0] * map_size[index][1] + h * map_size[index][1] + w])
|
||||
cls_max = cls[0 * map_size[index][0] * map_size[index][1] + h * map_size[index][1] + w]
|
||||
cls_index = 0
|
||||
else:
|
||||
for cl in range(class_num):
|
||||
cls_val = cls[cl * map_size[index][0] * map_size[index][1] + h * map_size[index][1] + w]
|
||||
if 0 == cl:
|
||||
cls_max = cls_val
|
||||
cls_index = cl
|
||||
else:
|
||||
if cls_val > cls_max:
|
||||
cls_max = cls_val
|
||||
cls_index = cl
|
||||
# cls_max = sigmoid(cls_max)
|
||||
cls_max = cls_max
|
||||
|
||||
if cls_max > object_thresh:
|
||||
# print(cls_max)
|
||||
regdfl = []
|
||||
for lc in range(4):
|
||||
sfsum = 0
|
||||
locval = 0
|
||||
for df in range(16): # 16
|
||||
temp = exp(reg[((lc * 16) + df) * map_size[index][0] * map_size[index][1] + h * map_size[index][1] + w])
|
||||
reg[((lc * 16) + df) * map_size[index][0] * map_size[index][1] + h * map_size[index][ 1] + w] = temp
|
||||
sfsum += temp
|
||||
#
|
||||
for df in range(16): # 16
|
||||
sfval = reg[((lc * 16) + df) * map_size[index][0] * map_size[index][1] + h * map_size[index][
|
||||
1] + w] / sfsum
|
||||
locval += sfval * df
|
||||
regdfl.append(locval)
|
||||
#
|
||||
x1 = (meshgrid[gridIndex + 0] - regdfl[0]) * strides[index]
|
||||
y1 = (meshgrid[gridIndex + 1] - regdfl[1]) * strides[index]
|
||||
x2 = (meshgrid[gridIndex + 0] + regdfl[2]) * strides[index]
|
||||
y2 = (meshgrid[gridIndex + 1] + regdfl[3]) * strides[index]
|
||||
|
||||
xmin = x1 * scale_w
|
||||
ymin = y1 * scale_h
|
||||
xmax = x2 * scale_w
|
||||
ymax = y2 * scale_h
|
||||
|
||||
xmin = xmin if xmin > 0 else 0
|
||||
ymin = ymin if ymin > 0 else 0
|
||||
xmax = xmax if xmax < img_w else img_w
|
||||
ymax = ymax if ymax < img_h else img_h
|
||||
|
||||
box = DetectBox(cls_index, cls_max, xmin, ymin, xmax, ymax)
|
||||
detectResult.append(box)
|
||||
# topK
|
||||
print('before topK num is:', len(detectResult))
|
||||
predBox = TopK(detectResult)
|
||||
|
||||
return predBox
|
||||
|
||||
|
||||
|
||||
def export_rknn_inference(img):
|
||||
# Create RKNN object
|
||||
rknn = RKNN(verbose=False)
|
||||
|
||||
# pre-process config
|
||||
print('--> Config model')
|
||||
rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], quantized_algorithm='normal', quantized_method='channel', target_platform='rk3588')
|
||||
print('done')
|
||||
|
||||
# Load ONNX model
|
||||
print('--> Loading model')
|
||||
ret = rknn.load_onnx(model=ONNX_MODEL)
|
||||
if ret != 0:
|
||||
print('Load model failed!')
|
||||
exit(ret)
|
||||
print('done')
|
||||
|
||||
# Build model
|
||||
print('--> Building model')
|
||||
ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET, rknn_batch_size=1)
|
||||
if ret != 0:
|
||||
print('Build model failed!')
|
||||
exit(ret)
|
||||
print('done')
|
||||
|
||||
# Export RKNN model
|
||||
print('--> Export rknn model')
|
||||
ret = rknn.export_rknn(RKNN_MODEL)
|
||||
if ret != 0:
|
||||
print('Export rknn model failed!')
|
||||
exit(ret)
|
||||
print('done')
|
||||
|
||||
# Init runtime environment
|
||||
print('--> Init runtime environment')
|
||||
ret = rknn.init_runtime()
|
||||
# ret = rknn.init_runtime(target='rk3566')
|
||||
if ret != 0:
|
||||
print('Init runtime environment failed!')
|
||||
exit(ret)
|
||||
print('done')
|
||||
|
||||
# Inference
|
||||
print('--> Running model')
|
||||
outputs = rknn.inference(inputs=[img])
|
||||
rknn.release()
|
||||
print('done')
|
||||
|
||||
return outputs
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print('This is main ...')
|
||||
GenerateMeshgrid()
|
||||
|
||||
img_path = './test/1.jpg'
|
||||
src_img = cv2.imread(img_path)
|
||||
img_h, img_w = src_img.shape[:2]
|
||||
|
||||
|
||||
input_img = cv2.resize(src_img, (input_width, input_height))
|
||||
input_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2RGB)
|
||||
|
||||
input_img = np.expand_dims(input_img, 0)
|
||||
|
||||
outputs = export_rknn_inference(input_img)
|
||||
|
||||
out = []
|
||||
for i in range(len(outputs)):
|
||||
out.append(outputs[i])
|
||||
|
||||
predbox = postprocess(out, img_h, img_w)
|
||||
|
||||
print(len(predbox))
|
||||
|
||||
for i in range(len(predbox)):
|
||||
xmin = int(predbox[i].xmin)
|
||||
ymin = int(predbox[i].ymin)
|
||||
xmax = int(predbox[i].xmax)
|
||||
ymax = int(predbox[i].ymax)
|
||||
classId = predbox[i].classId
|
||||
score = predbox[i].score
|
||||
|
||||
cv2.rectangle(src_img, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2)
|
||||
title = CLASSES[classId] + ":%.2f" % (score)
|
||||
cv2.putText(src_img, title, (xmin, ymin), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2, cv2.LINE_AA)
|
||||
|
||||
cv2.imwrite('./test_rknn_result_cls10.jpg', src_img)
|
||||
|
BIN
onnx2rknn/test/1.jpg
Normal file
After Width: | Height: | Size: 431 KiB |
BIN
onnx2rknn/test/2.jpg
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
onnx2rknn/test/fg_mat.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
onnx2rknn/test/fg_mat_1.png
Normal file
After Width: | Height: | Size: 78 KiB |