1. 程式人生 > >TensorFlow腦洞人臉識別(三)

TensorFlow腦洞人臉識別(三)

一.cnn模型的訓練與儲存

呼叫startTrain()即可開始訓練,視窗會實時顯示迭代次數和準確率。這裡要另外說一下,樓主這裡偷了個懶,沒有劃分訓練集和測試集,這是極度不可取的,因為我們無法對比模型在訓練集和測試集上的準確率來獲取模型的擬合情況。大家別學樓主就對了。

呼叫setSavePath(savePath)即可儲存模型並結束訓練執行緒。

樓主迭代3000次後得到準確率0.82的模型,迭代10000次後得到準確率0.86的模型。這個結果很不理想,模型應該處於欠擬合狀態,由於樓主懶的原因,沒有繼續訓練了。當然了,本來樓主的資料集就不專業。

二.識別效果

先上幾張識別效果好的:

樓主能說樓主找這幾張效果好的花了九牛二虎之力嗎。。。與其說樓主樓主識別人臉,不如說人臉撞到了樓主畫的框上。。。

再來兩張效果差的:

絕大部分都是框很大,而且只包含部分人臉。有的就直接差了十萬八千里。

除錯過程中發現,樓主訓練的模型對人臉圖片的分類賊坑。。這個鍋應該讓資料集來背。

上一篇樓主貼的識別演算法是遞迴的,由於重複計算區域多,特別慢,於是寫了迴圈版的如下:

def getSizeReword(big,small):
    rate=((big[1]-big[0])*(big[3]-big[2]))/((small[1]-small[0])*(small[3]-small[2]))
    return rate/15

#'''
subRegionList=[(0,0.8,0,1),(0.2,1,0,1),(0,1,0,0.8),(0,1,0.2,1),(0.2,0.8,0,1),(0,1,0.2,0.8),(0.2,0.8,0.2,0.8)]
def recognizeFace(image,rect):
    retDic={"background":1,"face":0,"body":0}
    retRect=rect

    while True:
        width = retRect[1] - retRect[0]
        height = retRect[3] - retRect[2]
        if width <= MIN_SREACH_SIZE or height <= MIN_SREACH_SIZE:
            break

        goodDic=None
        goodRect=None
        for subRegion in subRegionList:
            subRect = []
            subRect.append(rect[0] + int(subRegion[0] * width))
            subRect.append(rect[0] + int(subRegion[1] * width))
            subRect.append(rect[2] + int(subRegion[2] * height))
            subRect.append(rect[2] + int(subRegion[3] * height))

            subRetDic=classfier.recognizeImage(image[subRect[0]:subRect[1],subRect[2]:subRect[3]])
            if goodDic==None or subRetDic["face"]>=goodDic["face"]:
                goodDic=subRetDic
                goodRect=subRect
        if (goodDic["face"]+getSizeReword(retRect,goodRect))<retDic["face"] or goodDic["background"]>1/3:
            break
        else:
            retDic=goodDic
            retRect=goodRect

    return retDic, retRect
#'''
這裡還有另外一個小變化,在判斷分割區域好壞時,樓主加上了一個小分割面積獎勵項,是這行程式碼:
if (goodDic["face"]+getSizeReword(retRect,goodRect))<retDic["face"] or goodDic["background"]>1/3:
這是為了讓演算法對小面積分割區域有一個偏好,結果似乎然並軟。這個方法不錯,但人臉分類模型太坑,導致這裡沒有發揮作用。

三.總結

樓主把所有程式碼、資料以及儲存的模型都傳到了github上,有興趣的可以看看。

連結:https://github.com/Xiong-Da/faceRecognizeTring

總結:

1.分類模型太坑了,這個鍋讓資料集背的可能性大。也有可能是訓練時間不夠。。樓主小筆記本跑了6-8個小時已經盡力了。

2.基於影象分割方法的太慢了,重複計算區域多,這個方面全卷積網路才是正道。

3.要做目標識別還是老老實實用正規資料集和faster rcnn等成熟演算法吧。