Darknet目前是基于Yolo_v4的物体识别框架, 因为网络模型简单, 识别速度精度高, 兼容性好, 文档齐全, 社区活跃等原因对新手友好相对而广泛使用. 这里我介绍使用中文标签的方法.
中文化的原理
Darknet使用字符图片拼接的方法, 例如cat是c a t各自的label连接而成. 中文远不止26个英文字符(及符号), 所以这里采用了简易的的class label, 好处是图片是静态生成的, 一次生成多次使用, 坏处是不能动态地根据可用class来生成对应labels.
获取 Darknet
1 | git clone https://github.com/AlexeyAB/darknet.git |
labels生成代码
类别名称
将你的.names
文件修改为中文, 本文以data/obj.names
为例
安装imagemagick
- Mac
1 | brew install imagemagick |
- Linux
1 | wget https://www.imagemagick.org/download/ImageMagick.tar.gz |
生成标签
删除darknet/data/labels里所有内容, 新建make_labels.py
, 内容如下:
1 | import os |
修改完字体位置后运行python make_labels.py
即可.
修改源代码
src/Image.c
这一步让darknet从找字符label变为找class label.
- 修改
get_label_v3
函数为
1 | image get_label_v3(image **characters, char *labelindex, int size) |
- 新建
**load_labels
函数以加载标签图, 建议在**load_alphabet()
附近添加, 方便维护.
1 | image **load_labels(int classes) |
- 在
draw_detections_v3
下寻找if (alphabet) {
语句, 并修改其内容为
1 | if (alphabet) { |
src/Image.h
- 为了声明新建的
**load_labels
函数, 在image **load_alphabet();
下一行添加
1 | image **load_labels(int); |
src/Detector.c
- 替换标签图加载函数, 把
image **alphabet = load_alphabet();
替换为
1 | image **alphabet = load_labels(names_size); |
- 修改释放变量的范围, 在
test_detector
函数下寻找for (i = 32; i < 127; ++i) {
替换为
1 | for (i = 0; i < names_size; ++i) { |
类别名称乱码处理
Windows下类别名称文件obj.names
使用GB2312保存, *nix下则使用UTF-8保存.
进行识别
至此中文化就完成了, 可以make
后进行图像识别.
仓库链接: Github