2023/3/31

torchvision datasets to jpg

torchvision 有很多整理好的 datasets。例如 MNIST。
如果要還原回 jpg 檔。
from torchvision import datasets
from PIL import Image

mysets = datasets.MNIST('./mnist')
idx, classes = next(enumerate(mysets))
這樣就取出一個 data,可以看 type,就知道 clases 是 (PIL Image, 數字)
所以把 PIL Image save 就可以。
classes[0].save('aaa.jpg')

如果要讓 dataloader 可以 load,就要依照規定folder structure 來放。

2023/3/25

bookmark : kalmen filter and object detection

要知道object 與自己的相對速度,光靠 object detection 結果,會受到景頭搖動的和 bounding box 跳動的影響。
把這些視作noise,用 Kalman filter 來 track,有: 他是6 年前的 code,所以 用的 ssd-mobilenet,可以試試用新的 Yolo 取代。

這個就是比較新的,用 Yolov4 配上 Kalman filter: 還有這個,moto 車的 FCW,用 Yolo 跟 kalman filter

一般使用 objection detection 做 FCW 的原理,概念而已: 另外。這一篇比較不相關,是用 mmwave + camera (object detection) 做 maching learning

2023/3/13

build C++ program with opencv library

如果不是自己 build from source,用 apt install libopencv-dev 就可以裝 distribution 版本的 opencv(4) library
然後因為是 distribution package,用 pkg-config 可以找到:
$ pkg-config --cflags opencv4
-I/usr/include/opencv4/opencv -I/usr/include/opencv4

$ pkg-config --libs opencv4
-lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm 
-lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality 
-lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres 
-lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_ml -lopencv_videostab 
-lopencv_videoio -lopencv_viz -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs 
-lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
所以build 的時候就:
g++ main.cpp `pkg-config --cflags --libs opencv4`
就可以了。

2023/3/9

some notes on python tkinter

要寫一個開啟 jpg file,show 圖,並且在 status bar (bottom) 顯示 mouse 所在位置對應 jpg file 的 X, y (rgb) 值。
然後windows 要能resize.

結果寫好久...
一些注意事項。

tkinter 的 window 沒有 status bar 這個 option。
所以是用 label 來做。
show jpg 也沒有特別的 widget,所以也是用 label 來做。

windows 上 widget 的 layout 就是先放先贏 (先 pack 先放)。
所以都是 fill, expand 的話,先 pack 就佔掉全部的 window 了,後來 pack 的 widget 會被蓋住看不到。

2023/3/3

bookmark : Inverse Perspective Mapping

就是把照片反投影為上視圖

find real mount url in windows net-disk

因為 windows mount 完就看不到 server/path。所以linux 不知道要怎麼mount。
現在是用 ubuntu 的檔案總管 nautilus。
他的 "connect to",輸入:smb://ip 然後跳出 login dialog,要注意 domain name 要對。
登入後就可以 browse file,找到正確的 folder path。
然後就可以用
mount -t cifs -o username=myname,password=mypassword,iocharset=utf8,uid=myname,gid=myname //server-ip/folder-path mymountpoint

2023/3/2

bing 寫的,read input video resize and save to modified filename

主要是紀錄一下python 讀argument 和 filename 操作的code:
import cv2
import sys
import os

input_file = sys.argv[1]
path, filename = os.path.split(input_file)
filename, ext = os.path.splitext(filename)

output_file = filename + "s" + ext

cap = cv2.VideoCapture(input_file)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

fourcc = cv2.VideoWriter_fourcc(*'mp4v')
fps = cap.get(cv2.CAP_PROP_FPS)
out = cv2.VideoWriter(output_file, fourcc, fps, (width//2, height//2))

while cap.isOpened():
    ret, frame = cap.read()
    if ret:
        resized_frame = cv2.resize(frame, (width//2, height//2))
        out.write(resized_frame)
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()

在多網卡機器上,指定使用某網卡

ref: 還有 bing 的回答:
有一些方法可以实现在多 nic 的 linux 机器上指定某程序使用某 nic,而不是依照 routing table。其中一种方法是使用 LD_PRELOAD 技巧,通过修改程序的网络绑定来实现¹。
另一种方法是使用网络命名空间(network namespaces)的特性,通过 ip 命令来创建和管理不同的网络环境¹²。
來源:
然後,name space 的方法:
如何使用网络命名空间来指定程序使用 eth1。可以按照以下步骤操作:

- 创建一个网络命名空间,比如叫 ns1:`ip netns add ns1`
- 将 eth1 接口移动到 ns1 命名空间中:`ip link set eth1 netns ns1`
- 在 ns1 命名空间中配置 eth1 的 IP 地址和路由:`ip netns exec ns1 ifconfig eth1 192.168.0.10/24 up` 和 `ip netns exec ns1 ip route add default via 192.168.0.1`
- 在 ns1 命名空间中运行您想要指定的程序,比如 ping:`ip netns exec ns1 ping 8.8.8.8`

这样,您就可以让 ping 程序使用 eth1 而不是默认的网络接口了。

(1) Network Namespaces — PF_RING dev documentation. https://www.ntop.org/guides/pf_ring/containers/namespaces.html
(2) How does `ip netns exec` command create mount namespace?. https://stackoverflow.com/questions/45629002/how-does-ip-netns-exec-command-create-mount-namespace
(3) Network Emulation using Network Namespaces and Mininet. https://www.inf.usi.ch/faculty/carzaniga/edu/adv-ntw/mininet.pdf

然後,用 LD_PRELOAD 的方法:
使用网络命名空间来指定程序使用 eth1。可以按照以下步骤操作:

- 创建一个网络命名空间,比如叫 ns1:`ip netns add ns1`
- 将 eth1 接口移动到 ns1 命名空间中:`ip link set eth1 netns ns1`
- 在 ns1 命名空间中配置 eth1 的 IP 地址和路由:`ip netns exec ns1 ifconfig eth1 192.168.0.10/24 up` 和 `ip netns exec ns1 ip route add default via 192.168.0.1`
- 在 ns1 命名空间中运行您想要指定的程序,比如 ping:`ip netns exec ns1 ping 8.8.8.8`

这样就可以让 ping 程序使用 eth1 而不是默认的网络接口了。

(1) Network Namespaces — PF_RING dev documentation. https://www.ntop.org/guides/pf_ring/containers/namespaces.html
(2) How does `ip netns exec` command create mount namespace?. https://stackoverflow.com/questions/45629002/how-does-ip-netns-exec-command-create-mount-namespace
(3) Network Emulation using Network Namespaces and Mininet. https://www.inf.usi.ch/faculty/carzaniga/edu/adv-ntw/mininet.pdf

2023/3/1

imshow error in remote X, and waitKey

ref: 因為server 是沒有 monitor 的,所以remote X 來跑,run plt.imshow( ) 就會出現上面的 error。

follow ref, install 一堆..
sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
windows 端開啟 xserver 也用了下面 option (雖然覺得不是問題)
D:\Program Files\VcXsrv>vcxsrv.exe :0 -ac -terminate -lesspointer -multiwindow -clipboard -wgl -dpi auto
另外,cv2.imshow( ) 很奇怪,執行完並不會show 圖,要呼叫 cv2.waitKey(0) 之後才會。
即使是用 interactive mode,在python 的 prompt 下。
執行完 imshow( ) 之後,沒有反應。
要再執行 cv2.waitKey(0) 之後才會顯示 (無論是正確還是錯誤的 encoding)

imread 也是,雖然說 default 是 cv2.IMREAD_COLOR,但是有時候不寫,雖然沒有 Error,但是不會正常顯示。
雖然 mediainfo 讀出是 YUV420 jpg file( mediainfo 錯誤?),指定 cv2.IMREAD_COLOR 的話,imshow 還是會正常顯示。
不指定cv2.IMREAD_COLOR的話,imshow 就會顯示出不正常的 size and color (auto detect failed ?)

總之
cv2.imread 配合 cv2.imshow 真的莫名其妙的問題很多


ref: 原來 waitKey 是專門給 imshow 用的。
是用來決定要顯示多久用的 function。
所以 imshow 之後一定要配合 waitKey,才會顯示。
同時 waitKey 也不能單獨使用,一定要再 imshow 之後,才會真正讀到 keyboard 輸入。
單純的call waitKey( ) ,前面沒有 imshow 的話,waitKey 會直接 return -1