图片缩放导致的相关问题

由于在做图像语义分割任务,所以需要拿很多的图像进行训练.但是存在的一个比较现实的问题是:有的图像比较大,需要缩放到比较小的分辨率才能进行训练.

缩放

考虑到之前频繁使用过linux的convert做图片的强制比例转化,所以就想使用convert实现图片缩放的功能.
之前使用的convert缩放命令如下convert -resize 480x360! a.jpg b.png,命令很容易理解.(关于convert的其他用法会在下文详细讲解)
然后需要借助一个shell脚本实现图片的批量缩放

#/bin/bash

# 目录格式如下
# gtFine/{train/val}/cityname/filename

cd gtFine
cd train
i=0
for dir in `ls`
do
    cd $dir
    for file in `ls`
    do
        i=$((i+1))
        echo $i"/2975: gtFine/train/"$dir"/"$file
        convert -resize 480x360! $file $file
    #file1=$file
    #substring="gtFine_labelTrainIds"
    #tarstring="leftImg8bit"
    #echo $file1 ${file/$substring/$tarstring} >> "../../train.txt"
    done
    cd ..
done
cd ..
cd ..

cd gtFine
cd val
i=0
for dir in `ls`
do
    cd $dir
    for file in `ls`
    do
        i=$((i+1))
        echo $i"/500: val/train/"$dir"/"$file
        convert -resize 480x360! $file $file
    #file1=$file
    #substring="gtFine_labelTrainIds"
    #tarstring="leftImg8bit"
    #echo $file1 ${file/$substring/$tarstring} >> "../../val.txt"
    done
    cd ..
done
cd ..
cd ..

其中用到了shell对文件夹和文件的遍历,以及shell中的字符替换(注释部分),不细说,需要了解的自行google.
进行convert之后,放入到图像语义分割模型中进行训练,可是模型出错,导致模型无法运行,而使用官方提供的图片却是可以运行的,我认为可能是图片的尺寸的问题(简单提一下,官方提供像素是480*360,而我最开始的构想是800*400,后来分别尝试了1025*512,480*360),直接导致的结果是花费了接近一天的时间解决这个问题.
大量的错误导致我导致我继续去看文档,由于我使用的是cityscapes,所以继续看cityscapes的论文和介绍,在google的时候,看到了github上有关于cityscapes的一套工具(似乎是去年9月份的),然后我就进行了一下学习.发现用于训练的ground truth应该是20类的(0-18, 255),其中255是void,而我对自己缩放后的照片进行python的解析,发现远远多余20个类别.然后我就进行了思考,考虑到可能是convert缩放功能导致的缩放过程中图片进行了采样,而采样使用的方法可能改变灰度值.
分析之后,发现正是convert导致的问题,于是convert就不能使用了,我尝试googlepython图片缩放的方法,找到了cv2,而cv2中可以设置参数,进行选定不同的缩放方式,找到方法之后,还需要寻找python进行文件操作的方法,具体代码如下:

#encoding=utf-8
import numpy as np
import cv2
import os
import matplotlib.pyplot as plt

i = 0
rootdir = "/home/ubuntu/Documents/deeplearning/cityscapesScripts/gtFine/"
for dirname in os.listdir(rootdir):
    abs_dirname = rootdir + dirname
    for dirname_city in os.listdir(abs_dirname):
        abs_dirname_city = abs_dirname + "/" + dirname_city
        for filename in os.listdir(abs_dirname_city):
            abs_filename = abs_dirname_city + "/" + filename
            i = i + 1
            print str(i) + "/3475 " + abs_filename
            im = cv2.imread(abs_filename, 0)
            res = cv2.resize(im, (800, 400), interpolation=cv2.INTER_NEAREST)
            if os.path.exists(rootdir + dirname + "_new/" + dirname_city) == False:
                os.makedirs(rootdir + dirname + "_new/" + dirname_city)
            cv2.imwrite(rootdir + dirname + "_new/" + dirname_city + "/" + filename,
                        res)
            cv2.destroyAllWindows()

转换过后,使用python进行图片的分析,其中遇到的一个问题是发现生成的图片是3通道的,很容易想到去查看转换前的照片的通道,发现读入的照片也是三通道的,于是就对imread进行分析,添加参数读入灰度图即可.
最后,问题完美解决,缩放得到了根据最邻近采样得到的图片,模型运行起来了.

convert(ImageMagick包下的工具)

  • 图像格式转化
    convert xxx.jpg xxx.png
  • 图像大小转化
    convert -resize 1024x768! a.jpg b.jpg
    convert -resize 50%x50% a.jpg b.jpg
    其中感叹号表示不按照原比例
  • 图像旋转
    convert -rotate 90 a.jpg b.jpg
  • 图像中添加文字
    convert -fill red -pointsize 60 -draw 'text 10,80 "Hello, nv shen"' background1.jpg background2.jpg
    1
  • 高斯模糊
    convert -blur 80 a.jpg b.png
  • 更多参见Documents: http://www.imagemagick.org/script/command-line-options.php

cv2.imwrite

//参数
CV_INTER_NN - 最近邻插值,  
CV_INTER_LINEAR - 双线性插值 (缺省使用)  
CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法..  
CV_INTER_CUBIC - 立方插值

//例子
image=cv2.imread('a.jpg')
res=cv2.resize(image,(32,32),interpolation=cv2.INTER_LINEAR)
cv2.imshow('image',image)

还有一点,imwirte保存的图片照片是没有边框及坐标系等的;相比来说,matplotlib.pyplot中的imshow,savefig则是带有白色边框的.

结论

想学会一个东西,精通一个东西,看官网看文档是最简单和好的方法.ti

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值