送藥小車代碼倉庫:https://gitee.com/lcsc/medical_car
更好的觀看體驗請去:12_K210的KPU數字識別訓練
送藥小車立創開源平臺資料:https://oshwhub.com/li-chuang-kai-fa-ban/21-dian-sai-f-ti-zhi-neng-song-yao-xiao-che
K210的KPU數字識別訓練
K210自帶 KPU(通用的神經網絡處理器),非常適合用來作數字識別。要采集的數據集圖像尺寸為 224*224(這是目前最常用的網絡數據大小),為了讓結果更準確,所以要訓練的數據集要盡可能多,每種數字的數據量盡可能相等。但 k210 的算力也是有限的,他所能運行的模型也是有限的,對于 k210:運行 c 代碼時最大可以加載 6MB 左右的模型,運行 maixpy 的最小固件時,能加載 3MB 左右的模型,運行 maixpy 的最大固件時,能夠加載約 2MB 左右的模型。(值得注意的一點,模型大小和數據集沒有必然關系,所以不用擔心數據集采集太多導致K210的內存裝載不下的問題,選好Alpha參數就能確定模型的大小)
簡單來說,實現K210的數字識別就是三步:
采集數據集
對數據集進行標注
開始訓練并得到
采集數據集
因為我們運算是在 K210 本地的,圖像來源也是 K210 自帶的攝像頭,為了讓結果更準確,可以用 python 編寫一個 K210 的拍照程序,采集固定的 224*224 圖像并保存到 TF 卡里面。最好是搭好小車框架后,選好攝像頭的安裝位置和角度,將拍照程序保存到 K210 的運行 sd 卡里面。當按下按鈕的時候就進行當前圖像的保存。
拍照的代碼如下所示(具體代碼在2_Code->application->sensor->k210->pyconde-take_picture.py):
import sensor, image, time, lcd, struct, ustruct, _thread from maix import KPU,GPIO, I2S, FFT import gc,os from machine import Timer,PWM,I2C from fpioa_manager import fm lcd.init() # Init lcd display lcd.clear(lcd.RED) # Clear lcd screen. sensor.reset() # Reset and initialize the sensor. sensor.reset(freq=24000000, dual_buff=1) # 設置攝像頭頻率 24M 開啟雙緩沖模式 會提高幀率 但內存占用增加 sensor.set_auto_exposure(1) # 設置自動曝光 sensor.set_auto_gain(False) # 顏色跟蹤必須關閉自動增益 sensor.set_auto_whitebal(False) # 顏色跟蹤必須關閉白平衡 sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE) sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240) sensor.set_windowing((224,224)) # 分辨率為B224X224 sensor.set_vflip(1) sensor.skip_frames(time = 2000) # Wait for settings take effect. clock = time.clock() # Create a clock object to track the FPS. #要拍攝不同的數字就切換這里的數字 need_number_ficture= 1 #保存文件名計數 save_count =0 #注冊IO,注意高速GPIO口才有中斷 fm.register(35, fm.fpioa.GPIO0) fm.register(16, fm.fpioa.GPIOHS0) #構建案件對象 KEY=GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP) #按鍵標志位 key_node = 0 key_press_long = 0 #中斷回調函數 def fun(KEY): global state,key_node,need_number_ficture temp_count = 0 time.sleep_ms(10) #消除抖動 while KEY.value()== 0: key_node = 1 time.sleep_ms(10) #長按延時 #長按檢測計數 temp_count=temp_count+1 if temp_count >= 50: key_node = 0 beep.duty(50) time.sleep_ms(500) beep.duty(0) time.sleep_ms(100) need_number_ficture=need_number_ficture+1 if(need_number_ficture == 9): need_number_ficture=0 #開啟中斷,下降沿觸發 KEY.irq(fun, GPIO.IRQ_FALLING) #先把文件路徑切換到文件卡里面 os.chdir("/sd") #os.mkdir("img/0") #os.mkdir("img/1") #os.mkdir("img/2") #os.mkdir("img/3") #os.mkdir("img/4") #os.mkdir("img/5") #os.mkdir("img/6") #os.mkdir("img/7") #os.mkdir("img/8") #PWM通過定時器配置,接到IO15引腳 tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM) beep = PWM(tim, freq=1000, duty=0, pin=9) clock = time.clock() # 創建一個clock對象,用來計算幀率 while True: clock.tick() # 更新計算幀率的clock img=sensor.snapshot() #按鍵按下進入 if key_node == 1: save_count=save_count+1 img.save("img/"+str(need_number_ficture)+"/"+str(save_count)+".jpg") beep.duty(50) time.sleep_ms(100) beep.duty(0) time.sleep_ms(100) key_node = 0 #清除按鍵標志位 # 在圖像上畫字符串 img.draw_string(0, 10,str(need_number_ficture)+"/"+str(save_count)+".jpg", color = (200, 0, 0), scale = 2, mono_space = False, char_rotation = 0, char_hmirror = False, char_vflip = False, string_rotation = 0, string_hmirror = False, string_vflip = False) lcd.display(img)
下面來解釋一下上面這段代碼做了什么:
導入必要的庫:導入需要的庫和模塊(就像C語言的.h頭文件一樣),如sensor, image, time, lcd, GPIO, Timer, PWM, I2C等。
初始化LCD屏幕:使用lcd.init()初始化LCD屏幕,并使用lcd.clear(lcd.RED)清空屏幕,防止出現誤顯示問題。
設置攝像頭:使用sensor.reset()重置攝像頭并進行初始化。然后,設置攝像頭的相關參數,比如時鐘頻率、設置雙緩沖來增加幀率,關閉自動曝光、關閉自動增益、關閉自動白平衡、設置像素格式、幀大小、窗口大小、垂直翻轉(這個和用的攝像頭有關)等。
初始化變量:初始化必要的變量,如當前拍攝的數字(need_number_ficture)、保存計數(save_count)、按鍵標志位(key_node)等。
設置GPIO和按鍵中斷:注冊GPIO,并創建一個按鍵對象KEY。定義一個中斷回調函數fun(KEY),用于在按鍵按下時改變當前拍攝的數字。最后,配置按鍵中斷,使其在下降沿觸發。
設置蜂鳴器:使用Timer和PWM初始化蜂鳴器,并連接到指定的引腳。
主循環:在主循環中,首先更新幀率計算的clock。然后,從攝像頭捕獲一幀圖像。如果按鍵被按下(key_node為1),則將當前幀圖像保存到SD卡的相應目錄(對應于當前拍攝的數字)。同時,蜂鳴器發出提示音(提示我們拍照OK了)。最后,在圖像上繪制當前拍攝數字和已保存的圖片計數,并將圖像顯示在LCD屏幕上,方便提示我們拍攝下一張照片。
對數據集進行標注
這個就需要用到一個大神開發的軟件了(現在最新版自帶Python環境,無需麻煩的環境配置了),下載地址,找下面的百度網盤下載鏈接,找到里面的V4.0.0下載下來安裝后就可以使用了。用讀卡器把 K210的TF 卡里面采集到的訓練集保存到電腦上。
打開Mx-yolo里面工具集中的圖片標注助手,打開保存采集數據的文件夾。詳細教程請查看這個鏈接。
開始訓練
訓練可以選在線的也可以用本地的,但是如果像是電賽這種時間很緊張的比賽,為了防止到時候千軍萬馬過獨木橋,導致你的訓練任務一直在排隊,最好先設置好自己的本地環境。按照上面的介紹安裝mx-yolo。
模型訓練的次數需要在保證模型收斂的前提下進行合理的選擇。如果訓練次數過少,可能會導致模型欠擬合,無法很好地擬合訓練數據。如果訓練次數過多,可能會導致模型過擬合,無法很好地泛化到新的數據。因此,需要根據具體的問題和數據集進行調整。一般來說,可以通過觀察模型在訓練集和驗證集上的表現來確定合適的訓練次數。當模型在驗證集上的表現不再提升時,可以停止訓練,以避免過擬合。
Alpha 主要影響所生成模型的大小,選 0.25 模型大小約 219k,選 0.5 模型大小約 831k,選 0.75 模型大小約 1.85M,選 1.0 模型大小約 3.24M。當運行 maixpy 的最大固件時,k210 最大只能加載約 2MB 左右的模型,所以選 0.75 就行了。
Batch Size 一般選 8 就行了。這個參數是指每次迭代訓練時,所選取的樣本數。Batch Size 的大小會影響模型訓練的速度和穩定性。較大的 Batch Size 可以加快模型訓練的速度,因為每次迭代處理的樣本數量更多。但是,如果 Batch Size 過大,可能會導致內存不足或顯存不足的問題。此外,較大的 Batch Size 還可能導致模型過度擬合訓練數據。較小的 Batch Size 可以提高模型訓練的穩定性,因為每次迭代處理的樣本數量較少,可以更好地避免過擬合。但是,較小的 Batch Size 也會導致訓練時間變長,因為需要更多次迭代才能處理完所有樣本。
數據增強建議開啟,他主要是做了一些隨機裁剪,隨機旋轉,縮放,翻轉等。
訓練結束后他會自動把模型轉換為K210能使用的模型,主要文件都在result_root_dirdetector_result目錄下面,它還會給一張測試報告,確保模型損失已經到了0.1以下。在測試報告中,epoch代表訓練次數,model loss是模型損失,train代表訓練集,是用來訓練模型的數據集。valid代表驗證集,是用來評估模型性能和調整超參數的數據集。這兩條線越來越往下就是越來越好了。
文件下的boot.py是他給的測試程序,labels.txt是標簽順序,mx.kmodel是K210實際要用的模型文件(這個文件在使用的時候需要保存到K210要使用的TF卡里面)。簡單來說,把boot.py,lables.txt,mx.kmodel一起放到K210的sd卡里,重新上電就可以運行了。
審核編輯 黃宇
-
開發板
+關注
關注
25文章
5032瀏覽量
97375 -
數字識別
+關注
關注
2文章
19瀏覽量
10140
發布評論請先 登錄
相關推薦
評論