深度學習於糖豆推薦應用--圖片模糊識別

1. 引言

糖豆的小視頻大部分來自UGC,我們的用戶更多分佈在三四線城市,她們經濟條件相對沒有那麼良好,受限於手機相機、光線、拍攝者的抖動等影響導致部分上傳的視頻的首圖圖像質量不高。低質量圖片類型主要包括運動模糊、對焦模糊、圖片發黑(白)等,這樣的首圖在推薦分發流會帶來非常不好的用戶體驗。因此開發一種圖像模糊檢測的技術顯得非常必要。

2. 相關工作

2.1 傳統方法

傳統的圖像模糊檢測一般分爲兩種方法直接法和間接法。

  • 間接法是用一個線性方程來描述模糊圖像:其中代表原始圖像,代表未知的模糊函數,N代表噪聲函數,代表現實看到的圖像。間接法是通過使用多種方法來估計模糊函數,Rooms等人[1]提出了在小波域中通過觀察邊緣棱角來估算模糊函數。在論文[3]中,作者通過Lipschitz指數來計算最尖銳的邊緣和相關係數,該相關係數是通過高斯點擴散函數的方差和Lipschitz指數的梯度來計算得到的,Lipschitz指數取決於圖像中存在的模糊,而不依賴圖像內容.

  • 直接法是通過檢測和識別圖像中一些具有特定屬性的特徵,比如邊緣和拐角。當模糊事件發生之後,圖像中的邊緣類型和邊緣的尖銳度都發生變化。通過檢測這些交錯分量的缺失可以辨別圖像的模糊度。Marichal等人[4]通過非零DCT(Discrete Cosine Tranform離散餘弦變換)係數的直方圖來判別MPEG或者JPEG的模糊度,該算法考慮整個圖像的DCT信息,這是基於一個重要的假設就是任何類型的邊緣中圖像中的尺度至少是8X8的塊。

2.2 深度學習方法

隨着近年來深度學習的快速發展,很多文獻中應用深度學習算法來評估圖像,文獻[5]中,作者採用二層深度置信網絡(two-stage deep belief network)進行模糊類型的分類和參數識別,首先進行傅立葉變換,然後進行訓練階段採用無監督的方式以及做一些權重的調整,這樣訓練得到的分類器的好處是不需要像其他算法[1]那樣進行手動設置特徵值計算。

傳統模糊分類算法都是計算人工設計好的特徵,這樣計算的特徵不能很好的表徵大量失真圖片的特性。最近很多研究人員將注意力轉移到提取圖片的深層次的特徵結構。在深度學習中,卷積神經網絡CNN是最常用的一種,常用的CNN模型有:AlexNet[6]、VGGNet[7]、GoogleNet[9]和ResNet[9]模型,在數據庫ImageNet都取得很好的效果。在論文[10][11]都是利用CNN抽取的特徵,結果顯示非常有效,並且適合多種圖像分類和目標識別中,可以嘗試中圖像模糊檢測中的應用,它和傳統的特徵提取算法SIFT、HOG、GIST等相比,CNN特徵提取不需要進行人工設計圖像中目標的特徵。這些CNN模型都可以在深度學習框架TensorFlow和Caffe上實現,有個基於tensorflow實現的開源工程yadlt[12]裏面實現了多種深度學習算法,比如CN、RBM、DBN以及邏輯迴歸等等。

3. 模糊圖片識別實驗

我們分別採用三種方法來進行對模糊圖片檢測的實驗,包括第三方深度學習API、傳統方法、CNN方法。我們在兩組不同的數據集上進行了多次試驗。公開數據集是使用公開的測試圖片數據庫Corel和Caltech 101,隨機選取了4153張清晰的圖片,同時利用高斯模糊對這圖像進行不同參數radius的模糊處理。私有數據集主要使用糖豆app產生的圖像數據,人工標註了模糊圖片集有20334張,清晰圖片集有16104張。

3.1 基於第三方API-騰訊優圖

第三方深度學習主要採用了騰訊優圖開放平臺提供圖像識別的接口。其中模糊檢測:fuzzydetect(self, image_path, data_type=0, seq=’’)參數:image_path 標識圖片信息,data_type 表示image_path是圖片還是url,0代表圖片,1代表url。
檢測的輸出結果:{u'errorcode': 0, u'errormsg': u'OK', u'fuzzy_confidence': 0.0, u'fuzzy': False}。該檢測結果顯示輸入的圖片不是模糊的,計算得到的模糊度fuzzy_confidence爲0.

3.1.1 私有數據集

在兩組數據集上得到的結果如下,採用騰訊優圖提供的模糊檢測api,主要關注的指標爲FPR和TNR。
我們做了三組試驗,第一組是表1利用該api默認的參數,對每個檢測圖像得到的分數大於閾值0.2判斷爲模糊圖片;第二組是表2將圖片得分數設置爲大於閾值0.1判斷爲模糊圖像;第三組表3做了兩次檢測,第一次檢測是得分大於0.1判定爲模糊圖像,如果得分低於0.1,裁剪出圖像中間部分再檢測一次,如果得分大於閾值0.08那麼該圖片判定爲模糊圖像,這個檢測策略針對運動模糊場景很實用。

名稱 FPR TNR
組一 32.9% 42.5%
組二 47.8% 49.8%
組三 60.3% 65.1%

Positive指清晰圖片,Negative指模糊圖像,Ture指正確分類,Flase指錯誤分類。表1和表2當調整閾值從0.2調整到0.1的時候,對模糊圖片的檢測效果提升了0.07個點,如表4所示,效果不明顯,當對圖像進行兩次檢測的時候,對模糊圖片的檢測率提升到0.651,如表4中TNR所示。由於試驗採用的清晰和模糊圖片集是通過人工標註的,沒有統一的標準誤差會很大,所以當降低閾值的時候,從清晰圖片中更加容易檢測到模糊的圖片,見表4中FPR。

綜上所述,採用兩次檢測策略可以更加識別出模糊的圖片。

3.1.2 公有數據集測試

利用組三中的檢測方法,在公開圖像數據集上進行測試,使用公開的測試圖片數據庫Corel和Caltech 101,隨機選取了4153張清晰的圖片,同時利用高斯模糊對這圖像進行不同參數radius的模糊處理,來測試該算法的準確率。試驗數據如下。

正樣本的檢測

名稱 True False
Positive 586 3567
Rate 14.1%

負樣本的檢測

名稱 True False TNR
radius=2 4100 53 98.7%
radius=1.5 4093 60 98.5%
radius=1 4081 72 98.2%

3.2 傳統方法-聯合laplace和haar-wavelet

採用laplace和haar-wavelet變換[13]進行模糊檢測。檢測的結果比騰訊優圖的效果好。

名稱 True False
Positive 1129 221
Negative 1456 67
名稱 FPR TNR
Rate 16.4% 76.7%

使用公開的測試圖片數據庫Corel和Caltech 101,隨機選取了4153張清晰的圖片,同時利用高斯模糊對這圖像進行不同參數radius的模糊處理,來測試該算法的準確率。試驗數據如下。

正樣本的檢測

名稱 True False
Positive 946 3207
Rate 22.7%

負樣本的檢測

名稱 True False TNR
radius=3 4153 0 100%
radius=2 4126 27 99.3%
radius=1.5 3936 217 94.7%
radius=1 2712 1441 65%

試驗結果表明,在糖豆app產生的圖像數據集上,聯合laplace和haar-wavelet的算法要比騰訊優圖模糊檢測api的效果好;通過對比表5,6和表9,10,在公開圖像數據集上,laplace和haar-wavelet對正樣本的識別率比騰訊優圖好,對負樣本隨着圖像高斯模糊參數的變化識別也在波動很大,而騰訊優圖對高斯模糊產生的負樣本的識別率比較穩定。

由於糖豆app產生的模糊圖像由多種因素導致的,很大一部分是運動模糊和對焦模糊,比高斯模糊要複雜很多,故此我們採用CNN方法來訓練專有模型來檢測模糊圖片。

3.3 CNN方法

3.3.1 原理

根據文獻[14]使用6層的卷積網絡,主要是針對運動模糊的識別。作者使用PASCAL VOC 2010數據集,自己合成不同參數的運動模糊類型圖像構成訓練集。由於我們的模糊圖像是由於很多種因素導致的,不僅僅是運動模糊的一種,於是我們利用糖豆標註的模糊圖像和人工合成的運動模糊圖像構成訓練集。

該6層CNN結構如下圖1所示。

image.png
image.png
卷積層
Pooling層

3.3.2 建模實現

# 定義模型
model = Sequential()
# 7x7 filter
# 步長是7 卷積窗口步重疊
# 96 map feature
model.add(Convolution2D(96, 7, 7, input_shape=input_shape))
model.add(Activation('relu'))
# model.add(Convolution2D(96, 7,7, activation='relu'))  #vgg-like
#2*2池化
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Convolution2D(256, 5, 5))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

##模型求解
epochs = 100
learning_rate = 0.01
decay = learning_rate / epochs
adam = Adam(lr=learning_rate)
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer='sgd',metrics=["accuracy"])

##模型概覽
model.summary()
model.get_config()
model.layers[0].get_config()
model.layers[0].input_shape
model.layers[0].output_shape
model.layers[0].get_weights()
numpy.shape(model.layers[0].get_weights()[0])
model.layers[0].trainable

##模型訓練
hist = model.fit(X_train, y_train, batch_size=128, nb_epoch=epochs, verbose=1, validation_data=(X_test, y_test))
filename='model_train_new.csv'
csv_log=callbacks.CSVLogger(filename, separator=',', append=False)
early_stopping=callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='min')
checkpoint = callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_best_only=True, mode='min')

##模型評估
score = model.evaluate(X_test, y_test, verbose=0)
print('Test Loss:', score[0])
print('Test accuracy:', score[1])
test_image = X_test[0:1]
print 'shape:', (test_image.shape)
print 'predict:', (model.predict(test_image))
print 'predict_classes:', (model.predict_classes(test_image))
print 'y_test:', (y_test[0:1])

##保存模型
file = open(filepath+"tangdoublur.h5", 'a')
model.save(filepath+"tangdoublur.h5")
file.close()

3.3.3 實驗結果

在模糊數據集的檢測上有較大的提升,達到了將近80%。如文章前部所述,由於糖豆圖片的模糊類型繁多,並且存在多種組合。所以目前的模糊檢測還存在大量提升空間。清晰數據集上有非常優秀的檢測性能。

名稱 FPR TNR
CNN方法 78.8% 96.8%

最後我們將該方法應用在糖豆小視頻的推薦流程中,整體提升了推薦流視頻的可看性。

4. 結束

本文主要簡述圖像模糊檢測的一些算法,介紹CNN在圖像模糊檢測以及圖像分類識別中應用,以及目前存在的工具,並採用了CNN方法檢測模糊圖片,提升了糖豆推薦流的觀看體驗。

參考文獻:

[1] Tong, H., Li, M., Zhang, H., and Zhang, C. "Blur detection for digital images using wavelet transform," In Proceedings of the IEEE International Conference on Multimedia and Expo, vol.1, pp. 27-30, June 2004. doi: 10.1109/ICME.2004.1394114.

[2] Rooms, F., Pizurica, A., Philips, W. “Estimating image blur in the wavelet domain.” In Proc. of IEEE Int. Conf. on Acoustics and Signal Processing, vol. 4, pp.4190- 4195, IEEE, 2002.

[3] Wanqing, S., Qing, L., Yuming, W. “Tool wear detection using Lipschitz exponent and harmonic wavelet.” Mathematical Problems in Engineering, August 2013, Article ID 489261, http://dx.doi.org/10.1155/2013/489261.

[4] Panchapakesan, K., Sheppard, D.G., Marcellin, M.W., and Hunt, B.R. “Blur identification from vector quantizer encoder distortion.” In Proc. of the 1998 International Conference on Image Processing (ICIP 98), pp. 751-755, 4-7 Oct. 1998, Chicago, IL., USA.

[5] Y.Ruomei, S.Ling: “Image Blur Classification and Parameter Identification using Two-stage Deep Belief Networks,” British Machine Vision Conference , 2013 :70.1-70.11.

[6] Alex Krizhevsky Ilya Sutskever Geoffrey E. Hinton “ImageNet Classification with Deep Convolutional Neural Networks,” NIPS 2012.

[7] K.Simonyan, A.Zisserman “Very Deep Convolutional Networks for Large-scale Image Recognition,” ICLR 2015.

[8] Christian Szegedy, Wei Liu, Yangqing Jia, et “Going Deeper with Convolutions,” CVPR 2015.

[9] K.He, X.Zhang, S.Ren, J.Sun “Deep Residual Learning for Image Recognition,” LSVRC 2015.

[10] Hirokatsu Kataoka, Kenji Iwata, Yutaka Satoh. Feature Evaluation of Deep Convolutional Neural Networks for Object Recognition and Detection. CoRR. 2015. arXiv: 1509.07627.

[11] Xiaona Song, Ting Rui, Zhengjun Zha, Xinqing Wang, Husheng Fang “The AdaBoost algorithm for vehicle detection based on CNN features,” ICIMCS 2015.

[12] https://github.com/blackecho/Deep-Learning-TensorFlow

[13] Tong H, Li M, Zhang H, et al. Blur detection for digital images using wavelet transform[C]// IEEE International Conference on Multimedia and Expo. IEEE, 2004:17-20 Vol.1.

[14] Sun J, Cao W, Xu Z, et al. Learning a convolutional neural network for non-uniform motion blur removal[J]. 2015(CVPR):769-777.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章