機械学習で画像キャプション (データ前処理)

前回のおさらい

前回は学習データとなるツイートを収集したので、今回はデータの前処理を行います。  

注意

前回はRubyを使いましたが、今回からはPythonとJupyterを使います。  

前処理を行なう必要性

  • ニュースなど重複したツイートが存在する
  • 全ての画像をJPEGに統一する
  • 白黒画像を除去する
    特に下2つは、学習の際にTensorにすると、次元数が異なるのでエラーとなります。

前処理

インポート

import pandas as pd
import MeCab
from PIL import Image
import os, sys

重複ツイートの除去

twitter_data = pd.read_table('tweet.csv')
print(twitter_data.shape)
sorted_twitter = twitter_data.sort_values(['text'])
no_duplicated_twitter = sorted_twitter.drop_duplicates(['text', 'image'],  keep='first')
print(no_duplicated_twitter.shape)
no_duplicated_twitter.to_csv('removeDupulicateTweet.csv', index=False, sep='\t')

画像フォーマットの統一

# CSVファイル書き換え
png = []
for line, tweet in enumerate(tweet_data['image']):
    if '.png' in tweet:
        png.append(tweet)
        tweet_data['image'][line] = tweet.replace('.png', '.jpg')
print(len(png))

dir = '(画像のあるディレクトリ)'
for filename in png:
    img = Image.open(dir + filename).convert('RGB')
    jpg_filename = filename.replace('.png', '.jpg')
    img.save(dir + jpg_filename, 'jpeg')

CSVファイルの画像ファイル名を先に変更して、その後画像ファイルのフォーマットを変換しています。

白黒画像の除去

import torch
import torch.nn as nn
from torchvision import transforms
from torch.autograd import Variable
import torchvision
import numpy as np

normalize = transforms.Normalize(
    mean=[0.485, 0.456, 0.406],
    std=[0.229, 0.224, 0.225])

preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    normalize
])

dir = '(画像のあるディレクトリ)'
def img_tensor_size(image):
    img = Image.open(dir + image)
    img_tensor = preprocess(img)
    img_tensor.unsqueeze_(0)
    return Variable(img_tensor).size()

error = []
expected_size = torch.zeros([1, 3, 224, 224]).size()
for line, tweet in enumerate(tweet_data['image']):
    if img_tensor_size(tweet) != expected_size:
        error.append(line)
tweet_data.drop(error, inplace=True)
print(tweet_data.shape)

tweet_data.to_csv('tweet2.csv', index = False, sep='\t')

白黒画像の除去と言いながら、万が一のことも考えて、欲しいTensorのサイズと異なるものだと除去するようにしてます。