用Xserver顯示遠端ubuntu server的matplotlib畫面 - jenhaoyang/ml_blog GitHub Wiki

寫深度學習程式的時候經常會使用運算能力比較強的server,如果想要顯示遠端python程式的圖片,我們可以利用matplotlib搭配xerver來顯示圖片。 步驟如下:

1. 安裝Xserver並啟用

  • 確認執行X Window system而不是Wayland
# echo $XDG_SESSION_TYPE x11

回傳值應該要是x11,如果是wayland進行以下設定

nano /etc/gdm3/custom.conf 
# Uncomment the line below to force the login screen to use Xorg
WaylandEnable=false

2. 設定ssh並允許x11 forwarding

  • 啟用ssh
  • 開通X11 forwarding
nano /etc/ ssh/ssh_config

將ForwardX11反註解並且設為yes

.
.
Host *
#   ForwardAgent no
    ForwardX11 yes
.
.
  • 重啟ssh服務
  • 測試顯示ubuntu應用程式
$ ssh -X user@hostname
$ echo $DISPLAY

應該要顯示類似localhost:10.0的訊息 試試看開啟gedit

$ gedit
  • Trusted X11 Forwarding 如果/etc/ssh/ssh_config改動的是```ForwardX11Trusted yes````,顯示的速度會變順暢,但是這樣比較不安全,因為傳輸沒有加密 可以用下面指令來連線
$ ssh -Y user@hostname
  • 壓縮x11 forwarding資訊 利用壓縮也可以提升速度
$ ssh -X -C user@hostname
  • 在windows使用x11 forwdarding
    • 要先安裝xserver : VcXsrv Windows X Server
    • 利用putty設定開啟x11 forwarding
    • 用putty連線到server就可以了

3. 將matplotlib backend設定為使用支援x11的

  • 設定backend
import cv2
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')

video = cv2.VideoCapture("video_ource",cv2.CAP_IMAGES)


plt.ion()
fig = plt.figure()
ax1 = fig.add_subplot(111, aspect='equal')

while True:
    success, frame = video.read()
    print("try")
    if success:   
        print("good")
        ax1.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
        fig.canvas.flush_events()
        plt.draw()

參考:
https://www.answertopia.com/ubuntu/displaying-ubuntu-applications-remotely-x11-forwarding/
https://www.answertopia.com/ubuntu/configuring-ssh-key-based-authentication-on-ubuntu/
https://pycairo.readthedocs.io/en/latest/
https://pygobject.readthedocs.io/en/latest/getting_started.html#ubuntu-getting-started
https://stackoverflow.com/a/3453527
https://matplotlib.org/2.0.2/faq/usage_faq.html