LuaTable函数库
1234567table.insert(table,[ pos,] value) table.remove(table[, pos]) table.concat(table[, sep[, i[, j]]]) table.sort(table[, comp]) // 见Lua排序table.getn() //5.0费table.maxn() //5.2费
#####insert, remove
insert 和 remove 只能用于数组元素的插入和移出, 进行插入和移出时,会将后面的元素对齐起来。 所以在 for 循环中进行 insert 和 remove 的时候要注意插入和移除时是否漏掉了某些项: local t = {1,2,3,3,5,3,6} for i,v in ipairs(t) do if v == 3 then table.remove(t,i) end end – 错误,第四个 3 没有被移除,ipairs 内部会维护一个变量记录遍历的位置,remove 掉第三个数字 3 之后,ipairs 下一个返回的值 ...
Programming in Lua摘录
“袁承志知道若再谦逊,那就是瞧人不起,展开五行拳,发拳当胸打去。荣彩和旁观三人本来都以为他武功有独到之秘,哪知使出来的竟是武林中最寻常不过的五行拳。
敌对三人登时意存轻视,温青脸上不自禁露出失望的神色。
“荣彩心中暗喜,双拳如风,连抢三下攻势,满拟自己的大力魔爪手江南独步,三四招之间就可破去对方五行拳,那知袁承志轻描淡写的一一化解。再拆数招,荣彩暗暗吃惊,原来对方所使虽是极寻常的拳术,但每一招均是含劲不吐,意在拳先,举手抬足 之间隐含极浑厚的内力。”
——金庸《碧血剑》——金庸《碧血剑》
Pose Estimation Evaluation (Metric)
对于人体骨骼关键点算法来说,如何有效的衡量一个算法的好坏非常重要,他不像分类问题那样可以很容易采用一些常用指标,例如precise、error、F-score等进行计算。因为在衡量的过程中,我们无法有效的将预测结果与真实值一一对应,无法知道他们之前的对应关系,更加无法知道当前的某个预测结果是否出现了误检或者漏检的情况。因此,构建一个合适的人体关键点的度量指标很重要。
本文目前涉及 oks、AP、mAP、PCK、PCKh、PDJ,后续碰到新的会继续补充
一、oks目前最为常用的就是OKS(Object Keypoint Similarity)指标,这个指标启发于目标检测中的IoU指标,目的就是为了计算真值和预测人体关键点的相似度。
OKS
其中:
表示groudtruth中,人的id
表示key point的id
表示groudtruth中每个人和预测的每个人的关键点的欧氏距离
表示当前人的尺度因子,这个值等于此人在groundtruth中所占面积的平方根,即
表示第 i 个骨骼点的归一化因子,这个因此是通过对数据集中所有groundtruth计算的标准差而得到的,反映出当 ...
lua 从字符串获取指定第几位数到第几位数
– 判断utf8字符byte长度
– 0xxxxxxx - 1 byte
– 110yxxxx - 192, 2 byte
– 1110yyyy - 225, 3 byte
– 11110zzz - 240, 4 byte
local function chsize(char)
if not char then
print(“not char”)
return 0
elseif char > 240 then
return 4
elseif char > 225 then
return 3
elseif char > 192 then
return 2
else
return 1
end
end
-- 计算utf8字符串字符数, 各种字符都按一个字符计算
-- 例如utf8len("1你好") => 3
function utf8len(str)
local len = 0
local curren ...
快速排序算法的lua实现
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556-- 快速排序算法的实现--[[ 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。 一趟快速排序的算法是: 1)设置两个变量i、j,排序开始的时候:i=1,j=N-1; 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]; 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j] 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i] 5) 将A[j]与A[i]的值互换 6)重复第3、4、5步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key, ...
Lua Study
本文并不会把Lua语言的所有内容都包含在内,只对个人学习过程中感觉比较重要的部分做一个记录,以便回顾。
类型学习语言首先要了解它提供的类型,Lua语言提供了如下几种。
nil
boolean
number
string
userdata
function
thread
tableLua中只有nil和boolean中的false视为条件(条件表达式中的条件)假,其他任何值都表示真。number可以表示任何32位整数。String表示不可变(immutable)的字符串,转义使用””符号,用..来连接字符串。table是Lua唯一的数据结构机制。可以理解为Hash表加上可变长数组(不加键默认从1开始计数)。talbe的两种存、取值方式123456testTable = { ["a"] = "value1", b = "value2"}testTable["a"]testTable.b
function是“第一类值”,支持函数式编程。
表达式
数字常量
字面字符串
变量
操作符
算数操作符 “-“,”+”,”- ...
Lua中的表操作
「�TODO�」: 表的查找和新增元素
取长度操作Lua中可以用 # 符号对表进行取长度操作. 对Lua中的表进行取长度操作时, 如果没有该表的元方法 __len, 则该取长度操作只对表的数组部分进行.
取长度的入口函数为 luaH_getn, 该函数的目的是找到表 t 的一个边界值i, 并且t[i]不为nil, t[i+1]为nil (如果t[1]为nil, 则i为0) 它的伪代码如下:
如果表存在数组部分:
在数组部分二分查找返回位置i,其中i足满足条件 t[i] != nil 且 t[i+1] == nil 的最大数据
否则前面的数组部分查不到满足条件的数据, 进入散列部分查找:
在散列桶部分二分查找返回位置i. 其中i是满足条件 t[i] != nil 且 t[i+1] == nil 的最大数据
使用表时需要注意的事项
尽量不要将一个表混用数组和散列桶部分, 即一个表最好只存放一类数据. Lua 的实现上确实提供了两者统一表示的遍历, 但是这不意味着使用者就应该混用这两种方式.
尽量避免进行重新散列操作, 因为重新散列操作的代价极大. 通过预分配, 只使用 ...
Lua 数据类型
数据类型
描述
nil
这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean
包含两个值:false和true。
number
表示双精度类型的实浮点数
string
字符串由一对双引号或单引号来表示
function
由 C 或 Lua 编写的函数
userdata
表示任意存储在变量中的C数据结构
thread
表示执行的独立线路,用于执行协同程序
table
Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。
nil#
nil 类型表示一种没有任何有效值,它只有一个值 – nil
对于全局变量和 table,nil 还有一个”删除”作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉.
boolean#
boolean 类型只有两个可选值:true(真) 和 false ...
lua脚本解析webhooks实现自动部署
码云配置webhooks实现自动部署的方式有很多,可以把项目放在github用github的webhooks,但是github只能创建公开项目私有项目是要钱的。也可以使用一种相对麻烦的方式,可以在vps上建一个git仓库每次提交到vps上之后触发hook去更新blog,这种方法相对麻烦而且vps上的项目容易丢失。所以最后选择了码云,在码云上初始化一个blog项目,之后配置一个webhooks并且跑配置密码,防止url被恶意调用。
如下图:
nginx配置前提是安装了lua或者Luajit以及nginx编译了lua-nginx-module模块
location /webhooks {
content_by_lua_file blog_hook.lua;
}
现在开始编写lua脚本
ngx.req.read_body()
local data = ngx.req.get_body_data()
local args = ngx.req.get_uri_args()
local cjson = require "cjson"
value ...
(2)静态资源服务器、缓存、HTTPS、Openresty+Lua
1.alias 与 root
访问固定目录的做法
Location / { alias dlib/;}
root 的问题:会把url 的路径带到文件目录中来,所以通常使用alias
2.gzip
gzip_min_length 1;表示小于1字节的就不再压缩了。因为有的文件小,一个TCP报文就发出去了。这时候如果还做gzip压缩,消耗CPU。意义不大了。
3.auto_index
应用场景:假定我们把dlib文件下的某个文件分享给用户,让用户决定用哪些文件。
当我们访问反斜线结尾的目录的时候。对应到指定目录,显示目录的结构。
location / { alias dlib/; auto_index on:}
共享静态资源的一种手段。
4.限制访问速度比如访问大文件的时候,我们限制流出速度。
location / { alias dlib/; auto_index on: set $limit_rate 1k; #限制向浏览器发送的速度。每秒1k字节。}
$limit_rate 内置变量,限制访问速度。
5.记录access日志
log_format 命名的场景
我们可能会对不同的域名下 ...