MTCNN试用
检测工作想借用MTCNN里的48-net,源码来自CongWeilin Git 下下来就能跑,真是良心
进入pepare_data准备好数据以后进入48-net,目录下有一个pythonLayer.py,由于loss函数是自定义的python层,所以train.sh里,第一行要把这个目录export到pythonpath
然后在train.sh第二行里配上自己的caffe编译路径,运行,报错找不到python层,查到是因为给的caffe路径不支持python层导致的,这是在caffe编译的时候没有选择 WITH_PYTHON_LAYER := 1
caffe路径选为py-faster-rcnn/caffe-fast-rcnn/build/tools/caffe 就可以了。
然后报错:
I0705 14:14:54.502411 18187 layer_factory.hpp:77] Creating layer PythonLayer48
F0705 14:14:54.995573 18187 solver_factory.hpp:67] Check failed: registry.count(type) == 0 (1 vs. 0) Solver type SGD already registered.
一个上午也没搞定。
最后下载blvc的caffe,选择WITH_PYTHON_LAYER=1重新编译就没问题。
然后会卡在regression_Layer那里,半个下午没搞定,最后把loss层直接改为caffe自带的欧式距离loss:
layer {
name: "RegressionLoss"
type: "EuclideanLoss"
bottom: "fc6-2"
bottom: "roi"
top: "RegressionLoss"
propagate_down: 1
propagate_down: 0
loss_weight: 1
}
终于可以训练了。
-------------20180709--------------
用caffe自带欧式距离loss还是不行,分类没问题,回归框基本没法看,返回自带python层里的regression_Layer,还是卡在这个regression_Layer的setup上,很诡异,data层和cls_brige层都能注册,就这个不行:

试过各种,改数据输入、改python层名字...都不行。看net.cpp Init()代码,看c++ vector _M_fill_insert()未果。
最后解决掉是在runcaffe.sh里添加blvc版caffe的python路径,看到这个,死马当活马医,试了试竟然就通过了......
export PYTHONPATH=/nfs/xxx/wkspace/caffe/python:$PYTHONPATH #这样是可以的
export PYTHONPATH=$PYTHONPATH:/nfs/xxx/wkspace/caffe/python #这样就不行
然后也遇到了回归loss NAN的问题,学习率多加一个0, lr=0.00001可以了。事实上,作者生成imdb代码有一处问题:

只有part这里是减128,而对positive和negative的处理都是:

全改成一致的,lr=0.0001, type="fixed",可以用。
然后,这是一个正确的输出log:
I0709 15:09:24.636786 26765 solver.cpp:239] Iteration 27000 (15.9364 iter/s, 31.3747s/500 iters), loss = 0.00683111
I0709 15:09:24.637056 26765 solver.cpp:258] Train net output #0: ClassifyLoss = 0.0068324 (* 1 = 0.0068324 loss)
I0709 15:09:24.637082 26765 solver.cpp:258] Train net output #1: RegressionLoss = 0 (* 0.5 = 0 loss)
I0709 15:09:24.637099 26765 solver.cpp:258] Train net output #2: cls_Acc = 1
I0709 15:09:24.637115 26765 sgd_solver.cpp:112] Iteration 27000, lr = 0.0001
I0709 15:09:55.372771 26765 solver.cpp:239] Iteration 27500 (16.2685 iter/s, 30.7343s/500 iters), loss = 0.699202
I0709 15:09:55.372918 26765 solver.cpp:258] Train net output #0: ClassifyLoss = 0.693147 (* 1 = 0.693147 loss)
I0709 15:09:55.372941 26765 solver.cpp:258] Train net output #1: RegressionLoss = 0.0121121 (* 0.5 = 0.00605605 loss)
I0709 15:09:55.372956 26765 solver.cpp:258] Train net output #2: cls_Acc = 0
I0709 15:09:55.372972 26765 sgd_solver.cpp:112] Iteration 27500, lr = 0.0001
I0709 15:10:26.095998 26765 solver.cpp:239] Iteration 28000 (16.2752 iter/s, 30.7217s/500 iters), loss = 0.00408262
I0709 15:10:26.096397 26765 solver.cpp:258] Train net output #0: ClassifyLoss = 0.00408339 (* 1 = 0.00408339 loss)
I0709 15:10:26.096426 26765 solver.cpp:258] Train net output #1: RegressionLoss = 0 (* 0.5 = 0 loss)
I0709 15:10:26.096446 26765 solver.cpp:258] Train net output #2: cls_Acc = 1
I0709 15:10:26.096462 26765 sgd_solver.cpp:112] Iteration 28000, lr = 0.0001
I0709 15:10:57.990130 26765 solver.cpp:239] Iteration 28500 (15.6778 iter/s, 31.8923s/500 iters), loss = 0.699614
I0709 15:10:57.990347 26765 solver.cpp:258] Train net output #0: ClassifyLoss = 0.693147 (* 1 = 0.693147 loss)
I0709 15:10:57.990371 26765 solver.cpp:258] Train net output #1: RegressionLoss = 0.0129341 (* 0.5 = 0.00646706 loss)
I0709 15:10:57.990386 26765 solver.cpp:258] Train net output #2: cls_Acc = 0
训练分类网络的时候回归loss=0, 训练回归网络的时候分类loss=0.693(log(2)),表示分类概率=0.5
用自己训练的模型finetune报错:

开始的时候以为是因为pythonLayer里的batchsize设的和原来不一样了,改成一致,仍旧报错,然后发现是中间改过输入图片尺度,从48改成了128,又改成了48......

runcaffe.sh改成这样比较方便:
#!/bin/bash
set -e
set -x
EXEC_DIR="48net0" #这里等号前后不能加空格,否则会找不到
export PYTHONPATH=/nfs/xxx/wkspace/caffe/python:$PYTHONPATH
export PYTHONPATH=/nfs/xxx/wkspace/caffe/examples/mtcnn/${EXEC_DIR}:$PYTHONPATH
TOOLS=./build/tools
$TOOLS/caffe train \
--solver=examples/mtcnn/${EXEC_DIR}/solver.prototxt \
--weights=examples/mtcnn/48net-only-cls.caffemodel \
--gpu 0 2>&1 | tee examples/mtcnn/${EXEC_DIR}/`date +'%Y-%m-%d_%H-%M-%S'`.log #根据生成时间打log
-------------2018.07.25------------
用了小半个月以后发现这个版本的数据处理脚本坑还是挺多的,还是因为自己对框架图像算法什么的都不熟,每个坑都搞了很久。
1. 最严重的一个花了整整两天时间,图像输入的问题:
首先是训练出来的网络forward时各种不对,需要和pythonLayer.py里的处理方式同步一下,然后在c++里调用的时候又不对
因为caffe输入是n,c,h,w,opencv读入一张图是通道在后的,需要把通道提前,caffe mtcnn的pythonLayer.py里直接用:
im = np.swapaxes(im, , )
把通道换到前边了,这样送给caffe去训练的是一张放倒了的图像,那么模型训好,forward的时候也要同样放倒,在python里调的时候因为用了同样的方式没问题,后来在c++里就踩坑了,输出怎么也不对,最后是把像素一个个打印出来找到问题,c++里需要加一句转置:
cv::transpose(img, img);
参考caffe2官方Tuorials,正确的方式应该是训练数据这样准备:

2. 内存问题:
pythonlayer.py里是一次性把所有训练图像都读入内存,训练时随机取一个batch,开了多卡训练以后总是莫名其妙的训练到一段时间就自己停掉了,tmux和nohup命令都一样,最后锁定到时内存爆了,改成训练时读入数据ok,128x128的输入,速度可以接受。
| batchSize | 图像读取方式 | 迭代时间 |
| 128 | 批量读入 | 6.7iters/s |
| 128 | 训练时读入 | 3.2iters/s |
| 512 | 批量读入 | 1.6iters/s |
MTCNN试用的更多相关文章
- SharePoint Online 申请试用链接地址
SharePoint Online 申请试用链接地址: https://products.office.com/en-us/business/compare-office-365-for-busine ...
- 活动助手Beta用户试用报告
用户试用报告 1.面向参与者用户 1.1 日常参加各类学习(水综测)活动中,有没有遇到以下问题: (1) 信息来源混乱,不知道靠不靠谱 (2) 每次报名都要重新填写自己的学号手机号,有时候填错了就没综 ...
- 创建WP8试用应用
参考资料: 创建 Windows Phone 的试用应用 如何在 Windows Phone 应用中实现试用体验 Windows Phone 7 开发 31 日谈——第23日:提供试用版应用程序 对资 ...
- 达梦7的试用 与SQLSERVER的简单技术对比
达梦7的试用 与SQLSERVER的简单技术对比 达梦数据库公司推出了他们的数据库服务管理平台,可以在该平台使用达梦数据库而无须安装达梦7数据库 地址:http://online.dameng.com ...
- Beta版本——用户试用与调研报告
1 引言 1.1 系统概述 毕设导师智能分配系统是一个用来简化传统手工匹配繁琐操作的系统.本系统将学生报志愿.系负责人收集整理数据.相关人员进行手工分配.反馈选择结果等繁琐的操作转移到线上.把毕设 ...
- 【记录】尝试用android-logging-log4j去实现log输出内容到sd卡中的文件的功能
[背景] 折腾: [记录]给Android中添加log日志输出到文件 期间,已经试了: [记录]尝试用android中microlog4android实现log输出到文件的功能 但是不好用. 然后就是 ...
- 代码阅读分析工具Understand 2.0试用
Understand 2.0是一款源代码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实可以大大提高代码阅读效率.由于Understand功能十分强大,本文不可能详尽地介绍它的所有功能,所 ...
- 如何申请国际版Office365和Azure的试用账号
关键字:国际版.Office365.Azure.试用账号.1美元.信用卡 待续
- Android N preview 试用
一.下载更新包 下载地址:https://developer.android.com/intl/zh-cn/preview/download.html 注意下载适合你手机的安装包哦 二.把你手机的oe ...
随机推荐
- Javadoc转换chm帮助文档的四种方法总结
1) 将现有的 html 文件集(比如 api) 制作成chm 文档 http://www.blogjava.net/lishunli/archive/2010/01/07/308618.html 我 ...
- 【静默】在RHEL 6.5上静默安装Oracle 18c
[静默]在RHEL 6.5上静默安装Oracle 18c Oracle 18c.18c其实就是12.2.0.2,19c就是12.2.0.3.db_home.zip 安装包大概4.25G,解压后有8.9 ...
- 从头配置,开发 cocos2dx 3.14.1
要使用cocos2dx写一个麻将测试工具. 配置流程如下: 1. 下载安装最新版本的VS(VS2017): https://www.visualstudio.com/zh-hans/downloads ...
- ArcGIS删除数据异常崩溃
环境 ArcGIS Desktop10.1,ArcSDE10.1,Oracle 11.2.0.4客户端和服务器端(服务器端搭建RAC集群) 问题描述 在使用ArcCatalog连接数据库进行数据删除时 ...
- Vue Cli 3.x项目如何部署到IIS子站点下
Vue Router在IIS下的部署参考:https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB% ...
- python中元组与数组的区别
列表: a=['12', '3rr'] 元组: t=(21,34) 列表可以修改,而元组不可以修改,如果元组中仅有一个元素,则要在元素后加上逗号. 元组和列表的查询方式一样. 元组只可读不可修改. 如 ...
- JavaScript基础知识(函数)
函数的基础 函数: 把实现相同功能的代码放到一个函数体中,当想实现这个功能时,直接执行这个函数即可:减少了的冗余:高内聚,低耦合--> 函数的封装: 函数:引用数据类型: var a = 10; ...
- 主席树 || 可持久化线段树 || BZOJ 3653: 谈笑风生 || Luogu P3899 [湖南集训]谈笑风生
题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的 ...
- .NET Core 2.1 源码学习:看 SocketsHttpHandler 如何在异步方法中连接 Socket
在 .NET Core 2.1 中,System.Net.Sockets 的性能有了很大的提升,最好的证明是 Kestrel 与 HttpClient 都改为使用 System.Net.Sockets ...
- sql数据库光标变成黑快怎么回事?
可能是因为你按到了insert键啦,你再按一下insert键应该就可以啦. 光标变成块状说明当前是覆盖模式.光标变成竖条状说明当前是插入模式.