1. 程式人生 > >#YOLO_v3代碼解析以及相關註意事項

#YOLO_v3代碼解析以及相關註意事項

名稱 avi 更改 其中 ssa 進行 block ext www

1. 項目介紹

$~~~~~~~$本次YOLO_v3的項目來源於機器之心翻譯的項目---從零開始PyTorch項目:YOLO v3目標檢測實現以及從零開始 PyTorch 項目:YOLO v3 目標檢測實現(下)兩部分組成,原版的博客在此Series: YOLO object detector in PyTorch,原始博客的GitHub地址為:ayooshkathuria/pytorch-yolo-v3,最後附上論文的地址:YOLOv3: An Incremental Improvement

2. 項目需求及相關文件解釋

$~~~~~~~$YOLO_v3官方原始的代碼是由C語言所寫,真是佩服作者手擼代碼能力啊,但是由於源碼並沒有相關的任何註釋,閱讀起來特別費事,所以參考了網上關於YOLO_v3遷移到$Tensorflow$和$Pytorch$的代碼進行閱讀,以便對代碼有更深的認識和理解。

$~~~~~~~$關於此YOLO_v3的$Pytorch$的代碼,其$Pytorch$作者的GitHub提到相應的需求如下:

  • Python3.5
  • OpenCV
  • Pytorch 0.4(其中作者提了一句:$Using$ $PyTorch$ $0.3$ $will$ $break$ $the$ $detector.$)

$~~~~~~~$在準備好相應的東西之後將相應的項目$Clone$ $or$ $downoad$下來,除此之外你首先需要下載$weights$ $file$(權重文件),地址如下:a weightsfile only for COCO,大小有237M,下載下來的權重文件只需放在下載好的$project$根目錄下即可,權重文件名為:yolov3.weights

$~~~~~~~$一切準備就緒就可以進行圖片檢測了,如果想要檢測圖片,可以在$Pycharm$的底部欄找到$Terminal$,也就是$CMD$,將地址$cd$到你下載的項目所在的地址,如:D:\軟件安裝\pycharm\PyCharm Community Edition 2017.3.3\workplace\yolo_tensorflow-master>,然後在$Terminal$中輸入:python detect.py --images imgs --det det命令即可,其中 --images代表定義圖片存儲或加載的文件夾,而--det代表檢測完圖片之後將檢測圖片保存起來的文件夾,當然,如果需要查看其它標記含義(例如:--bs

),可以通過在命令行輸入:python detect.py -h 或者直接代開$project$中detect.py文件查看arg_parse()函數下定義的參量進行查看。甚至直接運行detect.py文件也可以進行圖片檢測。

$~~~~~~~$如果你想檢測視頻,可以運行video.py進行檢測,要在視頻或網絡攝像頭上運行這個檢測器,代碼基本可以保持不變,只是我們不會在 batch 上叠代,而是在視頻的幀上叠代。

$~~~~~~~$在視頻上運行該檢測器的代碼可以在我們的 GitHub 中的 video.py 文件中找到。這個代碼非常類似 detect.py 的代碼,只有幾處不太一樣。這裏需要註意的是,如果想要對視頻進行檢測需要將視頻文件放入$projiect$的根目錄中,而且在video.py文件中對視頻定義的默認參數為:default = "video.avi",所以,你需要更改你視頻文件的名稱或者更改參數的默認設定。

3. 源碼詳細解析

$~~~~~~~$PASS

4. 源碼中的問題

$~~~~~~~$在項目下載下來之後發現了源碼有一些比較坑的地方,以至於部分代碼無法運行,這裏舉出暫時所遇到的坑以及解決辦法。

4.1 視頻檢測中遇到的問題:

$~~~~~~~$此處非項目:YOLO_v3_tutorial_from_scratch-master中視頻檢測遇到的問題,而是項目yolo_tensorflow-master中視頻檢測遇到的問題,只是在此將所有和YOLO代碼相關的問題都列舉出來,在項目yolo_tensorflow-mastertest.py中,第201-203行代碼為攝像頭檢測的代碼:detect from camera
代碼中:cap = cv2.VideoCapture(0),原始的GitHub:hizhangp/yolo_tensorflow代碼中為:cap = cv2.VideoCapture(-1),運行時造成攝像頭開啟後顯示的圖像為滿屏幕的雪花噪點,無法檢測到任何東西,需要將括號中的參數-1改為0方可正常開始攝像頭進行檢測。此項目yolo_tensorflow-master的解讀參照知乎相關專欄:YOLO源碼解析 作者:狗頭山人七

4.2 圖片檢測中遇到的問題:

$~~~~~$此處遇到的問題非常的多和雜,將代碼修改正確以正常運行耗費了我很多精力,在此一一列舉,以備以後遇到類似情況。
$
~~~~~$技術分享圖片

4.2.1 絕對路徑與相對路徑的問題

$~~~~~~~$剛開始運行圖片檢測代碼(項目:YOLO_v3_tutorial_from_scratch-master)的時候直接報錯,報的錯誤為:

$~~~~~$AttributeError: ‘NoneType‘ object has no attribute ‘shape‘
$
~~~$!!完全不知道錯誤的那種錯!!
$
~~~~~$技術分享圖片

$~~~~~~~$後來一堆百度,Google查證之後發現是報了一個空的對象沒有shape這個屬性的錯誤,可能是因為路徑設置不對,所以返回的類型是None。後來通過bug排除發現是代碼第126行:imlist = [osp.join(osp.realpath(‘.‘), images, img) for img in os.listdir(images)],這一行代碼主要是用於生成圖片所在的絕對地址:

D:\軟件安裝\pycharm\PyCharm Community Edition 2017.3.3\workplace\pytorch-yolo-v3-master\imgs\dog.jpg
D:\軟件安裝\pycharm\PyCharm Community Edition 2017.3.3\workplace\pytorch-yolo-v3-master\imgs\eagle.jpg
D:\軟件安裝\pycharm\PyCharm Community Edition 2017.3.3\workplace\pytorch-yolo-v3-master\imgs\giraffe.jpg
D:\軟件安裝\pycharm\PyCharm Community Edition 2017.3.3\workplace\pytorch-yolo-v3-master\imgs\herd_of_horses.jpg
D:\軟件安裝\pycharm\PyCharm Community Edition 2017.3.3\workplace\pytorch-yolo-v3-master\imgs\img1.jpg
D:\軟件安裝\pycharm\PyCharm Community Edition 2017.3.3\workplace\pytorch-yolo-v3-master\imgs\img2.jpg
D:\軟件安裝\pycharm\PyCharm Community Edition 2017.3.3\workplace\pytorch-yolo-v3-master\imgs\img3.jpg
D:\軟件安裝\pycharm\PyCharm Community Edition 2017.3.3\workplace\pytorch-yolo-v3-master\imgs\img4.jpg
D:\軟件安裝\pycharm\PyCharm Community Edition 2017.3.3\workplace\pytorch-yolo-v3-master\imgs\lisa.jpg
$~~~~~~~$技術分享圖片

$~~~~~$這裏我意識到可能此處的錯誤並非作者源代碼的錯誤,而是作者在用這一句osp.join(osp.realpath(‘.‘)的時候獲取的是絕對路徑,而我的絕對路徑包含了中文!!!!
$
~~~~~$技術分享圖片

$~~~~~~~$所以為了解決這個問題,我需要將絕對路徑修改為相對路徑,以避免出現中文這個腦殼疼的問題(話說好多與bug有關的問題是出現路徑有中文上!),修改方法就是上面的代碼修改為:osp.join(osp.relpath(‘.‘),其中rel指的就是relative


4.2.2 斜杠‘/‘與反斜杠‘\‘的問題

$~~~~~~~$在上面的問題解決以後運行代碼發現代碼運行正常,但是最後保存檢測圖片的文件夾--det並沒有任何圖片存放其中,後來定位到存放圖片的代碼:

det_names = pd.Series(imlist).apply(lambda x: "{}/det_{}".format(args.det,x.split("/")[-1]))
list(map(cv2.imwrite, det_names, orig_ims))

$~~~~~~~$每張圖像都以「det_」加上圖像名稱的方式保存。我們創建了一個地址列表,這是我們保存我們的檢測結果圖像的位置。最後,將帶有檢測結果的圖像寫入到 det_names 中的地址。

$~~~~~~~$其中det_name打印出來結果如下:

0 det/det_.\imgs\dog.jpg
1 det/det_.\imgs\eagle.jpg
2 det/det_.\imgs\giraffe.jpg
3 det/det_.\imgs\herd_of_horses.jpg
4 det/det_.\imgs\img1.jpg
5 det/det_.\imgs\img2.jpg
6 det/det_.\imgs\img3.jpg
7 det/det_.\imgs\img4.jpg
8 det/det_.\imgs\lisa.jpg
9 det/det_.\imgs\messi.jpg
10 det/det_.\imgs\person.jpg
11 det/det_.\imgs\scream.jpg
12 det/det_.\imgs\vagaa.jpg

$~~~~~~~$而imlist打印出來的結果為:

[‘.\imgs\dog.jpg‘,‘.\imgs\eagle.jpg‘, ‘.\imgs\giraffe.jpg‘,‘.\imgs\herd_of_horses.jpg‘, ‘.\imgs\img1.jpg‘,‘.\imgs\img2.jpg‘, ‘.\imgs\img3.jpg‘,

$~~~~~~~$下一句代碼:list(map(cv2.imwrite, det_names, orig_ims))中:

$~~~~~$1.cv2.imwrite()函數:保存圖片的函數,共兩個參數,第一個為保存文件名,第二個為讀入圖片。
$
~~~$2. orig_ims:為list所包裹這的array矩陣,類型為無符號8位dtype=uint8,所以為圖片的編碼矩陣。
$
~~~~~$3.map()函數:會根據提供的函數對指定序列做映射。第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次 function 函數返回值的新列表。語法為:map(function, iterable, ...),其中function -- 函數,有兩個參數;iterable -- 一個或多個序列,例如:map(square, [1,2,3,4,5]),打印:[1, 4, 9, 16, 25],其中square(x)為一個函數,return x$^2$

$~~~~~~~$所以從上可以看出map函數將cv2.imwrite, det_names, orig_ims之間建立映射,其中det_names, orig_ims作為cv2.imwrite()的參數,其中一個作為保存文件名,一個作為讀入的圖片。

$~~~~~~~$運行此代碼,顯示:

[False, False, False, False, False, False, False, False, False, False, False, False, False]

$~~~~~~~$說明映射失敗,圖片存儲不成功。而由det_name所打印的顯示表明失敗是由於文件名中存在反斜杠‘‘,反斜杠在python中有實際轉義含義的,所以需要將反斜杠換為斜杠,不然運行的時候代碼會將反斜杠一起運行。

$~~~~~~~$修改方法如下:

    for i in range(len(imlist)):
    imlist[i] = imlist[i].replace('\\', '/')
    

$~~~~~~~$此處還需要註意的就是imlist[i].replace(‘\‘, ‘/‘)會生成一個列表存放修改後的值,而不是在原本的列表imlist[]上進行修改。

$~~~~~~~$修改後的det_name為:

0 det/det_dog.jpg
1 det/det_eagle.jpg
2 det/det_giraffe.jpg
3 det/det_herd_of_horses.jpg
4 det/det_img1.jpg
5 det/det_img2.jpg
6 det/det_img3.jpg
7 det/det_img4.jpg
8 det/det_lisa.jpg
9 det/det_messi.jpg
10 det/det_person.jpg
11 det/det_scream.jpg
12 det/det_vagaa.jpg

$~~~~~~~$此時,反斜杠已經改為了斜杠,代碼運行正常,且det文件夾也正常存放了檢測後的圖片,如下:
技術分享圖片

5. 關於YOLO_v3作者

$~~~~~~~$在知乎中有一個問題是關於如何評價最新的YOLOv3?,非常有意思,列舉如下一些有趣的點:

$~~~~~~~$1. 首先,YOLO_v3的論文根本就不算論文,更多的算是一片技術報告,讀起來相當的歡樂。作者首先就誠實的表明自己去年沒做什麽研究,而是主要花在完Twitter上和玩了下GAN。
技術分享圖片
技術分享圖片


$~~~~~~~$2. 其次,yolo的作者編碼能力真的強,darknet幾乎不用啥依賴庫,全部手擼,編譯起來也是快到沒朋友。而且,作業可能是個小馬寶莉的迷吧,哈哈哈,蠻有意思,感覺像個小萌妹。看看他的resume、個人主頁、git的commit message感受一下萌萌噠。
技術分享圖片
技術分享圖片
技術分享圖片

$~~~~~~~$而他本人長這樣:
技術分享圖片


$~~~~~~~$3. 直接diss一眾算法,例如他論文中出現的:
技術分享圖片

這張圖把自己放在第二象限,赤裸裸的表達你們這些都是辣雞。。。。
這圖應該作者從其他論文裁剪過來,再強行畫上的;
實力嘲諷啊,取了Retina裏面的圖,然後diss一波


$~~~~~$4. 論文結尾亮點滿滿,挺佩服能把自己論文寫的這麽隨意的,羨慕大佬:
技術分享圖片
$
~~~~~$效果好到論文可以隨意寫,反正我效果擺在這裏,論文寫的再隨意,你們還是要引用的。


$~~~~~$5. 而且有細心網友發現,模型一作在arXiv上發布研究論文時,腦回路清奇地將自己這篇論文自引自用了一下。
技術分享圖片
$
~~~~~$而在小哥自引自用後沒多久,arXiv官方賬號宣布服務器由於不明原因掛掉了……
技術分享圖片

6. 補完計劃

$~~~~~~~$文章的第三部分代碼詳細解析,有空了會繼續補完,待續。。。

---恢復內容結束---

## 你好

#YOLO_v3代碼解析以及相關註意事項