让老司机告别快进,Miles Deep使用CNN截取色情视频的关键部分

   2016-11-22 0
核心提示:在「非法」查看色情视频时,你是否也为其「漫长」的铺垫和前奏感到懊恼呢?前几天,GitHub 用户 ryanjay0 开源了一个可以用来识别色情视频中特定类型的场景的人工智能项目 Miles Deep。该算法可以将你想看的类型的片段从完整视频中截取出来并生成一个集合了这

在「非法」查看色情视频时,你是否也为其「漫长」的铺垫和前奏感到懊恼呢?前几天, GitHub 用户 ryanjay0 开源了一个可以用来识别色情视频中特定类型的场景的人工智能项目 Miles Deep 。该算法可以将你想看的类型的片段从完整视频中截取出来并生成一个集合了这些片段的新视频,让你可以不再为那些多余的片段烦恼。

Miles Deep 使用了一个带有残差连接(residual connections)的深度卷积神经网络,可以基于性行为(sexual act)将一段色情视频的每一秒分类成 6 种类别,其准确度高达 95%。然后它可以使用这种分类来自动编辑该视频。它可以移除所有不包含性接触的场景,或者编辑去掉一种特定的性行为。

Miles Deep 和雅虎最近发布的 NSFW 模型(见机器之心报道《 雅虎开源首个色情图像检测深度学习解决方案 》)使用了类似的架构,但不一样的是 Miles Deep 还能够区分裸体和多种特定的性行为之间的不同。就我所知,这是第一个公开的色情视频分类或编辑工具。

这个程序可以说是使用 Caffe 模型进行视频分类的一种通用框架,其使用了 C++ 的 batching 和 threading。通过替换权重、模型定义和 mean file,它可以立即被用于编辑其它类型的视频,而不需要重新编译。下面会介绍一个例子。

安装

Ubuntu 安装(16.04)

依赖包(Dependencies)

sudo apt install ffmpeg libopenblas-base libhdf5-serial-dev libgoogle-glog-dev libopencv-dev

额外的 14.04 依赖包

sudo apt install libgflags-dev

CUDA(推荐)

如果要使用 GPU,你需要 Nvidia GPU 和 CUDA 8.0 驱动。强烈推荐;可提速 10 倍以上。这可以通过软件包安装或直接从 NVIDIA 下载: https://developer.nvidia.com/cuda-downloads

CUDNN(可选)

这是来自 NVIDIA 的额外的驱动,可以让 CUDA GPU 支持更快。在这里下载(需要注册): https://developer.nvidia.com/cudnn

下载 Miles Deep

也要下载这个模型( https://github.com/ryanjay0/miles-deep/files/587616/model.v0.1.tar.gz )。将 miles-deep 与该模型的文件夹放在同一个位置(而不是在模型文件里面)。

Version Runtime
GPU + CuDNN 15s
GPU 19s
CPU 1m 59s

注:是在一个 GTX 960 4GB 上测试了一段 24.5 分钟长的视频

Windows 和 OSX

我目前还在开发用于 Windows 的版本。但我没有 Mac,不过应该只需要做一些小修改就可以在 OSX 上运行。编译指令如下。 https://github.com/ryanjay0/miles-deep#compilin g

使用方法

例子:

miles-deep -t sex_back,sex_front movie.mp4

这能找到后向和前向的性爱(sex from the back or front)场景,并输出结果到 movie.cut.avi

例子:

miles-deep -x movie.avi

这能编辑去除 movie.avi 中所有的非性爱场景,并将结果输出到 movie.cut.avi。

例子:

miles-deep -b 16 -t cunnilingus -o /cut_movies movie.mkv

这能将批大小(batch size)减小到 16(默认为 32)。筛选出舔阴(cunnilingus)的场景,结果输出到 /cut_movies/movie.cut.mkv

VRAM(GB) batch_size run time
3.5 32 14.9s
1.9 16 15.7s
1.2 8 16.9s
0.8 4 19.5s
0.6 2 24.3s
0.1 1 36.2s

注:如果你的内存不够,可以减小批大小

在多种批大小情况下的 GPU VRAM 用量和运行时间:

该结果是在带有 4GB VRAM 的 Nvidia GTX 960 上测试得到的,样本是一段 24.5 分钟的视频文件。当 batch_size = 32 时,处理 1 分钟的输入视频大约需要 0.6 秒,也就是说每小时大约 36 秒。

除了 batching 之外,Miles Deep 还使用了 threading,这让其可以在分类的过程中截取和处理截图(screenshot)。

预测权重

这里是一个预测一段视频中每一秒的例子:

让老司机告别快进,Miles Deep使用CNN截取色情视频的关键部分

通过你自己的 Caffe 模型使用 Miles Deep

找猫

下面这个例子是如果通过你自己的模型(或一个预训练的模型)使用这个程序:

MODEL_PATH=/models/bvlc_reference_caffenet/ 

miles-deep -t n02123045 \
-p caffe/${MODEL_PATH}/deploy.prototxt \
-m caffe/data/ilsvrc12/imagenet_mean.binaryproto \
-w caffe/${MODEL_PATH/bvlc_reference_caffenet.caffemodel \ -l caffe/data/ilsvrc12/synsets.txt \ movie.mp4

这能找到在 movie.mp4 中的所有带有虎斑猫(tabby cat)的场景,并返回仅带有这些部分的结果 movie.cut.mp4。

代码中的 n02123045 是虎斑猫的类别。你可以在 caffe/data/ilsvrc12/synset_words.txt 查找这些类别的代码。你也可以使用一个来自 model zoo 的预训练的模型: https://github.com/BVLC/caffe/wiki/Model-Zoo

注:这个例子只是展示了其中的句法。但不知怎的,在我的经历中它的表现很差,很可能是因为分类有 1000 个。这个程序也能完美适合带有一个“other”类别的分类数量更小的模型。

模型

该模型是一个用 pynetbuilder ( https://github.com/jay-mahadeokar/pynetbuilder/tree/master/models/imagenet )创建的带有残差连接(residual connections)的卷积神经网络(CNN)。这些模型都是 ImageNet 上预训练的。然后其最终层经过调整以适应新的分类数量和微调(fine-tuned)。

正如 Karpathy et al 的论文《Large-scale Video Classification with Convolutional Neural Networks》建议的那样,我训练了最上面 3 层的权重而不只是最顶层的,这稍微提升了一些准确度:

RetunedLayers Accuracy
Top3 94.6
Top1 93.9

下面使用不同的模型微调最上面 3 层所得到的结果,该结果是在 2500 张训练图像上测试得到的,这些图像来自与训练集不同的视频。

Model Accuracy(%) Flops(millions) Params(millions)
resnet50 80.0 3858 25.5
resnet50_1by2 94.6 1070 6.9
resnet77_1by2 95.7 1561 9.4

训练损失和测试精度:

让老司机告别快进,Miles Deep使用CNN截取色情视频的关键部分

在所有测试的模型中,resnet50_1by2 在运行时间、内存和准确度上表现出了最佳的平衡。我认为全 resnet50 的低精度是因为过拟合(overfitting)的关系,因为它有更多的参数,也许其训练可以按不同的方式完成。

上面的结果是通过 mirroring 而非 cropping 得到的。使用 cropping 能够将在 resnet50_1by2 上的结果稍微提升至 95.2%,因此它被用作了最终的模型。

使用 TensorFlow 微调(fine-tuning) Inception V3 也能实现 80% 的准确度。但是,这是使用 299x299 的图像大小,而不是 224x224 的大小,也没有 mirroring 或 cropping,所以它们的结果不能直接进行比较。这个模型可能也会有过拟合的问题。

编辑电影

给定对于每一秒的帧的预测,它会获取这些预测的 argmax(最大值参数)并创建这段影片的截断块(cut blocks),其中的 argmax 等于目标(target),而其分数(score)也比一些阈值要大。其中的差距大小、匹配每个模块中目标的帧的最小比例(minimum fraction)和分数阈值(score threshold)都是可以调整的。FFmpeg 支持很多编解码器(codecs),包括 mp4、avi、flv、mkv、wmv 等等。

单帧 vs 多帧

这个模型并不使用任何时间信息,因为它分别处理每一张图像。Karpathy et al 的论文表明其它使用多帧(multiple frames)的模型的表现并不会好很多。它们难以应对相机的移动。将它们的慢融合模型(slow fusion model)与这里的结果进行比较仍然是很有趣的。

数据

其训练数据库包含了 36,000(和 2500 测试图像)张图像,分成了 6 个类别:

  1. blowjob_handjob(口交和手淫)

  2. cunnilingus(舔阴)

  3. other(其它)

  4. sex_back(后向)

  5. sex_front(前向)

  6. titfuck(乳交)

这些图像的大小都调整为了 256x256,并且带有水平镜像(horizontal mirroring),并且为了数据增强(data augmentation)还随机剪切(cropping)成了 224×224 的大小。有很多实验没有剪切,但这能稍微提升 resnet50_1by2 的结果。

目前来说,这个数据集还受限于两个异性恋表演者。但鉴于这种方法的成功,我计划扩大分类的数量。因为这些训练很敏感,我个人并不会放出这些数据库;而只会提供训练出来的模型。

前向和后向性爱

这里的前向和后向性爱(sex front and back)是由相机的位置决定的,而非表演者的方向。如果女性表演者的身体面向相机,那么阴道的前面就展示了出来,这就是前向性爱(sex front)。如果女性的后面被展示了出来,就是后向性爱(sex back)。这创造了两种在视觉上不同的分类。其中在阴道性交和肛交之间不做区分;前向性爱和后向性爱可能两者都包含。

编译

克隆包含 Caffe 作为外部依赖包的 git repository

按步骤指令( http://caffe.berkeleyvision.org/installation.html )安装 Caffe 依赖包以用于你的平台。Ubuntu 指令( http://caffe.berkeleyvision.org/install_apt.html )。默认的是 OpenBlas。不要担心编辑 Makefile.config 或使用 Caffe 的问题。在 Ubuntu 16.04 上尝试这个,并在其上附加依赖包:
sudo apt install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt install --no-install-recommends libboost-all-dev
sudo apt install libopenblas-dev python-numpy
#Add symbolic links for hdf5 library#(not necessary on LinuxMint 18)cd /usr/lib/x86_64-linux-gnu
sudo ln -s libhdf5_serial.so libhdf5.so
sudo ln -s libhdf5_serial_hl.so libhdf5_hl.so
  • 默认的是不带 CuDNN 的 GPU。如果你想用其它的工具,请编辑 Makefile 和 Makefile.caffe。注释掉和取消注释这两个文件中对应的行即可。

  • make

证书

代码(包括训练好的模型)按 GPLv3 授权。Caffe 使用的是 BSD 2 授权。

 
标签: Linux命令
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 每天一条linux命令——halt
    halt命令用来关闭正在运行的Linux操作系统。halt命令会先检测系统的runlevel,若runlevel为0或6,则关闭系统,否则即调用shutdown来关闭系统。 语法:halt(选项)选项:-d:不要在wtmp中记录;-f:不论目前的runlevel为何,不调用shutdown即强制关闭系统;-i:
    02-10
  • 几个linux命令查看堆栈内存问题 几个linux命令
      公司编写代码,发现整个在程序里面调用system时候总是失败,原因是can't allocate memory ,根本原因不是内存不足,而是堆栈内存不够。使用ulimit -s 2048后有所好转但是发现一旦系统进程开启多了后仍然会挂。后来使用objdump -x 后发现了原因有个动态库
    02-09
  • Linux命令总结--rm命令 linux的rmp命令
    (来源于http://www.cnblogs.com/xqzt/p/5398919.html)1、命令简介rm(Remove file 删除目录或文件)删除文件,对于链接文件,只是删除整个链接文件,而原有文件保持不变。新手在删除文件之前一定要知道这些:很重要1.可以用mv代替rm的绝对不要用rm,不要着急
    02-09
  • Linux命令行批量创建目录详解 linux创建目录
    以前一直用-p创建目录链,觉得很方便了。在空目录/opt/app/myapp里创建src,再创建main,再创建javamkdir -p /opt/app/myapp/src/main/java没想到还可以这样玩##¥%……*(root@vm1:~/tmp# mkdir -p src/{{main,test}/{java,resources},main/webapp}root@vm1:
    02-09
  • Linux命令之乐--script和scriptplay
    script和scriptplay可以把终端会话记录到一个文件中,可以用来制作命令行教学视屏。 开始录制会话[root@new test]# script -t 2timing.log -a output.sessionScript started, file is output.session[root@new test]# echo hellohello[root@new test]# echo
    02-09
  • java 开发常用的Linux命令
    1.查找文件 find / -name filename.txt 根据名称查找/目录下的filename.txt文件。find . -name "*.xml" 递归查找所有的xml文件find . -name "*.xml" |xargs grep "hello world" 递归查找所有文件内容中包含hello world的xml文件grep -H 'spring' *.xml 查找所
    02-09
  • 常用Linux命令整理 Linux常用命令总结
    常用Linux命令整理常见系统命令export 查看或修改环境变量# 例:临时修改命令提示符为字符串$export PS1=$# 例:临时修改命令提示符显示系统时间 时间使用\t 表示export PS1="[\u@\h \t \W]\$"man 查看linux系统的手册# 例:查看ls命令如何使用man ls # 回车
    02-09 Linux
  • linux命令行—《命令行快速入门》 linux常用命令csdn
    linux命令行—《命令行快速入门》 linux常用命
    pwd print working directory 打印工作目录hostname my computer's network name 电脑在网络中的名称mkdir make directory 创建路径cd change directory 改变路径ls list directory 列出路径下的内容rmdir remove directory 删除路径pushd push directory 推
    02-09
  • Linux命令(五) 五个常用的linux命令
    Linux命令(五) 五个常用的linux命令
    jenkins触发钉钉报警机制1、安装钉钉插件钉钉报警需要安装Ding Talk插件,支持钉钉报警2、打开钉钉创建钉钉机器人2.1选择机器人类型——自定义2.2添加机器人2.3填写机器人信息填写机器人姓名—设置安全设置为加密类型,并复制出来加密值2.4创建完成保持webhoo
    02-09
  • 03_Linux基础-文件类型-主辅提示符-第1提示符-Linux命令-内外部命令-快捷键-改为英文编码-3个时间-stat-其他基础命令
    03_Linux基础-文件类型-主辅提示符-第1提示符-L
    03_Linux基础-文件类型-主辅提示符-第1提示符-Linux命令-内外部命令-快捷键-改为英文编码-3个时间-stat-{1..100}-du-cd-cp-file-mv-echo-id-shell-ln-env-set-which-rpm-/usr-/与/root-hostname-vim-cat-pwd-alias-unalias-ls-ASCII-wc-chmod博客
    02-09
点击排行