發表文章

[ Dlib ] 利用 Dlib訓練 Object Detector

圖片
本篇純為筆記,先寫下來擔心自己忘了,同時希望也能幫助到一些朋友。 可能有很多地方有錯,歡迎糾正。 上一篇 "利用 Dlib訓練 Shape Predictor",能夠訓練一個 Predictor去預測物體特徵,而 Object Detector則是從圖像中尋找物體。 其實這篇應該寫在前面才對,順序不小心搞混了。 開始之前需要先確認有安裝 Dlib和 scikit-image,scikit-image可以透過 pip安裝,imglab就有點麻煩了,可以參考 官方文檔 imglab的部分 。 python_examples中會有一個 train_object_detector.py 的文件,一樣可以直接執行。同樣使用 Dlib提供練習用的訓練數據。 python3 train_object_detector.py ../examples/faces/ faces資料夾中,除了照片外,同時也有 training.xml和 testing.xml,這兩個檔案是訓練的重要數據。內容和 training_with_face_landmarks.xml及 testing_with_face_landmarks.xml,有些不同,可以打開來看一下差異。 訓練完一樣會秀出幾張訓練的圖片和預測的結果。 訓練結束後會顯示一些訓練時使用的參數。 Training complete. Trained with C: 5 Training with epsilon: 0.01 Trained using 4 threads. Trained with sliding window 80 pixels wide by 80 pixels tall. Trained on both left and right flipped versions of images. Hit enter to continue Training accuracy: precision: 1, recall: 1, average precision: 1 接下來一樣需要準備數據。 因為需求想說拿來試試辨識一些手勢,所以找了 Idiap Research Institute提供的 Hand Posture and Gesture Datasets ,先拿 A的...

[ Dlib ] 利用 Dlib訓練 Shape Predictor

圖片
本篇純為筆記,尚未有實際應用,只是先寫下來擔心自己忘了,同時希望也能幫助到一些朋友。 可能有很多地方有錯,歡迎糾正。 Dlib的安裝檔中有個 python_examples的資料夾,如果沒有可以到 Dlib的 GitHub 中下載。 開始之前需要先確認有安裝 Dlib和 scikit-image,scikit-image可以透過 pip安裝,imglab就有點麻煩了,可以參考 官方文檔 imglab的部分 。 python_examples中會有一個 train_shape_predictor.py 的文件,直接執行 train_shape_predictor.py就行了,但要附上要訓練的資料。直接使用 Dlib提供練習用的訓練數據,路徑是上一層 examples資料夾中的 faces,其輸入格式如下 python3 train_shape_predictor.py ../examples/faces/ faces資料夾中,除了照片外,同時也有 training_with_face_landmarks.xml和 testing_with_face_landmarks.xml,這兩個檔案是訓練用的重要數據。 執行 train_shape_predictor.py時只要將訓練的資料導向這個資料夾就行了,最後就會秀出幾張測試用的照片測試剛訓練出來的模型。同時也會生成出 predictor.dat和 image_metadata_stylesheet.xsl文件,predictor.dat文件就是拿來捕捉特徵用的模型,另一個我還不知道是做什麼用的 :P 在秀出圖片前會顯示 Training accuracy和 Testing accuracy。 左圖是作為訓練用的照片,右圖則是做為測試用的照片,可以看出對 landmarks捕捉還不夠成熟,但還算有點樣子。 接下來最麻煩的就是準備訓練用的數據。 Dlib有提供一個 tool叫 imglab可以幫助製作訓練用的數據。安裝的方式跟安裝 Dlib很類似。 cd dlib/tools/imglab mkdir build cd build cmake .. cmake --build . --config Release 安裝成功後,可以到 dlib/tools/imglab/build中找到 i...

[ PhotoHash ] 利用 PhotoHash篩選相似度過高的圖像

圖片
子瑜在這部影片中,前 14秒幾乎沒有任何的動作。 若用 " 利用 Dlib進行臉部捕捉 " 該文中提供的程式碼,這 14秒的影片大約會擷取300多張的圖像。 用這筆數據訓練後,可能會導致權重失衡。 為了避免權重失衡影響辨識結果,有必要對圖像進行一些篩選。 用爬蟲爬取圖片的時候也容易爬到不同出處但卻是同一張照片,這麼做也很方便呦。 Hamming distance可以作為數據差異度的基準,詳細可以到 維基百科 了解一下。 對於圖像差異度的比較,Python也有一套 Library叫 PhotoHash 可以幫忙比較圖像的差異。 先計算整張圖像的平均 Hash值後,再計算 Hamming distance。 import os import glob import photohash def filter(member): img_list = glob.glob('./{0}/*.png'.format(member)) # def order_by_num(num): # return int(num.split('/')[-1].split('.')[0]) # img_list.sort(key=order_by_num) img_list.sort(key=lambda num: int(num.split('/')[-1].split('.')[0])) for img in img_list: hash_one_path = img hash_one = photohash.average_hash(hash_one_path) if 'hash_two' in locals(): distance = photohash.hash_distance(hash_one, hash_two) if distance <= 2: if not os.path.isdir("./{0}/similar".format...

[ Dlib ] 利用 Dlib進行臉部捕捉

圖片
為了更高品質的臉部數據,特別研究了一下 Face Alignment,相較 Haar等方式,似乎 Dlib更能有效地捕捉臉部,再利用 Face Alignment能有效地將捕捉的臉部校正,以取得更高的數據品質。 Dlib安裝稍微有點複雜,可以參考由 Adrian Rosebrock寫的 " How to install dlib "。 from imutils import face_utils import numpy as np import imutils import dlib import cv2 face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml') def detect_haar(filename): img = cv2.imread(filename) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3,) for (x,y,w,h) in faces: img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),3) cv2.imwrite('./haar.png', img) detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") def detect_face_landmarks(filename): img = cv2.imread(filename) gray = cv2.cvtColor(img, ...

[ MoviePy ] 利用MoviePy將影片加入音訊

圖片
由於 OpenCV是視覺處理的 Library,很自然它並沒有處理音訊的部分,所以生成出來的影片是沒有聲音的。 雖然拿 Twice的影片當作 OpenCV練習的素材滿有趣的,但看著沒有音樂的 MV也挺枯燥的。 因此特地找了 MoviePy 這個 Library。 MoviePy是用於視頻編輯的 Library,可用於基本操作(如剪切、連接、標題插入),視頻合成(非線性編輯),視頻處理或創建高級效果。它可以讀取和寫入最常見的視頻格式,也包含 GIF。 接著就把 Opencv輸出,但沒有音頻的影片加入音樂吧。 from moviepy.editor import VideoFileClip clip1 = VideoFileClip("twice_jelly_jelly.mp4") audioclip1 = clip1.audio clip2 = VideoFileClip("face_twice_jelly_jelly.avi") new_video = clip2.set_audio(audioclip1) # audioclip1.write_audiofile("twice_jelly_jelly.mp3") # 如果想要輸出 mp3 new_video.write_videofile("face_twice_jelly_jelly_audio.mp4") 再來介紹一個比較有趣的,網路上常會有人製作 GIF動畫貼在各大論壇。 MoviePy同樣也能輕鬆地製作這些 GIF動畫。 import moviepy.editor as mpy clip = mpy.VideoFileClip("spcial_video_tzuyu.mp4") subclip = clip.subclip(14.9,16.7) # 從第幾秒開始到第幾秒結束 subclip = subclip.resize(0.2) # 長寬皆乘上 0.2來縮小尺寸。 subclip.write_gif("try.gif") Resize共有下面四種方法 myClip.resize( (460,720) ) # New ...