用GPT零负担学单片机之点亮一颗cpu 第3节 训练or特征匹配?用GPT开发嵌入式

news2025/1/19 20:38:04

用GPT零负担学单片机之点亮一颗cpu

第3节 训练or特征匹配?AI写代码

大家好,我是小杰学长
如果你是大学生 遇到电子技术 学习 成长 入行难题
我曾经通过大学比赛赚钱 从事嵌入式AI 航天军工
用特别的学习和求职方法线下半年带50+学弟学妹入行开发
主页佳喔威信,给你提供一定资源和战略方法上的帮助
相信我的职业经历的专业性,一定能帮到你
我的gitee仓库分享 海量嵌入式资源入行求职技巧–>

目录

  • 1. 概述
  • 2. 神经网络和机器视觉
  • 3. 用ai写ai代码
  • 4. 参考博客和lvgl桌面应用
  • 5. 结语
  • 6. 资源下载地址

1. 概述

哈喽 让大家久等了
上一节课和大家说一周后见
结果因为主页工作忙 鸽了两周
但是只要一有空我也没有闲着
一直在翻阅visionboard的博客
visionboard的例程文档不多
但是作品创作博客不少

话不多说 简述本章主题
相对内容较多且杂 但是有所进展 但进展不大
哈哈哈哈哈哈

从主题可以看出来
人脸识别 是要通过训练得到高精度人脸识别效果
还是使用传统的Eigen\fisher\LBPH
等传统机器视觉提取关键特征识别
这是个问题
最后我选择了在漫长等待训练的过程中
转而选择了传统的机器视觉提取关键特征识别
嘻嘻!!!
并且发现已经有人用visionboard
完成了LBP人脸识别考勤机
但是在一次次犹豫中
还是不搬运吧

第二个事
既然要从AI人脸识别
为什么不同AI工具自己写代码呢?
所以用起了Cursor工具
让他自己从0-1实现这个项目

第三个事
visionboard的官方例程、文档、教程不多
所以我在用一些硬件的时候卡了我很多时间
但是在一些作品博客中找到了使用方法

最后一个事
安装了LVGL上位机
为后面的UI开发做准备

2. 神经网络和机器视觉

玩过openMV的小伙伴应该都知道edgeImpule
在这里插入图片描述

那天我在搜集自拍样本和训练准备到自闭的时候
突然想到上次在写机器学习博客的时候
有提到过传统的人脸识别机器视觉算法
图中可以看到我对这几个算法的简介
在这里插入图片描述

对上图博客感兴趣的记得主页佳喔威信
后续能第一时间获取更新博客和课程资料

于是我在漫长等待训练的过程中
转而选择了传统的机器视觉提取关键特征识别
在这里插入图片描述

在omv的官方文档中我找到了如下API:
在这里插入图片描述

在这里插入图片描述

开始肝代码:
这个是我自己测试实现的
注释齐全
后面加了一些其他代码
运行不起来 就自行调试

import sensor
import os
import time
import image
import machine
import lcd
from machine import Pin
from face_recg import match_face, register_face
def LED_INIT():
    #led init
    led_green = machine.LED("LED_GREEN")
    led_red = machine.LED("LED_RED")
    led_blue = machine.LED("LED_BLUE")
def LED_BLACK():
    led_green.off()
    led_blue.off()
    led_red.off()
def LED_WHITE():
    led_green.on()
    led_blue.on()
    led_red.on()
def LED_RED():
    led_green.off()
    led_blue.off()
    led_red.on()
def LED_BLUE():
    led_blue.on()
    led_green.off()
    led_red.off()
def LED_GREEN():
    led_blue.off()
    led_green.on()
    led_red.off()
LED_WHITE()
time.sleep(1)
LED_BLACK()
time.sleep(1)
LED_WHITE()
time.sleep(1)
LED_BLACK()
# Initialize the lcd screen.
lcd.init()
#文件夹初始化
try:
    os.mkdir(rootpath)
except:
    print(os.listdir("/"))
#按键初始化
key_flag = 0
def key0_func(v):
    global key_flag
    if key_flag == 0:
        LED_WHITE()
        key_flag = 1
    else:
        LED_BLACK()
        key_flag = 0
key_0 = Pin(("key_0", 0x907))
key_0.irq(trigger=Pin.IRQ_RISING, handler=key0_func)

sensor.reset()  # Reset and initialize the sensor.
# Sensor settings
sensor.set_contrast(3)
sensor.set_gainceiling(16)

# HQVGA and GRAYSCALE are the best for face tracking.
sensor.set_framesize(sensor.HQVGA)
sensor.set_pixformat(sensor.RGB565)  # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_vflip(True)
sensor.set_hmirror(True)
sensor.skip_frames(time=2000)  # Wait for settings take effect.

# Load Haar Cascade
# By default this will use all stages, lower satges is faster but less accurate.
face_cascade = image.HaarCascade("frontalface", stages=25)
print(face_cascade)

print('loop start')
clock = time.clock()  # Create a clock object to track the FPS.
while True :
    res = "NONE"
    clock.tick()  # Update the FPS clock.
    img = sensor.snapshot()  # Take a picture and return the image.
    img_gray = img.copy().to_grayscale()
    if key_flag == 0:
#        人脸识别
        # Find objects.
        # Note: Lower scale factor scales-down the image more and detects smaller objects.
        # Higher threshold results in a higher detection rate, with more false positives.
        objects = img_gray.find_features(face_cascade, threshold=0.75, scale_factor=1.25)

        if len(objects) == 1:
            LED_GREEN()
            # Draw objects
            img.draw_rectangle( objects[0], color=(0,255,0))
#            for x, y, w, h in objects:
#                img.draw_rectangle( (x, y, w, h), color=(0,255,0))
#                img.draw_string(x, y, "M", color=(0,255,0), scale=3, mono_space=False)
            src_lbp = img_gray.find_lbp(objects[0])
            res = match_face(src_lbp)
        else:
            LED_BLACK()
    else:
#        人脸注册
        ...
    img.draw_string(0, 0, "FPS"+str(int(clock.fps()))+" "+res, color=(0,255,0), scale=1, mono_space=False)
    lcd.display(img) # Take a picture and display the image.
def match_face(src_lbp):  # 人脸识别
    dir_lists = os.listdir(rootpath)  # 路径下文件夹
    dir_num = len(dir_lists)          # 文件夹数量
#    print("Total %d Folders -> %s"%(dir_num, str(dir_lists)))
    for i in range(0, dir_num):
        item_lists = os.listdir(rootpath+'/'+dir_lists[i])  # 路径下文件
#        print("The %d Folder[%s], Total %d Files -> %s" %(i+1, dir_lists[i], item_num, str(item_lists)))
        for j in item_lists:  # 文件依次对比
#            debug(">> Current File: " + item_lists[j])
            try:
                img = image.Image("/orl_faces/%s/%s" % (dir_lists[i], item_lists[j]), copy_to_fb=True)
            except Exception as e:
                debug(e)
                break
            d1 = img.find_lbp((0, 0, img.width(), img.height()))  # 提取特征值
            dist = image.match_descriptor(src_lbp, d1)                 # 计算差异度
            debug(">> Difference Degree: " + str(dist))
            if dist < DIST_THRESHOLD:
                debug(">> ** Find It! **")
                green.on()
                time.sleep(1000)
                green.off()
                return item_lists[j]
    debug(">> ** No Match! **")
    return 0
def register_face(face_cascade, img):
    # ...
   global REGISTER_MODE
   if find(face_cascade, img) == 1:
       debug(">> Existing without registration!")
       REGISTER_MODE = 0
       return 0
   dir_lists = os.listdir(rootpath)  # 路径下文件夹
   dir_num = len(dir_lists)          # 文件夹数量
   new_dir = ("%s/%d") % (rootpath, int(dir_num)+1)
   os.mkdir(new_dir)                 # 创建文件夹
   cnt = 5  # 拍摄5次图片
   while cnt:
       img = sensor.snapshot()
       objects = img.find_features(face_cascade, threshold=0.75, scale_factor=1.25)  # 人脸检测
       if objects:
           width_old = 0
           height_old = 0
           index = 0
           for r in objects:  # 寻找最大的face
               if r[2] > width_old and r[3] > height_old:
                   width_old = r[2]
                   height_old = r[3]
                   index += 1
           index -= 1
           #print("index:", index)
           item_lists = os.listdir(new_dir)  # 新路径下文件
           item_num = len(item_lists)        # 文件数量
           img.save("%s/%d.pgm" % (new_dir, item_num))  # 写入文件
           debug(">> [%d]Regist OK!" % cnt)
           img.draw_rectangle(objects[index])
           green.on()
           time.sleep(50)
           green.off()
           cnt -= 1
           if cnt==0:
               green.on()
               time.sleep(1000)
               green.off()
       REGISTER_MODE = 0

3. 用AI写AI代码

既然要从AI人脸识别
为什么不用AI工具自己写代码呢?
所以用起了Cursor工具
让他基于我上面写的测试代码
从0-1实现这个项目
在这里插入图片描述

大家感兴趣代码的生成过程
可以关注我的短视频自媒体
b站 嵌入式男友杰哥
抖音 小杰学长
不过想让ai帮我们写好一个可以跑的代码
确实需要很好的文字表达功底
以下代码还没验证
但是过程基本是没什么毛病
等下期注册人脸的博客实现了
我在一起调好

import sensor
import os
import time
import image
import lcd
from machine import Pin
from led import LED_BLACK,LED_WHITE,LED_RED,LED_BLUE,LED_GREEN

LED_WHITE()
time.sleep(1)
LED_BLACK()
time.sleep(1)
LED_WHITE()
time.sleep(1)
LED_BLACK()

# Initialize the lcd screen.
lcd.init()

#文件夹初始化
rootpath = "/orl_faces"
print(os.listdir(rootpath))
#按键初始化
key_flag = 0
def key0_func(v):
    global key_flag
    if key_flag == 0:
        LED_WHITE()
        key_flag = 1
    else:
        LED_BLACK()
        key_flag = 0
key_0 = Pin(("key_0", 0x907))
key_0.irq(trigger=Pin.IRQ_RISING, handler=key0_func)

sensor.reset()  # Reset and initialize the sensor.
# Sensor settings
sensor.set_contrast(3)
sensor.set_gainceiling(16)

# HQVGA and GRAYSCALE are the best for face tracking.
sensor.set_framesize(sensor.HQVGA)
sensor.set_pixformat(sensor.RGB565)  # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_vflip(True)
sensor.set_hmirror(True)
sensor.skip_frames(time=2000)  # Wait for settings take effect.

# Load Haar Cascade
# By default this will use all stages, lower satges is faster but less accurate.
face_cascade = image.HaarCascade("frontalface", stages=25)
# ----------------------
# 在文件开头添加全局变量
face_descriptors = {}  # 格式: {'person_name': [descriptor1, descriptor2, descriptor3]}

# 修改加载人脸特征描述符的函数
def load_face_descriptors():
    global face_descriptors
    for person_name in os.listdir(rootpath):
        person_path = os.path.join(rootpath, person_name)
        if os.path.isdir(person_path):
            face_descriptors[person_name] = []
            # 遍历文件夹中的所有描述符文件
            for file in os.listdir(person_path):
                if file.endswith('.bin'):
                    descriptor_path = os.path.join(person_path, file)
                    descriptor = image.load_descriptor(descriptor_path)
                    face_descriptors[person_name].append(descriptor)
            print(f"Loaded {len(face_descriptors[person_name])} descriptors for {person_name}")

# 在主循环开始前添加
load_face_descriptors()  # 程序启动时加载所有已存储的人脸特征
# -------------
# 修改人脸匹配函数
def match_face(src_lbp):
    min_diff = float('inf')
    matched_name = "NONE"
    
    for name, descriptors in face_descriptors.items():
        # 对每个人的所有特征描述符进行匹配
        for descriptor in descriptors:
            diff = image.match_descriptor(src_lbp, descriptor, threshold=70, filter_outliers=False)
            if diff < min_diff:
                min_diff = diff
                matched_name = name
    
    # 设置一个阈值,如果差异度太大,则认为是未知人脸
    if min_diff > 70:
        return f"NONE"
    return f"{matched_name}({min_diff})"

clock = time.clock()  # Create a clock object to track the FPS.
while True :
    res = "NONE"
    clock.tick()  # Update the FPS clock.
    img = sensor.snapshot()  # Take a picture and return the image.
    img_gray = img.copy().to_grayscale()
    if key_flag == 1:
        LED_GREEN()
        # Find objects.
        # Note: Lower scale factor scales-down the image more and detects smaller objects.
        # Higher threshold results in a higher detection rate, with more false positives.
        objects = img_gray.find_features(face_cascade, threshold=0.75, scale_factor=1.25)
        # 首先找到人脸
        if len(objects) == 1:
            # Draw objects
            img.draw_rectangle( objects[0], color=(0,255,0))
#            for x, y, w, h in objects:
#                img.draw_rectangle( (x, y, w, h), color=(0,255,0))
#                img.draw_string(x, y, "M", color=(0,255,0), scale=3, mono_space=False)
            src_lbp = img_gray.find_lbp(objects[0])
            res = match_face(src_lbp)
            # 识别完成后关闭识别功能
            if res=="NONE":
                key_flag = 0
            LED_WHITE()
        else:
            LED_BLACK()

    img.draw_string(0, 0, "FPS"+str(int(clock.fps()))+" "+res, color=(0,255,0), scale=1, mono_space=False)
    lcd.display(img) # Take a picture and display the image.

4. 参考博客和LVGL桌面应用

触摸屏和LVGL
用户按键
LVGL桌面应用 GUI-guider
下载安装就不需要我教了吧!!!
在这里插入图片描述

5. 结语

下周见

太叼了!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2255917.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java Springboot在线招聘APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

动力商城-05 阿里云短信服务

1.添加依赖 <dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId><version>2.0.24</version></dependency>2.控制层 Api(tags "短信业务接口管理") RequestMapping("p/sms&…

深入解析 HTML Input 元素:构建交互性表单的核心

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

HAMR技术进入云存储市场!

2024年12月3日&#xff0c;Seagate宣布其Mozaic 3系列HAMR&#xff08;热辅助磁记录&#xff09;硬盘获得了来自一家领先云服务提供商&#xff08;可能AWS、Azure或Google Cloud其中之一&#xff09;以及其他高容量硬盘客户的资格认证。 Seagate的Mozaic 3技术通过引入热辅助磁…

图数据库 | 12、图数据库架构设计——高性能计算架构

在传统类型的数据库架构设计中&#xff0c;通常不会单独介绍计算架构&#xff0c;一切都围绕存储引擎展开&#xff0c;毕竟存储架构是基础&#xff0c;尤其是在传统的基于磁盘存储的数据库架构设计中。 类似地&#xff0c;在图数据库架构设计中&#xff0c;项目就围绕存储的方…

【工具变量】地级市城市全社会用电量数据(2006-2021年)

一、数据范围&#xff1a;覆盖中国300多个地级市 二、包含指标&#xff1a; 省份、地级市、年份、全社会用电量。 三、数据来源&#xff1a;国家电网查询数据。对于极大部分城市&#xff0c;国网售电量就是全社会用电量(往年的售电量和全社会用电量数据相同&#xff09;,此外…

请求响应:常见参数接收及封装(数组集合参数及日期参数)

数组参数 在前端页面的表单中&#xff0c;存在复选框元素&#xff0c;当提交表单到后端的时候&#xff0c;会将复选框中的全部内容提交到后端进行处理&#xff0c;由于复选框中往往存在很多数据&#xff0c;并且同复选框中数据名称相同&#xff0c;这样的请求参数叫做数组参数…

兔子的寿命有多长?

在宠物的世界里&#xff0c;兔子以其灵动的身姿、柔软的皮毛和温顺的性格深受人们喜爱。然而&#xff0c;当我们满心欢喜地将兔子迎进家门时&#xff0c;可曾想过它们能陪伴我们多久&#xff1f;兔子的寿命&#xff0c;是一个值得深入探讨的话题&#xff0c;它不仅关乎生命的时…

本地多卡(3090)部署通义千问Qwen-72B大模型提速实践:从龟速到够用

最近在做文本风格转化&#xff0c;涉及千万token级别的文本。想用大模型转写&#xff0c;在线的模型一来涉及数据隐私&#xff0c;二来又不想先垫钱再找报销。本地的7-9B小模型又感觉效果有限&#xff0c;正好实验室给俺配了4卡3090的机子&#xff0c;反正也就是做个推理&#…

鸿蒙开发——键值型数据库的基本使用与跨设备同步

1、简 述 ❓ 什么是键值型数据库 键值型数据库&#xff08;KV-Store&#xff09;是一种非关系型数据库&#xff0c;其数据以“键值”对的形式进行组织、索引和存储&#xff0c;其中“键”作为唯一标识符。 键值型数据库适合很少数据关系和业务关系的业务数据存储。 另外&#…

STM32一keil5更换芯片后报错问题的解决。

目录 一、STM32型号认识二、报错问题三、常用的启动配置文件四、问题解决 一、STM32型号认识 二、报错问题 当我们在原来工程下修改芯片时&#xff0c;原本可以编译通过的代码突然很多报错。如下所示&#xff0c;这是因为我们的启动文件配置错误。对于不同型号的芯片其flash容量…

CentOS安装Nginx并配置为系统服务

前言 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 [13]&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;公开版本1.19.6发布…

部署loki,grafana 以及springcloud用法举例

文章目录 场景docker 部署grafanadocker-compose部署loki维护配置文件 local-config.yaml维护docker-compose.yml配置启动 grafana 添加loki数据源springcloud用法举例查看loki的explore,查看日志 场景 小公司缺少运维岗位&#xff0c;需要研发自己部署日志系统&#xff0c;elk…

快速学习selenium基础操作

全篇大概19000字&#xff08;含代码&#xff09;&#xff0c;建议阅读时间1h 什么是Selenium&#xff1f; Selenium是一系列自动化工具集的统称&#xff0c;官方工具有 Selenium IDE、Selenium WebDriver、Selenium Grid&#xff0c; 主要用于桌面端Web应用程序的自动化。能够通…

使用uniapp开发小程序场景:在百度地图上调用接口返回的设备相关信息并展示

首先在百度地图开发者平台注册微信小程序开发密钥下载百度地图SDK-bmap-wx.min.js,下载地址在项目入口index.html页面进行引入页面中进行调用&#xff0c;代码示例如下<map id"map" longitude"108.95" latitude"34.34" scale"3" :m…

SPI驱动模型框架及spidev.c分析---学习记录

目录 SPI设备如何使用 SPI驱动模型框架 SPI 控制器/SPI Master分析 SPI 设备端/SPI Slave分析 SPI 控制器/SPI Master与SPI 设备端/SPI Slave驱动模型 Linux内核自带的SPI 设备端/SPI Slave代码spidev.c 小结 SPI设备如何使用 一般我们使用spi设备驱动是类似文件操作&#xff0…

WordPress XStore Elementor 前端与编辑器内容不同步的问题

最近在新站更换成XStore的Elementor模板后&#xff0c;在编辑器修改完的内容前端网页部分没有同步&#xff0c;一开始清除了缓存没有解决。后面尝试重新安装也还是存在这个问题。 后续又在服务器上删除了Elementor插件缓存文件&#xff0c;问题依然存在。 最后通过在Elemento…

第四届全国过程模拟与仿真大会召开,积鼎科技相伴大会6年成长

第四届全国过程模拟与仿真学术会议于2024年11月29日-12月2日在广州圆满召开。积鼎科技&#xff0c;作为自主流体仿真软件研发的领航企业&#xff0c;与大会相伴四年&#xff0c;自首届以来一直积极参与其中&#xff0c;见证了大会从初创到逐渐壮大的全过程。每一次参会&#xf…

SAP导出表结构并保存到Excel 源码程序

SAP导出表结构并保存到Excel,方便写代码时复制粘贴 经常做接口,需要copy表结构,找到了这样一个程程,特别有用。 01. 先看结果

Hadoop生态圈框架部署 伪集群版(四)- Zookeeper单机部署

文章目录 前言一、Zookeeper单机部署&#xff08;手动部署&#xff09;1. 下载Zookeeper安装包到Linux2. 解压zookeeper安装包3. 配置zookeeper配置文件4. 配置Zookeeper系统环境变量5. 启动Zookeeper6. 停止Zookeeper在这里插入图片描述 注意 前言 本文将详细介绍Zookeeper的…