SECourses Caption Editor Pro Gradio APP - Edit Your Captions Super Easy Including Batch Editing - For Windows, RunPod and Massed Compute - Ultimate Caption Editor
🕑 Added 2025-05-15 20:01:00 +0000 UTCExtremely advanced lots of features image captioning Gradio APP developed by SECourses. 1-Click to install and run on Windows and Cloud
Patreon exclusive posts index to find our scripts easily, Patreon scripts updates history to see which updates arrived to which scripts and amazing Patreon special generative scripts list that you can use in any of your task.
Join discord to get help, chat, discuss and also tell me your discord username to get your special rank : SECourses Discord
Please also Star, Watch and Fork our Stable Diffusion & Generative AI GitHub repository and join our Reddit subreddit and follow me on LinkedIn (my real profile)
=======
Latest Zip File : SECourses_Caption_Editor_Pro_v1.zip
JoyCaption > https://www.patreon.com/posts/110613301
CogVLM 2 > https://www.patreon.com/posts/120193330
3 October 2025 Update
Now supports Tag Analytics
Use this tab to evaluate how often tags repeat across your dataset, visualize group/category balance, and quickly preview/edit images by tag.
Provide your dataset folder. Captions must be alongside images as .txt files.
Delimiters define how tags are separated in caption files.
Optionally define Groups and Categories mappings as lines like: group_name: tag1, tag2|tag3.
Thresholds: Yellow ≥ percentage is a warning; Red ≥ percentage means over-repeated.
Just extract latest zip file and overwrite for update
15 May 2025 Update
Now supports latest Gradio - overwrite files in previous installation and run installer again
Now you can delete images from the interface - asks verification
Now it has a better more modern theme
20 September 2024 Update
A new amazing feature Token Counter added
You can give your folder and it will count every word and display number of times they appear in your entire dataset - 1 word is only counted only 1 time per image even if it has multiple times it
The generated n-grams of countings will be written into outputs folder
Useful to share and see your dataset captioning composition
3 September 2024 Update
An update to fix : Error adding status icon: cannot add non-opaque RGBA color to RGB palette
Number of images to display limited to 500
More bugs fixed and app made more robust and faster
Overwrite previous app file
Various bugs fixed and code made to be more robust, now all text operations are utf8
Features and How to Use
I was having hard time to edit captions of my training images so I developed this super easy and effective to use Gradio app.
Entire source code is available so you can edit and improve.
So easy to use. Put the folder path into Input Folder Path
It will list all the images inside it
Select image from Gallery and edit caption and save
If you want to display only unprocessed images change Filter Images to Processed
It will display all the images that you didn't save their caption yet
Also if you want batch options, select the Batch Edit Captions tab
In this tab you can add suffix or prefix to all captions in given folder
Also you can batch replace words as you wish
Match Case and Replace All Occurrences can be selected at the same time
Replace All Occurrences is wildcard search so replaces all
Do batch operations on a cloned folder to be sure that your original captions will be still backuped
Check Word tab makes you able to check out that all of your images contains activation token like ohwx man
Requirements
Tested on Python 3.10 but should work on all Pythons
How To Install
For windows run Windows_Install.bat and then run Windows_Start_App.bat
You need to have Python installed
Massed Compute (Recommend Cloud) :
Please register via this link : https://vm.massedcompute.com/signup?linkId=lp_034338&sourceId=secourses&tenantId=massed-compute
Use our coupon SECourses
Our coupon works on all GPUs now
H100 has amazing price and speed but you can use like RTX A6000 ADA as well
Full details here : https://www.patreon.com/posts/26671823
Then select our image SECourses from Creator dropdown
Then follow Massed_Compute_Instructions_READ.txt
Same as my any other Massed Compute installer script
Example tutorial for learn how to install and use Massed Compute
(Starts at 12:58) : https://youtu.be/KW-MHmoNcqo?si=G1WbG-Qw4ujWvOtG&t=778
RunPod (Cloud):
Please register via this link : https://get.runpod.io/955rkuppqv4h
Then follow Runpod_Instructions_READ.txt
Same as my any other RunPod installer script
Use the template written in Runpod_Instructions_READ.txt file
Example tutorial for learn how to install and use RunPod
(starts at 22:03) : https://youtu.be/KW-MHmoNcqo?si=QN8X8Sjn13ZYu-EU&t=1323
Screenshots of the App





Comments
Furkan Gözükara
hi i connect Gold supporters pc and do that. or you can follow this tutorial : https://youtu.be/DrhUHnYfwC0
Richard Jones
Hi, I have an RTX 5070ti and need help installing the correct config and versions for my BASE setup (Python Cuda Torch etc.) Any other advise would be helpful as to installing apps like Foocus, FramePack, MagicQuill. Thanks.
Furkan Gözükara
ty for reporting. a third party library broken gradio. i fixed with v9. please use v9 and use installer again or make a fresh install
Larry Boles
Getting a lot of errors when grabbing and trying this out. Possibly a prereq got changed? ERROR: Exception in ASGI application Traceback (most recent call last): File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 403, in run_asgi result = await app( # type: ignore[func-returns-value] File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 60, in __call__ return await self.app(scope, receive, send) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\fastapi\applications.py", line 1054, in __call__ await super().__call__(scope, receive, send) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\applications.py", line 112, in __call__ await self.middleware_stack(scope, receive, send) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\middleware\errors.py", line 187, in __call__ raise exc File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\middleware\errors.py", line 165, in __call__ await self.app(scope, receive, _send) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio\route_utils.py", line 761, in __call__ await self.app(scope, receive, send) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\middleware\exceptions.py", line 62, in __call__ await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app raise exc File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app await app(scope, receive, sender) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\routing.py", line 714, in __call__ await self.middleware_stack(scope, receive, send) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\routing.py", line 734, in app await route.handle(scope, receive, send) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\routing.py", line 288, in handle await self.app(scope, receive, send) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\routing.py", line 76, in app await wrap_app_handling_exceptions(app, request)(scope, receive, send) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app raise exc File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app await app(scope, receive, sender) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\routing.py", line 73, in app response = await f(request) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\fastapi\routing.py", line 301, in app raw_response = await run_endpoint_function( File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\fastapi\routing.py", line 214, in run_endpoint_function return await run_in_threadpool(dependant.call, **values) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\starlette\concurrency.py", line 37, in run_in_threadpool return await anyio.to_thread.run_sync(func) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\anyio\to_thread.py", line 56, in run_sync return await get_async_backend().run_sync_in_worker_thread( File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\anyio\_backends\_asyncio.py", line 2470, in run_sync_in_worker_thread return await future File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\anyio\_backends\_asyncio.py", line 967, in run result = context.run(func, *args) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio\routes.py", line 431, in main gradio_api_info = api_info(False) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio\routes.py", line 460, in api_info app.api_info = app.get_blocks().get_api_info() File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio\blocks.py", line 2852, in get_api_info python_type = client_utils.json_schema_to_python_type(info) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio_client\utils.py", line 893, in json_schema_to_python_type type_ = _json_schema_to_python_type(schema, schema.get("$defs")) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio_client\utils.py", line 938, in _json_schema_to_python_type elements = _json_schema_to_python_type(items, defs) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio_client\utils.py", line 908, in _json_schema_to_python_type return _json_schema_to_python_type(defs[schema["$ref"].split("/")[-1]], defs) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio_client\utils.py", line 947, in _json_schema_to_python_type des = [ File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio_client\utils.py", line 948, in f"{n}: {_json_schema_to_python_type(v, defs)}{get_desc(v)}" File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio_client\utils.py", line 908, in _json_schema_to_python_type return _json_schema_to_python_type(defs[schema["$ref"].split("/")[-1]], defs) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio_client\utils.py", line 947, in _json_schema_to_python_type des = [ File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio_client\utils.py", line 948, in f"{n}: {_json_schema_to_python_type(v, defs)}{get_desc(v)}" File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio_client\utils.py", line 955, in _json_schema_to_python_type f"str, {_json_schema_to_python_type(schema['additionalProperties'], defs)}" File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio_client\utils.py", line 901, in _json_schema_to_python_type type_ = get_type(schema) File "S:\Image_Caption_Editor_v8\venv\lib\site-packages\gradio_client\utils.py", line 863, in get_type if "const" in schema: TypeError: argument of type 'bool' is not iterable
Furkan Gözükara
thanks adding to list
Philip Heggie
Hi I'd love for you to do a persons photo age changer for windows like https://www.cgg.cs.tsukuba.ac.jp/~itohlee/pub/ADFD/ https://github.com/shiiiijp/ADFD please
Furkan Gözükara
please make a video and show what you are doing
Federico Salmaso
Hi after i copied the folder with images and text files directory, the interface is showing an error on image caption and selected image pannels,
Furkan Gözükara
what is your GPU model? how much VRAM? anything on CMD?
Torcello
I was attempting to make caption files ... so Imade a mistake ... as this is to edit captions already made! I attempted to make captions using JoyCaption v13 - but after the shards file is downloaded - my system just hangs?!
Furkan Gözükara
this edits existing text files. can you explain more?
Torcello
My copy simply provides empty text files!!!
Furkan Gözükara
just fixed error
Olga Povarchuk
Thanks! I just sent you the error but will send the install logs in a second
Furkan Gözükara
please reinstall, save all install logs on cmd, and send me all as email : monstermmorpg@gmail.com
Olga Povarchuk
Hi, I uninstalled v3 and installed v5 and now I'm getting an error related to __get_pydantic_core_schema__ and a bunch of others. I should mention I did a fresh install of all the essentials based on your tutorial yesterday (Python 3.10.11, CUDA, C++, etc). I even checked for pip, fixed it, and then purged pip cache. Would you be willing to take a look at the error log?
Furkan Gözükara
i am experimenting it right now. you can see dataset and their captions and the trained models here and you can also download models and test yourself : https://huggingface.co/MonsterMMORPG/3D-Cartoon-Style-FLUX/tree/main
Lukas
What about training a style in Flux? Should i use a triggerword ?
Furkan Gözükara
just made another update please download v5
Furkan Gözükara
just made an update for this can you try v4 app?
Furkan Gözükara
can you email me one image as a zip file so i can hopefully fix it. indexed colors not working as you shouldn't use them in training : monstermmorpg@gmail.com
Olga Povarchuk
I'm getting this error, and from png images: Error adding status icon: cannot add non-opaque RGBA color to RGB palette
Furkan Gözükara
for those who gets this error, that means you have index colored image. convert your all images to png. otherwise your training will likely get broken too
Xavier Climent
gaves me the ERROR - Error adding status icon: color must be int or single-element tuple
Furkan Gözükara
replace man with triggerword man. you dont need to write at the start especially for FLUX.
piXtar playz
Hi, I´m a little bit confused. Do I have to replace "man" with "triggerword" or do I have to replace "man" with "triggerword man". I am a man. And is it also usefull to write the "triggerword,.." at the start of every caption.txt? Thx a lot
Furkan Gözükara
:D
Dmitry
What a Lion this Tiger is!:)