一、前言
2019年7月15日-29日,上海陆家嘴地铁站,出现15个会吐诗歌的POS机。诗歌里描绘着孩子们生活和希望的世界,那份特有的天真让来往匆匆的路人也都不由自主的停下了步伐。
POS机里的诗歌上还清楚的标注了出处,它们是来自一位位留守儿童在老师的指导下完成的诗歌。
这些小诗里有孩子对于情感一瞬的记录,一件小事,一个细节。
《小狗》
龙祥小学 于辰
“汪 汪 汪”
夏天出生的小狗不知道
一年回家一次的那个人
就是我爸爸
孩子们的字里行间里,没有成年人惯用的宏大议题,山川湖海,各种寓意,各种意义,没有艺术的卖弄,只是三言两语,直击人心。
简单的文字,质朴的情感,反而让诗越动人。
这次,我们也来做一个“诗歌银行”的项目吧。
二、作品介绍
本作品的构思来源于留守儿童的关怀项目,通过诗歌的形式让更多的人了解留守儿童们生活 和无奈以及他们美好的心理愿景,让更多的人关注山区的贫困儿童!
三、作品构成
本作品,主要由三部分构成:
1. 主要的执行件为 热敏打印机,此热敏打印机有互联网功能,并提供API方便用户操作。
2. 二哈识图(HuskyLens)AI 视觉传感器,用于人脸识别。并 使用Mind+ 进行数据处理,通过MQTT协议,将需要的数据发送到互联网平台。
3. 本地Python客户端,连接MQTT服务器,将接收到的数据打印出来。
四、制作过程
1. 使用 HuskyLens 训练人脸识别,这步实际上是比较简单的,就不具体介绍了。
将HuskyLens屏幕中央的“+”字对准需要学习的人脸,短按“学习按键”完成学习。如果识别到相同的脸,则屏幕上会出现一个蓝色的框并显示”人脸:ID1“。这说明已经可以进行人脸识别了。
然而,上述操作只是让HuskyLens学习了人脸的一个角度(维度),但实际上人脸是立体的,因此人脸有多个角度。如果人脸角度变化了,比如正脸换成了侧脸,那HuskyLens不一定能识别出来。为解决这个问题,HuskyLens内置有持续学习的功能,能录入人脸的各个角度,让HuskyLens越学越准确。
录入各个角度人脸的操作方法如下:(注:开始学习新的人脸之前,先要让HuskyLens忘记已经学习过的人脸。操作方法参考“忘记学过的人脸”章节。)
将HuskyLens屏幕中央的“+”字对准需要学习的人脸,长按“学习按键”不松开,此时屏幕中会在人脸上显示黄色框并标识“人脸:ID1”,说明HuskyLens正在学习人脸。然后,将HuskyLens屏幕中央的黄色框依次对准同一个人的脸的不同角度,如正脸、侧脸(也可以是同一个人的多张照片),录入此人脸的各个角度。学习过程中,RGB灯为黄色。
接着,松开“学习按键”,结束学习。如果HuskyLens识别到学习过的人脸,则屏幕上,这个人脸会被蓝色的框选中,并显示”人脸:ID1“。
小提示: 如果屏幕中央没有“+”字,说明HuskyLens在该功能下已经学习过了(已学习状态)。如要让HuskyLens学习新的人脸,则需要先让HuskyLens忘记已学的人脸。
2. 在Mind+中编辑使用代码:
有几点需要说明:
a. MQTT服务器的连接,这里可使用 dfrobot提供的 easy iot 平台:
b. 诗歌使用了说明里的两首:
《小狗》
【龙祥小学 于辰】
“汪 汪 汪”
夏天出生的小狗不知道
一年回家一次的那个人
就是我爸爸
《长大》
【龙祥小学 子豪】
长大是一件很难的事
上一次和爸爸妈妈
告别的时候
我学会了忍住不哭
我就知道
自己长大了
c. 使用【打印诗歌】:作为关键字,用于识别,并使用随机函数,随机打印不同的诗歌。
3. 编写本地发送 python 处理程序:
import paho.mqtt.client as mqtt
import requests
import time
# from time import strftime, localtime# 打印当前时间
import base64
HOST = "iot.dfrobot.com.cn" #服务器ip地址
PORT = 1883 #服务器端口
USER = '********' #登陆用户名
PASSWORD = '********' #用户名对应的密码
TOPIC1 = '********'
api_url = 'http://open.memobird.cn/home/printpaper?ak=********'
api_id = 'memobirdID=********&userID=********'
def on_connect(client, userdata, flags, rc):
rc_status = [ "连接成功", "协议版本错误", "无效的客户端标识", "服务器无法使用", "用户密码错误", "无授权" ]
print("connect:" , rc_status[rc])
client = mqtt.Client()
client.on_connect = on_connect #注册返回连接状态的回调函数
client.username_pw_set(USER, PASSWORD) #如果服务器要求需要账户密码
# client.will_set("test/test", "test", 0) #设置遗嘱消息
client.connect(HOST, PORT, keepalive=600) # 连接服务器
#client.disconnect() #断开连接,不会触发遗嘱消息
def on_message(client, userdata, msg):
print("主题:", msg.topic)
msgvalue = str(msg.payload,'utf-8')
print("消息:", msgvalue,'\n' )
if '【打印诗歌】:' in msgvalue:
msgvalue = msgvalue.replace('【打印诗歌】:', '')
api_content = base64.b64encode(msgvalue.encode('gbk')).decode('utf-8')
base64.encodestring
api_msg = f"""{api_url}&{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}&printcontent=T:{api_content}&{api_id}"""
print(api_msg)
requests.post(api_msg)
client.on_message = on_message #定义回调函数
client.subscribe(TOPIC1, qos=0) #订阅主题test/#
client.loop_start() #非阻塞,启动接收线程
#client.loop_forever() #阻塞式,会卡死在这等待接收
while 1:
pass
打印测试:
花生编程2023.01.17
不错
花生编程2023.01.17
厉害
三春牛-创客2022.12.28
6,厉害
三春牛-创客2022.12.28
很好玩
摸鱼的网民2022.12.16
6啊