管理員
統計數據
原文網址 石小川 2020-03-08 12:50:32
光騰三月份遠距教學 'TCP/IP通信程式實作班' 持續招生中...........,隨時歡迎報名! 熟悉通訊最底層的TCP/IP API程式設計, 對無人機、物聯網、機器監控的核心通訊才能駕馭自如,游刃有餘。 課程: 實作C#、Python遠端監控機台和即時影像傳輸程式 課程內容: *TCP/IP通訊協定基本知識 *Socket常用函式介紹 *主從式系統程式分析 *剖析網路聊天室程式 *剖析遠端監控和即時影像傳輸程式 *實作C#、Python主從式軸控遠端機台程式 *程式最佳化須注意的事項 學習目標---------------------------------- 由淺入深熟悉(A)、(B)、(C)三套程式碼通信信號交握原理。 (A) C#主從式聊天室程式 (B) C#主從式遠端監控和即時影像傳輸程式 (C) C#、Python主從式軸控遠端機台 學員可自行修改或設計網路監控通信程式,集中管理遠端機器或影像、資料的回傳,更進一步,也可將資料輸入Python模組做影像或深度學習分析後回饋機器(下一季課程),達到精簡人力,效能提升的智慧型機器。 此次開課採用遠距指導教學,實作還是以師徒方式比較有效率,使用messenger or line 個別指導學員學習,後期就以學員建立的程式溝通測試, 每一梯次是一個月,目的是想引導有C#、Python基礎的朋友進入自動控制有趣的領域,學習後學員可自行用C#、Python設計TCP/IP遠距監控通信應用程式。 日期: 2020/3/x 隨時開班 註1 . 確定要來上課的朋友請在此留言報名(A+),會用messenger主動聯絡您匯款,金額酌收NT$3500,並傳Quantum講義及程式給您。 Python人工智慧圖控 - 研習交流廳 : https://www.facebook.com/groups/523498395047153/
黃易辰 2020-03-08 13:54:28
石小川 2020-03-08 14:51:06
原文網址 石小川 2020-03-07 18:57:10
當相同類型的程式時常使用或必須重複呼叫時,這時就是考慮將副程式加進程式庫的時候,我習慣將功能相同的函式放在一起製作專用的程式庫,例如處裡影像副程式放在TImage.dll、處裡語音副程式放在 TSpeech.dll、處裡神經網路程式放在TNeuron.dll、處裡光達程式放在TLidar.dll等等 , 一旦你的程式庫累計的夠多的話,將來設計APP應用程式就會如同貼圖一樣方便,只要呼叫程式庫就好,主程式變少了。 接下來Demo一個動態程式庫TSystem.dll,裡面函式是負責儲存使用者最後操作各個視窗元件位置及大小的資訊, 請一步步看圖解。 step1. 建立新的專案。 圖1 ? step2. 選 C#類別庫, 按下一步。 圖2 ? step3. 設定新的專案, 並按建立。 圖3 ? step4. 設計程式碼TSystem.cs。 //---------------------------------------------------------------------- //動態程式庫 TSystem.dll 範例 //---------------------------------------------------------------------- using System; using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using System.Drawing; namespaceTSystem { public class WindowPosition { //--------------------------------------------------------------------- public void WriteSystemInfo(string FileName, Point position) { BinaryWriter WriteFile = new BinaryWriter(File.Open(FileName, FileMode.Create)); WriteFile.Write(position.X); WriteFile.Write(position.Y); WriteFile.Close(); } //------------------------------------------------------------------------ public Point ReadSystemInfo(string FileName) { if(!File.Exists(FileName)) return new Point(-1, -1); BinaryReader ReadFile = new BinaryReader(File.Open(FileName, FileMode.Open)); Point position = new Point(ReadFile.ReadInt32(), ReadFile.ReadInt32()); ReadFile.Close(); return position; } } //public class WindowPosition //------------------------------------------------------------------------- public class WindowhSize { //--------------------------------------------------------------------- public void WriteSystemInfo(string FileName, Size size) { BinaryWriter WriteFile = new BinaryWriter(File.Open(FileName, FileMode.Create)); //main form size WriteFile.Write(size.Width); WriteFile.Write(size.Height); WriteFile.Close(); } //------------------------------------------------------------------------ public Size ReadSystemInfo(string FileName) { if(!File.Exists(FileName)) return new Size(-1, -1); BinaryReader ReadFile = new BinaryReader(File.Open(FileName, FileMode.Open)); Size size = new Size(ReadFile.ReadInt32(), ReadFile.ReadInt32()); ReadFile.Close(); return size; } } //public class WindowSize } //namespace TSystem step5. 建置方案, 產生TSystem.dll。 圖4 ? step6. 產生的TSystem.dll的檔案及路徑。 圖5 ? step7. 主程式呼叫TSystem.dll, 需將產生的TSystem.dll加入參考。 圖6 ? step8. 主程式呼叫TSystem.dll( 關注//Note的地方即可 )。 //---------------------------------------------------------------------- //C# 主程式呼叫動態程式庫 TSystem.dll 範例 //---------------------------------------------------------------------- using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure; using Emgu.CV.Util; using Emgu.Util; using Emgu.CV.UI; using Emgu.CV.BgSegm; using Emgu.CV.VideoSurveillance; //Note using TSystem; using TCamera; //----------------------------------------------------------------------------- namespace VT { public partial class MainForm : Form { //--------------------------------------------------------------------- public ToolboxForm CreateToolboxForm(Form parent, string text, bool bshow = true) { ToolboxForm toolboxForm; toolboxForm = new ToolboxForm(); toolboxForm.MdiParent = parent; toolboxForm.Text = text; if(bshow) toolboxForm.Show(); return toolboxForm; }//---------------------------------------------------------------------public ImageXYForm CreateImageXYForm(Form parent, int number,stringtext, bool bshow = true){ ImageXYForm imageForm; imageForm = new ImageXYForm(number); imageForm.MdiParent = parent; imageForm.Text = text; if(bshow) imageForm.Show(); return imageForm;}//---------------------------------------------------------------------public static MainForm _gmainForm = null;public static ToolboxForm _gtoolboxForm = null;public static ImageXYForm _gimageXYForm = null; //Note public WindowhSize _winSize = null;//---------------------------------------------------------------------//Main Program//---------------------------------------------------------------------public MainForm(){ InitializeComponent();}//---------------------------------------------------------------------private void MainForm_Load(objectsender, EventArgs e){ _gmainForm = this; //Note //讀取系統設定檔 _winSize = new WindowhSize(); Size size = _winSize.ReadSystemInfo(@"..\..\system\mainform.inf"); if(size.Width == -1 && size.Height == -1) this.ClientSize = new Size(1200, 700); else this.ClientSize = new Size(size.Width, size.Height);//修改mdi窗体背景色--------------------------------------------------------MdiClient ctlMDI;// Loop through all of the form's controls lookingforeach(Control ctl in this.Controls){ try { // Attempt to cast the control to type MdiClient. ctlMDI = (MdiClient) ctl; // Set the BackColor of the MdiClient control. ctlMDI.BackColor = Color.LightGray; //this.BackColor; //Color.Blue; } catch(InvalidCastException) { // Catch and ignore the error if casting failed. }} _gtoolboxForm = CreateToolboxForm(this, "工具箱"); _gimageXYForm = CreateImageXYForm(this, 0, "XY軸攝影機");} //private void MainForm_Load(object sender, EventArgs e)//--------------------------------------------------------------------- private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { //Note _winSize.WriteSystemInfo(@"....\system\mainform.inf", new Size(this.ClientSize.Width, this.ClientSize.Height)); } } //public partial class MainForm : Form } //namespace VT step9. 執行主程式成功。 圖7 ?
原文網址 石小川 2020-03-06 15:23:51
時常有學員問我PyQt5授權問題, 在這裡就一起回答同學的提問。
PyQt是GPLv3協議,大意是你的程式中使用了它,你的程式就要開源,如果閉源商用就會違反協議。
老師上課都開源程式碼故無此問題,但有同學是寫套裝商用軟體販售的,商用無法開源,就需要付可觀的授權費,這時用PyQt就麻煩了!
有沒有解套方式? 沒關係,直接換PySide2就好, 兩者API幾乎一樣, PySide2是由Qt官方維護,而PyQt5由非Qt官方維護。 而且未來發展應會超越PyQt5。
PySide是LGPL協議,如果你只是作為程式庫用它,你的程式還是可以閉源商用。所以很多人喜歡PySide,而且PySide2版本已支援Qt5功能。
結論是: 如果不做商業項目,強烈建議使用PyQt5,資料多,穩定。需要開發閉源商用軟體的就用PySide2。
避免無謂的商業授權費干擾,下面連結很清楚可參考看看LGPL和GPL :
https://progressbar.tw/posts/97
原文網址 石小川 2020-03-05 22:28:13
人腦約有1000億個神經元,而每個神經元約有1000根樹突(dendrites)從細胞本體(cell body)延伸至其他神經元,因此人腦大約有100萬億根巨量連結,而且是平行處理各種信息,這實在是神奇了,傑克。單一個神經元不怎麼樣,可是一旦巨量連結智慧就非常可觀了,這就是科學。 倒傳遞網路是很多經典神經網路的基礎,要真正研究深度學習有必要知道式子是如何出來的,下面是使用最陡坡降法(Gradient descent)使能量誤差函數E最小化的推導過程。紅色字體是導出的神經網路學習修正量(公式15、17、18、21)。 E : 能量函數(誤差函數) Y : 輸出值 T : 目標值 Net : 集成函數 f : 轉換函數 η : 學習速率 Wji : 加權值 ΔWji : 加權值修正量 ϴj : 臨界值 Δϴj : 臨界值修正量 Yj(n) = f[Netj(n)] (1) //其中n 代表第n層 Netj(n) = ΣiWjiYi(n-1) - ϴj (2) E = (1/2)Σj(Tj - Yj)^2 (3) ΔWji = -η** **∂E/∂Wji (4) ∂E/∂Wji = ∂E/∂Netj(n) **. **∂Netj(n)/∂Wji (5) 根據微積分連鎖率(chain rule), = ∂E/∂Yj(n) **. **∂Yj(n)/∂Netj(n) **. **∂Netj(n)/∂Wji (6) = ①. ② . ③ 其中 ③ ∂Netj(n)/∂Wji = ∂/∂Wji[ΣiWjiYi(n-1) - ϴj]= Yi(n-1) (7) ② ∂Yj(n)/∂Netj(n) = ∂/∂Netj(n)f[Netj(n)] = f'[Netj(n)] (8) ① ∂E/∂Yj(n) case1: if n 層是輸出層 ∂E/∂Yj(n)= ∂/∂Yj(n)[ (1/2)Σj(Tj - Yj)^2] = -(Tj - Yj) (9) case2: if n 層是隱藏層m ∂E/∂Yi(n)= Σj [∂E/∂Netj(n+1) . ∂Netj(n+1)/∂Yi(n)] (10) = ①. ② 其中 ② ∂Netj(n+1)/∂Yi(n)= ∂/∂Yi(n)[ΣiWjiYi(n) - ϴj]= Wji (11) ① 定義∂E/∂Netj(n+1)= -σj(n+1) (12) 所以 ∂E/∂Yi(n)=- Σjσj(n+1)Wji (13) 推導結論: (I) Wji在輸出層、隱藏層間時, ∂E/∂Wji= -[Tj - Yj(n)]f'[Netj(n)]Yi(n-1) (14) = -σj(n)Yi(n-1) 所以 σj(n)= [Tj - Yj(n)]f'[Netj(n)] (15) (II) Wji在隱藏層間、輸入層時, ∂E/∂Wji= [-Σjσj(n+1)Wji]f'[Netj(n)]Yi(n-1) (16) = -σj(n)Yi(n-1) 所以 σj(n) = [Σjσj(n+1)Wji]f'[Netj(n)] (17) 由第4式(ΔWji = -η** **∂E/∂Wji)得出, ΔWji = ησj(n)Yi(n-1) (18) if f(netj) 採用雙彎曲函數(sigmoid function) f(netj) = 1/ 1+e^-Netj (19) f'(netj) = f(netj)[1-f(netj)] = Yj(1-Yj) (20) 同ΔWji 證明可得, Δϴj = -ησj(n) (21)
原文網址 石小川 2020-03-05 22:23:54
原文網址 石小川 2020-03-03 14:21:06
觀摩一下同學用八軸運動控制卡實作的作品,I/O接線、整線乾淨俐落,要量產及當作商品賣的話一定要用排線及接頭。
楊先民 2020-03-03 14:23:25
好同學!
原文網址 石小川 2020-03-03 10:56:04
VS2019拖拉元件寫程式步驟,請參考投影片說明(VS2019產生一個App.mht)。
原文網址 石小川 2020-03-03 10:52:38
上課學員對 Visual Studio 2019 產生視窗程式不熟悉時可參考以下步驟,這套工具很實用也簡單,足夠你發展強大的應用程式,值得同學花時間駕馭它。 步驟1 如圖1, 建立新的專案。 步驟2 如圖2, 選Windows Forms App(.NET Framework) 項目,並按下一步鍵。 步驟3 如圖3, 設定新的專案,並按建立鍵。 步驟4 拖拉元件寫程式,請參考 使用Visual Studio 2019 產生一個視窗程式的簡單教學 - II 投影片說明(VS2019產生一個App.mht)。 圖4是程式WindowsFormsApp1執行的樣子。 Form1.cs 程式如下, 大部份程式碼是VS自動產生的, 我只寫兩行。 usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; usingSystem.Windows.Forms; namespaceWindowsFormsApp1 { public partial class Form1: Form { public Form1() { InitializeComponent(); } private voidbutton1_Click(objectsender, EventArgs e) { richTextBox1.Text = "OK"; //自已加上 } private voidbutton2_Click(objectsender, EventArgs e) { Close(); //自已加上 } } }
原文網址 Allen Tzeng 2020-03-03 08:57:20
Jetson Nano Waveshare JetBot 想請教一下,是否有人利用過一般 RGB 相機的 JetBot 進行 SLAM implementation ? 因為最近在看 SLAM 相關領域的論文,想要實作玩看看,但似乎沒有看到太多實做相關討論,甚至有人覺得 JetBot 不適合用來做 SLAM ,所以想上來請教一下前輩們 ~
石小川 2020-03-03 11:35:48
JetBot + Jetson Nano 做SLAM應綽綽有餘, 價格US $250也還好, 如果沒時間自已DIY, 買這種現成的 "神經網路型的電腦鼠" 平台也是個好方法。
原文網址 石小川 2020-03-02 11:21:45
分享一下不須 VM, 直接在 Win10 安裝 Ubuntu 及 ROS的步驟 https://ithelp.ithome.com.tw/articles/10216435 Win10安装Ubuntu子系统超详细攻略 https://zhuanlan.zhihu.com/p/62658094
討論主題
發文排行榜
回文排行榜
熱門關鍵字