天然場景下的文字檢測是深度學習的重要應用,在以前的文章中已經介紹過了在簡單場景、複雜場景下的文字檢測方法,包括MSER+NMS、CTPN、SegLink、EAST等方法,詳見文章:python
【AI實戰】手把手教你文字識別(檢測篇一: MSER、CTPN、SegLink、EAST方法)git
今天將繼續介紹複雜場景下基於深度學習的文本檢測方法,手把手教你如何使用AdvancedEAST、PixelLink進行文本檢測。github
一、AdvancedEAST方法實戰
在上一篇文本檢測的AI實戰文章中,介紹了EAST檢測方式,取得了不錯的檢測效果,可是在長文本預測中效果還不是很理想。因而,有大牛對EAST檢測方法進行了改進,得到了比EAST更好的預測準確性(特別是在長文本上),並開源了源代碼,這就是AdvancedEAST方法。網絡結構以下:
AdvancedEAST的網絡結構與EAST類似(EAST技術原理詳見文章:大話文本檢測經典模型EAST),但採用了VGG做爲網絡主幹結構,基於Keras編寫,在特徵提取層中增長了後面卷積層的通道數量,對後處理方法也進行了優化。下面動手來試試AdvancedEAST的實際檢測效果吧。
(1)下載源代碼
首先,在github上下載AdvancedEAST源代碼(https://github.com/huoyijie/AdvancedEAST),可直接下載成zip壓縮包或者git克隆算法
git clone https://github.com/huoyijie/AdvancedEAST.git
(2)下載模型文件
下載AdvancedEAST預訓練好的模型,下載連接: https://pan.baidu.com/s/1KO7tR_MW767ggmbTjIJpuQ 提取碼: kpm2
建立文件夾saved_model,將下載後的模型文件解壓後放到裏面
修改cfg.py文件裏面的train_task_id,將該id修改與下載的預訓練模型一致,以便於在執行程序時,可自動加載模型,修改以下:sql
train_task_id = ‘3T736’
下載keras的VGG預訓練模型,由於AdvancedEAST使用了VGG做爲網絡的主幹結構,所以,在調用keras時會加載VGG預訓練模型,下載地址爲https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5,而後放到keras加載模型的默認路徑,目錄以下:數組
~/.keras/model
若是沒有手動下載,那麼在加載keras的VGG模型時,程序也會自動下載,但通常速度會很慢,常常會超時bash
(3)準備基礎環境
AdvancedEAST依賴於如下的基礎環境,使用conda或pip進行安裝準備。微信
(4)AdvancedEAST檢測文本
執行python predict.py進行文本檢測
默認讀取項目自帶的demo/012.png文件,進行檢測
檢測後生成如下文件
其中,012.png_act.jpg是檢測過程的結果
012.png_predict.jpg是檢測出最終文本框的圈定結果
012.txt是檢測文本框的位置座標(4個頂點)
在執行模型時,其中會有少部分檢測結果是不完整的(邊框少於4個頂點),默認會顯示出來
可經過在predict.py的源代碼中,讓其保持靜默(不提示不完整的檢測結果),修改最後一行爲網絡
predict(east_detect, img_path, threshold, quiet=True)
若是要檢測指定的圖片,在執行python predict.py時,可經過增長參數指定圖片路徑。另外,還可指定閾值,即在作像素分類判斷是否爲文本的閾值,默認爲0.9。執行命令以下:app
python predict.py --path=/data/work/tensorflow/data/icdar_datasets/ICDAR2015/ch4_test_images/img_364.jpg --threshold=0.9
執行效果以下:
(5)AdvancedEAST接口封裝
爲了方便其它程序調用AdvancedEAST的文本檢測能力,在predict.py的基礎上進行代碼修改,對AdvancedEAST進行接口封裝,核心代碼以下:
# sigmoid 函數 def sigmoid(x): return 1 / (1 + np.exp(-x)) # AdvancedEAST 模型 def east_detect(): east = East() east_detect = east.east_network() east_detect.load_weights(cfg.saved_model_weights_file_path) return east_detect # 基於 Advanced EAST 的文本檢測 # 輸入:AdvancedEAST模型,圖片路徑,像素分類閾值 # 返回:檢測後文本框的位置信息 def text_detect(east_detect,img_path,pixel_threshold=0.9): img = image.load_img(img_path) d_wight, d_height = resize_image(img, cfg.max_predict_img_size) scale_ratio_w = d_wight / img.width scale_ratio_h = d_height / img.height img = img.resize((d_wight, d_height), Image.NEAREST).convert('RGB') img = image.img_to_array(img) img = preprocess_input(img, mode='tf') x = np.expand_dims(img, axis=0) y = east_detect.predict(x) y = np.squeeze(y, axis=0) y[:, :, :3] = sigmoid(y[:, :, :3]) cond = np.greater_equal(y[:, :, 0], pixel_threshold) activation_pixels = np.where(cond) quad_scores, quad_after_nms = nms(y, activation_pixels) bboxes = [] for score, geo in zip(quad_scores, quad_after_nms): if np.amin(score) > 0: rescaled_geo = geo / [scale_ratio_w, scale_ratio_h] rescaled_geo_list = np.reshape(rescaled_geo, (8,)).tolist() bboxes.append(rescaled_geo_list) return bboxes
二、Pixel Link方法實戰
前面介紹的文本檢測方法,通常都是執行兩個預測:經過分類判斷是文本/非文本,經過迴歸肯定邊界框的位置和角度。其中,迴歸的耗時比分類要多得多,而PixelLink(像素鏈接)方法則所有都是經過「分類」的方式實現文本/非文本的判斷,並同時給出文本框的位置和角度,具體技術原理詳見以前的文章:大話文本檢測經典模型PixelLink。
PixelLink的總體框架以下圖:
下面介紹如何使用PixelLink模型來檢測文字。
(1)下載源代碼和模型
首先,在github上下載PixelLink源代碼(https://github.com/ZJULearning/pixel_link),可直接下載成zip壓縮包或者git克隆
git clone https://github.com/ZJULearning/pixel_link.git
下載pylib,下載路徑爲https://github.com/dengdan/pylib/tree/e749559c9a4bcee3339081ec2d159a6dcf41636e ,解壓後將src目錄中的util文件夾放到pylib目錄下面,而後添加到環境變量,在test_pixel_link.py , test_pixel_link_on_any_image.py, visualize_detection_result.py, datasets/dataset_utils.py的前面加上
import sys sys.path.append('/data/work/tensorflow/model/pixel_link/pixel_link-master/pylib') sys.path.append('/data/work/tensorflow/model/pixel_link/pixel_link-master/pylib/util')
或者在當前窗口執行如下命令,或在 /etc/profile,~/.bashrc 文件中添加如下命令
export PYTHONPATH=xx:$PYTHONPATH
下載基於IC15數據集預訓練好的模型,做者提供了兩個預訓練好的模型PixelLink + VGG16 4s (下載地址 https://pan.baidu.com/s/1jsOc-cutC4GyF-wMMyj5-w),PixelLink + VGG16 2s(下載地址 https://pan.baidu.com/s/1asSFsRSgviU2GnvGt2lAUw)
新建文件夾models/4s和models/2s,解壓模型壓縮文件,將兩個模型放入到相應的目錄下,方便進行調用
(2)安裝基礎環境
在下載的源代碼文件中pixel_link_env.txt文件提供了conda基礎環境安裝包,其中,因爲如今清華的conda鏡像源已中止服務,因而將其替換爲中科大的conda鏡像源,修改後的依賴基礎環境以下:
name: pixel_link channels: - menpo - https://mirrors.ustc.edu.cn/anaconda/pkgs/free - https://mirrors.ustc.edu.cn/anaconda/pkgs/main - defaults dependencies: - certifi=2016.2.28=py27_0 - cudatoolkit=7.5=2 - cudnn=5.1=0 - funcsigs=1.0.2=py27_0 - libprotobuf=3.4.0=0 - mkl=2017.0.3=0 - mock=2.0.0=py27_0 - numpy=1.12.1=py27_0 - openssl=1.0.2l=0 - pbr=1.10.0=py27_0 - pip=9.0.1=py27_1 - protobuf=3.4.0=py27_0 - python=2.7.13=0 - readline=6.2=2 - setuptools=36.4.0=py27_1 - six=1.10.0=py27_0 - sqlite=3.13.0=0 - tensorflow-gpu=1.1.0=np112py27_0 - tk=8.5.18=0 - werkzeug=0.12.2=py27_0 - wheel=0.29.0=py27_0 - zlib=1.2.11=0 - opencv=2.4.11=nppy27_0 - pip: - backports.functools-lru-cache==1.5 - bottle==0.12.13 - cycler==0.10.0 - cython==0.28.2 - enum34==1.1.6 - kiwisolver==1.0.1 - matplotlib==2.2.2 - olefile==0.44 - pillow==4.3.0 - polygon2==2.0.8 - pyparsing==2.2.0 - python-dateutil==2.7.2 - pytz==2018.4 - setproctitle==1.1.10 - subprocess32==3.2.7 - tensorflow==1.1.0 - virtualenv==15.1.0
使用如下命令建立pixel_link的conda虛擬環境和安裝基礎依賴包
conda env create --file pixel_link_env.txt
完成基礎環境包安裝以後,便可使用如下命令切換到pixel_link虛擬環境,在裏面執行相應的操做
source activate pixel_link
該源代碼提供基礎環境是基於python2版本的,若是本身以前已安裝了相應的基礎環境,便可直接使用,其中,要特別注意的是若是是使用python3,則須要對如下腳本進行改造:
(3)PixelLink檢測文本測試(批量圖片)
經過運行如下命令進行測試
./scripts/test.sh ${GPU_ID} ${model_path}/model.ckpt-xxx ${image_dir}
該命令由三個參數組成,第1個參數表示GPU的序號,第2個參數表示模型路徑,第3個參數表示測試圖片的目錄。
在這裏使用剛纔下載的PixelLink+VGG16 4s預訓練模型,使用場景文字圖片數據集ICDAR2015進行測試(下載地址 http://rrc.cvc.uab.es/?ch=4&com=downloads),也可使用本身的測試圖片,將測試的圖片放入到指定的目錄。
執行腳本以下:
./scripts/test.sh 0 models/4s/model.ckpt-38055 /data/work/tensorflow/data/icdar_datasets/ICDAR2015/ ch4_test_images
檢測後的結果保存在模型目錄下,結果文件是測試圖片中的文本框位置(4個座標點),以下圖:
全部結果還會生成zip壓縮文件,以下圖:
若是要使檢測結果顯性化,可經過調用scripts/vis.sh腳本,將會使文本檢測的結果直接顯示在圖片上,調用命令爲
./scripts/vis.sh ${image_dir} ${det_dir}
其中,第一個參數表示原始圖片的路徑,第二個參數表示檢測後的文本框位置文件所在目錄,最後輸出的標示文本框圖片結果保存在~/temp/no-use/pixel_result目錄下
執行腳本以下
./scripts/vis.sh /data/work/tensorflow/data/icdar_datasets/ICDAR2015/ch4_test_images models/4s/test/icdar2015_test/model.ckpt-38055/txt
輸出的結果圖片以下
(4)PixelLink檢測文本測試(任意圖片)
爲方便測試,可直接調用如下命令對任意圖片進行測試,命令以下:
./scripts/test_any.sh ${GPU_ID} ${model_path}/model.ckpt-xxx ${image_dir}
該命令由三個參數組成,第1個參數表示GPU的序號,第2個參數表示模型路徑,第3個參數表示圖片的路徑。
例如仍拿ICDAR2015的測試圖片集進行測試,執行的命令以下:
./scripts/test_any.sh 0 models/4s/model.ckpt-38055 /data/work/tensorflow/data/icdar_datasets/ICDAR2015/ ch4_test_images
執行後,文字的檢測結果將會直接顯示在圖片上,以下圖
可能會有些人有疑惑,test_any.sh命令不就是把test.sh、vis.sh兩個命令整合在一塊兒嗎,那究竟有什麼區別呢?主要的區別以下:
a. test_any.sh命令調用的是test_pixel_link_on_any_image.py,而test.sh命令調用的是test_pixel_link.py,二者在調用檢測模型時,test_pixel_link_on_any_image.py將並查集的後處理放到模型裏面,而test_pixel_link.py則是將並查集的後處理放到模型外邊。從檢測效率來看,test_pixel_link_on_any_image.py比test_pixel_link.py在速度上慢了不少,這是因爲並查集處理須要大量計算,放到模型外面利用CPU計算反而更加快速
b. test_pixel_link.py只輸出文本框位置數據,而test_pixel_link_on_any_image.py直接將檢測的文本框標示到圖片上
(5)PixelLink文本檢測能力封裝
爲方便其它程序調用PixelLink的文字檢測能力,經過對test_pixel_link.py, visualize_detection_result.py代碼進行改造封裝,便可將文字檢測能力提供給相應的程序調用,核心代碼以下:
# 模型參數 checkpoint_dir='/data/work/tensorflow/model/pixel_link/pixel_link-master/models/4s/model.ckpt-38055' image_width = 1280 image_height = 768 # 配置初始化 def config_initialization(): image_shape = (image_height, image_width) config.init_config(image_shape, batch_size = 1, pixel_conf_threshold = 0.8, link_conf_threshold = 0.8, num_gpus = 1, ) # 文本檢測 def text_detect(img): with tf.name_scope('eval'): image = tf.placeholder(dtype=tf.int32, shape = [None, None, 3]) image_shape = tf.placeholder(dtype = tf.int32, shape = [3, ]) processed_image, _, _, _, _ = ssd_vgg_preprocessing.preprocess_image(image, None, None, None, None, out_shape = config.image_shape, data_format = config.data_format, is_training = False) b_image = tf.expand_dims(processed_image, axis = 0) net = pixel_link_symbol.PixelLinkNet(b_image, is_training = True) global_step = slim.get_or_create_global_step() sess_config = tf.ConfigProto(log_device_placement = False, allow_soft_placement = True) sess_config.gpu_options.allow_growth = True saver = tf.train.Saver() checkpoint = util.tf.get_latest_ckpt(checkpoint_dir) bboxes = [] with tf.Session(config = sess_config) as sess: saver.restore(sess, checkpoint) image_data = img pixel_pos_scores, link_pos_scores = sess.run( [net.pixel_pos_scores, net.link_pos_scores], feed_dict = { image:image_data }) mask = pixel_link.decode_batch(pixel_pos_scores, link_pos_scores)[0, ...] bboxes = pixel_link.mask_to_bboxes(mask, image_data.shape) return bboxes
(6)pixellink的keras版本
剛纔介紹的pixel link是基於tensorflow版本的,還有大牛使用Keras對核心代碼進行改寫,並在github上開放了keras版本pixel link的源代碼。具體使用以下:
a. 下載源代碼
下載地址爲https://github.com/opconty/pixellink_keras,可直接下載成zip壓縮包或者git克隆
git clone https://github.com/opconty/pixellink_keras.git
b. 下載預訓練模型
做者並無從新訓練模型,而是直接拿tensorflow版本的訓練模型結果PixelLink-VGG 4s,轉化爲Keras的權重文件。下載地址爲https://drive.google.com/file/d/1MK0AkvBMPZ-VfKN5m4QtSWWSUqoMHY33/view?usp=sharing
c. 安裝基礎環境
除了須要安裝Keras以外,還要安裝imutils依賴包
pip install imutils
若是是使用了OpenCV 4.x,則須要修改pixellink_utils.py第220行,將cv2.findContours的返回結果由3個結果修改成2個結果,將_,cnts,_改成cnts,_
d. 運行模型
執行pixellink_eval.py,便可進行文本檢測,命令以下
python pixellink_eval.py
默認對項目自帶的圖片進行檢測(路徑./samples/img_1099.jpg),檢測效果以下:
若是要指定圖片進行檢測,可修改pixellink_eval.py文件中第21行,將img_path修改成指定的圖片路徑,而後再執行python pixellink_eval.py便可對指定的圖片進行文字檢測
爲方便介紹,以上AdvancedEAST、PixelLink的文本檢測能力封裝時,將加載模型、文本框預測、圖片繪製文本框等一些代碼寫在一塊兒,而在實際生產使用中,通常是將其分開。如要了解在生產環境中的詳細使用,可再私信進行交流。
歡迎關注本人的微信公衆號「大數據與人工智能Lab」(BigdataAILab),獲取 完整源代碼
推薦相關閱讀
一、AI 實戰系列
二、大話深度學習系列
三、圖解 AI 系列
四、AI 雜談
五、大數據超詳細系列