人臉表情識別的前期處理

一 、理解CSV和圖片的互轉(zhuǎn)過程
二 、Python實現(xiàn)CSV和圖片的互轉(zhuǎn)

一、CSV文件轉(zhuǎn)化為圖片

功能:實現(xiàn)CSV和圖片的互轉(zhuǎn)

image.png

要求:csv在轉(zhuǎn)化為圖片后,像素值不會發(fā)生變化。(這也是要解決的問題)

基礎數(shù)據(jù)解釋

  • emotion:表情;
  • pixels:組成圖片的像素值;
  • Usage:用處(訓練、測試)
image.png

轉(zhuǎn)化為圖片代碼

import os
import csv
import numpy as np
from PIL import Image


dataset_path = r'G:\tensorflow\project\data\excel\new_fer_test.csv'
image_path = r'G:\tensorflow\project\data\csvimage'

# 將csv轉(zhuǎn)image
def chage2Image():
    with open(dataset_path) as csvfile:
        csvr = csv.reader(csvfile)
        birth_header = next(csvfile)  # 讀取第一行每一列的標題
        for i, (label, pixel, usage) in enumerate(csvr):
            pixel = np.asarray([float(p) for p in pixel.split()]).reshape(48, 48)
            new_im = Image.fromarray(pixel).convert("L")
            image_name = os.path.join(image_path, label+'_'+usage+'_'+'{:05d}.jpg'.format(i))
            new_im.save(image_name)

chage2Image()

生成的圖片如下:

image.png

但有個問題:為什么轉(zhuǎn)化后,在去讀取這張圖片時,這個圖片的像素值就會發(fā)生變化?

最初從csv文件中讀取的像素是

70 80 82 72 58 58 60 63 54 58 60 48 89 115 121 ............

但是,用這個轉(zhuǎn)化為圖片后,再次讀取圖片的像素會變化。

74 84 92 60 72 58 54 60 61 54 58 20 18 79 101 13 ............

解釋如下:
對于彩色圖像,不管其圖像格式是PNG,還是BMP,或者JPG,在PIL中,使用Image模塊的open()函數(shù)打開后,返回的圖像對象的模式都是“RGB”。而對于灰度圖像,不管其圖像格式是PNG,還是BMP,或者JPG,打開后,其模式為“L”。
更加底層的原因是下面的這句代碼

new_im.save(image_name)

所以,就一直在思考:如何在將csv和圖片互轉(zhuǎn)時,保持其像素值不變。

后來,發(fā)現(xiàn)

如果將第一次csv轉(zhuǎn)化后生成的圖片再轉(zhuǎn)化為csv,這個(第二次生成)csv文件和第一次的csv值不同,但是如果利用這個已變的(第二次生成)csv再生成新的圖片,并對這次生成的(第二次生成)圖片再轉(zhuǎn)化為csv,這次的csv值和第二次生成的csv值是相等的。
也就是說,對第二次轉(zhuǎn)化后的csv文件,后面無論經(jīng)過多少次互轉(zhuǎn),后面csv中的像素都不會再發(fā)生變化。

image.png

所以,最后就將第一次轉(zhuǎn)化后的數(shù)據(jù)集作為基礎數(shù)據(jù)集(如圖),以這個為基礎數(shù)據(jù)集,后面無論如何處理都不會在發(fā)生變化了。

二、圖片轉(zhuǎn)化為CSV在轉(zhuǎn)化為圖片的過程

image.png

有了上面的結(jié)論,后面的工作就是寫代碼了。

import os
import csv
import numpy as np
from PIL import Image


'''

這個方法是將CSV文件轉(zhuǎn)化為Image圖片
各方法含義在方法體上面都有注釋

'''

dataset_path = r'G:\tensorflow\project\data\excel\new_fer_test.csv'
image_path = r'G:\tensorflow\project\data\csvimage'

# 將csv轉(zhuǎn)image
def chage2Image():
    with open(dataset_path) as csvfile:
        csvr = csv.reader(csvfile)
        birth_header = next(csvfile)  # 讀取第一行每一列的標題
        for i, (label, pixel, usage) in enumerate(csvr):
            pixel = np.asarray([float(p) for p in pixel.split()]).reshape(48, 48)
            new_im = Image.fromarray(pixel).convert("L")
            image_name = os.path.join(image_path, label+'_'+usage+'_'+'{:05d}.jpg'.format(i))
            new_im.save(image_name)


# def usage2Tail(usage):
#     numbers = {
#         'Training': 't',
#         'PublicTest': 'Pu',
#         'PrivateTest': 'Pr',
#     }
#     return numbers.get(usage, None)


chage2Image()
import os
import csv
import numpy as np
from PIL import Image

'''

這個方法是將Image圖片轉(zhuǎn)化為CSV文件
各方法含義在方法體上面都有注釋

'''

dataset_path = r'G:\tensorflow\project\data\excel\new_fer2013.csv'
init_image_path = r'G:\tensorflow\project\data\allImage'


# 將所有圖片轉(zhuǎn)化為csv文件
def writeImage2csv():
    with open(dataset_path, 'w', newline="") as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(["emotion", "pixels", "usage"])
        all_file_paths = getAllFiles()
        for path in all_file_paths:
            (filepath, tempfilename) = os.path.split(path)
            (shotname, extension) = os.path.splitext(tempfilename)
            emotion = shotname.split("_")[0]
            usage = shotname.split("_")[1]
            pixels = getSingleFilePixels(path)
            writer.writerow([emotion, pixels, usage])

        csvfile.close()


# 獲取單個文件的像素
def getSingleFilePixels(image_path):
    pixels = ""
    image = Image.open(image_path)
    matrix = np.asarray(image)
    for row in matrix:
        for pixel in row:
            pixels+=str(pixel)+" "
    return pixels


# 獲取所有的文件名稱
def getAllFiles():
    all_file_paths = []
    for root, dirs, files in os.walk(init_image_path):
        for file in files:
            if os.path.splitext(file)[1] == '.jpg':
                all_file_paths.append(root + "\\" + file)
    return all_file_paths


writeImage2csv()

期間陰差陽錯的還寫了,如何用python寫excel文件

import os
import numpy as np
from PIL import Image
import xlwt


dataset_path = r'G:\tensorflow\project\data\excel\new_fer_test.csv'
init_image_path = r'G:\tensorflow\project\data\images_test'


# 將所有圖片轉(zhuǎn)化為csv文件
def writeImage2csv():
    excel = xlwt.Workbook(encoding='utf-8')
    sheet1 = excel.add_sheet('Sheet 1')
    sheet1.write(0, 0, "emotion")
    sheet1.write(0, 1, "pixels")
    sheet1.write(0, 2, "Usage")
    row = 1
    all_file_paths = getAllFiles()
    for path in all_file_paths:
        (filepath, tempfilename) = os.path.split(path);
        (shotname, extension) = os.path.splitext(tempfilename)
        emotion = shotname.split("_")[0]
        usage = shotname.split("_")[1]
        pixels = getSingleFilePixels(path)
        sheet1.write(row, 0, str(emotion))
        sheet1.write(row, 1, str(pixels))
        sheet1.write(row, 2, str(usage))
        row+=1
    excel.save(dataset_path)


# 獲取單個文件的像素
def getSingleFilePixels(image_path):
    pixels = ""
    image = Image.open(image_path)
    matrix = np.asarray(image)
    for row in matrix:
        for pixel in row:
            pixels+=str(pixel)+" "
    return pixels



# 獲取所有的文件名稱
def getAllFiles():
    all_file_paths = []
    for root, dirs, files in os.walk(init_image_path):
        for file in files:
            if os.path.splitext(file)[1] == '.jpg':
                all_file_paths.append(root + "\\" + file)
    return all_file_paths



def writeImage2csv_2():
    book = xlwt.Workbook()
    sheet1 = book.add_sheet('Sheet 1')

    book.add_sheet('Sheet 2')
    sheet1.write(0, 0, 'A1')
    book.save(r'G:\tensorflow\project\data\excel\simple2.xls')


def writeImage2csv_1():
    file = xlwt.Workbook(encoding='utf-8')
    table = file.add_sheet('data')
    data = {
        "1": ["張三", 150, 120, 100],
        "2": ["李四", 90, 99, 95],
        "3": ["王五", 60, 66, 68]
    }
    ldata = []
    num = [a for a in data]

    num.sort()

    for x in num:
        t = [int(x)]
        for a in data[x]:
            t.append(a)
        ldata.append(t)

    for i, p in enumerate(ldata):
        for j, q in enumerate(p):
            table.write(i, j, q)

    file.save(r'G:\tensorflow\project\data\excel\data.xls')



writeImage2csv()

還學到了些關于Python處理的代碼和處理的一些錯誤

python獲取文件路徑、文件名、后綴名
python 寫入excel兩種方法
Python switch/case語句實現(xiàn)方法
python3 寫入CSV出現(xiàn)空白行問題
Python讀寫csv文件
Excel表格中綠色小三角是什么?怎么取消Excel綠色三角

P.S.
另外,測試的方法不要去自己寫(不要學某人O(∩_∩)O哈哈~),一般的框架都會提供測試的方法。


END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容