源碼閱讀經驗談-slim,darknet,labelimg,caffe

2021-02-20 Agent的潛意識

本文首先談自己的源碼閱讀體驗,然後給幾個案例解讀,選的例子都是比較簡單。重在說明我琢磨的點線面源碼閱讀方法。我不是專業架構師,是從一個深度學習算法工程師的角度來談的,不專業的地方請大家輕拍。

經常看別人寫的代碼,然後改別人的代碼,然後實現自己的想法,我想這是我們coder常幹的事情。看人看代碼,代碼如人。他代碼寫的有多清爽簡潔,說明他思維是清晰的;代碼的結構有多合理,模塊化內聚如何,是否低耦合,反應他的宏觀把控能力。一個軟體系統你可以把他看成是一個簡單的企業,各個職能部門如何發揮自己的作用,相當於每個軟體的模塊如何組織理順,一段繁冗雜亂的代碼和一家管理混亂的公司一樣,剪不斷理還亂,索性推翻重來。

談一談我閱讀源碼的經驗吧。希望能成為大家的墊腳石,大家可以在我的基礎上飛的更高,走的更穩。

源碼閱讀我自己琢磨的經驗是:點-線-面立體式逐層深入。

點:點有兩個層面的意思,首先你要找到突破點,比如說程序的入口main函數,或者說一個比較容易切入的點,很多時候main函數下面寫的很簡潔,就幾行代碼走一個主流程,或調用多進程,你很難看清楚裡面的邏輯,這時候找切入點就是一個比較技巧的事情了。找到切入點才能由點到線,開始去摸清楚裡面的東西。

點的另一個層面的意思是當通過切入點找到主線後,由線串起來的其它一些點,比如說一些功能性函數utils,一些功能性模塊的內容。這些東西你乾癟癟的去看沒有太大趣味,你有可能搞不明白它是幹什麼的,有一根線來串的話,你就可以調試,你會快速搞清楚裡面的功能。

線:線有主線和旁線。深度學習我認為是一個面向過程的,因為它其實就是一個方程,一個函數,面向過程的編程思想就是給一個input,在你軟體系統裡走一遍後,得到一些輸出。主線就是連接輸入和輸出的線。旁線就是主線的一些分支。給定一個輸入後,你可以跟著這根線逐步往後走,每步列印出一些關鍵變量,你就能基本明白每步做了什麼事情。

旁線就是一些分支,從主線上分出一個輸入,然後調用一個功能性模塊,得到一個結果後,又去走主線的流程。這個調用功能性模塊就是一個旁線,只有把這些旁線搞明白,你才能建立一個知識樹,你才能立體的對一個系統有深入認識。

面:線跟線交錯,線把點串起來,組織成一張網,就是一個面了。講面這層次主要是希望大家有全局意識。系統的設計者設計系統的時候應該首先想到的是面,是一個立體的東西,然後才抽絲剝縷的碼代碼。哪個文件放到哪個模塊,哪個函數放哪個文件中更合適,都要非常清楚,這樣有一個整體感,層次鮮明,邏輯清楚。就像網絡工程師搭網線一樣,有的高手搭建的網線有層次感,順手一摸就知道那根線是跟哪個交換機連的。

雜亂無章

 

有邏輯的代碼結構。

Labelimg案例:

實話實說,我之前經常用labelimg打標籤,但一直沒看過源碼。由於要在這個基礎上開發一個半自動化標籤系統,這周我也是從0開始摸索的。搞了三天才把它摸清楚。

Labelimg是用pyqt寫的。姑且說是一個面向對象的編程框架吧。他的主函數很簡單。主要邏輯全在mainwindow這個類裡面了。

這個mainwindow類東西太多了,一時找不到突破點。本來就對這種獲取點擊信息然後執行一些action的編程範式不是很熟,摸索了好久,才找到了一個突破口,那就是,畫完框後,他會彈出一個對話框,就是這個OK或者cancel的框。

之所以選它作為突破口,是因為1、下面那個列表數據是從txt文件中讀取返顯出來的,根據這條線,就能摸清楚怎麼樣把自己想要的數據返顯到對話框中;2他是在圖片上畫框後自動彈出對話框,這有助於你摸清楚他是怎麼獲取滑鼠點擊交互的,獲取點擊交互後怎麼打開對話框的。你把這個搞明白了就抓到主線了。

通過摸索,發現這個對話框寫在libs下面,代碼如下:

然後就是去找一些點了:1、在主mainwindow中是怎麼調用這個類的;2、txt中存的數據是怎麼讀取然後給到labeldialog的。3、這些Qwidget、QlistWidget都是幹啥的。大家是不是覺得特別簡單?別笑話我為了琢磨這些玩意琢磨了三天哈。哥是比你笨,但哥比你action。

這個系列起了個頭,可能大家覺得這些都是工程的事情,算法工程師幹這些玩意浪費時間。事實上,鼻祖hinton曾經告誡我們說:要少看論文,不要停止編程。強大的工程能力才是算法的基石,而如何收集數據(包括打標籤)和如何定義問題及建模是算法落地的基石。有沒有同感的請扣1。

相關焦點

  • darknet源碼學習(三):darknet前向流程解讀
    darknet源碼學習(二):YOLO V1 論文解讀darknet源碼學習(一):在VS上構建並編譯darknet解決方案darknet基於純C和CUDA編寫。前向過程如第一篇文章最後所述,執行以下命令對單張圖像進行檢測:E:\darknet>E:\darknet\build\darknet\x64\darknet.exe detect cfg/yolov3.cfg yolov3.weights data/dog.jpg為了調試方便,我們將上述命令添加到VS的調試命令中,如下圖所示:
  • 實戰 | 源碼入門之Faster RCNN
    , bbox_, label_, scale) in tqdm(enumerate(dataloader)):            scale = at.scalar(scale)            img, bbox, label = img.cuda().float(), bbox_.cuda(), label_.cuda()            trainer.train_step
  • darknet源碼學習(四):darknet數據加載詳解
    歷史文章darknet源碼學習(三):darknet前向流程解讀darknet源碼學習(二):YOLO V1 論文解讀darknet源碼學習(一):在VS上構建並編譯darknet解決方案1 訓練YOLO
  • 如何用 Caffe 生成對抗樣本?這篇文章告訴你一個更高效的算法
    代碼如下:# Load image & forwardimg = caffe.io.load_image('little_white_dog.jpg')transformed_img = transformer.preprocess('data', img)net.blobs['data'].data[0] = transformed_imgnet.forward()# Get predicted label indexpred = numpy.argmax(net.blobs
  • Caffe介紹與測試及相關Hi35xx平臺下caffe yolox的使用參考
    數據準備數據模型定義Net算法配置SolverRun分析結果1.2、安裝caffeCaffe安裝的官方網站,可以參考github上的兩個連結:https://github.com/Microsoft/caffe   /    https://github.com
  • SSD網絡tensorflow版本源碼深入分析
    代碼如下:img_shape=(300, 300),num_classes=21,no_annotation_label=21,feat_layers=['block4', 'block7', 'block8', 'block9', 'block10', 'block11'],feat_shapes=[(38, 38), (19, 19), (10,
  • 深度學習框架Caffe源碼解析
    本文將從整體架構和底層實現的視角,對Caffe源碼進行解析。Caffe總體架構Caffe框架主要有五個組件,Blob,Solver,Net,Layer,Proto,其結構圖如下圖1所示。Solver負責深度網絡的訓練,每個Solver中包含一個訓練網絡對象和一個測試網絡對象。每個網絡則由若干個Layer構成。
  • 賈揚清撰文詳解Caffe2:從強大的新能力到入門上手教程
    git clone https://github.com/caffe2/caffe2.git如果你安裝不了 Caffe2,你可以查看以下安裝指南:http://caffe2.ai/docs/getting-started.html,嘗試這個 Docker 鏡像:https://hub.docker.com/r/caffe2ai/caffe2/,或者在你選擇的雲提供商上運行
  • 解析:深度學習框架Caffe源碼
    本文將從整體架構和底層實現的視角,對Caffe源碼進行解析。1.Caffe總體架構Caffe框架主要有五個組件,Blob,Solver,Net,Layer,Proto,其結構圖如下圖1所示。Solver負責深度網絡的訓練,每個Solver中包含一個訓練網絡對象和一個測試網絡對象。每個網絡則由若干個Layer構成。
  • Opencv+TF-Slim實現圖像分類及深度特徵提取
    關注 極市平臺 公眾號 ,回復 加群,立刻申請入群~TF-Slim是一個用於定義、訓練和評估複雜模型的tensorflow輕量級庫,在slim庫中已經有很多官方實現的網絡並用ImageNet進行了預訓練,如VGG、ResNet、Inception等,可直接拿來使用。
  • 如何閱讀Java源碼?
    閱讀Java源碼的前提條件:1、技術基礎在閱讀源碼之前,我們要有一定程度的技術基礎的支持。比如設計模式,許多Java源碼當中都會涉及到。再比如閱讀Spring源碼的時候,勢必要先對IOC,AOP,Java動態代理等知識點有所了解。2、強烈的求知慾強烈的求知慾是閱讀源碼的核心動力!
  • MIT開放圖像標註工具LabelMe原始碼:助力機器視覺的發展
    本文由機器之心編輯,「機器之心」專注生產人工智慧專業性內容,適合開發者和從業者閱讀參考。點擊右上角即刻關注。計算機視覺需要大量的標註圖像來執行各類任務,ImageNet 的成功就在於其巨量的標註圖像。近日,MIT 的計算機科學和人工智慧實驗室(CSAIL)開放了圖像標註工具 LabelMe 的原始碼,我們可以使用該工具創建定製化標註任務或執行圖像標註。
  • layer定義 | 深度學習caffe框架
    本節主要介紹caffe的layer基本結構, 種類, 以及不同類型的layer如何定義.8}9}從一個典型的卷積神經網絡模型結構出發, 首先需要數據輸入層,然後是圖像的預處理,例如圖像切割slice, 卷積層Convolution, 在caffe中,激活函數等數據運算也用layer的方式定義.
  • 如何閱讀源碼?推薦一本書
    最終,這些思維邏輯和演化過程都會投射和堆疊到源碼上,使得源碼閱讀的過程是一個通過源碼去逆推思維邏輯和演化過程的工作,因此十分困難。3 源碼閱讀方法選好源碼項目之後,要做的就是閱讀源碼。作者介紹了源碼閱讀的方法、技巧、經驗。主要包括兩個大的步驟:項目初探源碼閱讀在項目初探環節,主要是通過斷點運行項目,然後分析項目的整體框架、跳轉流向。
  • Keras vs PyTorch vs Caffe:CNN實現對比
    keras.layers import Conv2D, MaxPooling2Dfrom keras import backend as K超參數:batch_size = 128num_classes = 10epochs = 12img_rows
  • darknet框架權威解讀系列一:框架構成
    截止目前,在github上解讀darknet的兩個好的項目(https://github.com/hgpvision/darknet和https://github.com/BBuf/Darknet),其中hgpvision主要針對pjreddie項目解讀,而BBuf主要是針對AB大神的darknet項目解讀。這裡特別感謝兩位前輩給出的精彩解讀。
  • 【深度學習】Keras vs PyTorch vs Caffe:CNN實現對比
    keras.layers import Conv2D, MaxPooling2Dfrom keras import backend as K超參數:batch_size = 128num_classes = 10epochs = 12img_rows