AI Lab上部署demo服務的方法
阿新 • • 發佈:2018-11-05
1. 引言
AI方向有很多的研究領域,比如影象領域有影象識別、OCR識別等,在對演算法的效果進行優化後,可以將演算法部署在伺服器上,方便對外展示AI研發實力,同時也方便其他同學體驗演算法效果和給出反饋意見,下面介紹如何將自己的演算法也部署成demo服務。
2. 功能框架介紹
從整體上來看,整個框架包括如下部分,
- 網頁前端;
- http請求協議;
- 資料解析;
- 演算法inference;
- 返回結果到伺服器;
3. 演算法程式碼準備
3.1 主程式 index.py(需要修改urls和port)
#!/home/anaconda2/bin/python
# coding: UTF-8
import sys
import os
import tornado.httpserver
import tornado.ioloop
import torndsession
from tornado.options import define, options
define("port", default=6007, help="run on the given port", type=int)
from interface import *
urls = [
(r'/sample', TextRecognition),
]
def main() :
tornado.options.parse_command_line()
app=tornado.web.Application(urls,
template_path=os.path.join(os.path.dirname(__file__), 'template'),
static_path=os.path.join(os.path.dirname(__file__), 'static'))
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen( options.port)
tornado.ioloop.IOLoop.current().start()
if __name__ == "__main__":
main()
3.2 http介面相關程式碼 interface.py
對於待修改的程式碼部分,
輸入引數:原始影象矩陣,numpy格式;
輸出引數:待顯示到瀏覽器頁面的結果資料;
# -*- coding: utf-8 -*-
import sys
import os
import hashlib
import time
import urllib2
import json
import datetime
import tornado.web
import tornado.gen
import random
import string
import requests
import main
import numpy as np
from PIL import Image
import cv2
from torndsession.sessionhandler import SessionBaseHandler
class TextRecognition(SessionBaseHandler):
ocr=main.OCR()
def get(self):
pass
def post(self):
filepath=self.get_argument('file', '').encode('utf-8')
im = Image.open(filepath)
img = np.array(im.convert('RGB'))
#-----------------------這一部分為待修改程式碼--------------------------
result, img_with_boxes, angle, text_recs = self.ocr.detect_and_recognition(img)
filepath = filepath.split('.')
filepath.insert(-1,'gen')
dest_path = '.'.join(filepath)
#向伺服器返回圖片資料。寫圖片到該資料夾即可,前端會做視覺化相關的操作。
dest_path = dest_path.split('/')[-1]
dest_path = '/home/share/ocr/gen_pic/'+dest_path
cv2.imwrite(dest_path, img_with_boxes[:, :, ::-1])
#向伺服器返回文字資料
self.write('hello world!') #Here is an example
#-----------------------這一部分為待修改程式碼,finished!--------------------------
3.3 前向inference程式碼main.py
# coding:utf-8
import numpy as np
from ctpn.tools.cfg import Config as cfg
from ctpn.src.other import CaffeModel
import cv2, os, caffe, sys
from detectors import TextProposalDetector, TextDetector
import os.path as osp
from utils.timer import Timer
import time
from glob import glob
from PIL import Image
from crnn.crnn import crnnSource
from matplotlib import cm
import model
NET_DEF_FILE="###.prototxt"
MODEL_FILE="###.caffemodel_T"
caffe.set_mode_cpu()
class OCR:
def __init__(self):
text_proposals_detector=TextProposalDetector(CaffeModel(NET_DEF_FILE, MODEL_FILE))
self.text_detector=TextDetector(text_proposals_detector)
self.recog_model, self.converter = crnnSource()
def detect_and_recognition(self, img):
'''result,img,angel分別對應-識別結果,影象的陣列,文字旋轉角度'''
#text_recs=self.text_detector.detect(im)
result, img_with_boxes, angle, text_recs = model.model(img, self.text_detector, self.recog_model, self.converter, detectAngle=False)
return result, img_with_boxes, angle, text_recs
if __name__ == '__main__':
ocr_obj = OCR()
img_path = "./test/ad_test.jpg"
img_path = "./test/test.png"
#img_path = "./test/004.jpg"
im = Image.open(img_path)
img = np.array(im.convert('RGB'))
#img, f = resize_im(img, cfg.SCALE, cfg.MAX_SCALE)
result, img_with_boxes, angle, text_recs = ocr_obj.detect_and_recognition(img)
dest_path = dest_path.split('/')[-1]
dest_path = '/tmp/ocr/gen_pic/'+dest_path
print dest_path
cv2.imwrite(dest_path, img_with_boxes[:, :, ::-1])
print('print recognition result:')
res = []
for key in result:
res.append(result[key][1])
print('\n'.join(res))
`
注意:這裡需要將模型載入等初始化操作放在 _init_ 函式內部,inference核心程式碼單獨放在其餘函式內!!!
4. 操作步驟
步驟1:準備優化好的演算法模型,本地驗證效果Ok;
步驟2:本地驗證。將程式碼修改成main.py中的格式,執行main.py結果正常;
步驟3:修改index.py和interface.py,執行python index.py無語法錯誤;
步驟4:執行命令 nohup python index.py &,保持服務後臺執行。
步驟5:聯絡伺服器管理員,增加前端展示頁面。