视觉类与对话类是人工智能技术的两个最重要应用领域,尽管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去开发计算机视觉类的相关应用。【完】
|