deal_cutout.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. import time
  2. from concurrent.futures import as_completed, ThreadPoolExecutor, wait
  3. import threading
  4. from .remove_bg_pixian import RemoveBgPiXian,Picture
  5. from .other.module_online_data import GetOnlineData
  6. from .deal_one_image import DealOneImage, DealOneImageBeforehand
  7. from .other.log import MyLogger
  8. from models import UnicornException
  9. import pandas as pd
  10. import csv
  11. from PIL import Image
  12. from io import BytesIO
  13. import os,requests,io
  14. def urlPilImage(url):
  15. yzmdata = requests.get(url)
  16. tempIm = BytesIO(yzmdata.content)
  17. im = Image.open(tempIm)
  18. return im
  19. def check_path(_path):
  20. if not os.path.exists(_path):
  21. os.mkdir(_path)
  22. return True
  23. class DealCutout:
  24. def __init__(self, token):
  25. super().__init__()
  26. self.lock = threading.Lock()
  27. self.need_cutout_images = {}
  28. self.token = token
  29. self.state = 2 # 1进行中 2停止
  30. self.get_online_data = GetOnlineData(self.token)
  31. self.is_upload_pic_num = 0
  32. self.is_deal_num = 0
  33. self.output_type = 0
  34. # 图片列表
  35. self.upload_pic_dict = {}
  36. self.logger = MyLogger().logger
  37. def startDispose(self):
  38. self.get_online_data.refresh_headers()
  39. num = 0
  40. result_array = []
  41. save_root_path = ""
  42. for image_data in self.need_cutout_images:
  43. num += 1
  44. save_root_path = image_data["root_path"]
  45. upload_pic_dict = {}
  46. upload_pic_dict = DealOneImageBeforehand(
  47. image_data=image_data,
  48. lock=self.lock,
  49. windows=self,
  50. num=num,
  51. token=self.token,
  52. ).run(upload_pic_dict)
  53. result = DealOneImage(
  54. image_data=image_data,
  55. lock=self.lock,
  56. windows=self,
  57. num=num,
  58. token=self.token,
  59. ).run(image_data, upload_pic_dict)
  60. result_array.append(result)
  61. return result_array, save_root_path
  62. def normalMode(self):
  63. """普通模式"""
  64. self.get_online_data.refresh_headers()
  65. num = 0
  66. result_array = []
  67. print("self.need_cutout_images", self.need_cutout_images)
  68. save_root_path = ""
  69. for image_data in self.need_cutout_images:
  70. num += 1
  71. save_root_path = image_data["root_path"]
  72. result = DealOneImageBeforehand(
  73. image_data=image_data,
  74. lock=self.lock,
  75. windows=self,
  76. num=num,
  77. token=self.token,
  78. ).get_image_cut_noraml(image_data)
  79. result_array.append(result)
  80. return result_array, save_root_path
  81. class DealCloths:
  82. def __init__(self, token):
  83. super().__init__()
  84. self.lock = threading.Lock()
  85. self.need_cutout_images = {}
  86. self.token = token
  87. self.output_type = 0
  88. self.state = 2 # 1进行中 2停止
  89. self.get_online_data = GetOnlineData(self.token)
  90. self.is_upload_pic_num = 0
  91. self.is_deal_num = 0
  92. # 图片列表
  93. self.upload_pic_dict = {}
  94. self.logger = MyLogger().logger
  95. def startDispose(self):
  96. self.get_online_data.refresh_headers()
  97. num = 0
  98. result_array = []
  99. save_root_path = ""
  100. for image_data in self.need_cutout_images:
  101. num += 1
  102. save_root_path = image_data["root_path"]
  103. upload_pic_dict = {}
  104. hand = DealOneImageBeforehand(
  105. image_data=image_data,
  106. lock=self.lock,
  107. windows=self,
  108. num=num,
  109. token=self.token,
  110. )
  111. upload_pic_dict = hand.get_image_cut_cloths(image_data)
  112. result_array.append(upload_pic_dict)
  113. return result_array, save_root_path
  114. class DealModelForm:
  115. '''处理人台抠图'''
  116. csvName = 'record.csv'
  117. def __init__(self, token,params):
  118. super().__init__()
  119. self.lock = threading.Lock()
  120. self.need_cutout_images = {}
  121. self.token = token
  122. self.output_type = 0
  123. self.state = 2 # 1进行中 2停止
  124. self.get_online_data = GetOnlineData(self.token)
  125. self.is_upload_pic_num = 0
  126. self.is_deal_num = 0
  127. self.params = params
  128. # 图片列表
  129. self.upload_pic_dict = {}
  130. self.logger = MyLogger().logger
  131. def addData2Csv(self,data):
  132. name_list = ['file_name', 'file_e', 'file_path', 'file','root_path','need_cutout','image_url','generate_id','status']
  133. isExist = os.path.exists(self.csvName)
  134. csvfile = open(self.csvName,"a", encoding='utf-8-sig')
  135. writer = csv.writer(csvfile)
  136. #先写入columns_name
  137. if isExist == False:
  138. writer.writerow(name_list)
  139. writer.writerows(data)
  140. csvfile.close()
  141. def startDispose(self):
  142. self.get_online_data.refresh_headers()
  143. num = 0
  144. save_root_path = ""
  145. baseImages = []
  146. resize=1600#定义标准
  147. for index,image_data in enumerate(self.need_cutout_images):
  148. num += 1
  149. save_root_path = image_data["root_path"]
  150. file_path = image_data["file_path"]
  151. original_pic = Picture(file_path)
  152. if original_pic.x > original_pic.y:
  153. if original_pic.x > resize:
  154. original_pic.resize(resize)
  155. else:
  156. if original_pic.y > resize:
  157. original_pic.resize_by_heigh(heigh=resize)
  158. buffer = io.BytesIO()
  159. original_pic.im.save(buffer, format='JPEG')
  160. buffer.seek(0)
  161. image_url = self.get_online_data.upload_pic(file_path=None,buffer=buffer)
  162. baseImages.append(image_url)
  163. self.need_cutout_images[index]["image_url"] = image_url
  164. data = {
  165. "base_image":baseImages,
  166. "out_width":self.params.out_width,
  167. "out_height":self.params.out_height,
  168. "size_mode":self.params.size_mode,
  169. "output_mode":self.params.output_mode,
  170. }
  171. result_json = self.get_online_data.model_form_segment(data)
  172. generate_ids = result_json.get("generate_ids")
  173. saveParams = []
  174. for idx,id in enumerate(generate_ids):
  175. self.need_cutout_images[idx]['generate_id'] = id
  176. # ['file_name', 'file_e', 'file_path',
  177. # 'file','root_path','need_cutout','image_url','generate_id','status']
  178. item = self.need_cutout_images[idx]
  179. saveParams.append([item['file_name'],
  180. item['file_e'],
  181. item['file_path'],
  182. item['file'],
  183. item['root_path'],
  184. item['need_cutout'],
  185. item['image_url'],
  186. item['generate_id'],
  187. False,
  188. ])
  189. self.addData2Csv(saveParams)
  190. return self.need_cutout_images, save_root_path,generate_ids
  191. def search_progress(self):
  192. try:
  193. csvData = pd.read_csv(self.csvName)
  194. except FileNotFoundError as e:
  195. raise UnicornException("不存在生成记录,请先提交抠人台抠图任务")
  196. '''进度查询'''
  197. print("self.params",self.params)
  198. search_generate_ids = self.params.generate_ids
  199. dataParams = {
  200. "generate_ids":search_generate_ids,
  201. "type":self.params.type,
  202. }
  203. responseData = self.get_online_data.search_progress(dataParams)
  204. generate_ids = csvData.loc[csvData['generate_id'].isin(search_generate_ids)]
  205. successCount = 0
  206. failCount = 0
  207. is_finished = False
  208. root_path = ""
  209. if len(generate_ids) > 0:
  210. print("generate_ids",generate_ids)
  211. root_path = generate_ids.iloc[0]["root_path"]
  212. save_path = f"{root_path}/已扣图"
  213. check_path(save_path)
  214. else:
  215. return is_finished,successCount,failCount,root_path
  216. for idx,generate in generate_ids.iterrows():
  217. for respItem in responseData:
  218. if generate["generate_id"]!=respItem["id"]:
  219. continue
  220. status = respItem['status']
  221. print("status",status)
  222. if status == -1:
  223. failCount+=1
  224. csvData.drop(csvData.loc[csvData['generate_id'] == generate["generate_id"]].index,inplace=True)
  225. break
  226. if status == 2:
  227. successCount+=1
  228. result_image_url = respItem['result_image_urls'][0]
  229. result_image_pil = urlPilImage(result_image_url)
  230. root_path = generate["root_path"]
  231. file_name = generate["file_name"]
  232. file_e = generate["file_e"]
  233. if result_image_pil.mode == 'RGBA':
  234. result_image_pil.save(f"{save_path}/{file_name}.png")
  235. else:
  236. result_image_pil.save(f"{save_path}/{file_name}.jpg")
  237. csvData.drop(csvData.loc[csvData['generate_id'] == generate["generate_id"]].index,inplace=True)
  238. break
  239. csvData.to_csv(self.csvName, index=False)
  240. is_finished = True if len(search_generate_ids) == (successCount+failCount) else False
  241. return is_finished,successCount,failCount,root_path