自動偵測圖片中的人臉

自動偵測圖片中的人臉

在我的工作場所,護照尺寸的照片被掃描在一起,然後切成單獨的照片並以唯一的文件編號保存。目前我們使用Paint.net來手動選擇、剪下和儲存圖片。

我見過索尼的 Cyber​​shot 相機具有人臉偵測功能。在搜尋人臉偵測時,Google也給了我一些關於 iphoto 的資訊。 Picasa 也有臉部偵測功能。有沒有什麼方法可以自動偵測文件中的人臉,從而減少剪切單一影像所需的時間,從而提高工作場所的工作效率。

掃描文件範例(真實文件有 5 行,每行 4 張 = 20 張圖片):(來自:http://www.memoryke​​eperphoto.com/images/passport_photo.jpg, 合理使用)

樣本影像

例如。在 Picasa 3.8 中,當按一下「檢視」>「人物」時,會顯示所有臉孔,並要求我為他們命名,我可以自動將這些單獨的圖片以名稱儲存為不同的圖片嗎?

答案1

自動裁切護照照片聽起來絕對可行。固定的照明條件、始終面向前方、一致的影像格式…我認為沒有人能要求更有利的人臉偵測條件。

我嘗試使用人臉偵測查看範例影像上的結果:

原始人臉偵測輸出

護照有不同的格式和尺寸,因此它們會不規則地包裝在掃描器的平板上,但我假設您會將照片始終直立放置。facedetect將為我們提供所有面的中心和大小。特別是,我們可以使用臉部的大小並按比例裁剪其周圍的區域。由於護照照片往往覆蓋照片的固定區域,因此這似乎是一個相對安全的假設。

裁剪影像的子區域非常容易使用圖像魔術師。我編寫了一些(粗略的)shell 腳本來自動化這個過程:

#!/bin/sh
pc=60
files="P1Xb8.jpg"

fileno=1
for file in $files; do
  n=1
  facedetect $file | while read x y w h; do
    border=$(($w * $pc / 100))
    x=$(($x - $border))
    y=$(($y - $border))
    w=$(($w + $border * 2))
    h=$(($h + $border * 2))
    echo $x $y $w $h
    convert "$file" -gravity NorthWest -crop "${w}x${h}+$x+$y" "${fileno}_$n.jpg"
    n=$(($n + 1))
  done
  fileno=$(($fileno + 1))
done

我根據經驗定義了檢測到的臉部寬度的 60%(在腳本的第二行中)的邊界區域。這是我得到的四張圖像:

1_1 1_2 1_3 1_4

這已經相當不錯了。頂部總是留下一些空白,我只需在呼叫中添加“-fuzz 10% -trim”即可將其刪除convert。這是之後第一張圖像的結果:

1_1 已修剪

對於一個快速腳本來說還不錯,而且還有很大的改進空間。例如,大多數護照使用縱向,因此具有不同的垂直/水平係數(通常為 1.3)。此外,臉部往往會稍微向上移動(可能是 1.3)。糾正這些將產生更好的裁剪,避免完全修剪頂部的空白區域。

如果您可以發布(甚至私下)範例平板掃描來根據一些實際輸出測試此腳本,那就太好了。

當然,這個建議需要Linux安裝。但如果我理解正確的話,設定專用安裝甚至虛擬機器來自動執行這項繁瑣的任務並不是完全不合理的。

如果隱私不是問題(但我懷疑),我實際上有興趣幫助編寫一個像樣的解決方案以換取裁剪後的臉部,我將用它來改進臉部偵測模型。

相關內容