最近在研究faceswap相关的内容,通过百度搜索了各种教程之后,发现相关的文章不少,但是内容基本一致,差不多的复制粘贴。按照帖子中的操作步骤进行之后发现效果不忍直视,具体的替换之后的图就不贴了。直到从官网看到相关的文章之后才发现那些简明操作步骤基本都是错误的。
原始文章链接:https://forum.faceswap.dev/viewtopic.php?f=5&t=27 包括一些名词解释也可以参考这个链接。本文只是简单记录下相关的步骤。其余的一些内容可以参考原文链接。
安卓广告跳过 yolov5 ncnn方式集成
代码原地址: https://github.com/nihui/ncnn-android-yolov5
我在这里只是替换了模型信息,其余的内容基本没有修改。
原工程并没有写如何进行模型转换,模型转换可以参考这篇文章:https://blog.csdn.net/flyfish1986/article/details/116604907里面写的比较详细了。
这里简单的做个备份,不想跳转的可以直接参考下面的内容:
模型转换为ncnn格式
- 导出onnx
bash
python models/export.py --weights yolov5s.pt --img 320 --batch 1- onnx-simplifer简化模型
bash
python -m onnxsim yolov5s.onnx yolov5s-sim.onnx- 专函为ncnn
bash
./onnx2ncnn yolov5s-sim.onnx yolov5s.param yolov5s.bin- 处理转ncnn产生的Unsupported slice step !
1).处理YOLOv5的Focus模块,将多个slice节点转换为一个focus节点
Freeswitch sip Push notifications
不管是安卓还是ios现在多数的app都无法长时间在后台运行(特殊权限以及应用除外),如果要想在app没有激活或者被冻结的情况下接收到来电,那么就需要先推送一条通知。
搜了一下有这么个插件:https://github.com/sem32/freeswitch-PushNotificator 尝试了一下发现编译起来比较麻烦,后来发现了这篇文章:https://www.zoiper.com/en/tutorials/push-notifications参考里面的关键代码,包含一个push.sh,代码如下:
Sip服务器(Freeswitch)屏蔽国外IP
SIP攻击很常见,特别是各大云服务器,基本上开了个公网IP绑定到实例机器就会被外国IP一遍怼。防范也容易,就是把外国IP禁掉。
实现:iptables+ipset,只允许中国IP访问本机,也就实现了封禁国外IP的效果。
优点:匹配迅速,免去iptables单链匹配。
操作步骤:
1.安装ipset 以及iptabls
#安装ipset: RedHat:yum install ipset Debian:apt-get install ipset #建表 ipset create china hash:net hashsize 10000 maxelem 1000000 #批量增加中国IP到ipset的china表 #以下内容保存成脚本执行即可 #!/bin/bash rm -f cn.zone wget http://www.ipdeny.com/ipblocks/data/countries/cn.zone for i in `cat cn.zone` do ipset add china $i done
Skip Ads Android Project
基于Freeswitch的语音视频通话
之前写过一篇《阿里云 opensips nat内网穿透》,当时是为了解决对讲机视频对讲的问题。但是之前的方案存在一个问题,那就是虽然服务器能够正常提供服务。但是在接通之后如果设备不在同一个局域网内就会导致有音频但是没有视频信息。这个问题困扰了很久,直到现在算是能够解决这个问题。出现上面这个问题的根本原因在于设备的网络层次关系太过复杂,视频信息没有办法透传。我不是语音视频方面的专家,集中nat结构我也不在叙述了,感兴趣的访问这个链接:https://www.cnblogs.com/zhumengke/articles/11204924.html
如果要在阿里云的服务器上,还需要升级绑定弹性网卡的相关内容,具体参考这里:https://developer.aliyun.com/article/228753?spm=a2c6h.13813017.content3.1.5cbc6532wDqNf4
Yolov5 tf-lite方式导出
在之前的文章《Yolov5 Android tf-lite方式集成》中,导出tf-lite方式的模型使用的是https://github.com/zldrobit/yolov5.git中的tf.py。晚上尝试用yolov5 最新版本的代码的export.py导出,如果不想修改命令行参数,可以字节修改以下代码:
# 需要修改参数 data weights batch-size def parse_opt(): parser = argparse.ArgumentParser() parser.add_argument('--data', type=str, default=ROOT / 'data/ads.yaml', help='dataset.yaml path') parser.add_argument('--weights', type=str, default=ROOT / 'best.pt', help='weights path') parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640, 640], help='image (h, w)') parser.add_argument('--batch-size', type=int, default=1, help='batch size') parser.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--half', action='store_true', help='FP16 half-precision export') parser.add_argument('--inplace', action='store_true', help='set YOLOv5 Detect() inplace=True') parser.add_argument('--train', action='store_true', help='model.train() mode') parser.add_argument('--optimize',default=True, action='store_true', help='TorchScript: optimize for mobile') parser.add_argument('--int8', action='store_true', help='CoreML/TF INT8 quantization') parser.add_argument('--dynamic', action='store_true', help='ONNX/TF: dynamic axes') parser.add_argument('--simplify', action='store_true', help='ONNX: simplify model') parser.add_argument('--opset', type=int, default=13, help='ONNX: opset version') parser.add_argument('--topk-per-class', type=int, default=100, help='TF.js NMS: topk per class to keep') parser.add_argument('--topk-all', type=int, default=100, help='TF.js NMS: topk for all classes to keep') parser.add_argument('--iou-thres', type=float, default=0.45, help='TF.js NMS: IoU threshold') parser.add_argument('--conf-thres', type=float, default=0.25, help='TF.js NMS: confidence threshold') parser.add_argument('--include', nargs='+', default=['torchscript', 'onnx'], help='available formats are (torchscript, onnx, coreml, saved_model, pb, tflite, tfjs)') opt = parser.parse_args() print_args(FILE.stem, opt) return opt