ブログの画像から顔写真だけを抜き出してRSSにする

このエントリにあるように、大好きなグラビアアイドルのブログをスクレイピングして画像だけダウンロードしてそれをRSSで配信するようにして以来、非常に快適なおっかけライフを過ごしております。

しかし、ひとつだけ問題が。
ブログには顔写真以外の画像もアップロードされる訳で、そんな画像を見てもあまり面白くないのです。
なので画像を顔認識させて顔写真らしきものだけをRSSにしてみようと思い、ググったらOpenCVというものを見つけたのです。
さらにCPANモジュールまであったので、簡単に顔写真だけRSSを実装できそうだと思ってやってみました。

で、さくらのレンタルサーバーにOpenCVをインストールして実験。
※インストールはここを参考にしました

で、プログラムを修正してImage::ObjectDetectが顔と認識したものだけを配信させてみたら、思ったより精度よく動いていて満足です。
これでさらに楽しいRSSとなりました。ばんざーい。

実験結果を公表したいところなのですが、著作権的に問題がありそうなので自粛。

代わりにソースを張り付けておきます。

#!/usr/bin/perl

use strict;
use XML::RSS;
use lib '/home/XXXXX/opencv/lib/perl5/site_perl/5.8.8/mach';
use Image::ObjectDetect;

my $cascade = '/home/XXXXX/opencv/share/opencv/haarcascades/haarcascade_frontalface_default.
xml';

my $detector = Image::ObjectDetect->new($cascade);

my $rss = XML::RSS->new(
    version => '2.0',
);
$rss->channel(
    title => 'title',
);

my @files;
my $i = 0;
opendir DIR, "/home/XXXXX/www/ame/img";
while (my $file = readdir(DIR)) {
    if ($file =~ /^.*\.jpg$/) {
        push @files, $file;
    }
}
closedir DIR;

for my $file (sort {$b cmp $a} @files) {
    my @faces = $detector->detect("/home/XXXXX/www/ame/img/$file");
    next unless @faces;
    last if $i++ >= 20;
    $rss->add_item(
        title => "$file",
        link => "http://XXXXX/ame/index.cgi#$file",
    description => qq(<![CDATA[<img src="http://XXXXX/ame/img/$file" />]]>),
    );
}

print 'Content-type: text/xml; charset=utf-8',
$rss->as_string;