那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

YOLOv5 Callback機(jī)制解讀

jf_pmFSk4VX ? 來源:GiantPandaCV ? 2023-02-09 15:12 ? 次閱讀

前言

代碼倉庫地址:https://github.com/Oneflow-Inc/one-yolov5歡迎star one-yolov5項(xiàng)目 獲取最新的動(dòng)態(tài)。如果您有問題,歡迎在倉庫給我們提出寶貴的意見。如果對(duì)您有幫助,歡迎來給我Star呀~

源碼解讀:https://github.com/Oneflow-Inc/one-yolov5/blob/main/utils/callbacks.py 。文章里面的超鏈接可能被公眾號(hào)吃掉,可以考慮到我們的文檔網(wǎng)站閱讀獲得更好的體驗(yàn):https://start.oneflow.org/oneflow-yolo-doc/source_code_interpretation/callbacks_py.html

這個(gè)文件是yolov5的Callback utils

鉤子

Hook

hook(鉤子)是一個(gè)編程機(jī)制,與語言無關(guān),通常用于在不修改原始代碼的情況下,捕獲或替換程序的一些函數(shù)或API調(diào)用。

個(gè)人觀點(diǎn):鉤子是指將代碼插入到其他代碼的執(zhí)行流程中的技術(shù),從而實(shí)現(xiàn)在執(zhí)行原有代碼之前或之后執(zhí)行額外代碼的目的,下面是一個(gè)簡(jiǎn)單demo。

defhook_function(original_function):
#定義鉤子函數(shù)
defnew_function(*args,**kwargs):
print("Beforeoriginalfunction")
result=original_function(*args,**kwargs)
print("Afteroriginalfunction")
returnresult

returnnew_function

@hook_function
deforiginal_function():
#@hook_function(python語法)等價(jià)于hook_function(original_function)
print("Originalfunction")

if__name__=="__main__":
original_function()
輸出
Beforeoriginalfunction
Originalfunction
Afteroriginalfunction

回調(diào)函數(shù)

來源網(wǎng)絡(luò)的例子,有一家旅館提供叫醒服務(wù),但是要求旅客自己決定叫醒的方法。可以是打客房電話,也可以是派服務(wù)員去敲門,睡得死怕耽誤事的,還可以要求往自己頭上澆盆水。這里,“叫醒”這個(gè)行為是旅館提供的,相當(dāng)于庫函數(shù),但是叫醒的方式是由旅客決定并告訴旅館的,也就是回調(diào)函數(shù)。而旅客告訴旅館怎么叫醒自己的動(dòng)作,也就是把回調(diào)函數(shù)傳入庫函數(shù)的動(dòng)作,稱為登記回調(diào)函數(shù)(to register a callback function)。如下圖所示(圖片來源:維基百科):

32ad9a96-a848-11ed-bfe3-dac502259ad0.pngcallback

從上圖可以看到,回調(diào)函數(shù)通常和應(yīng)用處于同一抽象層(因?yàn)閭魅胧裁礃拥幕卣{(diào)函數(shù)是在應(yīng)用級(jí)別決定的)。而回調(diào)就成了一個(gè)高層調(diào)用底層,底層再回過頭來調(diào)用高層的過程。

簡(jiǎn)單來說:

  • 一般函數(shù):function a(int a, String b),接收的參數(shù)是一般類型。
  • 特殊函數(shù):function b(function c),接收的參數(shù)是一個(gè)函數(shù),c這個(gè)函數(shù)就叫回調(diào)函數(shù)

個(gè)人觀點(diǎn):回調(diào)函數(shù)是指在代碼中被調(diào)用的一個(gè)函數(shù),它會(huì)對(duì)其他代碼的執(zhí)行造成影響,并在適當(dāng)?shù)臅r(shí)間進(jìn)行回調(diào),下面是一個(gè)簡(jiǎn)單demo。

defcallback_function(input_data):
#在回調(diào)函數(shù)中處理輸入數(shù)據(jù)
print("Inputdata:",input_data)

defmain(callback):
#調(diào)用回調(diào)函數(shù)
callback("HelloWorld")

if__name__=="__main__":
main(callback_function)
輸出
Inputdata:HelloWorld

總之,鉤子和回調(diào)函數(shù)是實(shí)現(xiàn)代碼間通信和協(xié)作的不同技術(shù),它們都可以用于實(shí)現(xiàn)代碼級(jí)別的自定義行為,只是函數(shù)的觸發(fā)時(shí)機(jī)有差異。

hook實(shí)現(xiàn)例子

hook函數(shù)是程序中預(yù)定義好的函數(shù),這個(gè)函數(shù)處于原有程序流程當(dāng)中(暴露一個(gè)鉤子出來)。我們需要再在有流程中鉤子定義的函數(shù)塊中實(shí)現(xiàn)某個(gè)具體的細(xì)節(jié),需要把我們的實(shí)現(xiàn),掛接或者注冊(cè)(register)到鉤子里,使得hook函數(shù)對(duì)目標(biāo)可用。

hook函數(shù)最常使用在某種流程處理當(dāng)中。這個(gè)流程往往有很多步驟。hook函數(shù)常常掛載在這些步驟中,為增加額外的一些操作,提供靈活性。

下面舉一個(gè)簡(jiǎn)單的例子,這個(gè)例子的目的是實(shí)現(xiàn)一個(gè)通過鉤子調(diào)用函數(shù)判斷字符串是否是"good"

#YOLOv5byUltralytics,GPL-3.0license
"""
Callbackutils
"""
classCallbacks:
""""
HandlesallregisteredcallbacksforYOLOv5Hooks
"""

def__init__(self):
#Definetheavailablecallbacks
self._callbacks={
"on_pretrain_routine_start":[],
}
self.stop_training=False#setTruetointerrupttraining

defregister_action(self,hook,name="",callback=None):
"""
Registeranewactiontoacallbackhook

Args:
hook:Thecallbackhooknametoregistertheactionto要向其注冊(cè)操作的回調(diào)鉤子名稱
name:Thenameoftheactionforlaterreference動(dòng)作的名稱,供以后參考
callback:Thecallbacktofire對(duì)fire的回調(diào)
"""
asserthookinself._callbacks,f"hook'{hook}'notfoundincallbacks{self._callbacks}"
assertcallable(callback),f"callback'{callback}'isnotcallable"
self._callbacks[hook].append({"name":name,"callback":callback})

defget_registered_actions(self,hook=None):
""""
Returnsalltheregisteredactionsbycallbackhook

Args:
hook:Thenameofthehooktocheck,defaultstoall
"""
returnself._callbacks[hook]ifhookelseself._callbacks

defrun(self,hook,*args,**kwargs):
"""
Loopthroughtheregisteredactionsandfireallcallbacks

Args:
hook:Thenameofthehooktocheck,defaultstoall
args:ArgumentstoreceivefromYOLOv5
kwargs:KeywordArgumentstoreceivefromYOLOv5
"""

asserthookinself._callbacks,f"hook'{hook}'notfoundincallbacks{self._callbacks}"

forloggerinself._callbacks[hook]:
logger["callback"](*args,**kwargs)
defon_pretrain_routine_start(good:str):
ifgood=="good":
print("isgood!")
else:
print("isbad!")
#初始化Callbacks對(duì)象
callbacks=Callbacks()
#要向其注冊(cè)操作的回調(diào)鉤子名稱
callbacks.register_action(hook="on_pretrain_routine_start",name="ss",callback=on_pretrain_routine_start)
#調(diào)用hook
callbacks.run("on_pretrain_routine_start","good")
#打印hook信息
callbacks.get_registered_actions("on_pretrain_routine_start")
is good





[{'name': 'ss',
  'callback': }]

yolov5項(xiàng)目中

在yolov5訓(xùn)練流程中,hook函數(shù)體現(xiàn)在一個(gè)訓(xùn)練過程(不包括數(shù)據(jù)準(zhǔn)備),會(huì)輪詢多次訓(xùn)練集,每次稱為一個(gè)epoch,每個(gè)epoch又分為多個(gè)batch來訓(xùn)練。流程先后拆解成:

  • 開始訓(xùn)練
  • 訓(xùn)練一個(gè)epoch前
  • 訓(xùn)練一個(gè)batch前
  • 訓(xùn)練一個(gè)batch后
  • 訓(xùn)練一個(gè)epoch后。
  • 評(píng)估驗(yàn)證集
  • 結(jié)束訓(xùn)練

這些步驟是穿插在訓(xùn)練一個(gè)batch數(shù)據(jù)的過程中,這些可以理解成是鉤子函數(shù),我們可能需要在這些鉤子函數(shù)中實(shí)現(xiàn)一些定制化的東西,比如在訓(xùn)練一個(gè)epoch后我們要保存下訓(xùn)練的損失。

#在train.py中hook注冊(cè)操作代碼
#Registeractions
forkinmethods(loggers):
callbacks.register_action(k,callback=getattr(loggers,k))
#YOLOv5byUltralytics,GPL-3.0license
"""
Callbackutils
"""


classCallbacks:
""""
HandlesallregisteredcallbacksforYOLOv5Hooks
"""

def__init__(self):
#Definetheavailablecallbacks
#定義些回調(diào)函數(shù),函數(shù)實(shí)現(xiàn)在utils/loggers/__init__.py
#github鏈接:https://github.com/Oneflow-Inc/one-yolov5/blob/main/utils/loggers/__init__.py
self._callbacks={
"on_pretrain_routine_start":[],
#https://github.com/Oneflow-Inc/one-yolov5/blob/88864544cd9fa9ddcbe35a28a0bcf2c674daeb97/utils/loggers/__init__.py#L118
"on_pretrain_routine_end":[],
"on_train_start":[],
"on_train_epoch_start":[],
"on_train_batch_start":[],
"optimizer_step":[],
"on_before_zero_grad":[],
"on_train_batch_end":[],
"on_train_epoch_end":[],
"on_val_start":[],
"on_val_batch_start":[],
"on_val_image_end":[],
"on_val_batch_end":[],
"on_val_end":[],
"on_fit_epoch_end":[],#fit=train+val
"on_model_save":[],
"on_train_end":[],
"on_params_update":[],
"teardown":[],
}
self.stop_training=False#setTruetointerrupttraining

defregister_action(self,hook,name="",callback=None):
"""
Registeranewactiontoacallbackhook

Args:
hook:Thecallbackhooknametoregistertheactionto
name:Thenameoftheactionforlaterreference
callback:Thecallbacktofire
"""
asserthookinself._callbacks,f"hook'{hook}'notfoundincallbacks{self._callbacks}"
assertcallable(callback),f"callback'{callback}'isnotcallable"
self._callbacks[hook].append({"name":name,"callback":callback})

defget_registered_actions(self,hook=None):
""""
Returnsalltheregisteredactionsbycallbackhook

Args:
hook:Thenameofthehooktocheck,defaultstoall
"""
returnself._callbacks[hook]ifhookelseself._callbacks

defrun(self,hook,*args,**kwargs):
"""
Loopthroughtheregisteredactionsandfireallcallbacks

Args:
hook:Thenameofthehooktocheck,defaultstoall
args:ArgumentstoreceivefromYOLOv5
kwargs:KeywordArgumentstoreceivefromYOLOv5
"""

asserthookinself._callbacks,f"hook'{hook}'notfoundincallbacks{self._callbacks}"

forloggerinself._callbacks[hook]:
logger["callback"](*args,**kwargs)


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62973
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4827

    瀏覽量

    69054
  • HOOK
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    8417

原文標(biāo)題:《YOLOv5全面解析教程》?十五,YOLOv5 Callback機(jī)制解讀

文章出處:【微信號(hào):GiantPandaCV,微信公眾號(hào):GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    YOLOv5】LabVIEW+YOLOv5快速實(shí)現(xiàn)實(shí)時(shí)物體識(shí)別(Object Detection)含源碼

    前面我們給大家介紹了基于LabVIEW+YOLOv3/YOLOv4的物體識(shí)別(對(duì)象檢測(cè)),今天接著上次的內(nèi)容再來看看YOLOv5。本次主要是和大家分享使用LabVIEW快速實(shí)現(xiàn)yolov5
    的頭像 發(fā)表于 03-13 16:01 ?2249次閱讀

    Yolov5算法解讀

    yolov5于2020年由glenn-jocher首次提出,直至今日yolov5仍然在不斷進(jìn)行升級(jí)迭代。 Yolov5YOLOv5s、YOLOv5
    的頭像 發(fā)表于 05-17 16:38 ?9560次閱讀
    <b class='flag-5'>Yolov5</b>算法<b class='flag-5'>解讀</b>

    YOLOv5】LabVIEW+TensorRT的yolov5部署實(shí)戰(zhàn)(含源碼)

    今天主要和大家分享在LabVIEW中使用純TensoRT工具包快速部署并實(shí)現(xiàn)yolov5的物體識(shí)別
    的頭像 發(fā)表于 08-21 22:20 ?1386次閱讀
    【<b class='flag-5'>YOLOv5</b>】LabVIEW+TensorRT的<b class='flag-5'>yolov5</b>部署實(shí)戰(zhàn)(含源碼)

    龍哥手把手教你學(xué)視覺-深度學(xué)習(xí)YOLOV5

    步數(shù)的課程,希望學(xué)員學(xué)習(xí)后能在實(shí)際工業(yè)項(xiàng)目中落地應(yīng)用。本次課程將重點(diǎn)講解《YOLOv5》篇,讓沒有任何深度學(xué)習(xí)基礎(chǔ)的小白學(xué)員,通過視頻課程能動(dòng)手配置好yolov5環(huán)境,能利用自己的數(shù)據(jù)集訓(xùn)練模型,能
    發(fā)表于 09-03 09:39

    怎樣使用PyTorch Hub去加載YOLOv5模型

    在Python>=3.7.0環(huán)境中安裝requirements.txt,包括PyTorch>=1.7。模型和數(shù)據(jù)集從最新的 YOLOv5版本自動(dòng)下載。簡(jiǎn)單示例此示例從
    發(fā)表于 07-22 16:02

    如何YOLOv5測(cè)試代碼?

    使用文檔“使用 YOLOv5 進(jìn)行對(duì)象檢測(cè)”我試圖從文檔第 10 頁訪問以下鏈接(在 i.MX8MP 上部署 yolov5s 的步驟 - NXP 社區(qū)) ...但是這樣做時(shí)會(huì)被拒絕訪問。該文檔沒有說明需要特殊許可才能下載 test.zip 文件。NXP 的人可以提供有關(guān)如
    發(fā)表于 05-18 06:08

    yolov5模型onnx轉(zhuǎn)bmodel無法識(shí)別出結(jié)果如何解決?

    問題描述: 1. yolov5模型pt轉(zhuǎn)bmodel可以識(shí)別出結(jié)果。(轉(zhuǎn)化成功,結(jié)果正確) 2. yolov5模型pt轉(zhuǎn)onnx轉(zhuǎn)bmodel可以無法識(shí)別出結(jié)果。(轉(zhuǎn)化成功,結(jié)果沒有) 配置: 1.
    發(fā)表于 09-15 07:30

    基于YOLOv5的目標(biāo)檢測(cè)文檔進(jìn)行的時(shí)候出錯(cuò)如何解決?

    你好: 按Milk-V Duo開發(fā)板實(shí)戰(zhàn)——基于YOLOv5的目標(biāo)檢測(cè) 安裝好yolov5環(huán)境,在執(zhí)行main.py的時(shí)候會(huì)出錯(cuò),能否幫忙看下 main.py: import torch
    發(fā)表于 09-18 07:47

    YOLOv5在OpenCV上的推理程序

    YOLOv5官方給出的YOLOv5在OpenCV上推理的程序相對(duì)來說是比較通俗易懂的,條理清晰,有基本的封裝,直接可用!但是我也發(fā)現(xiàn),模型的推理時(shí)間跟前后處理的時(shí)間相差無幾,特別是當(dāng)視頻流有多個(gè)檢測(cè)到的對(duì)象時(shí)候,整個(gè)幀率會(huì)有明顯下降!官方推薦的參考示例代碼鏈接為:
    的頭像 發(fā)表于 11-02 10:16 ?2002次閱讀

    YOLOv5 7.0版本下載與運(yùn)行測(cè)試

    支持實(shí)例分割了,從此YOLOv5實(shí)現(xiàn)了圖像分類、對(duì)象檢測(cè)、實(shí)例分割三個(gè)支持,從訓(xùn)練到部署。
    的頭像 發(fā)表于 11-30 15:55 ?3936次閱讀

    在C++中使用OpenVINO工具包部署YOLOv5模型

    下載并轉(zhuǎn)換YOLOv5預(yù)訓(xùn)練模型的詳細(xì)步驟,請(qǐng)參考:《基于OpenVINO?2022.2和蝰蛇峽谷優(yōu)化并部署YOLOv5模型》,本文所使用的OpenVINO是2022.3 LTS版。
    的頭像 發(fā)表于 02-15 16:53 ?5265次閱讀

    使用旭日X3派的BPU部署Yolov5

    本次主要介紹在旭日x3的BPU中部署yolov5。首先在ubuntu20.04安裝yolov5,并運(yùn)行yolov5并使用pytoch的pt模型文件轉(zhuǎn)ONNX。
    的頭像 發(fā)表于 04-26 14:20 ?971次閱讀
    使用旭日X3派的BPU部署<b class='flag-5'>Yolov5</b>

    淺析基于改進(jìn)YOLOv5的輸電線路走廊滑坡災(zāi)害識(shí)別

    本文以YOLOv5網(wǎng)絡(luò)模型為基礎(chǔ),提出一種改進(jìn)YOLOv5YOLOv5-BC)深度學(xué)習(xí)滑坡災(zāi)害識(shí)別方法,將原有的PANet層替換為BiFPN結(jié)構(gòu),提高網(wǎng)絡(luò)多層特征融合能力
    的頭像 發(fā)表于 05-17 17:50 ?1230次閱讀
    淺析基于改進(jìn)<b class='flag-5'>YOLOv5</b>的輸電線路走廊滑坡災(zāi)害識(shí)別

    yolov5和YOLOX正負(fù)樣本分配策略

    整體上在正負(fù)樣本分配中,yolov7的策略算是yolov5和YOLOX的結(jié)合。因此本文先從yolov5和YOLOX正負(fù)樣本分配策略分析入手,后引入到YOLOv7的解析中。
    發(fā)表于 08-14 11:45 ?2352次閱讀
    <b class='flag-5'>yolov5</b>和YOLOX正負(fù)樣本分配策略

    YOLOv5網(wǎng)絡(luò)結(jié)構(gòu)訓(xùn)練策略詳解

    前面已經(jīng)講過了Yolov5模型目標(biāo)檢測(cè)和分類模型訓(xùn)練流程,這一篇講解一下yolov5模型結(jié)構(gòu),數(shù)據(jù)增強(qiáng),以及訓(xùn)練策略。
    的頭像 發(fā)表于 09-11 11:15 ?2386次閱讀
    <b class='flag-5'>YOLOv5</b>網(wǎng)絡(luò)結(jié)構(gòu)訓(xùn)練策略詳解
    百家乐官网下载游戏| 535棋牌游戏| 游艇会百家乐官网的玩法技巧和规则 | 太阳城巴黎左岸| 百家乐官网出千桌| 葡京百家乐的玩法技巧和规则 | 百家乐有作弊的吗| 澳门百家乐官网实战| 太阳城娱乐城去大丰收娱乐| 真人百家乐游戏网址| 巴黎人百家乐官网的玩法技巧和规则 | 百家乐过滤| 杨公24山择日| 百家乐官网代理在线游戏可信吗网上哪家平台信誉好安全 | 新濠百家乐现金网| 百家乐官网没边| 现金游戏平台| 百家乐那里最好| 蓝盾百家乐赌场| 赌场百家乐官网的玩法技巧和规则| 英德市| 大发888 注册账号| 安阳百家乐赌博| 利澳百家乐官网的玩法技巧和规则 | 正网开户| 澳门百家乐群代理| 真钱百家乐游戏大全| 利都百家乐官网国际娱乐场开户注册 | 阳宅风水24向详解| 菲律百家乐官网太阳城| 宝龙国际娱乐城| 大发888游戏官网下载| 瑞丰国际娱乐城| 大发888官方备用| 大众百家乐娱乐城| 网上百家乐| 百盛百家乐官网的玩法技巧和规则| 百家乐官网赌场优势| 保单百家乐官网技巧| 帝豪娱乐城| 娱乐城金赞|