50. Pow(x, n) - Medium

本文介绍了一种使用二分搜索和递归实现幂运算的方法,即快速幂算法。该算法能够高效计算x^n,时间复杂度为O(logN),适用于n为32位有符号整数的情况。文章通过具体示例展示了算法的正确性和效率。

Implement pow(xn), which calculates x raised to the power n (xn).

Example 1:

Input: 2.00000, 10
Output: 1024.00000

Example 2:

Input: 2.10000, 3
Output: 9.26100

Example 3:

Input: 2.00000, -2
Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25

Note:

  • -100.0 < x < 100.0
  • n is a 32-bit signed integer, within the range [−231, 231 − 1]

 

binary search + 递归,注意n < 0时的处理

time: O(logN), space: O(logN) -- need extra space to store the computation results, there are logN computations in total

class Solution {
    public double myPow(double x, int n) {
        if (n < 0)
            return 1 / helper(x, -n);
        
        return helper(x, n);
    }
    private double helper(double x, int n) {
        if (n == 0) return 1;
        
        double half = helper(x, n / 2);
        if (n % 2 == 0)
            return half * half;
        else
            return half * half * x;
    }
}

 

转载于:https://www.cnblogs.com/fatttcat/p/10063593.html

import os import urllib import traceback import time import sys import numpy as np import cv2 from rknn.api import RKNN ONNX_MODEL = '/home/vincent/桌面/x66/final_model/best_sim.onnx' RKNN_MODEL = '/home/vincent/桌面/x66/final_model/rk-yolov5-dual.rknn' IMG_PATH = './bus.jpg' DATASET = '/home/vincent/桌面/x66/lianghua_testdata/lianghua_ceshi.txt' QUANTIZE_ON = True BOX_THESH = 0.6 NMS_THRESH = 0.01 IMG_SIZE = 416 CLASSES = ("tank_1", "tank_2", "zjc_1", "zjc_2", "fsc_1", "fsc_2", "bus", "car", "truck") def sigmoid(x): return 1 / (1 + np.exp(-x)) def xywh2xyxy(x): # Convert [x, y, w, h] to [x1, y1, x2, y2] y = np.copy(x) y[:, 0] = x[:, 0] - x[:, 2] / 2 # top left x y[:, 1] = x[:, 1] - x[:, 3] / 2 # top left y y[:, 2] = x[:, 0] + x[:, 2] / 2 # bottom right x y[:, 3] = x[:, 1] + x[:, 3] / 2 # bottom right y return y def process(input, mask, anchors): anchors = [anchors[i] for i in mask] grid_h, grid_w = map(int, input.shape[0:2]) box_confidence = sigmoid(input[..., 4]) box_confidence = np.expand_dims(box_confidence, axis=-1) box_class_probs = sigmoid(input[..., 5:]) box_xy = sigmoid(input[..., :2])*2 - 0.5 col = np.tile(np.arange(0, grid_w), grid_w).reshape(-1, grid_w) row = np.tile(np.arange(0, grid_h).reshape(-1, 1), grid_h) col = col.reshape(grid_h, grid_w, 1, 1).repeat(3, axis=-2) row = row.reshape(grid_h, grid_w, 1, 1).repeat(3, axis=-2) grid = np.concatenate((col, row), axis=-1) box_xy += grid box_xy *= int(IMG_SIZE/grid_h) box_wh = pow(sigmoid(input[..., 2:4])*2, 2) box_wh = box_wh * anchors box = np.concatenate((box_xy, box_wh), axis=-1) return box, box_confidence, box_class_probs def filter_boxes(boxes, box_confidences, box_class_probs): """Filter boxes with box threshold. It's a bit different with origin yolov5 post process! # Arguments boxes: ndarray, boxes of objects. box_confidences: ndarray, confidences of objects. box_class_probs: ndarray, class_probs of objects. # Returns boxes: ndarray, filtered boxes. classes: ndarray, classes for boxes. scores: ndarray, scores for boxes. """ box_classes = np.argmax(box_class_probs, axis=-1) box_class_scores = np.max(box_class_probs, axis=-1) pos = np.where(box_confidences[..., 0] >= BOX_THESH) boxes = boxes[pos] classes = box_classes[pos] scores = box_class_scores[pos] return boxes, classes, scores def nms_boxes(boxes, scores): """Suppress non-maximal boxes. # Arguments boxes: ndarray, boxes of objects. scores: ndarray, scores of objects. # Returns keep: ndarray, index of effective boxes. """ x = boxes[:, 0] y = boxes[:, 1] w = boxes[:, 2] - boxes[:, 0] h = boxes[:, 3] - boxes[:, 1] areas = w * h order = scores.argsort()[::-1] keep = [] while order.size > 0: i = order[0] keep.append(i) xx1 = np.maximum(x[i], x[order[1:]]) yy1 = np.maximum(y[i], y[order[1:]]) xx2 = np.minimum(x[i] + w[i], x[order[1:]] + w[order[1:]]) yy2 = np.minimum(y[i] + h[i], y[order[1:]] + h[order[1:]]) w1 = np.maximum(0.0, xx2 - xx1 + 0.00001) h1 = np.maximum(0.0, yy2 - yy1 + 0.00001) inter = w1 * h1 ovr = inter / (areas[i] + areas[order[1:]] - inter) inds = np.where(ovr <= NMS_THRESH)[0] order = order[inds + 1] keep = np.array(keep) return keep def yolov5_post_process(input_data): masks = [[0, 1, 2], [3, 4, 5], [6, 7, 8]] anchors = [[10, 13], [16, 30], [33, 23], [30, 61], [62, 45], [59, 119], [116, 90], [156, 198], [373, 326]] boxes, classes, scores = [], [], [] for input, mask in zip(input_data, masks): b, c, s = process(input, mask, anchors) b, c, s = filter_boxes(b, c, s) boxes.append(b) classes.append(c) scores.append(s) boxes = np.concatenate(boxes) boxes = xywh2xyxy(boxes) classes = np.concatenate(classes) scores = np.concatenate(scores) nboxes, nclasses, nscores = [], [], [] for c in set(classes): inds = np.where(classes == c) b = boxes[inds] c = classes[inds] s = scores[inds] keep = nms_boxes(b, s) nboxes.append(b[keep]) nclasses.append(c[keep]) nscores.append(s[keep]) if not nclasses and not nscores: return None, None, None boxes = np.concatenate(nboxes) classes = np.concatenate(nclasses) scores = np.concatenate(nscores) return boxes, classes, scores def draw(image, boxes, scores, classes): """Draw the boxes on the image. # Argument: image: original image. boxes: ndarray, boxes of objects. classes: ndarray, classes of objects. scores: ndarray, scores of objects. all_classes: all classes name. """ for box, score, cl in zip(boxes, scores, classes): top, left, right, bottom = box print('class: {}, score: {}'.format(CLASSES[cl], score)) print('box coordinate left,top,right,down: [{}, {}, {}, {}]'.format(top, left, right, bottom)) top = int(top) left = int(left) right = int(right) bottom = int(bottom) cv2.rectangle(image, (top, left), (right, bottom), (255, 0, 0), 2) cv2.putText(image, '{0} {1:.2f}'.format(CLASSES[cl], score), (top, left - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2) def letterbox(im, new_shape=(640, 640), color=(0, 0, 0)): # Resize and pad image while meeting stride-multiple constraints shape = im.shape[:2] # current shape [height, width] if isinstance(new_shape, int): new_shape = (new_shape, new_shape) # Scale ratio (new / old) r = min(new_shape[0] / shape[0], new_shape[1] / shape[1]) # Compute padding ratio = r, r # width, height ratios new_unpad = int(round(shape[1] * r)), int(round(shape[0] * r)) dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1] # wh padding dw /= 2 # divide padding into 2 sides dh /= 2 if shape[::-1] != new_unpad: # resize im = cv2.resize(im, new_unpad, interpolation=cv2.INTER_LINEAR) top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1)) left, right = int(round(dw - 0.1)), int(round(dw + 0.1)) im = cv2.copyMakeBorder(im, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color) # add border return im, ratio, (dw, dh) if __name__ == '__main__': ''' # Create RKNN object rknn = RKNN(verbose=True) # pre-process config print('--> Config model') rknn.config(mean_values=[[0, 0, 0]], std_values=[[1, 1, 1]], target_platform='rk3588') print('done') # Load ONNX model print('--> Loading model') ret = rknn.load_onnx(model=ONNX_MODEL, outputs=['output0', '376', '377']) 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) 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(target='rk3588') # ret = rknn.init_runtime('rk3566') if ret != 0: print('Init runtime environment failed!') exit(ret) print('done') ''' # load rknn model RKNN_MODEL = '/home/vincent/桌面/x66/end_model/end_0516_sim_255_500data-416-416_rk3588.rknn' rknn = RKNN(verbose=True) rknn.load_rknn(path=RKNN_MODEL) print('Finished loading model!') # Init runtime environment print('--> Init runtime environment') ret = rknn.init_runtime(target='rk3588', core_mask=RKNN.NPU_CORE_0_1_2, async_mode=True) CCD_PATH = '/home/vincent/wh/code/20240910_x66_code/pyqt_tensorrt_thread/data/XN4_car/JPEGImages_ccd' HW_PATH = '/home/vincent/wh/code/20240910_x66_code/pyqt_tensorrt_thread/data/XN4_car/JPEGImages_hw' total_infer_time=0 count=0 # rknn inference for ccd_png, hw_png in zip(os.listdir(CCD_PATH), os.listdir(HW_PATH)): print(os.path.join(CCD_PATH, ccd_png)) img_ccd = cv2.imread(os.path.join(CCD_PATH, ccd_png), cv2.IMREAD_GRAYSCALE) img_hw = cv2.imread(os.path.join(HW_PATH, hw_png), cv2.IMREAD_GRAYSCALE) ori_h, ori_w = img_ccd.shape # im_zero = np.zeros((ori_h,ori_w)).astype(np.uint8) im_zero = np.zeros_like(img_ccd) # img_yolo_ori = np.dstack((img_hw, im_zero, img_ccd))#BGR img_yolo_ori = cv2.merge([img_hw, im_zero, img_ccd]) img_yolo_resize=cv2.resize(img_yolo_ori, (416, 416)) # img_yolo = img_yolo_resize[:, :, ::-1].transpose(2, 0, 1) # BGR to RGB img_yolo=img_yolo_resize.astype(np.float32) img_yolo = np.ascontiguousarray(img_yolo) # img_yolo /= 255.0 # 0 - 255 to 0.0 - 1.0 img_yolo = np.expand_dims(img_yolo, 0) # (1, 416, 416, 3) # Inference start_time = time.time() print('--> Running model') outputs = rknn.inference(inputs=[img_yolo], data_format=['nhwc']) # print('!!!!', outputs[0].shape) end_time = time.time() print('process_time:', (end_time - start_time) * 1000) total_infer_time+=(end_time-start_time) count+=1 np.save('./onnx_yolov5_0.npy', outputs[0]) np.save('./onnx_yolov5_1.npy', outputs[1]) np.save('./onnx_yolov5_2.npy', outputs[2]) print('done') # post process input0_data = outputs[0] input1_data = outputs[1] input2_data = outputs[2] input0_data = input0_data.reshape([3, -1]+list(input0_data.shape[-2:])) input1_data = input1_data.reshape([3, -1]+list(input1_data.shape[-2:])) input2_data = input2_data.reshape([3, -1]+list(input2_data.shape[-2:])) input_data = list() input_data.append(np.transpose(input0_data, (2, 3, 0, 1))) input_data.append(np.transpose(input1_data, (2, 3, 0, 1))) input_data.append(np.transpose(input2_data, (2, 3, 0, 1))) boxes, classes, scores = yolov5_post_process(input_data) img_ = np.squeeze(img_yolo, axis=0) img_ = img_ / 255 img_1 = cv2.cvtColor(img_, cv2.COLOR_RGB2BGR) if boxes is not None: draw(img_1, boxes, scores, classes) # show output cv2.imshow("post process result", img_1) cv2.waitKey(1) # cv2.destroyAllWindows() rknn.release() print("avg infer time->{:.2f}ms".format((total_infer_time) * 1000/count)) 把这段代码转为c++代码
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值