本文不遵循cc-by-nc-sa,严禁任何转载

【摘要】

本项目旨在运用机器视觉技术为阿尔兹海默症患者和记忆力不佳的人提供帮助,为他们的日常生活提供便利。基于摆放区域的摄像头,可以帮助记录常用物品,识别准确而实时地将新物品记录到数据库中。框选出这些物品,在显示器上可以便捷地被搜索出来。同时,也可帮助用户记录所摆放物品的位置,便于其找到该物品。本项目将帮助阿兹海默症患者以及记忆力不太好的人更好地应对日常生活,节约时间,提高生活便利性。

【关键词】

   机器视觉、阿尔兹海默症、物品定位

一、绪论引言

(一)课题由来

平时日常生活中偶尔笔者会忘记某个东西被笔者放在哪里了。特别是早上,当笔者忘记把自己的眼镜放到哪里去时,看着时钟上不断减小的预留时间,眼看着就要迟到,才终于找到了眼镜。

当笔者在遇到这么一个难题后,遇到了其他同样戴眼镜的同学,笔者问了一下他们是否有同样的问题,他们也回答有,不过不知道怎么办。由此,笔者想到了要搞这么一个项目,帮助笔者寻找笔者的眼镜。

之后,在老师的开导下,笔者突然联想到,笔者这个项目不光可以帮助笔者自己找眼睛。同样的,随着老龄化社会的发展,阿尔兹海默症的患者也在不断增多,而他们的大脑将无法识别、确认以及记住环境中的物品,会带来诸多不便。

图1 阿兹海默症患者脑部示意图

为此,笔者将机器视觉技术和人工智能技术相结合,提出一款通过机器视觉帮助阿兹海默症患者的记忆工具,帮助他们更有效地记忆、确认和搜索环境中的物品,从而有助于提高他们生活质量。

(二)解决方案

在常用的物品摆放区域前放置一个摄像头。记录下该物品摆放区域内所有的物品,并在有新物品出现时识别其物品类别,若属于易丢物品,则在显示器中框选出来,方便用户搜索。

运行流程:

1 用户在特定位置随手摆放了一个物品

2 带有定向ai的摄像头检测到已存在于模型中的易丢失物品

3 反馈到显示器

4 用户遗忘某个物品的摆放位置时,通过显示器进行检索

5 用户找到该物品

(三)课题意义及创新点

(1)使用普通摄像头进行视频采集,交互操作仍显示在显示屏上,系统整体成本较低

(2)通过识别特定易丢物品,方法巧妙,准确度高,实现难度低

(3)使用跨平台的Python处理计算机视觉图像,学习难度低,处理效果好

(4)应用范围广,不仅可以针对阿兹海默症患者,还可以针对记忆力衰退人士

(5)系统简单可靠,稳定性高,可操控性高

(四)课题规划

完成程序需求分析,模块化框架构建、训练模型并完成程序编写。

(五)研究流程

1.确定研究目的:本研究的目的是开发一款基于机器视觉帮助阿兹海默症病人的记忆工具,帮助他们更好地记忆日常生活中的物品,节约时间,方便他们的生活。

2.确定研究方法:本研究采用机器视觉技术,在常用的物品摆放区域前放置一个摄像头,记录下该物品摆放区域内所有的物品,并在有新物品出现时识别其物品类别,若属于易丢物品,在显示器中框选出来,方便用户搜索。

3.确定研究对象:本研究的对象是阿兹海默症患者以及记忆力不太好的人。

4.确定研究步骤:(1)设计摄像头布置位置:在常用的物品摆放区域前放置一个摄像头,记录下该物品摆放区域内所有的物品。(2)编写计算机程序:编写程序,以识别物品类别,若属于易丢物品,则在显示器中框选出来,方便用户搜索。(3)记录物品位置:记录该物品所摆放位置,方便用户找到所摆放物品。

5.试验验证:在确定研究方案后,进行实际试验,以验证系统的可行性和有效性,以及物品识别和记录的准确性。

二、背景与需求调研

(一)理论研究

机器视觉技术的兴起为本项目的开发提供了重要的技术支持。机器视觉技术是一种具有应用前景的技术,能够帮助电脑从图像、视频或从流列中解析出信息,并根据其计算机程序搜集、识别、诊断和理解等过程进行分析与处理。该技术不仅有深度学习模型算法,还包括分类、聚类、降维、模式识别等多种技术形成的一个完整体系。使用不同的表情识别技术,可以根据摄像头视角记录摆放物品的位置,并使用深度学习分析、识别物体,从而建立记忆工具。

(二)现有课题或产品研究

在进行本项目研究前,必须对相关课题和产品进行充分研究,以明确本项目可能出现的新问题及其优势。

首先,本项目基于机器视觉技术进行,当前市场上,该技术已经有不少的产品使用,例如:亚马逊Rekogntion、IBM Watson Visual Recognition等,使机器可以识别标记人脸,检测不同类型的物体等,但它们对记忆工具的支持还是比较有限的,因此本项目的开发有可能弥补这一空缺。

此外,在市场上也有多款相关内容的记忆工具,如:MAP、Reminder、Tile、Apple AirTag等,它们主要是通过使用蓝牙、GPS等技术,将用户常用物品与无线设备相连,实时查找,提高物品定位。但对物品摆放位置感知度低,无法适配不同类型物品,而本项目可以实现对摆放物品位置的识别,准确记录摆放位置,极大提高搜索易丢失物品的效率。

综上所述,本项目的发展将能够为阿尔兹海默症患者以及记忆力不足的人提供极大的便利,帮助他们更加便利地搜索、定位物品,节省时间,改善他们的生活质量。

三、原型设计

(一)灵感来源

笔者在b站上看到了使用华为HMS Core AR Engine进行物品定位的视频。

图2 B站上AR元件柜

因此,我想到了使用Python+opencv来实现特定易丢物品定位。

(二)任务目标

1 用户在特定位置随手摆放了一个物品

2 带有定向ai的摄像头检测到已存在于模型中的易丢失物品

3 反馈到显示器

4 用户遗忘某个物品的摆放位置时,通过显示器进行检索

四、原型设计

(一)设计过程

开发环境

Python环境:Python 3.11

IDE:PyCharm 2022.3.2 (Professional Edition)/Visual Studio Code 1.75.0

操作系统:Windows 11 专业工作站版22H2 22623.1245

图3 PyCharm环境
图4 Python环境
图5 IDE Visual Studio Code

(二)开发过程

首先,笔者需要确定整体流程,如下:

图6 程序流程图

接着根据流程进行配置

1.模型训练

1.1获取特定易丢失物品的图片形成数据集

在这一部分,笔者使用了python的requests,通过对百度图片搜索功能的爬取,获得了作为实验数据集的水杯、遥控器、笔的图片,每组数据集为60张图

图7 通过更改keyword关键词更改目标

1.2创建easydl模型

图8 创建模型

1.3创建数据集

图9 创建数据集

1.4导入数据集并对数据集进行标注清洗

图10 标注

1.5训练模型并发布

图11 训练界面
图12 发布界面

1.6完成easydl平台的配置

图13 配置界面

2.调用模型

接下来笔者需要获取摄像头画面,通过调用opencv库来实现。获取到视频流之后,截取每一个关键帧,将关键帧通过base64编码push给百度easydl的api,向笔者已经训练好的模型推送。Api会将特定易丢失物品的二维平面坐标返回,通过如下代码进行分割各个不同的物品

图14 分割

并且通过cv2.rectangle函数进行绿框绘制从而进行显示

调用模型可以使用百度easydl提供的api接口:https://aip.baidubce.com/rpc/2.0/ai_custom/v1/detection/mfindo,通过requests模块配合api key、SECRET_KEY等参数实现调用

IMAGE_FILEPATH = "./capture.jpg"

PARAMS = {"top_num": 6}

MODEL_API_URL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/detection/mfindo"

ACCESS_TOKEN = "at"

API_KEY = "ak"

SECRET_KEY = "sk"

with open(IMAGE_FILEPATH, 'rb') as f:

     base64_data = base64.b64encode(f.read())

     base64_str = base64_data.decode('UTF8')

PARAMS["image"] = base64_str

requestUrl = "{}?access_token={}".format(MODEL_API_URL, ACCESS_TOKEN)

response = requests.post(url=requestUrl, json=PARAMS)

responseJson = response.json()

3.部署到香橙派

考虑到要有可视化界面,笔者选择的是香橙派作为计算单元,如下:

图15  OrangePi 5
图16 接上线之后的香橙派

通过balenaEtcher刷入基于Debian的OrangePiOS,通过ssh将主程序推送至香橙派后,再通过系统自带python3.9进行运行。只需要输入 python3 ./main.py 即可

图17 安装OrangePiOS

4.成果演示

图18 开发环境运行示意图
图19 香橙派中程序的运行效果

(Tips:由于写文章时使用的todesk进行连接,远程桌面驱动存在问题,故有偏色,实际连接显示器不会产生此问题)

五、实验设计与测试分析

(一)实验设计

程序准确性由物品类别、硬件清晰度等直接影响

实验1

实验目的:

是否可以识别各类物品

实验步骤:

  1. 启动程序
  2. 将物品放置在画面中的各个地方
  3. 记录实验结果

实验过程:

开启程序后,将特定物品放置在摄像头中

实验记录表:

实验次数测试物品是否准确
1遥控器Yes
2水杯Yes
3No

实验总结:

由于需要单人标注,数据集中的笔的数据仍然不够,不能识别部分类型的笔。其余两项则能准确显示,工作正常

图20 水杯类
图21 遥控器类
图22 笔类

实验2

实验目的:

是否可以准确识别各类物品

实验步骤:

  1. 启动程序
  2. 将物品放置在画面中的各个地方
  3. 记录实验结果

实验过程:

将水瓶置于摄像头的各个位子

图23 置于正中央
图24 露出上半部分
图25 露出左半部分
图26 露出下半部分

实验总结:

水瓶主体均能识别出来,但可能会将衣柜把手部分识别为笔从而框出来

实验3

实验目的:

实际场景下的识别

实验步骤:

  1. 启动程序
  2. 将物品放置在画面中的各个地方
  3. 记录实验结果

实验过程:

图27 单主体
图28 多主体
图29 多主体 + 俯视图

实验总结:

考虑到实际运用中应当为自上而下的俯视图,故将遥控器俯视进行试验,十分成功

(二)使用访谈

请不同的人进行使用,并完成使用反馈。因为整体设计简易直观,所以效果十分优秀。

(三)结论概述

    本项目能够为阿尔兹海默症患者以及记忆力不足的人提供极大的便利,帮助他们更加便利地搜索、定位物品,节省时间,改善他们的生活质量。

六、总结

经过一段时间的研究,本项目证明了不仅能够研究、设计出满足阿尔兹海默症患者特定需要的一款记忆助手系统,更能有效将机器视觉数据应用到日常生活中,为人类带来便捷,提高效率。

本项目结束,尽管面临着诸多难题,但本项目仍能够实现投入使用的目的,取得了实际的进展。最终,本项目也将也阿尔兹海默症患者的常生活提供便利。

七、收获与成长

在参加本项目的过程中,笔者收获颇多。笔者理解了机器视觉的基本原理,掌握了计算机语言的编程技巧,也学会了科学研究的思想和方法,以及如何检索和下载学术文献。刚开始时,由于毫无头绪,毫无经验,笔者花费了大量的时间查阅相关文献,学习使用计算机语言,不断改进优化程序,应用系统的开发和测试,从而步入正轨。在这次项目的开发过程中,笔者不仅激起了对科学的好奇之心,更加深了对困难永不言弃的坚定之心。

八、参考文献

[1]韦志文. 基于机器视觉的分拣机器人设计与研究[D].安徽理工大学,2022.DOI:10.26918/d.cnki.ghngc.2022.000275.
[2]马兆昆. 基于深度学习与机器视觉的装配机器人关键技术研究[D].青岛科技大学,2022.DOI:10.27264/d.cnki.gqdhc.2022.000185.
[3]张磊. 基于机器视觉的自动定位系统的研究[D].长春大学,2020.DOI:10.27912/d.cnki.gcdcx.2020.000022.
[4]梁赟. 基于机器视觉的产品识别与定位方法研究[D].哈尔滨工业大学,2020.DOI:10.27061/d.cnki.ghgdu.2020.004346.
[5]杨雷雷. 基于机器视觉的图像识别和瑕疵检测研究[D].杭州电子科技大学,2020.DOI:10.27075/d.cnki.ghzdc.2020.000435.
[6]陈鹏. 基于机器视觉自动定位折弯机研究[D].华南理工大学,2019.DOI:10.27151/d.cnki.ghnlu.2019.004320.
[7]高宇成. 基于机器视觉的工件定位识别分拣系统设计与实现[D].厦门大学,2019.
[8]余松乐. 通用贴片机定位识别检测系统的研究[D].广东工业大学,2019.DOI:10.27029/d.cnki.ggdgu.2019.000172.
[9]李响. 基于机器视觉的螺钉定位与识别研究[D].西南交通大学,2019.DOI:10.27414/d.cnki.gxnju.2019.002991.
[10]曹乾. 机器视觉在工业机器人目标识别与定位中的研究[D].青岛科技大学,2019.
[11]安喆. 基于机器视觉智能分拣系统的研究与应用[D].兰州交通大学,2019.DOI:10.27205/d.cnki.gltec.2019.000358.
[12]王吉豪,陈奎,王顺,蒋梦,渠敬智.基于机器视觉的位置感知与轨迹跟踪的研究[J].工业控制计算机,2018,31(12):56-57.
[13]姚畅. 基于机器视觉的纽扣分拣设备设计[D].安徽理工大学,2018.

九.附录

相关代码

运行代码需要按照以下步骤安装Python库

pip install opencv-python
pip install cvzone
pip install requests

以下为程序代码

以下为爬取图片代码

import requests

import os

import re

def get_images_from_baidu(keyword, page_num, save_dir):

    header = {

        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}

    url = 'https://image.baidu.com/search/acjson?'

    n = 0

    for pn in range(0, 30 * page_num, 30):

        param = {'tn': 'resultjson_com',

                 # 'logid': '7603311155072595725',

                 'ipn': 'rj',

                 'ct': 201326592,

                 'is': '',

                 'fp': 'result',

                 'queryWord': keyword,

                 'cl': 2,

                 'lm': -1,

                 'ie': 'utf-8',

                 'oe': 'utf-8',

                 'adpicid': '',

                 'st': -1,

                 'z': '',

                 'ic': '',

                 'hd': '',

                 'latest': '',

                 'copyright': '',

                 'word': keyword,

                 's': '',

                 'se': '',

                 'tab': '',

                 'width': '',

                 'height': '',

                 'face': 0,

                 'istype': 2,

                 'qc': '',

                 'nc': '1',

                 'fr': '',

                 'expermode': '',

                 'force': '',

                 'cg': '',    # 这个参数没公开,但是不可少

                 'pn': pn,    # 显示:30-60-90

                 'rn': '30',  # 每页显示 30 条

                 'gsm': '1e',

                 '1618827096642': ''

                 }

        request = requests.get(url=url, headers=header, params=param)

        if request.status_code == 200:

            print('Request success.')

        request.encoding = 'utf-8'

        html = request.text

        image_url_list = re.findall('"thumbURL":"(.*?)",', html, re.S)

        print(image_url_list)

        if not os.path.exists(save_dir):

            os.makedirs(save_dir)

        for image_url in image_url_list:

            image_data = requests.get(url=image_url, headers=header).content

            with open(os.path.join(save_dir, f'{n:06d}.jpg'), 'wb') as fp:

                fp.write(image_data)

            n = n + 1

if __name__ == '__main__':

    keyword = '需要的关键词'

    save_dir = keyword

    page_num = 2

    get_images_from_baidu(keyword, page_num, save_dir)

    print('Get images finished.')

以下为主要功能实现代码

# -*- coding:utf-8 -*-

import time

import base64

import cv2

import requests

camera = cv2.VideoCapture(0)

while True:

    ret, frame = camera.read()

    cv2.imwrite('capture.jpg', frame)

    # 调用百度easydl公有云上已有的模型,

    # 请注意模型免费配额只有10000点,单次使用消耗6点

    IMAGE_FILEPATH = "./capture.jpg"

    PARAMS = {"top_num": 6}

    MODEL_API_URL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/detection/mfindo"

    ACCESS_TOKEN = "at"

    API_KEY = "ak"

    SECRET_KEY = "sk"

    with open(IMAGE_FILEPATH, 'rb') as f:

        base64_data = base64.b64encode(f.read())

        base64_str = base64_data.decode('UTF8')

    PARAMS["image"] = base64_str

    requestUrl = "{}?access_token={}".format(MODEL_API_URL, ACCESS_TOKEN)

    response = requests.post(url=requestUrl, json=PARAMS)

    responseJson = response.json()

    print(responseJson)

    for i in range(len(responseJson["results"])):

            x1, y1 = responseJson["results"][i]["location"]["left"], responseJson["results"][i]["location"]["top"]

            x2, y2 = x1 + responseJson["results"][i]["location"]["width"], y1 + \

                responseJson["results"][i]["location"]["height"]

            cv2.rectangle(frame, (round(x1), round(y1)),

                        (round(x2), round(y2)), (0, 255, 0), 1)

    cv2.imshow('frame', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):  # 按q键退出

        break

    """

    防止过高费用,延时5s,若使用本地模型则不需要

    本地模型可以在easydl平台下载,鉴于本项目短期内

    不会投入实际运用,且尚未确定若投入使用目标平台

    算力,为简化代码,使用在线模型,若正式投入使用

    将采用本地模型,并禁用该代码,且该代码会导致程序

    出现不可估计错误。

    """

    # time.sleep(5)

camera.release()

cv2.destroyAllWindows()