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所示。
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.