This commit is contained in:
Daniel
2020-08-26 08:37:16 +03:00
commit 8957d38f16
10 changed files with 2800 additions and 0 deletions

139
main.go Normal file
View File

@@ -0,0 +1,139 @@
package main
import (
"fmt"
"image"
"time"
"github.com/Danile71/go-face"
"gocv.io/x/gocv"
)
const (
netModel = "models/face-detection-retail-0005.bin"
netProto = "models/face-detection-retail-0005.xml"
cnnModel = "models/mmod_human_face_detector.dat"
shapeModel = "models/shape_predictor_68_face_landmarks.dat"
descrModel = "models/dlib_face_recognition_resnet_model_v1.dat"
ageModel = "models/dnn_age_predictor_v1.dat"
genderModel = "models/dnn_gender_classifier_v1.dat"
)
//openvino detecting
//dlib recognize
func main() {
var (
pt = image.Pt(300, 300)
scalar = gocv.NewScalar(0, 0, 0, 0)
faceNet = gocv.ReadNet(netModel, netProto)
)
faceNet.SetPreferableBackend(gocv.NetBackendDefault)
faceNet.SetPreferableTarget(gocv.NetTargetCPU)
defer faceNet.Close()
rec, err := face.NewRecognizer()
if err != nil {
fmt.Println(err)
return
}
defer rec.Close()
err = rec.SetShapeModel(shapeModel)
if err != nil {
fmt.Println(err)
return
}
err = rec.SetDescriptorModel(descrModel)
if err != nil {
fmt.Println(err)
return
}
err = rec.SetAgeModel(ageModel)
if err != nil {
fmt.Println(err)
return
}
err = rec.SetGenderModel(genderModel)
if err != nil {
fmt.Println(err)
return
}
err = rec.SetCNNModel(cnnModel)
if err != nil {
fmt.Println(err)
return
}
start := time.Now()
defer func() {
fmt.Println("elapsed", time.Since(start))
}()
img := gocv.IMRead("test.jpg", gocv.IMReadUnchanged)
defer img.Close()
width := img.Cols()
height := img.Rows()
blob := gocv.BlobFromImage(img, 1, pt, scalar, false, false)
defer blob.Close()
faceNet.SetInput(blob, "")
outputFace := faceNet.Forward("")
defer outputFace.Close()
for i := 0; i < outputFace.Total(); i += 7 {
confidence := outputFace.GetFloatAt(0, i+2)
if confidence > 0.5 {
left := int(outputFace.GetFloatAt(0, i+3) * float32(width))
top := int(outputFace.GetFloatAt(0, i+4) * float32(height))
right := int(outputFace.GetFloatAt(0, i+5) * float32(width))
bottom := int(outputFace.GetFloatAt(0, i+6) * float32(height))
//bugfix
if left < 0 {
left = 0
}
if top < 0 {
top = 0
}
if right > img.Cols() {
right = img.Cols()
}
if bottom > img.Rows() {
bottom = img.Rows()
}
r := image.Rect(left, top, right, bottom)
submat := img.Region(r)
submatgray := gocv.NewMat()
gocv.CvtColor(submat, &submatgray, gocv.ColorBGRToGray)
faces, err := rec.DetectFromMatCNN(submatgray)
submatgray.Close()
if err != nil {
fmt.Println(err)
continue
}
for _, f := range faces {
rec.Recognize(&f)
rec.GetAge(&f)
rec.GetGender(&f)
fmt.Println("detected:", f.Rectangle, " age:", f.Age, " gender:", f.Gender)
f.Close()
}
submat.Close()
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
test.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB