iPhoneのフォトライブラリから、顔だけを切り出す方法です

データセットを用意するのは大変
たとえば機械学習などで、データセットとして顔写真や人体の写真が数千枚必要なケースがあります。
しかし、手動で顔写真を切り出すのは大変です。
手元のiPhoneの写真が使えたら便利
たいていの人のiPhoneには、人の写っている写真が数百〜数千枚はあるでしょう。
それらの写真の顔だけを抽出できれば、迅速なデータセット作成に活かせそうです。
SemanticImageでiPhoneの写真を高速処理できる
SemanticImageというライブラリを使えば、高速で写真から顔だけを切り抜けます。
手順
SwiftPackageManagerでSemanticImageをインストール。
let semanticImage = SemanticImage()
PhPickerでiPhoneのフォトライブラリから、複数写真を選択します。
Personで検索すると、人の画像だけ切り抜きにかけられて便利です。
var configuration = PHPickerConfiguration()
configuration.selectionLimit = 0 // 選択する写真の数を無制限にする
configuration.filter = .images
let picker = PHPickerViewController(configuration: configuration)
picker.delegate = self
present(picker, animated: true)
取得した写真をSemanticImageの顔切り抜き機能にかけます。
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true)
for result in results { // フォトライブラリから取得した写真を順次処理
if result.itemProvider.canLoadObject(ofClass: UIImage.self) {
result.itemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, error in
if let image = image as? UIImage, let safeSelf = self {
DispatchQueue.main.async {
if let faceImage = safeSelf.sematicImage.faceRectangle(uiImage: image) { // 顔を切り抜く
UIImageWriteToSavedPhotosAlbum(maskImage, nil, nil, nil) // フォトライブラリに保存
}
}
}
}
}
}
}
これで、切り抜かれた顔の画像がフォトライブラリに保存されます。
100枚程度だと、14秒で処理でき、メモリとCPU使用量も安全です(iPhone11)。
(数千枚一気に処理すると、画像データを保持しきれず、メモリがオーバーするので、数百枚ずつ処理するのが良さそうです)
添付画像は全部マスクしてデータとしては意味ない感じですが、著者は照れ屋なので、すみません。
全身データや、犬、猫のデータにも
SemanticImageは、全身やペットを検出して切り抜く機能もあるので、さまざまなデータ作成に活かせます。
🐣
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com
Core MLやARKitを使ったアプリを作っています。
機械学習/AR関連の情報を発信しています。