Face++のdeceteAPIを使いフォルダ内の画像すべてに感情推定を行い、その出力結果をcsvファイルに追記していき一つのcsvファイルにまとめるプログラムを書きたい。
# coding: utf-8 import os import sys import csv import pandas as pd import requests sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) sys.path.append('E:/facepp-python-demo-master/facepp-python-demo-master/example/detect/images/images01/*') from config import API_KEY, API_SECRET, DETECT_PATH ,ANALYZE_PATH from images import images01 from images import images02 from images import images03 from images import images04 from example.common import get_input_file_path from example.common2 import get_image_file_path import cv2 import codecs import glob import re from PIL import Image import numpy as np return_landmark = 0 return_attributes = None #calculate_all = 0 face_rectangle = '' beauty_score_min = 0 beauty_score_max = 100 def call_api(): data = { 'api_key': API_KEY, 'api_secret': API_SECRET, 'return_landmark': 1, 'return_attributes': 'gender,age,emotion' #'calculate_all': calculate_all, #'beauty_score_min': beauty_score_min, #'beauty_score_max': beauty_score_max } dir = 'images/images01/' files2 = glob.glob(dir + "*.jpg") for f in files2: name_list = [] # ファイル名の空リストを定義 ext_list = [] # 拡張子の空リストを定義 name_list2 = [] # ファイルのフルパスからファイル名と拡張子を抽出 file = os.path.basename(f) # 拡張子ありファイル名を取得 name, ext = os.path.splitext(file) # 拡張子なしファイル名と拡張子を取得 name_list.append(name) # 拡張子なしファイル名をリスト化 ext_list.append(ext) # 拡張子をリスト化 if face_rectangle in file: data.update({'face_rectangle': face_rectangle}) input_file = file #input_file = get_input_file_path(os.path.abspath(os.path.dirname(__file__)),f) if not input_file: print('画像ファイルを正しいディレクトリに置いてください') return files = { 'image_file': open(f, 'rb').read() } resp = requests.post(DETECT_PATH, data=data, files=files).json() with open('emotion.csv','w') as csv_file: writer = csv.writer(csv_file) for key, value in resp.items(): #writer.writerows(resp) (pd.DataFrame.from_dict(data=resp,orient='index').to_csv('emotion.csv',header=False)) osp = resp['faces'] #print(osp) df = pd.json_normalize(osp) df.to_csv('emotion2.csv') if __name__ == "__main__": call_api()
目的としてはemotion2.csvに追記していくことが目的です。
何か解決法があれば教えていただきたいです。
後半の行に書かれているospの値をprint関数で見てみると元々自分がcsvファイルに保存したいと思っていたデータ(for文により複数枚の画像の推定結果)が出力されていたのでこのospの値をcsvファイルに記述、書き込みしていくプログラムを書きたいです。
追記
resp = requests.post(DETECT_PATH, data=data, files=files).json() osp = [] with open('emotion.csv','w') as csv_file: writer = csv.writer(csv_file) writer.writerows(resp) for key, value in resp.items(): #writer.writerows(resp) (pd.DataFrame.from_dict(data=resp,orient='index').to_csv('emotion.csv',header=False)) osp.append(resp['faces']) print(osp) ################################################### with open('emotion2.csv','w') as f: writer2 = csv.writer(f) writer2.writerows(osp)
resp以下をこのように改変すると一回以上書き込まれるようになりましたが処理が五回で止まっています。
五回の情報がないわけでもないので何が原因で書き込みが終わっているのかがわからない状況です。
何か解決方法があれば教えていただきたいです。
回答1件
あなたの回答
tips
プレビュー