2023/2/22

VSCode. msys2. C++

ref: 結果要在windows 下 build/debug C++ 反而最麻煩。
因為 toolchain 要裝。
現在新的好像都用 msys2,這個裝了之後,用 pacman -S 來安裝 package,有比較方便。

VSCode 就麻煩了,要自己設定 vscode 需要的 json 文件。
結果這一篇說得比較清楚:
VSCode 作為一堆語言的 IDE,並不會自己偵測語言, build tool 和設置。
所以要 user 告訴他。

VSCode 是以 folder 為 project 單位,所以 folder 內要有 .vscode,裡面就是這格 project 相關的設定(build command, option... etc)
所以跟使用的 toolchain 有關,也跟安裝的位置有關。

有時候 VSCode 開啟 folder 時,如果沒看到 .vscode 目錄,會跳出設定讓使用者設。



updated:

最後還是官方的這一篇: 重點應該就是 msys2,新的msys2 用 pacman 安裝package。
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
所以follow instruction裝完 gcc (和gdb),設好環境變數(add msys2 /usr/bin/ to PATH),VSCode 安裝 C++ extension後,create new project,cpp file,之後run 就會自動 create task.json.
另外,在source code 設 bp,之後也會自動 invoke gdb



updated2:

上面的,用 msys2,build 出來的 exe 黨,要在 msys 的 shell 中執行才會正確。
可能是 library ? shell 環境 ?

如果要 build 在 windows command console 執行的,要用: download up 檔解開就可以。 (例如 D:\mingw64)
然後開啟command line 可以用command 設定環境變數
SET PATH=D:\mingw63\bin;%PATH%
然後就可以用了。
用這個 winlibs 的 gcc/g++ build 出來的 exe, 在 windows command console 下執行是正常的。

2023/2/20

hough transform 計算

ref:

Hough transform,hough 座標的兩軸方別是 (r, theta):

Point A,座標 (x,y),做hough transform 後,在 "hough space" 變成一條線。
hough space 的座標是: (r, theta)。
point A 在 hough space 上的轉換是:
r = x*cos(theta) + y*sin(theta)
由圖形可以看到..符合這個條件的 (r, theta) 有很多個。
在 hough space\plan 上,形成一個曲線。

hough 轉換就:找出通過 point A 的所有直線。
直線的代表(參數化),就是 (r, theta):法線距離原點 r,夾角 theta。

x = r/cos(theta)
y = r/sin(theta)
assume y exceed:
yd = y - ymax
new:
y = ymax
x = yd * tan(theta)
assume  x exceed
xd = x -xmax
new:
x = xmax
y = yd / tan(theta)

2023/2/17

New Bing 的回答:reynolds number 的推導

使用白金漢π定理來導出雷諾數的步驟如下¹⁴:

1. 確定問題涉及的物理量,例如流體密度ρ、流體黏度μ、流體速度V和特徵長度L。
2. 確定這些物理量的基本量和測量單位,例如ρ的基本量是質量M和長度L,測量單位是kg/m3;μ的基本量是質量M、長度L和時間T,測量單位是Pa·s或kg/(m·s);V的基本量是長度L和時間T,測量單位是m/s;L的基本量是長度L,測量單位是m。
3. 確定問題涉及的獨立因次數目,即不同的基本量數目。在這個例子中,有三個獨立因次:M、L和T。
4. 根據白金漢π定理,計算無量綱數(π參數)的數目。在這個例子中,有四個物理變數(n=4),三個獨立因次(k=3),所以無量綱數的數目為n-k=4-3=1。也就是說,只需要一個無量綱數來描述問題。
5. 選擇一組重複變數(repeating variables),即可以用來表示所有其他變數的變數。在這個例子中,可以選擇ρ、V和L作為重複變數。
6. 用重複變數乘除其他變數(或自身),使得結果沒有任何物理單位。在這個例子中,只有一個其他變數μ。用ρ、V和L乘除μ,可以得到無量綱參數:π = ρVL/μ
7. 將無量綱參數命名或識別。在這個例子中,π就是雷諾數Re。

因此,使用白金漢π定理可以導出雷諾數Re = ρVL/μ作為描述流體流動特性的無量綱參數¹⁴。

來源: 
(1) 9.2: Buckingham–π–Theorem - Engineering LibreTexts. https://bing.com/search?q=derive+reynolds+number+using+buckingham+pi+theorem
(2) Chapter 7 - 國立清華大學開放式課程OpenCourseWare(NTHU, OCW). https://ocw.nthu.edu.tw/ocw/upload/2/news/2.%20Dimensional%20Analysis.pdf
(3) Buckingham Pi Theorem Application - YouTube. https://www.youtube.com/watch?v=DkJt7668kFI
(4) Buckingham π Theorem - an overview | ScienceDirect Topics. https://www.sciencedirect.com/topics/engineering/buckingham-pi-theorem 
(5) Buckingham π theorem - Wikipedia. https://en.wikipedia.org/wiki/Buckingham_%CF%80_theorem
(6) 9.2: Buckingham–π–Theorem - Engineering LibreTexts. https://bing.com/search?q=derive+reynolds+number+using+buckingham+pi+theorem+%e4%b8%ad%e6%96%87

2023/2/16

New Bing 的回答:使用 ffmpeg 對video file 截圖

根據網路搜尋的結果,要用 ffmpeg 從video 中 抓圖 出來,您可以參考以下的指令:

`ffmpeg -i video.mp4 -ss 00:00:01 -vframes 1 image.jpg`

這個指令會從 video.mp4 的第一秒截取一張圖片並儲存為 image.jpg。

如果您想要截取多張圖片,您可以使用以下的指令:

`ffmpeg -i video.mp4 -vf fps=1 image_%d.jpg`

這個指令會每隔一秒截取一張圖片並儲存為 image_1.jpg, image_2.jpg, ... 等等。


如果您想要每隔10秒截取一張圖片,您可以使用以下的指令:

`ffmpeg -i video.mp4 -vf fps=0.1 image_%d.jpg`

這個指令會每隔10秒截取一張圖片並儲存為 image_1.jpg, image_2.jpg, ... 等等

您也可以使用以下的指令來指定截取的起始時間和結束時間:

`ffmpeg -ss 00:01:00 -i video.mp4 -to 00:05:00 -vf fps=0.1 image_%d.jpg`

這個指令會從 video.mp4 的第一分鐘開始,到第五分鐘結束,每隔10秒截取一張圖片。

2023/2/15

yolov5 export

yolov5 竟然一直有在update。
ref: 就是用 export.py
source code 本身就有範例。

AMB 說明就有點舊了,應該是:
cd yolov5
python ./export.py --weights yolov5s.pt --img-size 416 --batch 1 --opset=11 --include onnx 
也不用改opset 了,因為可以在 arguments 里。
--include 可以把要output 的格式都寫上去...他會都 export 出來。

2023/2/10

bookmark : 車道偵測.

這篇好像很厲害: 是 V2 當然就有 V1,網路上的說明,V1 比較多。

古典CV,大家好像都一樣: STEP BY STEP 的古典 CV 方法,用 jupyter notebook 的:


這篇: 是用同一個 convolution layers (Neck) multi output, 同時輸出 1. object detection. 2. lane detection 3.lane segementation.

然後有人把他 port 在 qualcomm 的snpe 上: 同樣的這家公司,也有把 LanNet Port SNPE 上:

2023/2/9

正確的 py file. python path

為了要正確執行 .py 檔,檔案開頭就要告知 python interpreter 的 path:
#!/usr/bin/python
但是這樣寫的話,在 conda 環境下,就不會引用到conda env 的 python interpreter。
可以用以下 printpython.py來測試:
#!/usr/bin/python
import sys
print(sys.executable)
然後chmod a+x printpython.py
直接執行 ./printpython.py

可以發現,不論是在系統下,或是在 conda env 下,都是/usr/bin/python 來 run。

如果希望依照環境變數的 python, 也就是 conda env 下,用 env 的python,
在系統console就用 /usr/bin/python 的話。就要用:
#!/usr/bin/env python
...

2023/2/7

parse_model 中
for i, (f, n, m, args) in enumerate(d['backbone'] + d['head']):  # from, number, module, args
所以 yaml 中:
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, BottleneckCSP, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, BottleneckCSP, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, BottleneckCSP, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 3, BottleneckCSP, [1024, False]],  # 9
  ]

# YOLOv5 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, BottleneckCSP, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, BottleneckCSP, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, BottleneckCSP, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, BottleneckCSP, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]
每一行內容依序是 from, number, modeule, args

其中定義的一些 layer (例如:Focus,Conv,Bottleneck...),都在 models.common 下