瑞芯微Rockchip开发者社区
直播中

华仔stm32

3年用户 2986经验值
擅长:嵌入式技术
私信 关注
[经验]

《深度学习嵌入式应用开发:基于RK3399Pro和RK3588》第7章第4节,人脸数据采集——读后感以及问题发现与解决

最近在评测飞凌RK3588的人脸识别项目,我用官方的例程已经实现了人脸检测。为了完成人脸识别,决心学习人脸识别的章节。

【学习步骤】

1、认真阅读7.4节。
2、按照作者提供的程序录入程序。
3、放到发板上测试。

程序

# _*_ coding:utf-8 _*_
import cv2
import os
import sys
import random

# 图片宽高
img_w = 64
img_h = 64
# 最多采集500张人脸图片
MAX_NUM = 500
data_dir = './data/'
my_dir = './data/my_faces/'

camera = cv2.VideoCapture(74)


# 改变图片的高度与对比度
def relight(img, light=1, bias=0):
    w = img.shape[1]
    h = img.shape[0]
    for i in range(0, w):
        for j in range(0, h):
            for c in range(3):
                tmp = int(img[j, i, c] * light + bias)
                if tmp > 255:
                    tmp = 255
                elif tmp < 0:
                    tmp = 0
                img[j, i, c] = tmp
    return img


if __name__ == '__main__':
    # 采集照片存放目录
    output_dir = my_dir
    # 判断目录是否存在,若不存在则创建
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    print("save faces pictures to", output_dir)
    # 获取分类器
    haar = cv2.CascadeClassifier('./static/haarcascade_frontalface_alt2.xml')
    # 打开摄像头是否已经打开
    if not camera:
        print("Camera open error! Please check camera!")
        sys.exit(1)
    index = 1
    while True:
        if index <= MAX_NUM:
            print("Processing picture %s" % index)
            # 从摄像头读取图像
            ret, img = camera.read()
            if ret == False:
                print("Camera read picture error! Please check camera")
                break
            # 将图片从从BGR转为灰度图
            gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            # 开始检测人险, 每次缩小图像的比例为1.3,周围矩形框的数目达到5时才算匹配成功
            faces = haar.detectMultiScale(gray_img, 1.3, 5)
            for f_x, f_y, f_w, f_h, in faces:
                face = img[f_y:f_y + f_h, f_x:f_x + f_w]
                # 调整图片的对比度与亮度, 对比度与亮度值都取随机数,这样能增加样本的多样性
                face = relight(face, random.uniform(0.8, 1.2), random.randint(-20, 20))
                # 将图片调整成我们需要的尺寸
                face = cv2.resize(face, (img_w, img_h))
                # 设置OpenCV显示窗口信息
                cv2.namedWindow('image', cv2.WINDOW_NORMAL)
                cv2.resizeWindow('image', 256, 256)
                # 保存图像文件
                str_dir = output_dir + str(index) + '.jpg'
                cv2.imwrite(str_dir, face)
                cv2.moveWindow('image', 200, 200)
                cv2.imshow('image', face)
                index += 1
            # 检测是否按下q键, 若按下则结束人脸照片采集
            key = cv2.waitKey(1) & 0xFF
            if key == ord('q'):
                break
        else:
            print("Finished!")
            break
    # 释放摄像对资源
    camera.release()
    # 销毁所有的窗口
    cv2.destroyAllWindows()

实验效果

通过上面的程序,成功实现了人脸的图像采集,为下一步的人脸识模型训练提供数据。

读后感

这次的程序注释非常详细,我一个一个字录入后,再次学习了摄像头的打开,文件的保存,图像的转换等。写得非常好。

问题发现与解决方案

一个一个字录入程序时发现一个小问题。是程序中没有初始化camera所以我加入了camers = cv2.VideoCapture(74)//74这个是摄像头的端口号,如果大家要找到这个编号,要通过查看摄像头的设备来定。

建议

作者在源码提供上,跟上次一样,还是有一些问题,建议代码要全面,要不有些新手会找不着北。

更多回帖

发帖
×
20
完善资料,
赚取积分