筆者的硬件配置
mac端:macbook air m1,16G內(nèi)存
ubuntu端:i7-13700kf + RTX 4090,32G內(nèi)存
訪問下面的網(wǎng)站,下載對應(yīng)操作系統(tǒng)的安裝包,根據(jù)提示安裝。
https://ollama.com/download
安裝完之后,直接打開,狀態(tài)欄會(huì)出來一只小羊駝。
打開mac的終端輸入,有如下的輸出就說明安裝成功了。
ubuntu通過下面的指令可以很輕松的完成安裝。
和mac一樣,終端輸入,有如下的輸出就說明安裝成功了。
打開下面的網(wǎng)站,根據(jù)電腦的配置,選擇合適的模型進(jìn)行部署。
https://ollama.com/library/deepseek-r1:1.5b
筆者認(rèn)為mac有16G內(nèi)存的話,可以先嘗試一下7b的模型。
看來M1 16G還是可以順利運(yùn)行7b的模型,占用的內(nèi)存在2-4G之間。
Ubuntu的內(nèi)存有點(diǎn)吃緊,擔(dān)心模型對內(nèi)存也有要求,筆者給了64G的swap空間,嘗試運(yùn)行32b的模型。
能夠順利運(yùn)行32b的模型,內(nèi)存占用不多,顯存占了22G。
筆者準(zhǔn)備了幾類自己常問ChatGPT的問題,比較一下7b和32b模型。
測試的問題比較少,代碼部分內(nèi)容較多,隨機(jī)性還挺大的。這里只總結(jié)這三個(gè)問題的表現(xiàn):
7b和32b在代碼解析上差不太多,個(gè)人看不出區(qū)別來;
7b在代碼報(bào)錯(cuò)問題上,只生成了一個(gè)解決方案,可能需要多次交互才能順利解決問題;
32b的結(jié)果和ChatGPT比較接近,給了幾個(gè)解決方案,其中有一個(gè)直接能解決問題的;
在代碼生成上,需要計(jì)算的是相機(jī)視錐體,總共是5個(gè)點(diǎn)。7b給的代碼是錯(cuò)誤的,把相機(jī)后面不可見的區(qū)域也考慮進(jìn)去了,算了8個(gè)點(diǎn);32b的代碼沒有問題,計(jì)算的是相機(jī)視錐體。
下面的內(nèi)容感興趣可以看看。
筆者使用gaussian splatting中的一段代碼來測試這兩個(gè)模型,下面是發(fā)送給這兩個(gè)模型的內(nèi)容。
對于7b,它的回答是
代碼總結(jié):
- 這個(gè)函數(shù)計(jì)算兩個(gè)圖像之間的SSIM(結(jié)構(gòu)相似性)值。
- 它通過滑動(dòng)窗口計(jì)算均值、方差和協(xié)方差,并根據(jù)預(yù)定義的常數(shù)C1和C2進(jìn)行歸一化。
- 最終返回的是整體平均值或通道級平均值,取決于size_average參數(shù)。
公式總結(jié):
$$
SSIM(img1, img2) = frac{(2mu_1mu_2 + C1)(2sigma_{12} + C2)}{(mu_1^2 + mu_2^2 + C1)(sigma_1^2 + sigma_2^2 + C2)}
$$
其中:
- $mu_1$和$mu_2$是img1和img2的加權(quán)均值
- $sigma_1^2$和$sigma_2^2$是img1和img2的加權(quán)方差
- $sigma_{12}$是img1和img2乘積的加權(quán)協(xié)方差
- $C1 = (0.01)^2$和$C2 = (0.03)^2$是防止分母為零的常數(shù)
對于32b,它的回答是
函數(shù)總結(jié):
該函數(shù)實(shí)現(xiàn)了結(jié)構(gòu)相似性指數(shù) (Structural Similarity Index, SSIM) 的計(jì)算。SSIM是一種衡量兩幅圖像相似度的指標(biāo),考慮了亮度(luminance)、對比度(contrast)和結(jié)構(gòu)(structure)之間的差異。
公式總結(jié):
SSIM的計(jì)算公式如下:
$$
SSIM(x, y) = frac{(2mu_xmu_y + C_1)(2sigma_{xy} + C_2)}{(mu_x^2 + mu_y^2 + C_1)(sigma_x^2 + sigma_y^2 + C_2)}
$$
其中:
- $mu_x, mu_y$ 是圖像x和y的局部均值
- $sigma_x^2, sigma_y^2$是圖像x和y的方差
- $sigma_{xy}$ 是圖像x和y的協(xié)方差
- $C_1 = (0.01L)^2, C_2 = (0.03L)^2$是常數(shù)項(xiàng),L是像素的最大值(默認(rèn)為255)
這是筆者運(yùn)行MonoGS的時(shí)候遇到的一個(gè)問題,下面的代碼塊是發(fā)送給模型的內(nèi)容。
這個(gè)問題已經(jīng)通過ChatGPT解決,原因是這段代碼認(rèn)為系統(tǒng)沒有顯示器或圖形界面,切換 的后端為無顯示后端,例如 就可以了。(吐槽:matplotlib這里沒有創(chuàng)建圖形界面,保存圖片居然還需要xxxxxx)
7b模型的回答
通過這種方法,你應(yīng)該能夠解決報(bào)錯(cuò)的問題。如果問題仍然存在,請?zhí)峁└嘞嚓P(guān)代碼或上下文以便進(jìn)一步診斷。
最終答案:在調(diào)用時(shí),如果沒有傳遞適當(dāng)?shù)膮?shù),可能導(dǎo)致繪圖區(qū)域無效。通過添加合適的參數(shù)(如10x6英寸)可以解決問題:
修改后的代碼如下:
32b模型的回答
為了解決報(bào)錯(cuò)的問題,請按照以下步驟操作:
檢查當(dāng)前Python環(huán)境:確保你使用的是支持圖形輸出的環(huán)境,或者在沒有 GUI 的環(huán)境中正確配置了matplotlib。
修改代碼以設(shè)置合適的backend:
在你的代碼中添加以下兩行,放在任何導(dǎo)入matplotlib.pyplot之前:
顯式指定繪圖大?。蛇x):
如果仍然有問題,可以在創(chuàng)建figure時(shí)明確設(shè)置大小,確保寬高都是正數(shù):
處理異常情況:
在繪圖之前,添加錯(cuò)誤檢查,防止負(fù)值或零尺寸被傳遞給繪圖函數(shù)。
重新運(yùn)行代碼:
應(yīng)用上述修改后,再次執(zhí)行代碼,觀察是否還出現(xiàn)相同錯(cuò)誤。
如果問題依然存在,請進(jìn)一步核實(shí)PIL庫的版本以及系統(tǒng)環(huán)境的變化,并考慮其他可能的解決方案。
筆者不喜歡讓AI生成所有的代碼,筆者一般是搭建一個(gè)框架讓AI來補(bǔ)充,并提供一些必要的說明。因此這里對比一下7b和32b模型的代碼補(bǔ)充和生成的能力,下面是發(fā)送給模型的內(nèi)容。
7b模型的回答
看起來你正在嘗試在相機(jī)坐標(biāo)系中定義一個(gè)視錐體(視界盒),然后將其變換到世界坐標(biāo)系中,并根據(jù)緩沖距離擴(kuò)展這個(gè)視界盒的邊界框(bbox)。以下是具體的實(shí)現(xiàn)步驟和代碼示例:
函數(shù)實(shí)現(xiàn)思路
- 相機(jī)坐標(biāo)系到世界坐標(biāo)系轉(zhuǎn)換
首先,需要將相機(jī)位置和旋轉(zhuǎn)參數(shù)轉(zhuǎn)換為齊次變換矩陣。通過這個(gè)矩陣可以將相機(jī)坐標(biāo)系中的點(diǎn)轉(zhuǎn)換到世界坐標(biāo)系。 - 生成視錐體邊界點(diǎn)
根據(jù)相機(jī)的FOV(水平和垂直)、緩沖距離和其他參數(shù),計(jì)算出在相機(jī)坐標(biāo)系中視錐體的邊界點(diǎn)。 - 變換到世界坐標(biāo)系
使用齊次變換矩陣將這些邊界點(diǎn)轉(zhuǎn)換到世界坐標(biāo)系中。 - 計(jì)算bbox并擴(kuò)展
計(jì)算這些點(diǎn)的最小和最大值(x, y, z),然后根據(jù)緩沖距離擴(kuò)展bbox。 - 更新邊界參數(shù)
根據(jù)傳入的min_x、max_x等參數(shù),更新這些參數(shù)。
實(shí)現(xiàn)代碼
使用說明
輸入?yún)?shù):
- : 相機(jī)旋轉(zhuǎn)矩陣(3x3)。
- : 相機(jī)位置向量(3D)。
- : 擴(kuò)展的距離比例。
- 和 : 水平和垂直視場角,以度為單位。
- : 初始邊界參數(shù)。
輸出:
- 返回更新后的邊界參數(shù) 。
示例
注意事項(xiàng)
- 單位轉(zhuǎn)換:視場角需要從度轉(zhuǎn)換為弧度。
- 相機(jī)坐標(biāo)系方向:如果相機(jī)的z軸指向物體,需調(diào)整視錐體的方向(如將 和 替換為 和 )。
- 擴(kuò)展距離:buffer_distance 可以根據(jù)需求調(diào)整,控制bbox的擴(kuò)展程度。
希望這個(gè)實(shí)現(xiàn)對您有幫助!
32b模型的回答
步驟說明:
定義參數(shù):
確定所有輸入?yún)?shù)的意義和單位。視錐體頂點(diǎn)生成:
- 根據(jù)和計(jì)算視錐體底面矩形的寬度和高度。
- 生成矩形四個(gè)頂點(diǎn)在相機(jī)坐標(biāo)系下的坐標(biāo)。
應(yīng)用旋轉(zhuǎn)和平移變換:
- 對每個(gè)頂點(diǎn)應(yīng)用,將其從相機(jī)坐標(biāo)系轉(zhuǎn)換到世界坐標(biāo)系。
- 將每個(gè)頂點(diǎn)加上向量,完成平移到世界坐標(biāo)系的轉(zhuǎn)換。
計(jì)算包圍盒:
- 收集所有變換后的頂點(diǎn)和原點(diǎn)(視錐體頂點(diǎn))在x和z方向上的最小值和最大值。
- 這些極值構(gòu)成了包圍盒的范圍。
擴(kuò)展包圍盒:
- 根據(jù),向外擴(kuò)展包圍盒的尺寸。這里假設(shè)是一個(gè)比例,乘以當(dāng)前包圍盒的尺寸進(jìn)行擴(kuò)展。
更新全局范圍:
- 將擴(kuò)展后的包圍盒與傳入的, , , 進(jìn)行比較,并更新這些值,確保它們包含更大的范圍。
返回結(jié)果:
- 返回更新后的四個(gè)邊界值。
代碼實(shí)現(xiàn):
說明:
視錐體生成:根據(jù)給定的水平和垂直視場角( 和 ),計(jì)算出視錐體底面矩形在相機(jī)坐標(biāo)系下的四個(gè)頂點(diǎn)。假設(shè)視錐體的高度為1單位長度。
坐標(biāo)變換:每個(gè)頂點(diǎn)先通過旋轉(zhuǎn)矩陣轉(zhuǎn)換到世界坐標(biāo)系,然后再應(yīng)用平移變換,加上相機(jī)的位置向量。
包圍盒計(jì)算:收集所有變換后的頂點(diǎn)和原點(diǎn)(視錐體的頂點(diǎn))在x和z方向上的最小值和最大值,從而得到包圍盒的范圍。
擴(kuò)展包圍盒:根據(jù)給定的(這里作為比例),向外擴(kuò)展包圍盒的尺寸。計(jì)算新的極值,并確保擴(kuò)展后的包圍盒正確覆蓋原視錐體區(qū)域。
更新全局范圍:將擴(kuò)展后的包圍盒與傳入的全局邊界進(jìn)行比較,更新這些邊界以包含更大的范圍。
返回結(jié)果:最后,返回更新后的四個(gè)邊界值, , , 和 。