習(xí)日志——人臉識(shí)別系統(tǒng)(上))
將采用D415深度學(xué)習(xí)相機(jī)連接全志OK527板子通過mipi屏幕做一個(gè)人臉識(shí)別系統(tǒng)。本文所做工作是將相機(jī)連接板子并在屏幕上輸出畫面。此環(huán)節(jié)的流程大概是硬件連接后檢查-是否識(shí)別到usb-dmesg看內(nèi)核日志看是否綁定上對(duì)應(yīng)驅(qū)動(dòng)-檢查設(shè)備文件找到相機(jī)對(duì)應(yīng)的設(shè)備文件-打開D415設(shè)備文件下對(duì)應(yīng)的彩色節(jié)點(diǎn)-輸出彩色畫面。1.檢查是否識(shí)別到usb相機(jī)通過USB3.0與板子連接連上后需要檢查是否識(shí)別到usb設(shè)備輸入命令input:lsusb output: Bus 003 Device 001: ID 1d6b:0002 Bus 001 Device 001: ID 1d6b:0002 Bus 004 Device 001: ID 1d6b:0001 Bus 002 Device 001: ID 1d6b:0003 Bus 003 Device 003: ID 8086:0ad3 Bus 003 Device 002: ID 1a40:0101Bus表示總線號(hào)后面的Device代表根設(shè)備觀測輸出查官方設(shè)備號(hào)表可知8086:0ad3即為D415相機(jī)的設(shè)備號(hào)其掛載在總線3下的003號(hào)根設(shè)備上而Linux設(shè)定總線下的Device001代表的ID后面四位表示其對(duì)應(yīng)的USB代次通過Bus 003 Device 001: ID 1d6b:0002可發(fā)現(xiàn)3號(hào)總線對(duì)應(yīng)的是USB2.0而相機(jī)是USB3.0說明插錯(cuò)了usb口隨后重新插到USB3.0上。2.觀察是否綁定了對(duì)應(yīng)驅(qū)動(dòng)而后需要查內(nèi)核看是否綁定了對(duì)應(yīng)驅(qū)動(dòng)輸入命令inputdmesg | grep -iE uvc|8086|RealSense|video output usbcore: registered new interface driver uvcvideo//說明本板子中存在uvcvideo驅(qū)動(dòng)設(shè)備 usb 3-1.3: New USB device found, idVendor8086, idProduct0ad3, bcdDevice51.10 usb 3-1.3: Product: Intel(R) RealSense(TM) Depth Camera 415 usb 3-1.3: Manufacturer: Intel(R) RealSense(TM) Depth Camera 415 uvcvideo 3-1.3:1.1: Unknown video format 00000050-0000-0010-8000-00aa00389b71 usb 3-1.3: Found UVC 1.50 device Intel(R) RealSense(TM) Depth Camera 415 (8086:0ad3) input: Intel(R) RealSense(TM) Depth Ca as /devices/platform/soc3000000/4200000.ehci1-controller/usb3/3-1/3-1.3/3-1.3:1.0/input/input19 usb 3-1.3: Found UVC 1.50 device Intel(R) RealSense(TM) Depth Camera 415 (8086:0ad3) # ← 這是 USB2 / EHCI看上一行路徑里的 ehci1-controller usb 1-1: New USB device found, idVendor8086, idProduct0ad3, bcdDevice51.10 usb 1-1: Product: Intel(R) RealSense(TM) Depth Camera 415 usb 1-1: Manufacturer: Intel(R) RealSense(TM) Depth Camera 415 uvcvideo 1-1:1.1: Unknown video format 00000050-0000-0010-8000-00aa00389b71 usb 1-1: Found UVC 1.50 device Intel(R) RealSense(TM) Depth Camera 415 (8086:0ad3) input: Intel(R) RealSense(TM) Depth Ca as /devices/platform/soc3000000/12.usbc2/4d00000.xhci2-controller/xhci-hcd.23.auto/usb1/1-1/1-1:1.0/input/input20 usb 1-1: Found UVC 1.50 device Intel(R) RealSense(TM) Depth Camera 415 (8086:0ad3) # ← 這是 USB3 / xHCI要用的看上一行路徑里的 xhci-hcd由于內(nèi)核日志太多因此需要從全本日記里面篩關(guān)鍵詞-iE代表忽視大小寫而搜索uvc是因?yàn)閁SB 攝像頭在 Linux 上幾乎都走 UVC驅(qū)動(dòng)名是uvcvideo8086是剛剛看到的idRealSense是深度相機(jī)的廠家型號(hào)video在攝像頭文件里面涉及最廣。從日志輸出來看由于剛才誤插入2.0后又改成插入3.0所以出現(xiàn)了兩次插入歷史。usb 1-1: Found UVC 1.50 device Intel(R) RealSense(TM) Depth Camera 415 (8086:0ad3)表示掛載在總線1的1號(hào)口上且已綁定uvc并被當(dāng)成了UVC1.5設(shè)備。3.檢查設(shè)備文件找到相機(jī)對(duì)應(yīng)的設(shè)備文件目前確定了設(shè)備已經(jīng)綁定了驅(qū)動(dòng)之后需要找到對(duì)應(yīng)的設(shè)備文件才能進(jìn)行后續(xù)的文件操作輸入input: ls -l /dev/video* which v4l2-ctl output: crw-rw---- 1 root video 81, 0 Jan 1 08:00 /dev/video0 crw-rw---- 1 root video 81, 37 Jan 1 08:02 /dev/video1 crw-rw---- 1 root video 81, 3 Jan 1 08:00 /dev/video12 crw-rw---- 1 root video 81, 4 Jan 1 08:00 /dev/video16 crw-rw---- 1 root video 81, 5 Jan 1 08:00 /dev/video17 crw-rw---- 1 root video 81, 38 Jan 1 08:02 /dev/video2 crw-rw---- 1 root video 81, 39 Jan 1 08:02 /dev/video3 crw-rw---- 1 root video 81, 1 Jan 1 08:00 /dev/video4 crw-rw---- 1 root video 81, 40 Jan 1 08:02 /dev/video5 crw-rw---- 1 root video 81, 41 Jan 1 08:02 /dev/video6 crw-rw---- 1 root video 81, 42 Jan 1 08:02 /dev/video7 crw-rw---- 1 root video 81, 2 Jan 1 08:00 /dev/video8 /usr/bin/v4l2-ctl通過ls可以初步確認(rèn)存在video設(shè)備節(jié)點(diǎn)但無法確認(rèn)具體的設(shè)備節(jié)點(diǎn)是哪個(gè)一般來說給項(xiàng)目open的設(shè)備文件都是掛載在/dev下面。通過時(shí)間戳其實(shí)也可以初步辨別再插上D415相機(jī)后出現(xiàn)了video1/2/3/5/6/7。然而不同的節(jié)點(diǎn)其功能不同對(duì)于當(dāng)前需要輸出彩色畫面需要找到對(duì)應(yīng)的彩色節(jié)點(diǎn)。因此需要用到v4l2-ctl調(diào)試工具V4L2 是 Linux 里攝像頭以及部分視頻采集/輸出設(shè)備的標(biāo)準(zhǔn)接口。而v4l2-ctl 是在命令行里操作 V4L2 設(shè)備的工具用于發(fā)現(xiàn)設(shè)備文件查詢并修改文件參數(shù)還可以取走節(jié)點(diǎn)數(shù)據(jù)。通過which命令找到了工具的位置下面需要用工具找到對(duì)應(yīng)的彩色節(jié)點(diǎn)。4.找到D415設(shè)備文件下對(duì)應(yīng)的彩色節(jié)點(diǎn)輸入input v4l2-ctl --list-devices for d in /dev/video1 /dev/video2 /dev/video3 /dev/video5 /dev/video6 /dev/video7; do echo $d v4l2-ctl -d $d --list-formats-ext 2/dev/null | head -n 25 done output: sunxi-vin (): /dev/video0 /dev/video4 /dev/video8 /dev/video12 /dev/video16 /dev/video17 Allwinner Vin (platform:sunxi-vin-media): /dev/media0 Intel(R) RealSense(TM) Depth Ca (usb-xhci-hcd.23.auto-1): /dev/video1 /dev/video2 /dev/video3 /dev/video5 /dev/video6 /dev/video7 /dev/media1 /dev/media2 /dev/video1 ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: Z16 (16-bit Depth) Size: Discrete 256x144 ... 90 fps Size: Discrete 480x270 / 640x360 / 640x480 / 848x480 / 1280x720 各種幀率 /dev/video2 ioctl: VIDIOC_ENUM_FMT Type: Video Capture 下面沒有 [0]沒有格式 /dev/video3 ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: GREY (8-bit Greyscale) 480x270 / 640x360 / 640x480 / 848x480 / 1280x720 [1]: UYVY (UYVY 4:2:2) head 截?cái)嘀豢吹?480x270 開頭 /dev/video5 ioctl: VIDIOC_ENUM_FMT Type: Video Capture 同樣沒有格式 /dev/video6 ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: YUYV (YUYV 4:2:2) 424x24060/30/15/6 fps 640x48030/15/6 fps 1280x72015/10/6 fps 1920x10808 fps /dev/video7 ioctl: VIDIOC_ENUM_FMT Type: Video Capture 沒有格式通過v4l2-ctl --list-devices指令能夠按「哪臺(tái)相機(jī)」把 /dev/video* 分組列出來從輸出可以看出有三組sunxi代表全志片內(nèi)的CSI/VIN攝像頭接口ALLwinner Vin代表同一套 VIN 的 媒體控制器節(jié)點(diǎn)用來描述內(nèi)部管線相當(dāng)于全志這塊 VIN視頻輸入硬件內(nèi)部怎么接線的說明書在下面的Intel RealSense即表示深度相機(jī)設(shè)備可以看出其對(duì)應(yīng)的節(jié)點(diǎn)。而下面的for.....命令則是對(duì) D415 那幾個(gè)節(jié)點(diǎn)逐個(gè)問「你會(huì)什么格式」好從里面挑出彩色口其具體解釋如下for d in /dev/video1 /dev/video2 /dev/video3 /dev/video5 /dev/video6 /dev/video7; do 對(duì)列表里每一個(gè)路徑把名字存進(jìn)變量 d循環(huán)一遍。這里故意沒寫 video0/4/8/...那些是空的 sunxi-vin。 echo $d 先打印 /dev/video6 這類分隔否則六段輸出會(huì)糊成一坨。 v4l2-ctl -d $d --list-formats-ext 2/dev/null | head -n 25 -d $d問當(dāng)前這個(gè)節(jié)點(diǎn) --list-formats-ext格式、分辨率、幀率 2/dev/null報(bào)錯(cuò)不刷屏空節(jié)點(diǎn)常有 ioctl 失敗 head -n 25每個(gè)節(jié)點(diǎn)最多 25 行避免某口分辨率特別多把串口刷爆 done 結(jié)束循環(huán)。通過輸出可得知各個(gè)節(jié)點(diǎn)對(duì)應(yīng)的含義其中YUYV代表彩色節(jié)點(diǎn)因此/dev/video6即為所要找的彩色節(jié)點(diǎn)對(duì)應(yīng)節(jié)點(diǎn)含義如下5.輸出彩色畫面目前已經(jīng)找到了彩色節(jié)點(diǎn)下面需要對(duì)節(jié)點(diǎn)進(jìn)行讀取操作不同于點(diǎn)燈程序的是相機(jī)文件更加復(fù)雜節(jié)點(diǎn)得到的元數(shù)據(jù)需要按照對(duì)應(yīng)的協(xié)議進(jìn)行解碼轉(zhuǎn)換輸出才能最終得到彩色畫面一般來說為了簡便使用可以直接調(diào)用GStreamer或者FFmeg框架這些框架內(nèi)部提供現(xiàn)成的程序幫助直接進(jìn)行取流轉(zhuǎn)換操作輸入命令input which gst-launch-1.0 ffplay gst-play-1.0 export XDG_RUNTIME_DIR/var/run output /usr/bin/gst-play-1.0 /usr/bin/gst-launch-1.0用which命令查找是否存在對(duì)應(yīng)框架程序從輸出可看出出廠鏡像帶 GStreamer沒有 ffplay。不必交叉編譯預(yù)覽程序。export用于給當(dāng)前串口會(huì)話設(shè)環(huán)境變量不設(shè)的話管道往往取流成功但畫不到 MIPI。不過其只對(duì)當(dāng)前終端有效重開 Xshell 或重啟要再執(zhí)行一次。找到框架程序后輸入命令input gst-launch-1.0 v4l2src device/dev/video6 ! video/x-raw,formatYUY2,width640,height480,framerate30/1 ! videoconvert ! waylandsink 對(duì)應(yīng)含義 v4l2src device/dev/video6打開彩色口 video/x-raw,formatYUY2,width640,height480,framerate30/1指定 640×48030和 v4l2-ctl 列出的能力一致適合 1024×600 小屏 videoconvert轉(zhuǎn)格式 waylandsink畫到 Weston/MIPI執(zhí)行輸入程序后攝像頭打開工作按 Ctrl C停止程序。針對(duì)輸入命令的最后一項(xiàng)?!皐aylandsink畫到 Weston/MIPI”代表通過 Wayland 協(xié)議把相機(jī)幀交給 Weston再顯示到 MIPI。Weston是這塊板上正在跑的圖形桌面Linux 上應(yīng)用一般不直接操作屏幕中間有一層「誰在管屏幕」管屏幕的那個(gè)進(jìn)程叫 Weston而Wayland 是一套「應(yīng)用程序怎么把窗口交給屏幕」的協(xié)議。而waylandsink是 GStreamer 里專門把畫面交給Weston的出口插件。前面export XDG_RUNTIME_DIR/var/run設(shè)置環(huán)境就是為了讓waylandsink能找到Weston的Socket將數(shù)據(jù)順利傳入進(jìn)去。不過由于在Xshell一次性粘貼命令時(shí)出現(xiàn)了長命令被撕碎的情況且程序運(yùn)行時(shí)反饋刷屏日志因此對(duì)輸入命令稍作修改如下intput set H dmesg -n 3 export XDG_RUNTIME_DIR/var/run gst-launch-1.0 v4l2src device/dev/video6 ! videoconvert ! waylandsink fullscreentrue set H 關(guān)掉 bash 的歷史展開。否則命令里的 ! 會(huì)被當(dāng)成「重復(fù)上一條命令」整句粘壞。只對(duì)當(dāng)前串口會(huì)話有效。 dmesg -n 3 把往控制臺(tái)打的內(nèi)核日志壓到級(jí)別 3。減輕 crtc 94 刷屏方便看到 GStreamer 自己的字。 export XDG_RUNTIME_DIR/var/run 告訴程序去 /var/run 找 Weston 的 Wayland 套接字。waylandsink 靠這個(gè)把窗口交給桌面。重開 Xshell 要再執(zhí)行一次。