分享

Jetson Nano心得分享:学习计算机视觉技术

 taotao_2016 2023-05-13 发布于北京

视觉类与对话类是人工智能技术的两个最重要应用领域,尽管ChatGPT引发对话类人工智能应用风潮,但视觉类的智能应用依旧是边缘应用的重点,为我们识别并收集边缘角落的各种信息。

Jetson Nano的设备配置对视觉类应用有明显的优势,包括支持两个低功耗CSI摄像头、内置H.264/H.265编解码芯片、底层摄像头子系统(subsystem)等设计,都是为了实现低能耗、高效地执行智能视觉计算目的。

OpenCV是目前计算机视觉领域中使用比例最高的开源库,在Jetson Nano里提供一个支持C/C++与Python的精简版OpenCV库,主要去除关于神经网络的支持以及一些需要授权的算法。除非您很清楚自己真的需要那些额外的功能,否则这里所提供的库是绝对能满足一般图像处理的需求。

显示图像处理结果”是远程操作计算机视觉应用的一大困扰,大部分初学者会使用VNC或NoMachine这些图形化远程控制软件,来查看执行输出的图像或视频。不过使用之后就会发现,VNC的图像显示效果不太流畅,NoMachine的体验感比较好,但是会消耗比较多的内存资源,在内存比较充沛的x86工作机可能比较无所谓,但是对于只有4GB内存的Jetson Nano而言,就会比较吃紧。

熟悉Linux的开发人员,可以选择在SSH终端搭配X11转向的功能,来处理这个图像显示问题,但其他大部分SSH工具并不支持这个功能,或者需要比较复杂的配置,这对新手来说还是比较繁琐的。

这里推荐使用vs-code上的“Remote X11 (SSH)”扩展,来解决计算机图像的输出显示问题,我们只要在“扩展区”输入“X11”关键字,就能显示这个扩展选项,点击安装就可以(如下图):

图片

接下去执行远程连线时,选择“Connect to Host”,然后在对话框中输入“ssh -X 用户名@IP”的方式(如下图),然后按照要求输入密码,就能启动远程X11转向的功能。

图片

现在远程登录到Jetson Nano之后,试试执行以下调用OpenCV库的Python代码,简单读取Jetson Nano自带的VisionWorks一个范例视频:

import cv2

FILE='/usr/share/visionworks/sources/data/pedestrians.mp4'
cap=cv2.VideoCapture(FILE)

while(cap.isOpened()):
_, frame=cap.read()
cv2.imshow('Test Play a Video', frame)
key = cv2.waitKey(1)
cap.release()

看看是否能在本机屏幕上显示如下图的视频内容?

图片

如果可以显示如上图的内容,就表示能在本机上用vs-code的X11转向功能,控制远程的Jetson Nano去执行OpenCV应用。不过这里得强调一点,就是这个X11转向功能并不支持OpenGL的应用。

接着使用OpenCV自带Haar Cascade算法库来体验基础的人脸识别功能,为了避免侵犯个人隐私问题,我们使用GAN对抗式生成网络所创建的虚拟人脸来做示范,然后透过以下代码读入图像,用OpenCV的Haar Cascade算法库来进行人脸识别功能。完整代码如下:

import numpy as np
import cv2

cap = cv2.VideoCapture('/home/nvidia/GAN_Pic03.png')
# 算法的模型路径
libHaarCascadePath='/usr/share/opencv4/haarcascades/'
# 使用“前脸(frontalface)”模型
libHaarCascadeFace='haarcascade_frontalface_default.xml'
faceCascade = cv2.CascadeClassifier(libHaarCascadePath+libHaarCascadeFace)

_, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
print('Detect Face!\n')
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
roi_gray = gray[y : y + h, x : x + w]
roi_color = frame[y : y + h, x : x + w]
cv2.imshow('Jetson Nano的OpenCV人脸检测Demo', frame)
cv2.waitKey()
cv2.destroyAllWindows()
cap.release()

以下是执行的结果,蓝色框框很清晰标示出人脸的位置,读者可以使用自己准备的照片来执行这个代码。

图片

我们继续在这个脸部识别算法上添加“眼睛”的识别功能,只要在上面代码中添加以下粗体部分的增量内容即可:

import numpy as np
import cv2

cap = cv2.VideoCapture('/home/nvidia/GAN_Pic03.png')
# 算法的模型路径
libHaarCascadePath='/usr/share/opencv4/haarcascades/'
# 使用“前脸(frontalface)”模型
libHaarCascadeFace='haarcascade_frontalface_default.xml'
faceCascade = cv2.CascadeClassifier(libHaarCascadePath+libHaarCascadeFace)
# 使用“眼睛(eye)”模型
libHaarCascadeEye='haarcascade_eye.xml'
eyeCascade = cv2.CascadeClassifier(libHaarCascadePath+libHaarCascadeEye)

_, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
# print('Detect Face!\n')
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
roi_gray = gray[y : y + h, x : x + w]
roi_color = frame[y : y + h, x : x + w]
eyes = eyeCascade.detectMultiScale(roi_gray)
for (ex, ey, ew, eh) in eyes:
cv2.rectangle( roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
cv2.imshow('Jetson Nano的OpenCV人脸检测Demo', frame)
cv2.waitKey()
cv2.destroyAllWindows()
cap.release()

执行后就会如下截屏,在先前检测到脸部的范围内进行眼睛的检测,虽然精确度还有改善的空间,不过这个算法库已经能达到基本的要求。

图片

以上的识别计算是OpenCV比较复杂的应用,至于调用摄像头、图像格式转换、色调空间转换、边缘查找、尺度缩放。。。等通用功能,在Jetson Nano所提供的精简版OpenCV都是相当完整,对于学习计算机视觉基础技术是完全足够的。

现在,结合vs-code的X11转向功能去操作Jetson Nano的OpenCV库,能让我们随时随地面对各种场景,用C/C++或Python去开发计算机视觉类的相关应用。【完】

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多