我使用的瑞芯微板子是RK3399Pro,这个板子自带有人脸识别功能,于是参看Rockchip_Developer_Guide_RockX_SDK_CN.pdf这个文档进行测试,具体操作手册上还算详细,在此不赘述。

原始的程序中是可以用摄像头来demo的,但是板子没直接接显示器,你imshow不了呀,无赖之下只能采用网络通讯方式来把结果发送到pc端然后绘制结果,最后显示,在此我采用了python3中的socket来通讯并收发json数据,下面直接上程序吧,先说明下,原始代码写的有些复杂我改写了好些地方。

1、板子服务端程序:

import os
import sys
import time
import sqlite3
import argparse
import numpy as npfrom rockx import RockX
import cv2,json,socketclass FaceDB:def __init__(self, db_file):self.db_file = db_fileself.conn = sqlite3.connect(self.db_file)self.cursor = self.conn.cursor()if not self._is_face_table_exist():self.cursor.execute("create table FACE (NAME text, VERSION int, FEATURE blob, ALIGN_IMAGE blob)")def load_face(self):all_face = dict()c = self.cursor.execute("select * from FACE")for row in c:name = row[0]version = row[1]feature = np.frombuffer(row[2], dtype='float32')align_img = np.frombuffer(row[3], dtype='uint8')align_img = align_img.reshape((112, 112, 3))all_face[name] = {'feature': RockX.FaceFeature(version=version, len=feature.size, feature=feature),'image': align_img}return all_facedef insert_face(self, name, feature, align_img):self.cursor.execute("INSERT INTO FACE (NAME, VERSION, FEATURE, ALIGN_IMAGE) VALUES (?, ?, ?, ?)",(name, feature.version, feature.feature.tobytes(), align_img.tobytes()))self.conn.commit()def _get_tables(self):cursor = self.cursorcursor.execute("select name from sqlite_master where type='table' order by name")tables = cursor.fetchall()return tablesdef _is_face_table_exist(self):tables = self._get_tables()for table in tables:if 'FACE' in table:return Truereturn Falsedef get_max_face(results):max_area = 0max_face = Nonefor result in results:area = (result.box.bottom - result.box.top) * (result.box.right * result.box.left)if area > max_area:max_face = resultreturn max_facedef get_face_feature(image_path):img = cv2.imread(image_path)img_h, img_w = img.shape[:2]ret, results = face_det_handle.rockx_face_detect(img, img_w, img_h, RockX.ROCKX_PIXEL_FORMAT_BGR888)if ret != RockX.ROCKX_RET_SUCCESS:return None, Nonemax_face = get_max_face(results)if max_face is None:return None, Noneret, align_img = face_landmark5_handle.rockx_face_align(img, img_w, img_h,RockX.ROCKX_PIXEL_FORMAT_BGR888,max_face.box, None)if ret != RockX.ROCKX_RET_SUCCESS:return None, Noneif align_img is not None:ret, face_feature = face_recog_handle.rockx_face_recognize(align_img)if ret == RockX.ROCKX_RET_SUCCESS:return face_feature, align_imgreturn None, Nonedef get_all_image(image_path):img_files = dict()g = os.walk(image_path)for path, dir_list, file_list in g:for file_name in file_list:file_path = os.path.join(path, file_name)if not os.path.isdir(file_path):img_files[os.path.splitext(file_name)[0]] = file_pathreturn img_filesdef import_face(face_db, images_dir):image_files = get_all_image(images_dir)image_name_list = list(image_files.keys())for name, image_path in image_files.items():feature, align_img = get_face_feature(image_path)if feature is not None:face_db.insert_face(name, feature, align_img)print('[%d/%d] success import %s ' % (image_name_list.index(name)+1, len(image_name_list), image_path))else:print('[%d/%d] fail import %s' % (image_name_list.index(name)+1, len(image_name_list), image_path))def search_face(face_library, cur_feature):min_similarity = 10.0target_name = Nonetarget_face = Nonefor name, face in face_library.items():feature = face['feature']ret, similarity = face_recog_handle.rockx_face_similarity(cur_feature, feature)if similarity < min_similarity:target_name = namemin_similarity = similaritytarget_face = faceif min_similarity < 1.0:return target_name, min_similarity, target_facereturn None, -1, Noneif __name__ == '__main__':parser = argparse.ArgumentParser(description="RockX Face Recognition Demo")parser.add_argument('-c', '--camera', help="camera index", type=str,default='rtsp://admin:abcd.1234@192.168.3.198:664/Streaming/Channels/101?transportmode=unicast&profile=Profile_101')#大华摄像机网络地址parser.add_argument('-b', '--db_file', help="face database path", required=True)parser.add_argument('-i', '--image_dir', help="import image dir")parser.add_argument('-d', '--device', help="target device id", type=str)args = parser.parse_args()print("camera=", args.camera)print("db_file=", args.db_file)print("image_dir=", args.image_dir)face_det_handle = RockX(RockX.ROCKX_MODULE_FACE_DETECTION, target_device=args.device)face_landmark5_handle = RockX(RockX.ROCKX_MODULE_FACE_LANDMARK_5, target_device=args.device)face_recog_handle = RockX(RockX.ROCKX_MODULE_FACE_RECOGNIZE, target_device=args.device)face_track_handle = RockX(RockX.ROCKX_MODULE_OBJECT_TRACK, target_device=args.device)face_db = FaceDB(args.db_file)if args.image_dir is not None:import_face(face_db, args.image_dir)exit(0)# load face from databaseface_library = face_db.load_face()print("load %d face" % len(face_library))cap = cv2.VideoCapture(args.camera)dstimhw=(480,640)last_face_feature = Noneserversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取本地主机名ip_port=('192.168.3.266',8686)# 绑定端口号serversocket.bind(ip_port)# 设置最大连接数,超过后排队serversocket.listen(2)while True:# Capture frame-by-frameret, frame = cap.read()if frame is None:cap = cv2.VideoCapture(args.camera)ret, frame = cap.read()# continuestarttime=time.time()frame=cv2.resize(frame, dstimhw[::-1], None, fx=0, fy=0)# 建立客户端连接clientsocket, addr = serversocket.accept()in_img_h, in_img_w = frame.shape[:2]ret, results = face_det_handle.rockx_face_detect(frame, in_img_w, in_img_h, RockX.ROCKX_PIXEL_FORMAT_BGR888)ret, results = face_track_handle.rockx_object_track(in_img_w, in_img_h, 3, results)itemresults=[]index = 0for result in results:# face alignret, align_img = face_landmark5_handle.rockx_face_align(frame, in_img_w, in_img_h,RockX.ROCKX_PIXEL_FORMAT_BGR888,result.box, None)# get face featureif ret == RockX.ROCKX_RET_SUCCESS and align_img is not None:ret, face_feature = face_recog_handle.rockx_face_recognize(align_img)target_name=None# search faceif ret == RockX.ROCKX_RET_SUCCESS and face_feature is not None:target_name, diff, target_face = search_face(face_library, face_feature)# print("target_name=%s diff=%s", target_name, str(diff))itemresult={}itemresult["result"]=resultif target_name is not None:itemresult["target_name"]=target_nameelse:itemresult["target_name"]=Noneitemresults.append(itemresult)if itemresults:costtime=time.time()-starttimeprint('costtime={}'.format(costtime))itemresults=json.dumps(itemresults)sendmsg =itemresults.encode('utf-8')clientsocket.send(sendmsg)  #clientsocket.close()# print('itemresults=',itemresults)# break# When everything done, release the capturecap.release()face_det_handle.release()#python3 rockx_face_recog_server.py -b face.db

2、pc客服端程序:

# 导入 socket、sys 模块
import socket,cv2
import sys,json,timedef drawfacerecogresult(im,itemresults):for itemresult in itemresults:_, _, detbox, score =itemresult['result']target_name=itemresult['target_name']cv2.rectangle(im, (detbox[0], detbox[1]), (detbox[2], detbox[3]), (0, 255, 0),2)cv2.putText(im,target_name, (detbox[0], detbox[1] - 12),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0))if __name__ == "__main__":camera='rtsp://admin:abcd.1234@192.168.3.198:664/Streaming/Channels/101?transportmode=unicast&profile=Profile_101'#大华摄像机网络地址cap = cv2.VideoCapture(camera)dstimhw=(480,640)cv2.namedWindow('myim',cv2.WINDOW_NORMAL)ip_port = ('192.168.3.266', 8686)while True:ret, im = cap.read()if im is None:cap = cv2.VideoCapture(camera)ret, im = cap.read()# continueim = cv2.resize(im, dstimhw[::-1], None, fx=0, fy=0)# print(im.shape)# 创建 socket 对象s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接服务,指定主机和端口s.connect(ip_port)# 接收小于 1024 字节的数据recvmsg = s.recv(4096)try:recvmsg=recvmsg.decode('utf-8')itemresults=json.loads(recvmsg)except:passif itemresults:drawfacerecogresult(im, itemresults)cv2.imshow('myim', im)cv2.waitKey(1)cap.release()cv2.destroyAllWindows()s.close()

先启动服务端,然后执行客服端,可以显示,但是比较卡顿,画面也有些花的情况,可能是视频流解码跟不上步伐导致,具体还要查找

瑞芯微板子人脸识别demo展现相关推荐

  1. 基于瑞芯微RK3288人脸识别测温一体终端解决方案

    方案背景 随着企业复工.学校开学,返程高峰的逐步到来,各地将迎来大规模的人员流动,为接下来的疫情防控带来新的难题和不小的压力.筛查和判别感染人群主要以是否有"发热"症状作为初步判断 ...

  2. 瑞芯微转化人脸识别模型

    瑞芯微转化人脸识别模型 一.运行docker 二.使用步骤 1.使用https://netron.app/查看模型的输入及输出 2.设置转换模型参数 3. 运行文件生成rknn模型文件 4. 测试 5 ...

  3. 瑞芯微转化人脸检测retinaface模型

    瑞芯微转化人脸检测retinaface模型 一.运行docker 二.转换步骤 1.使用https://netron.app/查看模型的输入及输出 2.设置转换模型参数 3.运行文件生成rknn模型文 ...

  4. linux人脸识别终端是什么意思,瑞芯微如何看待天波首发得RV1109 Linux人脸识别终端...

    2020年9月21日,天波智能云发布了业内首款基于RV1109的Linux人脸识别终端,得到了业内很多企业的关注.而作为该产品的芯片厂家瑞芯微也出现了本次直播间,瑞芯微的市场负责人对RV1109 Li ...

  5. 人脸识别嵌入式Linux芯片瑞芯微RV1109参数介绍

    瑞芯微RV1109是一款用于工控机或人工智能视觉应用的高性能机器视觉处理器SoC.它基于双核ARM Cortex-A7 32位内核,集成了NEON和FPU.每个核心有一个32KB的I-cache和32 ...

  6. 瑞芯微rk356x板子快速上手

    文章目录 rk3568 CPU GPU NPU VPU 一.编译环境要求 二.编译前准备 0)开发板型号 1)安装第三方编译工具 2)设置adb路径 3)安装USB驱动DriverAssitant_v ...

  7. 35、ubuntu20.04搭建瑞芯微的npu仿真环境和测试rv1126的Debain系统下的yolov5+npu检测功能以及RKNN推理部署以及RTSP视频流解码

    基本思想:手中有一块core-1126/1109-JD4,记录一下其刷机过程和开发人数统计,与树莓派的nanodet 每帧200ms对比一下 第一步:刷机,真的是难,各种各样的小问题,反正成功的方法只 ...

  8. 瑞芯微推出RV1126性能/案例大评测

    瑞芯微推出RV1126性能/案例大评测 目录 案例1:面部识别 案例2:图像分割 案例3:目标检测 一.车载录像性能提升一倍,支持8路1080p视频录像 二.内置2T独立NPU,AI效率更高 三.配备 ...

  9. 瑞芯微RK3399K简单介绍及烧写镜像

    瑞芯微RK3399K简单介绍及烧写镜像 文章目录 瑞芯微RK3399K简单介绍及烧写镜像 1. 前言 2. 官网及相关资料 3. 烧写固件所需软件 4. 直接烧写单一固件步骤 5. 固件文件 6. W ...

  10. 全志和瑞芯微比较_哪家强

    描述 全志和瑞芯微 全志科技是领先的智能应用处理器SoC和智能模拟芯片设计厂商.公司主要产品为多核智能终端应用处理器.智能电源管理芯片等.凭借卓越的研发团队及技术实力,全志科技在超高清视频编解码.高性 ...

最新文章

  1. 树莓派python实例_使用Python实现树莓派WiFi断线自动重连实例(附代码)
  2. ie 不执行回调函时_javascript引擎执行的过程的理解--执行阶段
  3. 操作系统中的进程与线程和java中的线程
  4. mac端addr2line的NDK位置和使用
  5. python制作文本进度条
  6. 从声学模型算法角度总结 2016 年语音识别的重大进步
  7. python中unique()与nuniqe()用法
  8. python fread_fwrite 和 fread函数的用法小结
  9. VB语言实现Http的Post和Get请求
  10. 中兴b860刷机运行Linux,整理 B860A 刷机,安装第三方,升降固件,进recovery
  11. 在CentOS 8上安装使用Firefox的视频播放功能(FFmpeg)
  12. C语言公交车线路信息查询系统
  13. 【ClickHouse内核】MergeTree表引擎语法结构
  14. Python时间戳转为北京时间
  15. 服务器的类型包括哪些
  16. 红米note2 android版本是多少,红米Note 2有几个版本以及红米Note2手机哪个版本好用?...
  17. java的public int_Java语言中“int”、“public”、“static int ”有什么区别?
  18. 分析网络出现故障的原因
  19. python满天星效果图_50行Python代码绘制满天星
  20. 高云FPGA芯片GW2A固化方法

热门文章

  1. 同心向前,Google Play 十周年啦!
  2. 图的有权最短路径及Dijkstra算法
  3. 出现VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录。 未能将管道连接到虚拟机: 所有的管道范例都在使用中。
  4. php script是什么,script是什么意思
  5. 用unity高通Vuforia AR制作自定义扫描物体
  6. 宁皓网bootstrap
  7. 中国十大1至3岁童车品牌辐轮王土拨鼠世界儿童自行车品牌排行榜
  8. 阿里巴巴矢量图引入步骤
  9. simplest_ffmpeg_decoder_pure.c
  10. Widows Git SSH