• go使用dlib训练模型


    作者的环境为windos 10,64位。

    一、准备需要检测的图片

    这个是在网络上下载。

    准备工具,imglab.exe,这个工具用于标记矩形框

    1、创建images目录,把图片放到里面。

    2、运行cmd命令行,imglab -c training_with_face_landmarks.xml images,创建相关文件。

    3、运行cmd命令行,imglab training_with_face_landmarks.xml,打开制作数据集的软件。

    工具的使用说明:

    shirt+左键                                                      长方形的框

    先选中长方形的框,再shirt+左键                   特征点标注

    ctrl+滚动轴                                                     放大或者缩小

    键盘的up和down                                            上/下一张图片

    alt+d                                                               删除当前图片

    选中框+del                                                     删除框

    最终生成文件training_with_face_landmarks.xml和image_metadata_stylesheet.xsl

    一、在go-face库增加训练接口

    如果没有安装go-face和dlib库,请参考go使用dlib人脸检测和人脸识别_xinlinhack的博客-CSDN博客_go 人脸识别

    官方的源码路径:GitHub - Kagami/go-face: Face recognition with Go

    需要增加两个接口:

    1、修改头文件facerec.h,增加结构体,增加两个函数facerec_train_object_detector和facerec_test_object_detector声明。

    1. typedef struct tagSimpleTestResults
    2. {
    3. double precision;
    4. double recall;
    5. double average_precision;
    6. }tagSimpleTestResults;
    7. void facerec_train_object_detector(const char* dataset_filename, const char* detector_output_filename);
    8. tagSimpleTestResults facerec_test_object_detector(const char* dataset_filename, const char* detector_filename);

    2、修改文件facerec.cc。

    增加头文件#include

    增加两个函数facerec_train_object_detector和facerec_test_object_detector

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include "facerec.h"
    8. #include "jpeg_mem_loader.h"
    9. #include "classify.h"
    10. void facerec_train_object_detector(const char* dataset_filename, const char* detector_output_filename) {
    11. // options用于设置训练的参数和模式
    12. simple_object_detector_training_options gsOptions;
    13. // 持向量机的C参数,通常默认取为5.自己适当更改参数以达到最好的效果
    14. gsOptions.C = 5;
    15. // 线程数,你电脑有4核的话就填4
    16. gsOptions.num_threads = 4;
    17. // 打印信息
    18. gsOptions.be_verbose = 1;
    19. gsOptions.add_left_right_image_flips = 1;
    20. train_simple_object_detector(dataset_filename, detector_output_filename, gsOptions);
    21. }
    22. tagSimpleTestResults facerec_test_object_detector(const char* dataset_filename, const char* detector_filename) {
    23. struct simple_test_results t;
    24. tagSimpleTestResults res;
    25. t = test_simple_object_detector(dataset_filename, detector_filename, -1);
    26. res.precision = t.precision;
    27. res.recall = t.recall;
    28. res.average_precision = t.average_precision;
    29. return res;
    30. }

    3、在目录C:\msys64\mingw64\include\dlib\image_processing,添加三个头文件 

    simple_object_detector.h、simple_object_detector_py.h和serialize_object_detector.h

    这三个文件原本是PYTHON的头文件,经过修改。

    4、修改C:\msys64\mingw64\include\dlib\config.h头文件,把DLIB_GIF_SUPPORT屏蔽,否则编译不过。

    5、face.go文件增加两接口

    1. func TrainSimpleObjectDetector(dataset_filename, detector_output_filename string) {
    2. datasetFilePath := C.CString(dataset_filename)
    3. defer C.free(unsafe.Pointer(datasetFilePath))
    4. detectorOutFilePath := C.CString(detector_output_filename)
    5. defer C.free(unsafe.Pointer(detectorOutFilePath))
    6. C.facerec_train_object_detector(datasetFilePath, detectorOutFilePath)
    7. return
    8. }
    9. func TestSimpleObjectDetector(dataset_filename, detector_filename string) (precision, recall, average_precision float32) {
    10. datasetFilePath := C.CString(dataset_filename)
    11. defer C.free(unsafe.Pointer(datasetFilePath))
    12. detectorFilePath := C.CString(detector_filename)
    13. defer C.free(unsafe.Pointer(detectorFilePath))
    14. ret := C.facerec_test_object_detector(datasetFilePath, detectorFilePath)
    15. //defer C.free(unsafe.Pointer(ret))
    16. precision = float32(ret.precision)
    17. recall = float32(ret.recall)
    18. average_precision = float32(ret.average_precision)
    19. return
    20. }

    至此,人脸库可以使用了。

    三、训练例子代码

    1. package main
    2. import (
    3. "fmt"
    4. "github.com/Kagami/go-face"
    5. "path/filepath"
    6. )
    7. // 训练
    8. func trainSimple() {
    9. fmt.Println("开始训练:")
    10. dataset_filename := filepath.Join("cat_face_train", "cat_face_train.xml")
    11. face.TrainSimpleObjectDetector(dataset_filename, "catDetector.svm")
    12. precision, recall, average_precision := face.TestSimpleObjectDetector("cat_face_train/cat_face_train.xml", "catDetector.svm")
    13. fmt.Println("训练图片的精确度: ", precision, recall, average_precision )
    14. precision, recall, average_precision = face.TestSimpleObjectDetector("cat_face_test/cat_face_test.xml", "catDetector.svm")
    15. fmt.Println("测试图片的精确度: ", precision, recall, average_precision )
    16. }
    17. func main() {
    18. // 训练
    19. trainSimple()
    20. }

     可以看到准确率差不多7成,模型保存到了catDetector.svm中。

    四、测试模型

    接口NewRecognizer3、SetSimpleDetector和DetectFromBufferSimple都是定制的,需要修改go-face的库,达到跟python的接口一致。

    1. package main
    2. import (
    3. "fmt"
    4. "github.com/Kagami/go-face"
    5. "gocv.io/x/gocv"
    6. "image"
    7. "image/color"
    8. "log"
    9. "path/filepath"
    10. )
    11. func testDetectorSimple() {
    12. // open display window
    13. window := gocv.NewWindow("cat Detector")
    14. defer window.Close()
    15. // color for the rect when faces detected
    16. greenColor := color.RGBA{0, 255, 0, 255}
    17. //redColor := color.RGBA{255, 0, 0, 255}
    18. // Init recognizer
    19. rec, err := face.NewRecognizer3()
    20. if nil != err {
    21. log.Fatal(err)
    22. }
    23. // close it
    24. defer rec.Close()
    25. // Load
    26. if err = rec.SetSimpleDetector("catDetector.svm"); nil != err {
    27. log.Fatal(err)
    28. }
    29. faceImagePath := "cat_face_test/6.jpg"
    30. //
    31. fmt.Println("正在读的人脸图像 = ", faceImagePath)
    32. img1 := gocv.IMRead(faceImagePath, gocv.IMReadColor)
    33. defer img1.Close()
    34. buff, err := gocv.IMEncode(".jpg", img1)
    35. //
    36. faces, err := rec.DetectFromBufferSimple(buff.GetBytes())
    37. if err != nil {
    38. log.Fatalf("无法识别: %v", err)
    39. }
    40. if 0 == len(faces){
    41. log.Fatal("图片中没找到人脸")
    42. }
    43. for _, f := range faces{
    44. gocv.Rectangle(&img1, f.Rectangle, greenColor, 3)
    45. pt := image.Pt(f.Rectangle.Min.X, f.Rectangle.Min.Y-10)
    46. gocv.PutText(&img1, "cat", pt, gocv.FontHersheyPlain, 1, greenColor, 1)
    47. }
    48. // show the image in the window, and wait 1 millisecond
    49. window.IMShow(img1)
    50. for{
    51. if window.WaitKey(1) >= 0 {
    52. break
    53. }
    54. }
    55. }
    56. func main() {
    57. // 使用模型测试
    58. testDetectorSimple()
    59. }

    工具和代码的路径:训练工具、测试代码、goface修改的代码和头文件。-机器学习文档类资源-CSDN下载

  • 相关阅读:
    YOLOv5的Tricks | 【Trick12】YOLOv5使用的数据增强方法汇总
    【NI-DAQmx入门】校准
    STM32读保护的解除和出现的原因,使用串口和ST-LINK Utility解除读保护
    【python】如何注释
    零基础可以报考中级经济师吗?需要准备多久?
    uboot-重定位中断向量表 relocate_vectors 函数
    manacher算法
    抗击疫情静态HTML网页作业作品 大学生抗疫感动专题页设计制作成品 简单DIV CSS布局网站
    Vue.js2+Cesium1.103.0 十二、绑定多个 DOM 弹窗,并跟随视角实时更新位置
    查看创建好的数据库
  • 原文地址:https://blog.csdn.net/xinlinhack/article/details/126337694