본문 바로가기

IT/Deeplearning

[CNN classifier / YOLO DARKNET] classifier code review :: load_network- [2.2]

1. [CNN classifier / YOLO DARKNET] classifier code review :: Intro- [1]

2. [CNN classifier / YOLO DARKNET] classifier code review :: load_network- [2.1]


저번 포스팅에서는 load_network함수의 parse_network_cfg 함수까지 개략적으로 살펴보았습니다.


이번 포스팅은 parse_network_cfg함수의 한줄한줄씩, 코드 리뷰를 진행하도록 하겠습니다.


1. read_cfg:: src/parse.c

read_cfg함수는 parse.c 파일에 위치하고 있습니다.


parse_network_cfg 함수안에서는 1번째 라인에 read_cfg 코드가 다음과 같이 나타나있습니다.


1. filename이라는 인자를 받아 read_cfg를 통과하고 나온 반환값을 list구조체 포인터 section에 대입합니다.


즉, read_cfg함수를 통해서 반환되는 것은 list구조체라는 것을 알 수 있습니다.


network *parse_network_cfg(char *filename)
{
    list *sections = read_cfg(filename);
...
}



이제 read_cfg 함수의 전체 코드를 보도록 하겠습니다.


1. 인자로 받은 filename(*.cfg 파일의 file location)을 read 모드로 open합니다.

2. options이라는 빈 리스트 구조체를 생성합니다.

3. current라는 빈 section 구조체를 생성합니다.

4. *.cfg파일을 읽어들이면서, 공백 및 불필요한 문자를 제거해줍니다.

5. 문자 '['가 나오면 section을 초기화합니다. 

6. 그리고 section구조체 멤버인 option 리스트도 초기화합니다.

7. options리스트에 section구조체를 insert합니다.

8. section구조체 멤버변수 type에는 문자 '['가 나타난 line을 넣어줍니다.

9. 그 외의 경우에는 line을 읽어들이고, 문자'='를 기점으로 {key:value}상을 만들어서 section구조체의 멤버 변수 option리스트에 넣어줍니다.

10. 그렇게 반복이 끝나면, options 리스트를 반환합니다.


list *read_cfg(char *filename)
{
    FILE *file = fopen(filename, "r");
    if(file == 0) file_error(filename);
    char *line;
    int nu = 0;
    list *options = make_list();
    section *current = 0;
    while((line=fgetl(file)) != 0){
        ++ nu;
        strip(line);
        switch(line[0]){
            case '[':
                current = malloc(sizeof(section));
                list_insert(options, current);
                current->options = make_list();
                current->type = line;
                break;
            case '\0':
            case '#':
            case ';':
                free(line);
                break;
            default:
                if(!read_option(line, current->options)){
                    fprintf(stderr, "Config file error line %d, could parse: %s\n", nu, line);
                    free(line);
                }
                break;
        }
    }
    fclose(file);
    return options;
}