def execute(self): """执行业务逻辑""" utils.info( 'API REQUEST INFO[' + self.request.path + '][' + self.request.method + '][' + self.request.remote_ip + '][' + str(self.request.arguments) + ']', ApiImageDigit) img_file = self.get_argument('img_file', '') model_path = self.get_argument('model_path', '') if img_file == '': return {'code': 2, 'msg': 'img_file不能为空'} if model_path == '': model_path = MODEL_PATH res = {} try: ret, msg, res = infer.infer(img_file, model_path) if ret != 0: utils.error('execute fail [' + img_file + '] ' + msg, ApiImageDigit) return {'code': 4, 'msg': '查询失败'} except: utils.error('execute fail [' + img_file + '] ' + utils.get_trace(), ApiImageDigit) return {'code': 5, 'msg': '查询失败'} # 组织返回格式 return {'code': 0, 'msg': 'success', 'data': res}
def post(self): """post请求处理""" try: result = self.execute() except: utils.error('execute fail ' + utils.get_trace(), ApiImageDigit) result = {'code': 1, 'msg': '查询失败'} utils.info('API RES[' + self.request.path + '][' + self.request.method + '][' + str(result['code']) + '][' + str(result['msg']) + ']', ApiImageDigit) self.write(json.dumps(result))
def infer(img_file='', model_path='./'): if img_file == '': opts, args = getopt.getopt(sys.argv[1:], "p:", ["file_name="]) if len(args) == 0: print( "usage: python infer.py [file_name_name] \n\tpython infer.py infer_62.jpeg" ) return 1, 'file_name is empty', {} file_name = args[0] img_file = './data/image/' + file_name else: file_name = img_file.split('/')[-1] # 是否使用GPU use_cuda = False # set to True if training with GPU place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() params_dirname = model_path + "/model/" # 模型参数保存目录 height = width = 28 # 加载测试数据 imgs = [] #使用多种不同的预处理方法 imgs_weight = [1, 0.99, 0.99] #不同预处理方法的结果权重 try: #测试集图片 imgs.append(utils.load_image(img_file, height, width)) except: utils.warning(utils.get_trace()) imgs.append([]) try: #白纸手写照片 if len(file_name.split('_')[1].split('.')[0]) >= 2 and int( file_name.split('_')[1][1:2]) > 0: imgs_weight[1] = 5 imgs.append( utils.load_image(img_file, height, width, rotate=0, sobel=True, save_resize=True, ksize=5, dilate=1)) except: utils.warning(utils.get_trace(), 'infer') imgs.append([]) try: #黑纸粗笔写照片 imgs.append( utils.load_image(img_file, height, width, rotate=0, sobel=True, save_resize=True, ksize=3, dilate=6, erode=1)) except: utils.warning(utils.get_trace(), 'infer') imgs.append([]) # 使用保存的模型参数+测试图片进行预测 inferencer = Inferencer( # infer_func=softmax_regression, # uncomment for softmax regression # infer_func=multilayer_perceptron, # uncomment for MLP infer_func=utils.convolutional_neural_network, # uncomment for LeNet5 param_path=params_dirname, place=place) results = [] results_sum = numpy.ndarray([]) numpy.set_printoptions(precision=2) for i in xrange(len(imgs)): if len(imgs[i]) == 0: continue result = inferencer.infer({'img': imgs[i]}) #此输入img的各label概率 result = numpy.where(result[0][0] > 0.01, result[0][0], 0) #概率<0.1%的直接设置为0 print(result) results.append(result) print(numpy.argsort(result)) results_sum = results_sum + result * imgs_weight[i] #累加label下标概率 #print(imgs_weight) #按概率加和排序 lab = numpy.argsort( results_sum) # probs and lab are the results of one batch data label = lab[-1] #概率倒排最后一个 weight = [] for result in results: if numpy.argsort(result)[-1] == label: weight = result print("*label weight sort:") print(results_sum) print(lab) print("*img: %s" % img_file) print("*label: %d weight: %f" % (label, weight[label])) return 0, '', { 'img': img_file, 'label': label, 'weight': list(weight.astype(str)) }