Swift4.0集成百度人脸识别:从零开始的简单Demo指南

一、环境准备与基础配置

1.1 开发环境要求

Swift4.0集成百度人脸识别需满足以下条件:

  • Xcode 9.0+(推荐Xcode 10.2)
  • iOS 11.0+系统设备
  • Swift语言版本4.0+
  • 有效的Apple开发者账号(用于真机调试)

建议使用CocoaPods进行依赖管理,在Podfile中添加基础网络库:

  1. platform :ios, '11.0'
  2. use_frameworks!
  3. target 'FaceDemo' do
  4. pod 'Alamofire', '~> 4.8'
  5. pod 'SwiftyJSON', '~> 4.0'
  6. end

1.2 百度AI开放平台注册

  1. 访问百度AI开放平台
  2. 创建应用获取API Key和Secret Key
  3. 开启”人脸识别”服务权限
  4. 记录以下关键参数:
    • API_KEY: 您的应用API密钥
    • SECRET_KEY: 您的应用安全密钥
    • ACCESS_TOKEN: 动态获取的访问令牌

二、核心功能实现

2.1 访问令牌获取

使用HTTP请求获取动态令牌,建议封装为独立工具类:

  1. struct BaiduAuth {
  2. static func getAccessToken(apiKey: String, secretKey: String, completion: @escaping (String?, Error?) -> Void) {
  3. let url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=\(apiKey)&client_secret=\(secretKey)"
  4. Alamofire.request(url).responseJSON { response in
  5. switch response.result {
  6. case .success(let value):
  7. let json = JSON(value)
  8. if let token = json["access_token"].string {
  9. completion(token, nil)
  10. } else {
  11. completion(nil, NSError(domain: "BaiduAuth", code: 400, userInfo: [NSLocalizedDescriptionKey: "Invalid token response"]))
  12. }
  13. case .failure(let error):
  14. completion(nil, error)
  15. }
  16. }
  17. }
  18. }

2.2 人脸检测实现

核心检测接口调用示例:

  1. struct FaceDetector {
  2. static func detectFace(imageData: Data, accessToken: String, completion: @escaping ([[String: Any]]?, Error?) -> Void) {
  3. let url = "https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=\(accessToken)"
  4. let parameters: [String: Any] = [
  5. "image": imageData.base64EncodedString(),
  6. "image_type": "BASE64",
  7. "face_field": "age,beauty,expression,gender"
  8. ]
  9. Alamofire.upload(
  10. multipartFormData: { multipartFormData in
  11. for (key, value) in parameters {
  12. if let data = "\(value)".data(using: .utf8) {
  13. multipartFormData.append(data, withName: key)
  14. }
  15. }
  16. },
  17. to: url,
  18. method: .post
  19. ) { encodingResult in
  20. switch encodingResult {
  21. case .success(let upload, _, _):
  22. upload.responseJSON { response in
  23. switch response.result {
  24. case .success(let value):
  25. let json = JSON(value)
  26. if let result = json["result"].arrayObject as? [[String: Any]] {
  27. completion(result, nil)
  28. } else {
  29. completion(nil, NSError(domain: "FaceDetection", code: 400, userInfo: [NSLocalizedDescriptionKey: "Invalid detection response"]))
  30. }
  31. case .failure(let error):
  32. completion(nil, error)
  33. }
  34. }
  35. case .failure(let error):
  36. completion(nil, error)
  37. }
  38. }
  39. }
  40. }

2.3 界面设计与交互

创建包含以下元素的视图控制器:

  1. UIImageView:显示待检测图片
  2. UIButton:触发检测操作
  3. UILabel:显示检测结果

示例实现:

  1. class FaceViewController: UIViewController {
  2. @IBOutlet weak var imageView: UIImageView!
  3. @IBOutlet weak var resultLabel: UILabel!
  4. let apiKey = "YOUR_API_KEY"
  5. let secretKey = "YOUR_SECRET_KEY"
  6. var accessToken: String?
  7. override func viewDidLoad() {
  8. super.viewDidLoad()
  9. fetchAccessToken()
  10. }
  11. func fetchAccessToken() {
  12. BaiduAuth.getAccessToken(apiKey: apiKey, secretKey: secretKey) { [weak self] token, error in
  13. guard let self = self, let token = token else {
  14. print("Token error: \(error?.localizedDescription ?? "Unknown")")
  15. return
  16. }
  17. self.accessToken = token
  18. }
  19. }
  20. @IBAction func detectFace(_ sender: Any) {
  21. guard let token = accessToken else {
  22. resultLabel.text = "请先获取访问令牌"
  23. return
  24. }
  25. guard let image = imageView.image, let imageData = image.jpegData(compressionQuality: 0.8) else {
  26. resultLabel.text = "请选择有效图片"
  27. return
  28. }
  29. FaceDetector.detectFace(imageData: imageData, accessToken: token) { [weak self] faces, error in
  30. guard let self = self else { return }
  31. DispatchQueue.main.async {
  32. if let error = error {
  33. self.resultLabel.text = "检测失败: \(error.localizedDescription)"
  34. return
  35. }
  36. if let faces = faces, !faces.isEmpty {
  37. let firstFace = faces[0]
  38. let age = firstFace["age"] as? Int ?? 0
  39. let beauty = firstFace["beauty"] as? Double ?? 0.0
  40. let gender = firstFace["gender"] as? String ?? "unknown"
  41. self.resultLabel.text = """
  42. 年龄: \(age)岁
  43. 颜值: \(Int(beauty))分
  44. 性别: \(gender == "male" ? "" : "")
  45. """
  46. } else {
  47. self.resultLabel.text = "未检测到人脸"
  48. }
  49. }
  50. }
  51. }
  52. }

三、高级功能扩展

3.1 人脸比对实现

  1. struct FaceMatcher {
  2. static func matchFaces(image1: Data, image2: Data, accessToken: String, completion: @escaping (Double?, Error?) -> Void) {
  3. let url = "https://aip.baidubce.com/rest/2.0/face/v3/match?access_token=\(accessToken)"
  4. let parameters: [String: Any] = [
  5. "images": [
  6. ["image": image1.base64EncodedString(), "image_type": "BASE64"],
  7. ["image": image2.base64EncodedString(), "image_type": "BASE64"]
  8. ]
  9. ]
  10. // 实现类似detectFace的上传逻辑...
  11. }
  12. }

3.2 性能优化建议

  1. 令牌缓存:将获取的access_token缓存到Keychain,有效期29天内可复用
  2. 图片压缩:检测前压缩图片至800x800像素以内
  3. 并发控制:使用DispatchQueue限制同时检测数量
  4. 错误重试:实现指数退避算法处理网络异常

四、常见问题解决方案

4.1 授权失败处理

  1. enum BaiduError: Error {
  2. case invalidCredentials
  3. case rateLimitExceeded
  4. case serviceUnavailable
  5. static func handle(response: JSON) -> BaiduError? {
  6. if let errorCode = response["error_code"].int {
  7. switch errorCode {
  8. case 110: return .invalidCredentials
  9. case 120: return .rateLimitExceeded
  10. case 111: return .serviceUnavailable
  11. default: return nil
  12. }
  13. }
  14. return nil
  15. }
  16. }

4.2 真机调试要点

  1. 在Info.plist中添加:

    1. <key>NSPhotoLibraryUsageDescription</key>
    2. <string>需要访问相册以选择检测图片</string>
    3. <key>NSCameraUsageDescription</key>
    4. <string>需要访问相机以拍摄检测图片</string>
  2. 网络请求配置:

  • 确保ATS设置允许百度API域名
  • 在Xcode的Scheme中禁用App Transport Security测试

五、完整项目结构建议

  1. FaceDemo/
  2. ├── Pods/
  3. ├── FaceDemo/
  4. ├── Models/
  5. └── FaceResult.swift
  6. ├── Services/
  7. ├── BaiduAuth.swift
  8. └── FaceDetector.swift
  9. ├── ViewControllers/
  10. └── FaceViewController.swift
  11. └── Supporting Files/
  12. └── Info.plist
  13. └── FaceDemoTests/

本demo完整实现了百度人脸识别的基础功能,开发者可根据实际需求扩展活体检测、1:N人脸搜索等高级功能。建议参考百度人脸识别官方文档获取最新API规范,特别注意服务调用频率限制(免费版QPS为2)。实际生产环境中,应考虑添加用户隐私政策提示和图片本地加密存储等安全措施。