FastVision
			
			
			
			function
			 
			
			
	
			ImageClassificationSingle
			(
			
			blocks
			::
			
			Tuple
			{
			
			<:
			
	
			Image
			{
			N
			}
			,
			 
			
			<:
	
			Label
			}
			,
			
                                   
			
			data
			 
			=
			 
			nothing
			
			;
			
                                   
			
			size
			 
			=
			 
			
			ntuple
			(
			
			i
			 
			->
			 
			128
			,
			 
			N
			)
			,
			
                                   
			
			aug_projections
			 
			=
			 
			
			
	
			DataAugmentation
			.
			
	
			Identity
			(
			)
			,
			
                                   
			
			aug_image
			 
			=
			 
			
			
	
			DataAugmentation
			.
			
	
			Identity
			(
			)
			,
			
                                   
			
			C
			 
			=
			 
			
			RGB
			{
			N0f8
			}
			,
			
                                   
			
			computestats
			 
			=
			 
			false
			)
			 
			where
			 
			{
			N
			}
			
			
    
			
			return
			 
			
	
			SupervisedTask
			(
			blocks
			,
			
                          
			
			(
			
	
			ProjectiveTransforms
			(
			size
			
			;
			 
			
			augmentations
			 
			=
			 
			aug_projections
			)
			,
			
                           
			
	
			getimagepreprocessing
			(
			data
			,
			 
			computestats
			
			;
			 
			
			C
			 
			=
			 
			C
			,
			
                                                 
			
			augmentations
			 
			=
			 
			aug_image
			)
			,
			
                           
			
	
			OneHot
			(
			)
			)
			)
			
			end
			
			
			
			
			
			"""
			
			    ImageClassificationSingle(size, classes; kwargs...)
			    ImageClassificationSingle(blocks[, data]; kwargs...)
			
			Learning task for single-label image classification. Images are
			resized to `size` and classified into one of `classes`.
			
			Use [`ImageClassificationMulti`](#) for the multi-class setting.
			
			## Keyword arguments
			
			- `computestats = false`: Whether to compute image statistics on dataset `data` or use
			    default ImageNet stats.
			- `aug_projections = `[`DataAugmentation.Identity`](#): augmentation to apply during
			  [`ProjectiveTransforms`](#) (resizing and cropping)
			- `aug_image = `[`DataAugmentation.Identity`](#): pixel-level augmentation to apply during
			  [`ImagePreprocessing`](#)
			- `C = RGB{N0f8}`: Color type images are converted to before further processing. Use `Gray{N0f8}`
			    for grayscale images.
			"""
			
			
			function
			 
			
			
	
			ImageClassificationSingle
			(
			
			size
			::
			
			NTuple
			{
			N
			,
			 
			Int
			}
			,
			 
			
			classes
			::
			AbstractVector
			
			;
			
                                   
			
			kwargs
			...
			)
			 
			where
			 
			{
			N
			}
			
			
    
			
			blocks
			 
			=
			 
			
			(
			
			
	
			Image
			{
			N
			}
			(
			)
			,
			 
			
	
			Label
			(
			classes
			)
			)
			
    
			
			return
			 
			
	
			ImageClassificationSingle
			(
			blocks
			,
			 
			
			size
			 
			=
			 
			size
			)
			
			end
			
			
			
			
			_tasks
			[
			
			"
			imageclfsingle
			"
			]
			 
			=
			 
			
			(
			
			id
			 
			=
			 
			
			"
			vision/imageclfsingle
			"
			,
			
                            
			
			name
			 
			=
			 
			
			"
			Image classification (single-label)
			"
			,
			
                            
			
			constructor
			 
			=
			 
	
			ImageClassificationSingle
			,
			
                            
			
			blocks
			 
			=
			 
			
			(
	
			Image
			,
			 
	
			Label
			)
			,
			
                            
			
			category
			 
			=
			 
			
			"
			supervised
			"
			,
			
                            
			
			description
			 
			=
			 
			
			"""
			
			                                
			Single-label image classification task where every image has a single
			                                
			class label associated with it.
			                                
			"""
			,
			
                            
			
			package
			 
			=
			 
			
			@
			__MODULE__
			)
			
			
			
			function
			 
			
			
	
			ImageClassificationMulti
			(
			
			blocks
			::
			
			Tuple
			{
			
			<:
			
	
			Image
			{
			N
			}
			,
			 
			
			<:
	
			LabelMulti
			}
			,
			
                                  
			
			data
			 
			=
			 
			nothing
			
			;
			
                                  
			
			size
			 
			=
			 
			
			ntuple
			(
			
			i
			 
			->
			 
			128
			,
			 
			N
			)
			,
			
                                  
			
			aug_projections
			 
			=
			 
			
			
	
			DataAugmentation
			.
			
	
			Identity
			(
			)
			,
			
                                  
			
			aug_image
			 
			=
			 
			
			
	
			DataAugmentation
			.
			
	
			Identity
			(
			)
			,
			
                                  
			
			C
			 
			=
			 
			
			RGB
			{
			N0f8
			}
			,
			
                                  
			
			computestats
			 
			=
			 
			false
			)
			 
			where
			 
			{
			N
			}
			
			
    
			
			return
			 
			
	
			SupervisedTask
			(
			blocks
			,
			
                          
			
			(
			
	
			ProjectiveTransforms
			(
			size
			
			;
			 
			
			augmentations
			 
			=
			 
			aug_projections
			)
			,
			
                           
			
	
			getimagepreprocessing
			(
			data
			,
			 
			computestats
			
			;
			 
			
			C
			 
			=
			 
			C
			,
			
                                                 
			
			augmentations
			 
			=
			 
			aug_image
			)
			,
			
                           
			
	
			OneHot
			(
			)
			)
			)
			
			end
			
			
			
			
			
			"""
			
			    ImageClassificationMulti(size, classes; kwargs...)
			
			Learning task for multi-label image classification. Images are
			resized to `size` and classified into multiple of `classes`.
			
			Use [`ImageClassificationSingle`](#) for the single-class setting.
			
			## Keyword arguments
			
			- `computestats = false`: Whether to compute image statistics on dataset `data` or use
			    default ImageNet stats.
			- `aug_projections = `[`DataAugmentation.Identity`](#): augmentation to apply during
			  [`ProjectiveTransforms`](#) (resizing and cropping)
			- `aug_image = `[`DataAugmentation.Identity`](#): pixel-level augmentation to apply during
			  [`ImagePreprocessing`](#)
			- `C = RGB{N0f8}`: Color type images are converted to before further processing. Use `Gray{N0f8}`
			    for grayscale images.
			"""
			
			
			function
			 
			
			
	
			ImageClassificationMulti
			(
			
			size
			::
			
			NTuple
			{
			N
			,
			 
			Int
			}
			,
			 
			
			classes
			::
			AbstractVector
			
			;
			
                                  
			
			kwargs
			...
			)
			 
			where
			 
			{
			N
			}
			
			
    
			
			blocks
			 
			=
			 
			
			(
			
			
	
			Image
			{
			N
			}
			(
			)
			,
			 
			
	
			LabelMulti
			(
			classes
			)
			)
			
    
			
			return
			 
			
	
			ImageClassificationMulti
			(
			blocks
			
			;
			 
			
			size
			 
			=
			 
			size
			,
			 
			
			kwargs
			...
			)
			
			end
			
			
			
			
			_tasks
			[
			
			"
			imageclfmulti
			"
			]
			 
			=
			 
			
			(
			
			id
			 
			=
			 
			
			"
			vision/imageclfmulti
			"
			,
			
                           
			
			name
			 
			=
			 
			
			"
			Image classification (multi-label)
			"
			,
			
                           
			
			constructor
			 
			=
			 
	
			ImageClassificationMulti
			,
			
                           
			
			blocks
			 
			=
			 
			
			(
	
			Image
			,
			 
	
			LabelMulti
			)
			,
			
                           
			
			category
			 
			=
			 
			
			"
			supervised
			"
			,
			
                           
			
			description
			 
			=
			 
			
			"""
			
			                               
			Multi-label image classification task where every image can
			                               
			have multiple class labels associated with it.
			                               
			"""
			,
			
                           
			
			package
			 
			=
			 
			
			@
			__MODULE__
			)
			
			
			
			@
			testset
			 
			
			"
			ImageClassificationSingle [task]
			"
			 
			
			begin
			
    
			
			task
			 
			=
			 
			
	
			ImageClassificationSingle
			(
			
			(
			16
			,
			 
			16
			)
			,
			 
			
			[
			1
			,
			 
			2
			]
			)
			
    
			
			testencoding
			(
			
			getencodings
			(
			task
			)
			,
			 
			
			
			getblocks
			(
			task
			)
			.
			
			sample
			)
			
    
			
			
	
			FastAI
			.
			
			checktask_core
			(
			task
			)
			
    
			
			@
			test_nowarn
			 
			
	
			tasklossfn
			(
			task
			)
			
    
			
			@
			test_nowarn
			 
			
	
			taskmodel
			(
			task
			,
			 
			
			
			Models
			.
			
	
			xresnet18
			(
			)
			)
			
			
    
			
			@
			testset
			 
			
			"
			`encodeinput`
			"
			 
			
			begin
			
        
			
			image
			 
			=
			 
			
			rand
			(
			RGB
			,
			 
			32
			,
			 
			48
			)
			
			
        
			
			xtrain
			 
			=
			 
			
			encodeinput
			(
			task
			,
			 
			
	
			Training
			(
			)
			,
			 
			image
			)
			
        
			
			@
			test
			
			 
			
			size
			(
			xtrain
			)
			 
			==
			 
			
			(
			16
			,
			 
			16
			,
			 
			3
			)
			
        
			
			@
			test
			
			 
			
			eltype
			(
			xtrain
			)
			 
			==
			 
			Float32
			
			
        
			
			xinference
			 
			=
			 
			
			encodeinput
			(
			task
			,
			 
			
	
			Inference
			(
			)
			,
			 
			image
			)
			
        
			
			@
			test
			
			 
			
			size
			(
			xinference
			)
			 
			==
			 
			
			(
			16
			,
			 
			24
			,
			 
			3
			)
			
        
			
			@
			test
			
			 
			
			eltype
			(
			xinference
			)
			 
			==
			 
			Float32
			
    
			end
			
    
			
			@
			testset
			 
			
			"
			`encodetarget`
			"
			 
			
			begin
			
        
			
			category
			 
			=
			 
			1
			
        
			
			y
			 
			=
			 
			
			encodetarget
			(
			task
			,
			 
			
	
			Training
			(
			)
			,
			 
			category
			)
			
        
			
			@
			test
			
			 
			y
			 
			≈
			 
			
			[
			1
			,
			 
			0
			]
			
        
			# depends on buffered interface for `BlockTask`s and `Encoding`s
			
        
			#encodetarget!(y, task, Training(), 2)
			
        
			#@test y ≈ [0, 1]
			
    
			end
			
    
			
			@
			testset
			 
			
			"
			Show backends
			"
			 
			
			begin
			 
			
			@
			testset
			 
			
			"
			ShowText
			"
			 
			
			begin
			
        
			#@test_broken FastAI.test_task_show(task, ShowText(Base.DevNull()))
			
    
			end
			 
			end
			
			
    
			
			@
			testset
			 
			
			"
			blockmodel
			"
			 
			
			begin
			
        
			
			task
			 
			=
			 
			
	
			ImageClassificationSingle
			(
			
			(
			
			
	
			Image
			{
			2
			}
			(
			)
			,
			 
			
	
			Label
			(
			
			1
			:
			2
			)
			)
			)
			
        
			
			@
			test_nowarn
			 
			
	
			taskmodel
			(
			task
			)
			
    
			end
			
			end
			
			
			
			@
			testset
			 
			
			"
			ImageClassificationMulti [task]
			"
			 
			
			begin
			
    
			
			task
			 
			=
			 
			
	
			ImageClassificationMulti
			(
			
			(
			16
			,
			 
			16
			)
			,
			 
			
			[
			1
			,
			 
			2
			]
			)
			
			
    
			
			testencoding
			(
			
			getencodings
			(
			task
			)
			,
			 
			
			
			getblocks
			(
			task
			)
			.
			
			sample
			)
			
    
			
			
	
			FastAI
			.
			
			checktask_core
			(
			task
			)
			
    
			
			@
			test_nowarn
			 
			
	
			tasklossfn
			(
			task
			)
			
    
			
			@
			test_nowarn
			 
			
	
			taskmodel
			(
			task
			,
			 
			
			
			Models
			.
			
	
			xresnet18
			(
			)
			)
			
    
			
			@
			testset
			 
			
			"
			Show backends
			"
			 
			
			begin
			 
			
			@
			testset
			 
			
			"
			ShowText
			"
			 
			
			begin
			 
			
			
	
			FastAI
			.
			
			test_task_show
			(
			task
			,
			
                                                                                   
			
	
			ShowText
			(
			
			
			Base
			.
			
			DevNull
			(
			)
			)
			)
			 
			end
			 
			end
			
			end