Darknet学习笔记1:代码预处理

1. 代码清理

1. 文件目录清理
.
├── [data]
│   └── [labels]
├── [examples]
├── [include]
├── [src]
└── Makefile

只保留./data/labels目录下所有文件与其余目录下的*.c,*.h文件

2. 条件编译清理

由于Darknet有针对GPU的优化与使用了OpenCV,可以先排除掉这一部分,让主体代码逻辑更清楚。这里使用unifdef工具来删去相关代码。

apt-get install unifdef

安装unifdef工具包

unifdef -K -U CONFIG_XXXX /path/to/file

这里,-K 是防止 unifdef 处理一些带常数的条件编译,比如 #if 0。-U 就是指定某个宏是 undefined。

#!/bin/bash

filelist=`find . -name *.c -o -name *.h`

for file in $filelist
do
  unifdef -K -U GPU CUDNN OPENCV $file > $file.out
  cmp --silent $file $file.out || cp $file.out $file
  rm -f $file.out
done

编译测试一下,看否精简得有问题

3. 文件结构归一

.c,.h 文件归一到一个文件夹下面,写个Makefile

EXEC = darknet

CC = gcc

CFLAGS  = -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors
LDFLAGS = -lm -pthread

OBJS = gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o  lstm_layer.o l2norm_layer.o yolo_layer.o iseg_layer.o \
captcha.o lsd.o super.o art.o tag.o cifar.o go.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o instance-segmenter.o darknet.o

all: $(EXEC)

$(EXEC): $(OBJS)
    $(CC) $(OBJS) -o $(EXEC) $(LDFLAGS)

$(OBJS):
    $(CC) -c $(CFLAGS) $*.c -o $*.o

.PHONY: clean

clean:
    rm -rf $(EXEC) $(OBJS)

make编译一下,执行测试命令(没有权重文件先在官网下载好):

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

可以看到结果没问题,至于预测时间嘛,也是相当感人的。。。。。(主频4.2GHz情况下,3分钟)

这是清理过后源代码,欢迎Watch、Star、Fork三连:
https://github.com/SimpleDoger/Darknet_CPU_Only(这个版本是做了指针和对象错误修复过后的版本,并测试过与原版执行结果相同)

2. 创建VS2013工程

接下来即便是耗费大力气为什么都要推到Windows系统上呢,因为Windows系统上有宇宙最强IDE加持。。。能事半功倍

1. 代码修复

由于MSVC与GCC编译的差异,在GCC下能编译通过,但是在MSVC下报错。主要报错的地方有:

  1. 相关头文件未找到(除了pthread.h,其余都能找到替代)
  2. what_time_is_it_now()函数实现修复
  3. 指针和对象错误(这个应该属于原作者书写不规范,遗留下的bug,虽然不严格的gcc编译能通过。刚刚看了下原作者简历,拿Vim撸的。。。。)
  4. 清理掉文件:captcha.c、lsd.c、super.c、art.c、tag.c、cifar.c、go.c、rnn.c、segmenter.c、regressor.c、classifier.c、coco.c、yolo.c、nightmare.c、instance-segmenter.c。并备注掉darknet.c里面相关调用代码。这些算是对Darknet框架应用层上的东西了,和detector.c完成功能同级。

1) what_time_is_it_now()函数实现修复

double what_time_is_it_now()
{
    double time_now = clock() / 1000.0;
    return time_now;
}

2)关于net报错的地方,将对象改为指针

2. 添加VC版pthread支持(已废除)

后来发现在运行的时候有动态内存分配溢出,会导致后面的calloc失败?不知道,反正移除了过后能正常运行了。很诡异,在有调试器加持的情况下没问题。。。

  1. 下载Win32的pthread发行版

  2. 解压

Pre-built.2\dll\x86\pthreadVC2.dll 到程序生成目录
Pre-built.2\lib\x86\pthreadVC2.lib 到程序生成目录
Pre-built.2\include\pthread.h 到工程目录
Pre-built.2\include\sched.h 到工程目录
Pre-built.2\include\semaphore.h 到工程目录

工程包含对应头文件

  1. 修改pthread.h
    在42行添加:
#pragma comment(lib,"pthreadVC2.lib")

修改300行为:

#include "sched.h"
2. 移除pthread相关代码

pthread相关代码经过分析主要用在了数据加载上。通过多线程加载图片,标签数据源到内存,相关函数包含在swag.c、voxel.c、writing.c、attention.c、compare.c、data.c、detector.c文件里面。

待续....

终于可以运行调试了,Bingo~

借助强大的IDE,能很方便的生成函数调用逻辑关系图:


代码的分析将在随后的文章详解

-----逃-----

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容