You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

225 lines
6.8 KiB

  1. // Copyright 2016 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package vision
  15. import (
  16. "testing"
  17. "cloud.google.com/go/internal/testutil"
  18. pb "google.golang.org/genproto/googleapis/cloud/vision/v1"
  19. )
  20. func TestFaceFromLandmarks(t *testing.T) {
  21. landmarks := []*pb.FaceAnnotation_Landmark{
  22. {
  23. Type: pb.FaceAnnotation_Landmark_LEFT_EYE,
  24. Position: &pb.Position{X: 1192, Y: 575, Z: 0},
  25. },
  26. {
  27. Type: pb.FaceAnnotation_Landmark_RIGHT_EYE,
  28. Position: &pb.Position{X: 1479, Y: 571, Z: -9},
  29. },
  30. {
  31. Type: pb.FaceAnnotation_Landmark_LEFT_OF_LEFT_EYEBROW,
  32. Position: &pb.Position{X: 1097, Y: 522, Z: 27},
  33. },
  34. {
  35. Type: pb.FaceAnnotation_Landmark_RIGHT_OF_LEFT_EYEBROW,
  36. Position: &pb.Position{X: 1266, Y: 521, Z: -61},
  37. },
  38. {
  39. Type: pb.FaceAnnotation_Landmark_LEFT_OF_RIGHT_EYEBROW,
  40. Position: &pb.Position{X: 1402, Y: 520, Z: -66},
  41. },
  42. {
  43. Type: pb.FaceAnnotation_Landmark_RIGHT_OF_RIGHT_EYEBROW,
  44. Position: &pb.Position{X: 1571, Y: 519, Z: 10},
  45. },
  46. {
  47. Type: pb.FaceAnnotation_Landmark_MIDPOINT_BETWEEN_EYES,
  48. Position: &pb.Position{X: 1331, Y: 566, Z: -66},
  49. },
  50. {
  51. Type: pb.FaceAnnotation_Landmark_NOSE_TIP,
  52. Position: &pb.Position{X: 1329, Y: 743, Z: -137},
  53. },
  54. {
  55. Type: pb.FaceAnnotation_Landmark_UPPER_LIP,
  56. Position: &pb.Position{X: 1330, Y: 836, Z: -66},
  57. },
  58. {
  59. Type: pb.FaceAnnotation_Landmark_LOWER_LIP,
  60. Position: &pb.Position{X: 1334, Y: 954, Z: -36},
  61. },
  62. {
  63. Type: pb.FaceAnnotation_Landmark_MOUTH_LEFT,
  64. Position: &pb.Position{X: 1186, Y: 867, Z: 27},
  65. },
  66. {
  67. Type: pb.FaceAnnotation_Landmark_MOUTH_RIGHT,
  68. Position: &pb.Position{X: 1484, Y: 857, Z: 19},
  69. },
  70. {
  71. Type: pb.FaceAnnotation_Landmark_MOUTH_CENTER,
  72. Position: &pb.Position{X: 1332, Y: 894, Z: -41},
  73. },
  74. {
  75. Type: pb.FaceAnnotation_Landmark_NOSE_BOTTOM_RIGHT,
  76. Position: &pb.Position{X: 1432, Y: 750, Z: -26},
  77. },
  78. {
  79. Type: pb.FaceAnnotation_Landmark_NOSE_BOTTOM_LEFT,
  80. Position: &pb.Position{X: 1236, Y: 755, Z: -20},
  81. },
  82. {
  83. Type: pb.FaceAnnotation_Landmark_NOSE_BOTTOM_CENTER,
  84. Position: &pb.Position{X: 1332, Y: 783, Z: -70},
  85. },
  86. {
  87. Type: pb.FaceAnnotation_Landmark_LEFT_EYE_TOP_BOUNDARY,
  88. Position: &pb.Position{X: 1193, Y: 561, Z: -20},
  89. },
  90. {
  91. Type: pb.FaceAnnotation_Landmark_LEFT_EYE_RIGHT_CORNER,
  92. Position: &pb.Position{X: 1252, Y: 581, Z: -1},
  93. },
  94. {
  95. Type: pb.FaceAnnotation_Landmark_LEFT_EYE_BOTTOM_BOUNDARY,
  96. Position: &pb.Position{X: 1190, Y: 593, Z: -1},
  97. },
  98. {
  99. Type: pb.FaceAnnotation_Landmark_LEFT_EYE_LEFT_CORNER,
  100. Position: &pb.Position{X: 1133, Y: 584, Z: 28},
  101. },
  102. {
  103. Type: pb.FaceAnnotation_Landmark_LEFT_EYE_PUPIL,
  104. Position: &pb.Position{X: 1189, Y: 580, Z: -8},
  105. },
  106. {
  107. Type: pb.FaceAnnotation_Landmark_RIGHT_EYE_TOP_BOUNDARY,
  108. Position: &pb.Position{X: 1474, Y: 561, Z: -30},
  109. },
  110. {
  111. Type: pb.FaceAnnotation_Landmark_RIGHT_EYE_RIGHT_CORNER,
  112. Position: &pb.Position{X: 1536, Y: 581, Z: 15},
  113. },
  114. {
  115. Type: pb.FaceAnnotation_Landmark_RIGHT_EYE_BOTTOM_BOUNDARY,
  116. Position: &pb.Position{X: 1481, Y: 590, Z: -11},
  117. },
  118. {
  119. Type: pb.FaceAnnotation_Landmark_RIGHT_EYE_LEFT_CORNER,
  120. Position: &pb.Position{X: 1424, Y: 579, Z: -6},
  121. },
  122. {
  123. Type: pb.FaceAnnotation_Landmark_RIGHT_EYE_PUPIL,
  124. Position: &pb.Position{X: 1478, Y: 580, Z: -18},
  125. },
  126. {
  127. Type: pb.FaceAnnotation_Landmark_LEFT_EYEBROW_UPPER_MIDPOINT,
  128. Position: &pb.Position{X: 1181, Y: 482, Z: -40},
  129. },
  130. {
  131. Type: pb.FaceAnnotation_Landmark_RIGHT_EYEBROW_UPPER_MIDPOINT,
  132. Position: &pb.Position{X: 1485, Y: 482, Z: -50},
  133. },
  134. {
  135. Type: pb.FaceAnnotation_Landmark_LEFT_EAR_TRAGION,
  136. Position: &pb.Position{X: 1027, Y: 696, Z: 361},
  137. },
  138. {
  139. Type: pb.FaceAnnotation_Landmark_RIGHT_EAR_TRAGION,
  140. Position: &pb.Position{X: 1666, Y: 695, Z: 339},
  141. },
  142. {
  143. Type: pb.FaceAnnotation_Landmark_FOREHEAD_GLABELLA,
  144. Position: &pb.Position{X: 1332, Y: 514, Z: -75},
  145. },
  146. {
  147. Type: pb.FaceAnnotation_Landmark_CHIN_GNATHION,
  148. Position: &pb.Position{X: 1335, Y: 1058, Z: 6},
  149. },
  150. {
  151. Type: pb.FaceAnnotation_Landmark_CHIN_LEFT_GONION,
  152. Position: &pb.Position{X: 1055, Y: 882, Z: 257},
  153. },
  154. {
  155. Type: pb.FaceAnnotation_Landmark_CHIN_RIGHT_GONION,
  156. Position: &pb.Position{X: 1631, Y: 881, Z: 238},
  157. },
  158. }
  159. want := &FaceLandmarks{
  160. Eyebrows: Eyebrows{
  161. Left: Eyebrow{
  162. Top: &pb.Position{X: 1181, Y: 482, Z: -40},
  163. Left: &pb.Position{X: 1097, Y: 522, Z: 27},
  164. Right: &pb.Position{X: 1266, Y: 521, Z: -61},
  165. },
  166. Right: Eyebrow{
  167. Top: &pb.Position{X: 1485, Y: 482, Z: -50},
  168. Left: &pb.Position{X: 1402, Y: 520, Z: -66},
  169. Right: &pb.Position{X: 1571, Y: 519, Z: 10},
  170. },
  171. },
  172. Eyes: Eyes{
  173. Left: Eye{
  174. Left: &pb.Position{X: 1133, Y: 584, Z: 28},
  175. Right: &pb.Position{X: 1252, Y: 581, Z: -1},
  176. Top: &pb.Position{X: 1193, Y: 561, Z: -20},
  177. Bottom: &pb.Position{X: 1190, Y: 593, Z: -1},
  178. Center: &pb.Position{X: 1192, Y: 575, Z: 0},
  179. Pupil: &pb.Position{X: 1189, Y: 580, Z: -8},
  180. },
  181. Right: Eye{
  182. Left: &pb.Position{X: 1424, Y: 579, Z: -6},
  183. Right: &pb.Position{X: 1536, Y: 581, Z: 15},
  184. Top: &pb.Position{X: 1474, Y: 561, Z: -30},
  185. Bottom: &pb.Position{X: 1481, Y: 590, Z: -11},
  186. Center: &pb.Position{X: 1479, Y: 571, Z: -9},
  187. Pupil: &pb.Position{X: 1478, Y: 580, Z: -18},
  188. },
  189. },
  190. Ears: Ears{
  191. Left: &pb.Position{X: 1027, Y: 696, Z: 361},
  192. Right: &pb.Position{X: 1666, Y: 695, Z: 339},
  193. },
  194. Nose: Nose{
  195. Left: &pb.Position{X: 1236, Y: 755, Z: -20},
  196. Right: &pb.Position{X: 1432, Y: 750, Z: -26},
  197. Top: &pb.Position{X: 1331, Y: 566, Z: -66},
  198. Bottom: &pb.Position{X: 1332, Y: 783, Z: -70},
  199. Tip: &pb.Position{X: 1329, Y: 743, Z: -137},
  200. },
  201. Mouth: Mouth{
  202. Left: &pb.Position{X: 1186, Y: 867, Z: 27},
  203. Center: &pb.Position{X: 1332, Y: 894, Z: -41},
  204. Right: &pb.Position{X: 1484, Y: 857, Z: 19},
  205. UpperLip: &pb.Position{X: 1330, Y: 836, Z: -66},
  206. LowerLip: &pb.Position{X: 1334, Y: 954, Z: -36},
  207. },
  208. Chin: Chin{
  209. Left: &pb.Position{X: 1055, Y: 882, Z: 257},
  210. Center: &pb.Position{X: 1335, Y: 1058, Z: 6},
  211. Right: &pb.Position{X: 1631, Y: 881, Z: 238},
  212. },
  213. Forehead: &pb.Position{X: 1332, Y: 514, Z: -75},
  214. }
  215. got := FaceFromLandmarks(landmarks)
  216. if diff := testutil.Diff(got, want); diff != "" {
  217. t.Error(diff)
  218. }
  219. }